Index: Source/WebCore/platform/graphics/chromium/GlyphPageTreeNodeChromiumWin.cpp |
=================================================================== |
--- Source/WebCore/platform/graphics/chromium/GlyphPageTreeNodeChromiumWin.cpp (revision 105592) |
+++ Source/WebCore/platform/graphics/chromium/GlyphPageTreeNodeChromiumWin.cpp (working copy) |
@@ -1,5 +1,5 @@ |
/* |
- * Copyright (c) 2008, 2009 Google Inc. All rights reserved. |
+ * Copyright (c) 2008, 2009, 2012 Google Inc. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions are |
@@ -49,15 +49,27 @@ |
page->setGlyphDataForIndex(i, 0, 0); |
} |
-// Lazily initializes space glyph |
-static Glyph initSpaceGlyph(HDC dc, Glyph* spaceGlyph) |
+// Convert characters to glyph ids by GetGlyphIndices(), during which, we |
+// ensure the font is loaded in memory to make it work in a sandboxed process. |
+static bool getGlyphIndices(HFONT font, HDC dc, const UChar* characters, unsigned charactersLength, WORD* glyphBuffer, DWORD flag) |
{ |
- if (*spaceGlyph) |
- return *spaceGlyph; |
+ if (GetGlyphIndices(dc, characters, charactersLength, glyphBuffer, flag) != GDI_ERROR) |
+ return true; |
+ if (PlatformSupport::ensureFontLoaded(font)) { |
+ if (GetGlyphIndices(dc, characters, charactersLength, glyphBuffer, flag) != GDI_ERROR) |
+ return true; |
+ // FIXME: Handle gracefully the error if this call also fails. |
+ // See http://crbug.com/6401 |
+ LOG_ERROR("Unable to get the glyph indices after second attempt"); |
+ } |
+ return false; |
+} |
+// Initializes space glyph |
+static bool initSpaceGlyph(HFONT font, HDC dc, Glyph* spaceGlyph) |
+{ |
static wchar_t space = ' '; |
- GetGlyphIndices(dc, &space, 1, spaceGlyph, 0); |
- return *spaceGlyph; |
+ return getGlyphIndices(font, dc, &space, 1, spaceGlyph, 0); |
} |
// Fills |length| glyphs starting at |offset| in a |page| in the Basic |
@@ -68,27 +80,27 @@ |
unsigned length, |
UChar* buffer, |
GlyphPage* page, |
- const SimpleFontData* fontData, |
- bool recurse) |
+ const SimpleFontData* fontData) |
{ |
HDC dc = GetDC((HWND)0); |
HGDIOBJ oldFont = SelectObject(dc, fontData->platformData().hfont()); |
TEXTMETRIC tm = {0}; |
if (!GetTextMetrics(dc, &tm)) { |
- SelectObject(dc, oldFont); |
- ReleaseDC(0, dc); |
+ if (PlatformSupport::ensureFontLoaded(fontData->platformData().hfont())) { |
+ if (!GetTextMetrics(dc, &tm)) { |
+ // FIXME: Handle gracefully the error if this call also fails. |
+ // See http://crbug.com/6401 |
+ LOG_ERROR("Unable to get the text metrics after second attempt"); |
- if (recurse) { |
- if (PlatformSupport::ensureFontLoaded(fontData->platformData().hfont())) |
- return fillBMPGlyphs(offset, length, buffer, page, fontData, false); |
- |
- fillEmptyGlyphs(page); |
- return false; |
+ SelectObject(dc, oldFont); |
+ ReleaseDC(0, dc); |
+ fillEmptyGlyphs(page); |
+ return false; |
+ } |
} else { |
- // FIXME: Handle gracefully the error if this call also fails. |
- // See http://crbug.com/6401 |
- LOG_ERROR("Unable to get the text metrics after second attempt"); |
+ SelectObject(dc, oldFont); |
+ ReleaseDC(0, dc); |
fillEmptyGlyphs(page); |
return false; |
} |
@@ -128,7 +140,12 @@ |
// Also according to Jungshik and Hironori's suggestion and modification |
// we treat turetype and raster Font as different way when windows version |
// is less than Vista. |
- GetGlyphIndices(dc, buffer, length, localGlyphBuffer, GGI_MARK_NONEXISTING_GLYPHS); |
+ if (!getGlyphIndices(fontData->platformData().hfont(), dc, buffer, length, localGlyphBuffer, GGI_MARK_NONEXISTING_GLYPHS)) { |
+ SelectObject(dc, oldFont); |
+ ReleaseDC(0, dc); |
+ fillEmptyGlyphs(page); |
+ return false; |
+ } |
// Copy the output to the GlyphPage |
bool haveGlyphs = false; |
@@ -138,6 +155,7 @@ |
invalidGlyph = 0x1F; |
Glyph spaceGlyph = 0; // Glyph for a space. Lazily filled. |
+ bool spaceGlyphInitialized = false; |
for (unsigned i = 0; i < length; i++) { |
UChar c = buffer[i]; |
@@ -149,7 +167,12 @@ |
if (Font::treatAsSpace(c)) { |
// Hard code the glyph indices for characters that should be |
// treated like spaces. |
- glyph = initSpaceGlyph(dc, &spaceGlyph); |
+ if (!spaceGlyphInitialized) { |
+ // If initSpaceGlyph fails, spaceGlyph stays 0 (= glyph is not present). |
+ initSpaceGlyph(fontData->platformData().hfont(), dc, &spaceGlyph); |
+ spaceGlyphInitialized = true; |
+ } |
+ glyph = spaceGlyph; |
} else if (glyph == invalidGlyph) { |
// WebKit expects both the glyph index and FontData |
// pointer to be 0 if the glyph is not present |
@@ -222,7 +245,7 @@ |
// FIXME: Add assertions to make sure that buffer is entirely in BMP |
// or entirely in non-BMP. |
if (bufferLength == length) |
- return fillBMPGlyphs(offset, length, characterBuffer, this, fontData, true); |
+ return fillBMPGlyphs(offset, length, characterBuffer, this, fontData); |
if (bufferLength == 2 * length) { |
// A non-BMP input buffer will be twice as long as output glyph buffer |