Crash when measuring a glyphs from a fallback SVG font
authormmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Jul 2014 00:27:09 +0000 (00:27 +0000)
committermmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Jul 2014 00:27:09 +0000 (00:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=135264

Reviewed by Simon Fraser.

Source/WebCore:
We can't realize font data for all fallback fonts ahead
of time, but we don't have all the necessary context to
realize SVG fallback data when it's needed. For now, we
can just bail; however, a larger, more invasive fix is
in order.

Test: svg/text/svg-fallback-font-crash.html

* platform/graphics/WidthIterator.cpp:
(WebCore::applyFontTransforms):

LayoutTests:
Render some text with a fallback SVG Font including a glyph which
only exists in that fallback font. Make sure there is no crash.

* svg/text/resources/Litherum.svg:
* svg/text/svg-fallback-font-crash-expected.txt: Added.
* svg/text/svg-fallback-font-crash.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@171561 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/svg/text/resources/Litherum.svg
LayoutTests/svg/text/svg-fallback-font-crash-expected.txt [new file with mode: 0644]
LayoutTests/svg/text/svg-fallback-font-crash.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/WidthIterator.cpp

index d64681e2b5ad6bb03c80ded7a7a9a2acb4f55afa..a2b1278dc2e0d4ecd2b9478f022ffab86760db95 100644 (file)
@@ -1,3 +1,17 @@
+2014-07-24  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        Crash when measuring a glyphs from a fallback SVG font
+        https://bugs.webkit.org/show_bug.cgi?id=135264
+
+        Reviewed by Simon Fraser.
+
+        Render some text with a fallback SVG Font including a glyph which
+        only exists in that fallback font. Make sure there is no crash.
+
+        * svg/text/resources/Litherum.svg:
+        * svg/text/svg-fallback-font-crash-expected.txt: Added.
+        * svg/text/svg-fallback-font-crash.html: Added.
+
 2014-07-24  Mihnea Ovidenie  <mihnea@adobe.com>
 
         [New Multicolumn] Assertion failure when an input element has multicolumn style
 2014-07-24  Mihnea Ovidenie  <mihnea@adobe.com>
 
         [New Multicolumn] Assertion failure when an input element has multicolumn style
index 042c7ed94ef174be60b960738644c90d310970fa..e95a1a494a868a272762de39ce6a188f7446a53c 100644 (file)
@@ -6,6 +6,7 @@
 <font id="Litherum" horiz-adv-x="1024">
 <font-face units-per-em="14" ascent="14" descent="-7"/>
 <glyph unicode="|" horiz-adv-x="14" d="M5 -7v21h4v-21z"/>
 <font id="Litherum" horiz-adv-x="1024">
 <font-face units-per-em="14" ascent="14" descent="-7"/>
 <glyph unicode="|" horiz-adv-x="14" d="M5 -7v21h4v-21z"/>
+<glyph unicode="&#x20001;" horiz-adv-x="14" d="M5 -7v21h4v-21z"/>
 </font>
 </defs>
 </svg>
 </font>
 </defs>
 </svg>
diff --git a/LayoutTests/svg/text/svg-fallback-font-crash-expected.txt b/LayoutTests/svg/text/svg-fallback-font-crash-expected.txt
new file mode 100644 (file)
index 0000000..de23205
--- /dev/null
@@ -0,0 +1,2 @@
+This test makes sure that there is no crash if a character is rendered with a SVG fallback font. The test is successful if there is no crash.
+This is a foreign character. 𠀁 That was a foreign character.
diff --git a/LayoutTests/svg/text/svg-fallback-font-crash.html b/LayoutTests/svg/text/svg-fallback-font-crash.html
new file mode 100644 (file)
index 0000000..0b86e74
--- /dev/null
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+@font-face {
+    font-family: 'Litherum';
+    src: url("./resources/Litherum.svg") format(svg)
+}
+</style>
+<script>
+if (window.testRunner)
+    testRunner.dumpAsText();
+</script>
+</head>
+<body>
+This test makes sure that there is no crash if a character is rendered with a SVG fallback font. The test is successful if there is no crash.
+<div style="font-family: 'Helvetica' 'Litherum';">This is a foreign character. &#x20001; That was a foreign character.</div>
+</body>
+</html>
index 3b3f4a9147163a3fbe724d8cd71f132972cad369..1970b45b53023bc8a745b1eefd064e802355a0f2 100644 (file)
@@ -1,3 +1,21 @@
+2014-07-24  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        Crash when measuring a glyphs from a fallback SVG font
+        https://bugs.webkit.org/show_bug.cgi?id=135264
+
+        Reviewed by Simon Fraser.
+
+        We can't realize font data for all fallback fonts ahead
+        of time, but we don't have all the necessary context to
+        realize SVG fallback data when it's needed. For now, we
+        can just bail; however, a larger, more invasive fix is
+        in order.
+
+        Test: svg/text/svg-fallback-font-crash.html
+
+        * platform/graphics/WidthIterator.cpp:
+        (WebCore::applyFontTransforms):
+
 2014-07-24  Daniel Bates  <dabates@apple.com>
             And Alexey Proskuryakov  <ap@apple.com>
 
 2014-07-24  Daniel Bates  <dabates@apple.com>
             And Alexey Proskuryakov  <ap@apple.com>
 
index 777dc2978dbf97cbd1773ff6a0cbfb0053c6cb59..cd524f77dbc53365a7e42cd4534f216e1e24f4a0 100644 (file)
@@ -123,10 +123,12 @@ static inline float applyFontTransforms(GlyphBuffer* glyphBuffer, bool ltr, int&
 #else
     // We need to handle transforms on SVG fonts internally, since they are rendered internally.
     if (fontData->isSVGFont()) {
 #else
     // We need to handle transforms on SVG fonts internally, since they are rendered internally.
     if (fontData->isSVGFont()) {
-        ASSERT(iterator.run().renderingContext());
         // SVG font ligatures are handled during glyph selection, only kerning remaining.
         // SVG font ligatures are handled during glyph selection, only kerning remaining.
-        if (typesettingFeatures & Kerning)
+        if (iterator.run().renderingContext() && (typesettingFeatures & Kerning)) {
+            // FIXME: We could pass the necessary context down to this level so we can lazily create rendering contexts at this point.
+            // However, a larger refactoring of SVG fonts might necessary to sidestep this problem completely.
             iterator.run().renderingContext()->applySVGKerning(fontData, iterator, glyphBuffer, lastGlyphCount);
             iterator.run().renderingContext()->applySVGKerning(fontData, iterator, glyphBuffer, lastGlyphCount);
+        }
     } else
 #endif
         fontData->applyTransforms(glyphBuffer->glyphs(lastGlyphCount), advances + lastGlyphCount, glyphBufferSize - lastGlyphCount, typesettingFeatures);
     } else
 #endif
         fontData->applyTransforms(glyphBuffer->glyphs(lastGlyphCount), advances + lastGlyphCount, glyphBufferSize - lastGlyphCount, typesettingFeatures);