Title: [187685] trunk
Revision
187685
Author
mmaxfi...@apple.com
Date
2015-07-31 15:24:56 -0700 (Fri, 31 Jul 2015)

Log Message

[SVG -> OTF Converter] Crash when converting Arabic fonts
https://bugs.webkit.org/show_bug.cgi?id=147510

Reviewed by Anders Carlsson.

Source/WebCore:

SVGToOTFFontConverter::compareCodepointsLexicographically() wasn't transitive.

Test: fast/text/arabic-duplicate-glyph-font.html

* svg/SVGToOTFFontConversion.cpp:
(WebCore::SVGToOTFFontConverter::compareCodepointsLexicographically):

LayoutTests:

* fast/text/arabic-duplicate-glyph-font-expected.txt: Added.
* fast/text/arabic-duplicate-glyph-font.html: Added.
* fast/text/resources/arabic-duplicate-glyph-font.svg: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (187684 => 187685)


--- trunk/LayoutTests/ChangeLog	2015-07-31 22:20:30 UTC (rev 187684)
+++ trunk/LayoutTests/ChangeLog	2015-07-31 22:24:56 UTC (rev 187685)
@@ -1,3 +1,14 @@
+2015-07-31  Myles C. Maxfield  <mmaxfi...@apple.com>
+
+        [SVG -> OTF Converter] Crash when converting Arabic fonts
+        https://bugs.webkit.org/show_bug.cgi?id=147510
+
+        Reviewed by Anders Carlsson.
+
+        * fast/text/arabic-duplicate-glyph-font-expected.txt: Added.
+        * fast/text/arabic-duplicate-glyph-font.html: Added.
+        * fast/text/resources/arabic-duplicate-glyph-font.svg: Added.
+
 2015-07-31  Saam barati  <saambara...@gmail.com>
 
         ES6 class syntax should use block scoping

Added: trunk/LayoutTests/fast/text/arabic-duplicate-glyph-font-expected.txt (0 => 187685)


--- trunk/LayoutTests/fast/text/arabic-duplicate-glyph-font-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/text/arabic-duplicate-glyph-font-expected.txt	2015-07-31 22:24:56 UTC (rev 187685)
@@ -0,0 +1,2 @@
+This test makes sure that SVGToOTFFontConverter::compareCodepointsLexicographically() is transitive. The test passes if there is no crash.
+ﻟﻠﻪ

Added: trunk/LayoutTests/fast/text/arabic-duplicate-glyph-font.html (0 => 187685)


--- trunk/LayoutTests/fast/text/arabic-duplicate-glyph-font.html	                        (rev 0)
+++ trunk/LayoutTests/fast/text/arabic-duplicate-glyph-font.html	2015-07-31 22:24:56 UTC (rev 187685)
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+@font-face {
+    font-family: "arabicfont";
+    src: url("resources/arabic-duplicate-glyph-font.svg") format("svg");
+}
+</style>
+<script>
+if (window.testRunner)
+    testRunner.dumpAsText();
+</script>
+</head>
+<body>
+This test makes sure that SVGToOTFFontConverter::compareCodepointsLexicographically() is transitive. The test passes if there is no crash.
+<div style="font-family: arabicfont;">&#xfedf;&#xfee0;&#xfeea;</div>
+</body>
+</html>

Added: trunk/LayoutTests/fast/text/resources/arabic-duplicate-glyph-font.svg (0 => 187685)


--- trunk/LayoutTests/fast/text/resources/arabic-duplicate-glyph-font.svg	                        (rev 0)
+++ trunk/LayoutTests/fast/text/resources/arabic-duplicate-glyph-font.svg	2015-07-31 22:24:56 UTC (rev 187685)
@@ -0,0 +1,90 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<defs>
+<font horiz-adv-x='1024' >
+  <font-face 
+    font-family="Font"
+    font-weight="300"
+    font-stretch="normal"
+    units-per-em="2048"
+    ascent="1374"
+    descent="-674"
+    x-height="680"
+    cap-height="956"
+    bbox="-127 -672 1872 1855"
+    underline-thickness="66"
+    underline-position="-147"
+    unicode-range="U+0020-FEFC"
+  />
+<missing-glyph horiz-adv-x="2048" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+    <glyph unicode="&#xfedf;&#xfee0;&#xfeea;" horiz-adv-x="1235" arabic-form="isolated" d="M0 0" />
+  </font>
+</defs></svg>

Modified: trunk/Source/WebCore/ChangeLog (187684 => 187685)


--- trunk/Source/WebCore/ChangeLog	2015-07-31 22:20:30 UTC (rev 187684)
+++ trunk/Source/WebCore/ChangeLog	2015-07-31 22:24:56 UTC (rev 187685)
@@ -1,3 +1,17 @@
+2015-07-31  Myles C. Maxfield  <mmaxfi...@apple.com>
+
+        [SVG -> OTF Converter] Crash when converting Arabic fonts
+        https://bugs.webkit.org/show_bug.cgi?id=147510
+
+        Reviewed by Anders Carlsson.
+
+        SVGToOTFFontConverter::compareCodepointsLexicographically() wasn't transitive.
+
+        Test: fast/text/arabic-duplicate-glyph-font.html
+
+        * svg/SVGToOTFFontConversion.cpp:
+        (WebCore::SVGToOTFFontConverter::compareCodepointsLexicographically):
+
 2015-07-31  Jeremy Jones  <jere...@apple.com>
 
         Rename AVPlayerLayerView to _AVPlayerLayerView.

Modified: trunk/Source/WebCore/svg/SVGToOTFFontConversion.cpp (187684 => 187685)


--- trunk/Source/WebCore/svg/SVGToOTFFontConversion.cpp	2015-07-31 22:20:30 UTC (rev 187684)
+++ trunk/Source/WebCore/svg/SVGToOTFFontConversion.cpp	2015-07-31 22:24:56 UTC (rev 187685)
@@ -1312,8 +1312,6 @@
     auto codePoints2 = StringView(data2.codepoints).codePoints();
     auto iterator1 = codePoints1.begin();
     auto iterator2 = codePoints2.begin();
-    unsigned length1 = data1.codepoints.length();
-    unsigned length2 = data2.codepoints.length();
     while (iterator1 != codePoints1.end() && iterator2 != codePoints2.end()) {
         UChar32 codepoint1, codepoint2;
         codepoint1 = *iterator1;
@@ -1328,10 +1326,12 @@
         ++iterator2;
     }
 
-    if (length1 == length2 && data1.glyphElement
-        && equalIgnoringCase(data1.glyphElement->fastGetAttribute(SVGNames::arabic_formAttr), "isolated"))
-        return true;
-    return length1 < length2;
+    if (iterator1 == codePoints1.end() && iterator2 == codePoints2.end()) {
+        bool firstIsIsolated = data1.glyphElement && equalIgnoringCase(data1.glyphElement->fastGetAttribute(SVGNames::arabic_formAttr), "isolated");
+        bool secondIsIsolated = data2.glyphElement && equalIgnoringCase(data2.glyphElement->fastGetAttribute(SVGNames::arabic_formAttr), "isolated");
+        return firstIsIsolated && !secondIsIsolated;
+    }
+    return iterator1 == codePoints1.end();
 }
 
 static void populateEmptyGlyphCharString(Vector<char, 17>& o, unsigned unitsPerEm)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to