Title: [205111] trunk
Revision
205111
Author
[email protected]
Date
2016-08-28 23:55:59 -0700 (Sun, 28 Aug 2016)

Log Message

Add support for non-BMP operators U+1EEF0 and U+1EEF1
https://bugs.webkit.org/show_bug.cgi?id=153984

Source/WebCore:

Patch by Frederic Wang <[email protected]> on 2016-08-25
Reviewed by Darin Adler.

Tests: mathml/presentation/non-bmp-operators-spacing.html
       mathml/presentation/non-bmp-operators-stretching.html

* mathml/MathMLOperatorDictionary.cpp: We move the definition of operator dictionary Entry
here as it is not used by external code.
We now also accept non-BMP operators and add entries for U+1EEF0 and U+1EEF1.
(WebCore::extractProperty): Helper function to convert from Entry structure to a Property
structure.
(WebCore::MathMLOperatorDictionary::search): This function now accepts a non-BMP parameter
and returns a Property structure.
(WebCore::MathMLOperatorDictionary::isVertical): This function now accepts a non-BMP parameter.
* mathml/MathMLOperatorDictionary.h: Replace the Entry structure with a Property structure
which was used by MathMLOperatorElement. Update the signatures of search and isVertical.
* mathml/MathMLOperatorElement.cpp:
(WebCore::MathMLOperatorElement::parseOperatorChar): Remove the special case that excludes
non-BMP operators.
(WebCore::MathMLOperatorElement::computeDictionaryProperty): Rename the property structure
to use the one moved into MathMLOperatorDictionary.h. We no longer need to convert the result
of the search call.
(WebCore::MathMLOperatorElement::dictionaryProperty): Rename the property structure.
* mathml/MathMLOperatorElement.h: Make OperatorChar accept non-BMP operators.
MathMLOperatorElement::DictionaryProperty is now moved into MathMLOperatorDictionary
and renamed Property.
* rendering/mathml/MathOperator.cpp: Accept non-BMP operators.
* rendering/mathml/MathOperator.h: Ditto.
* rendering/mathml/RenderMathMLFencedOperator.cpp:
(WebCore::RenderMathMLFencedOperator::updateOperatorContent):  Adjust code to use the new
return type of MathMLOperatorDictionary::search.
* rendering/mathml/RenderMathMLFencedOperator.h: Accept non-BMP operators.
* rendering/mathml/RenderMathMLOperator.cpp: Ditto.
* rendering/mathml/RenderMathMLOperator.h: Ditto.

LayoutTests:

We add two reftests to check that the non-BMP operators are properly
handled by the MathML dictionary (form, properties, direction) as well
as the rendering code (spacing, stretching). We test the new horizontal
strechy operators U+1EEF0 and U+1EEF1 as well as the letter U+1D400
which is not a real mathematical operator. We add a minimal test
font which contains a black square for U+005F, U+1EEF0, U+1EEF1, U+1D400
and the data that can be used to stretch them horizontally.

Patch by Frederic Wang <[email protected]> on 2016-08-25
Reviewed by Darin Adler.

* mathml/presentation/non-bmp-operators-spacing-expected.html: Added.
* mathml/presentation/non-bmp-operators-spacing.html: Added.
* mathml/presentation/non-bmp-operators-stretching-expected.html: Added.
* mathml/presentation/non-bmp-operators-stretching.html: Added.
* mathml/presentation/non-bmp-operators.woff: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (205110 => 205111)


--- trunk/LayoutTests/ChangeLog	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/LayoutTests/ChangeLog	2016-08-29 06:55:59 UTC (rev 205111)
@@ -1,3 +1,24 @@
+2016-08-25  Frederic Wang  <[email protected]>
+
+        Add support for non-BMP operators U+1EEF0 and U+1EEF1
+        https://bugs.webkit.org/show_bug.cgi?id=153984
+
+        We add two reftests to check that the non-BMP operators are properly
+        handled by the MathML dictionary (form, properties, direction) as well
+        as the rendering code (spacing, stretching). We test the new horizontal
+        strechy operators U+1EEF0 and U+1EEF1 as well as the letter U+1D400
+        which is not a real mathematical operator. We add a minimal test
+        font which contains a black square for U+005F, U+1EEF0, U+1EEF1, U+1D400
+        and the data that can be used to stretch them horizontally.
+
+        Reviewed by Darin Adler.
+
+        * mathml/presentation/non-bmp-operators-spacing-expected.html: Added.
+        * mathml/presentation/non-bmp-operators-spacing.html: Added.
+        * mathml/presentation/non-bmp-operators-stretching-expected.html: Added.
+        * mathml/presentation/non-bmp-operators-stretching.html: Added.
+        * mathml/presentation/non-bmp-operators.woff: Added.
+
 2016-08-28  Youenn Fablet  <[email protected]>
 
         [Fetch API] Ensure response cloning works when data is loading

Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing-expected.html (0 => 205111)


--- trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing-expected.html	                        (rev 0)
+++ trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing-expected.html	2016-08-29 06:55:59 UTC (rev 205111)
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Spacing of non-BMP operators</title>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      @font-face {
+        font-family: non-bmp-operators;
+        src: url("non-bmp-operators.woff");
+      }
+      math {
+        font-family: non-bmp-operators;
+      }
+    </style>
+  </head>
+  <body>
+
+    <p>
+      This test verifies the spacing of some non-BMP operators. It is assumed
+      that U+1EEF0 and U+1EEF1 only have a prefix form with zero lspace/rspace
+      and that U+1D400 is not in the operator dictionary. Hence the operator
+      spacing use zero for prefix U+1EEF0/U+1EEF1 and will use the default
+      thickmathspace value otherwise. Note that for implicit form, WebKit has a
+      workaround for bad markup and will fallback to the form of a dictionary
+      entry if one is found.
+    </p>
+
+    <p>Prefix:</p>
+    U+1EEF0:<math><mo lspace="0em" rspace="0em" form="prefix">&#x1EEF0;</mo></math>_
+    U+1EEF1:<math><mo lspace="0em" rspace="0em" form="prefix">&#x1EEF1;</mo></math>_
+    U+1D400:<math><mo lspace="thickmathspace" rspace="thickmathspace" form="prefix">&#x1D400;</mo></math>_
+
+    <p>Postfix:</p>
+    U+1EEF0:<math><mo lspace="thickmathspace" rspace="thickmathspace" form="postfix">&#x1EEF0;</mo></math>_
+    U+1EEF1:<math><mo lspace="thickmathspace" rspace="thickmathspace" form="postfix">&#x1EEF1;</mo></math>_
+    U+1D400:<math><mo lspace="thickmathspace" rspace="thickmathspace" form="postfix">&#x1D400;</mo></math>_
+
+    <p>Infix:</p>
+    U+1EEF0:<math><mo lspace="thickmathspace" rspace="thickmathspace"  form="infix">&#x1EEF0;</mo></math>_
+    U+1EEF1:<math><mo lspace="thickmathspace" rspace="thickmathspace"  form="infix">&#x1EEF1;</mo></math>_
+    U+1D400:<math><mo lspace="thickmathspace" rspace="thickmathspace"  form="infix">&#x1D400;</mo></math>_
+
+    <p>Prefix (implicit):</p>
+    U+1EEF0:<math><mo lspace="0em" rspace="0em">&#x1EEF0;</mo><mn></mn></math>_
+    U+1EEF1:<math><mo lspace="0em" rspace="0em">&#x1EEF1;</mo><mn></mn></math>_
+    U+1D400:<math><mo lspace="thickmathspace" rspace="thickmathspace">&#x1D400;</mo><mn></mn></math>_
+
+    <p>Infix (implicit):</p>
+    U+1EEF0:<math><mn></mn><mo lspace="0em" rspace="0em">&#x1EEF0;</mo><mn></mn></math>_
+    U+1EEF1:<math><mn></mn><mo lspace="0em" rspace="0em">&#x1EEF1;</mo><mn></mn></math>_
+    U+1D400:<math><mn></mn><mo lspace="thickmathspace" rspace="thickmathspace">&#x1D400;</mo><mn></mn></math>_
+
+    <p>Postfix (implicit):</p>
+    U+1EEF0:<math><mn></mn><mo lspace="0em" rspace="0em">&#x1EEF0;</mo></math>_
+    U+1EEF1:<math><mn></mn><mo lspace="0em" rspace="0em">&#x1EEF1;</mo></math>_
+    U+1D400:<math><mn></mn><mo lspace="thickmathspace" rspace="thickmathspace">&#x1D400;</mo></math>_
+  </body>
+</html>
Property changes on: trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing-expected.html
___________________________________________________________________

Added: svn:eol-style

+LF \ No newline at end of property

Added: svn:mime-type

+text/html \ No newline at end of property

Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing.html (0 => 205111)


--- trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing.html	                        (rev 0)
+++ trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing.html	2016-08-29 06:55:59 UTC (rev 205111)
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Spacing of non-BMP operators</title>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      @font-face {
+        font-family: non-bmp-operators;
+        src: url("non-bmp-operators.woff");
+      }
+      math {
+        font-family: non-bmp-operators;
+      }
+    </style>
+  </head>
+  <body>
+
+    <p>
+      This test verifies the spacing of some non-BMP operators. It is assumed
+      that U+1EEF0 and U+1EEF1 only have a prefix form with zero lspace/rspace
+      and that U+1D400 is not in the operator dictionary. Hence the operator
+      spacing use zero for prefix U+1EEF0/U+1EEF1 and will use the default
+      thickmathspace value otherwise. Note that for implicit form, WebKit has a
+      workaround for bad markup and will fallback to the form of a dictionary
+      entry if one is found.
+    </p>
+
+    <p>Prefix:</p>
+    U+1EEF0:<math><mo form="prefix">&#x1EEF0;</mo></math>_
+    U+1EEF1:<math><mo form="prefix">&#x1EEF1;</mo></math>_
+    U+1D400:<math><mo form="prefix">&#x1D400;</mo></math>_
+
+    <p>Postfix:</p>
+    U+1EEF0:<math><mo form="postfix">&#x1EEF0;</mo></math>_
+    U+1EEF1:<math><mo form="postfix">&#x1EEF1;</mo></math>_
+    U+1D400:<math><mo form="postfix">&#x1D400;</mo></math>_
+
+    <p>Infix:</p>
+    U+1EEF0:<math><mo form="infix">&#x1EEF0;</mo></math>_
+    U+1EEF1:<math><mo form="infix">&#x1EEF1;</mo></math>_
+    U+1D400:<math><mo form="infix">&#x1D400;</mo></math>_
+
+    <p>Prefix (implicit):</p>
+    U+1EEF0:<math><mo>&#x1EEF0;</mo><mn></mn></math>_
+    U+1EEF1:<math><mo>&#x1EEF1;</mo><mn></mn></math>_
+    U+1D400:<math><mo>&#x1D400;</mo><mn></mn></math>_
+
+    <p>Infix (implicit):</p>
+    U+1EEF0:<math><mn></mn><mo>&#x1EEF0;</mo><mn></mn></math>_
+    U+1EEF1:<math><mn></mn><mo>&#x1EEF1;</mo><mn></mn></math>_
+    U+1D400:<math><mn></mn><mo>&#x1D400;</mo><mn></mn></math>_
+
+    <p>Postfix (implicit):</p>
+    U+1EEF0:<math><mn></mn><mo>&#x1EEF0;</mo></math>_
+    U+1EEF1:<math><mn></mn><mo>&#x1EEF1;</mo></math>_
+    U+1D400:<math><mn></mn><mo>&#x1D400;</mo></math>_
+
+  </body>
+</html>
Property changes on: trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing.html
___________________________________________________________________

Added: svn:eol-style

+LF \ No newline at end of property

Added: svn:mime-type

+text/html \ No newline at end of property

Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching-expected.html (0 => 205111)


--- trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching-expected.html	                        (rev 0)
+++ trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching-expected.html	2016-08-29 06:55:59 UTC (rev 205111)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Stretching of non-BMP operators</title>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      @font-face {
+        font-family: non-bmp-operators;
+        src: url("non-bmp-operators.woff");
+      }
+      math {
+        font-family: non-bmp-operators;
+      }
+    </style>
+  </head>
+  <body>
+
+    <p>
+      This test verifies the stretching of some non-BMP operators. The font
+      used by this test provides horizontal stretching data for U+1EEF0,
+      U+1EEF1 and U+1D400. It is assumed that U+1EEF0 and U+1EEF1 are
+      horizontal and only have a prefix form with property stretchy. It is also
+      assumed that U+1D400 is not in the operator dictionary. Hence only the
+      prefix operators U+1EEF0 and U+1EEF1 will stretch horizontally.
+    </p>
+
+    <p>Prefix form:</p>
+    U+1EEF0:<math><munder><mo form="prefix" stretchy="true" lspace="0em" rspace="0em">_</mo><mspace width="100px"/></munder></math>
+    U+1EEF1:<math><munder><mo form="prefix" stretchy="true" lspace="0em" rspace="0em">_</mo><mspace width="100px"/></munder></math>
+    U+1D400:<math><munder><mo form="prefix" stretchy="false" lspace="thickmathspace" rspace="thickmathspace">_</mo><mspace width="100px"/></munder></math>
+
+    <p>Infix form:</p>
+    U+1EEF0:<math><munder><mo form="infix" stretchy="false" lspace="thickmathspace" rspace="thickmathspace">_</mo><mspace width="100px"/></munder></math>
+    U+1EEF1:<math><munder><mo form="infix" stretchy="false" lspace="thickmathspace" rspace="thickmathspace">_</mo><mspace width="100px"/></munder></math>
+    U+1D400:<math><munder><mo form="infix" stretchy="false" lspace="thickmathspace" rspace="thickmathspace">_</mo><mspace width="100px"/></munder></math>
+
+    <p>Postfix form:</p>
+    U+1EEF0:<math><munder><mo form="postfix" stretchy="false" lspace="thickmathspace" rspace="thickmathspace">_</mo><mspace width="100px"/></munder></math>
+    U+1EEF1:<math><munder><mo form="postfix" stretchy="false" lspace="thickmathspace" rspace="thickmathspace">_</mo><mspace width="100px"/></munder></math>
+    U+1D400:<math><munder><mo form="postfix" stretchy="false" lspace="thickmathspace" rspace="thickmathspace">_</mo><mspace width="100px"/></munder></math>
+
+  </body>
+</html>
Property changes on: trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching-expected.html
___________________________________________________________________

Added: svn:eol-style

+LF \ No newline at end of property

Added: svn:mime-type

+text/html \ No newline at end of property

Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching.html (0 => 205111)


--- trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching.html	                        (rev 0)
+++ trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching.html	2016-08-29 06:55:59 UTC (rev 205111)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Stretching of non-BMP operators</title>
+    <meta charset="utf-8"/>
+    <style type="text/css">
+      @font-face {
+        font-family: non-bmp-operators;
+        src: url("non-bmp-operators.woff");
+      }
+      math {
+        font-family: non-bmp-operators;
+      }
+    </style>
+  </head>
+  <body>
+
+    <p>
+      This test verifies the stretching of some non-BMP operators. The font
+      used by this test provides horizontal stretching data for U+1EEF0,
+      U+1EEF1 and U+1D400. It is assumed that U+1EEF0 and U+1EEF1 are
+      horizontal and only have a prefix form with property stretchy. It is also
+      assumed that U+1D400 is not in the operator dictionary. Hence only the
+      prefix operators U+1EEF0 and U+1EEF1 will stretch horizontally.
+    </p>
+
+    <p>Prefix form:</p>
+    U+1EEF0:<math><munder><mo form="prefix">&#x1EEF0;</mo><mspace width="100px"/></munder></math>
+    U+1EEF1:<math><munder><mo form="prefix">&#x1EEF1;</mo><mspace width="100px"/></munder></math>
+    U+1D400:<math><munder><mo form="prefix">&#x1D400;</mo><mspace width="100px"/></munder></math>
+
+    <p>Infix form:</p>
+    U+1EEF0:<math><munder><mo form="infix">&#x1EEF0;</mo><mspace width="100px"/></munder></math>
+    U+1EEF1:<math><munder><mo form="infix">&#x1EEF1;</mo><mspace width="100px"/></munder></math>
+    U+1D400:<math><munder><mo form="infix">&#x1D400;</mo><mspace width="100px"/></munder></math>
+
+    <p>Postfix form:</p>
+    U+1EEF0:<math><munder><mo form="postfix">&#x1EEF0;</mo><mspace width="100px"/></munder></math>
+    U+1EEF1:<math><munder><mo form="postfix">&#x1EEF1;</mo><mspace width="100px"/></munder></math>
+    U+1D400:<math><munder><mo form="postfix">&#x1D400;</mo><mspace width="100px"/></munder></math>
+
+  </body>
+</html>
Property changes on: trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching.html
___________________________________________________________________

Added: svn:eol-style

+LF \ No newline at end of property

Added: svn:mime-type

+text/html \ No newline at end of property

Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators.woff (0 => 205111)


--- trunk/LayoutTests/mathml/presentation/non-bmp-operators.woff	                        (rev 0)
+++ trunk/LayoutTests/mathml/presentation/non-bmp-operators.woff	2016-08-29 06:55:59 UTC (rev 205111)
@@ -0,0 +1,49 @@
+wOFFOTTO\xA4=\xE4CFF \xB3c\xD4.\xE6SFFTM\xD0z\xDDJ\MATH\xEC\xA1h883\x8FOS/2XA`\xD9\xE9cmap\x94p\x9Aɋ\xF4head,6
+\xCFg\xB9hhea4$=\xEBhmtx\x90	`maxpP+Pname\x9C\xF55\x9DS}c%post \xFF\x863x\x9Cc`d``b\xBB\x8ED\x91x~\x9B\xAF\xDC\xCC/\x80"\x97\x9FL,C\xA6\x99_\x80\xC59\x98@<8B/x\x9Cc`d``~\xC1\xC0\xC0\x90&AlFT\xC0P\xA02P+x\x9Cc`a~\xC18\x81\x81\x95\x81\x81\x99\x87ك\x81\x81a\x84fr`\xB0f4\xD2\xAC\x9C0\xC0\xC8\xC4A+
+\xFF\xFF3\xBF\xB2r`j\xE0r
+@\xC8\xA0b\xE2x\x9C\xC5[ێ\xC9y\xAE\xB5׎]6\xDE\xDB
+sah\x80j$ͮ+\xDD\xD9\xD4\xCB!gI\x8Ed\xF0E\xB3Y$\xDBbw\xD3\xDD\xCD\xF1\xF2Nr\x9DW\xC9k\xE4\xFB\xFF\xAA\xEA3c%\x81W;\xC3bu\xD5\xF8\xFEcUKB\x88߉\xFF\xDF\xFE\xEF\xFBoϤ#\xBE\xF3Ǝ!\xFE\xE1͝\xFFR\\xBC\xF9;\xFEV|\xF5\x8Fv\xFC+\xF1\xBB\xAB\xB5\xE3_c\xBE\xB0\xE3\xEF\xC4?_\xFD'v}\xF3\xEDo\x858\xFB+S\xA0\xF17\xE2\xEC\xCD?\xD9\xF1/\xC4wo|;\xFE\xA5\xF8\xB77\xB6\xE3o\xB1\xE6\xBF\xED\xF8WB]\xFD\x8B\xFFZ\x9C]\xDD\xDA\xF1w\xE2\xEA\xEA\xDFEG\xA4b#v"\x91X\x8A\x95(\x84/D(\xCE\xF1\xF9Z\\x8AW\xE2G\xE1a\xDC\xC7\xD3@\xAC\xB1*\xC0\xB7\x89h\x89~h-\xED)@\xE3\xADx\x89?Qm]tRc\xF6\H\xFC\x99bm$r\xEC\xEAa>a^\x8C=`}&4f\xCC
+\xA2\xE2{\x82oZ\xCC1\xB3\xC5x\x8Eq\x86qJ\x9Aw\xF7!\x87#\xF0\xA7\xB5uʃ\xD2\xE1\xEF\xCE1\x9F\xF2\xDAW\x90\x90~\xEA\x925\xF9:iBF)\xB2\x92\xCC\xF0\xB9\xC6\xCCS+X.\xB7\x92t\xCF\xF1\x8CF\xF7\xF8\x89\xF0=\xC0\x8E5S{\xC0w\x92]1\x8A=\xD1?\xF3\xB8zr\xC9\\xC9*\xCC\xE5\x902gZ-\xD0΀\xF1K\xE8܃\x8E\x92\xFF\\xFC]\xFE\xC8\xFE\xB7\xC2C\xD6i\x84\xCF)\xE3߇w\xD1\xEC\xBFO\xA1\xAF@\x87<\xEDGޫ\x81TK\x93/\xEC\xAC^\x8A?\xFC5\x94\xD0l\xF9\xDB\xE2F\xBC\x83N\xBE\xF5\xB2\xE6\x9A{+\xF6\xE2\xCA/\x9F\xF6G\x8Ac\xC1s\xF6\xE3\xFB{N\x8E\xCFq\xB3e\xDF)\xAC\xE7\x90\xDD\xD7\xF04\xF2!\x8Aɿ\xEF\xAD/n\xB0^[NF\xF2ٵ\xF5>\xDA0\xD5{\xA6\xB6(\xA5\xDA\xE0I*\xFE\x82ِ\xFD̫I\xB1\xC5\xD3+\xEF-j\xBAU{C\x96\xDAХ9\x89o~\x9E1-'I\x80\x95K3U\xCCP\xB4%\xC0q\xCB\xD1Sا&k\xC4\xF1\xCFj+\x99\xDBg$4\xB2\xDF[<LL-X&]\xAE\x95\x8C\x8D\xB1łQ \x9C\x9A\x9F9jFwżW5\xFDH\xFE\xEBw6\xE2	\x91\x95\xB5Լ\xF7q)\x89\xB63	K0\x89\xF5\xFBDz\xAC\xE5\x80\xD4b\x9Aq|˚g\xCF0\xD9\xC4d\x9A\x
 BCf\x81\xC3\xDCX\x97\xD9`c$\xDE\xDA\x9E\xF5\xAA-\xC6Q9c%}_\x94\x99\xCDaft46\xA14\xC3΢\xE4e^32\x81͚)\xDB\xD1}7\x92\xEEj\x9E\x9D\xB0\xB6\x8As\xE3\xDAf\xD1]\xB92f9׌`\xCEu\xC5 !k\x9Ay\xD9\xEB\x8C\x8Ec”Lm\x888\xEBV\x9E\xEE,m\xF6\x87\xBCڡ3\xB35e]"B\x92\xCC\xF8ۼ\x9C{+\x83\xD8K\xE6R׮\x9E\xE9\x8D|\xF9A\xA5k\xFA\xEFܢ0NnWƈ\x90fƻ$\xE6\x8D\xE7G\xD0ݖ1{&\xD2Mr\xBE}l?!I\xB5\x8A\xBC\xD2䟬\x86\xAD\x93\xC4 \x9C\xB1U5{\xC5aw:Vq@\xEC8^]\xEEh\xFAz\xDD3\x88\xF6_9sdl7\x97\xFD\xD6\x871a\xD66>\xF7\xFB\x89\xE3\xF5\x8E\x9Dk\xA7Y\xC0Y\x91\xBC_Z\xBA\x95\xA6ػ\xAD\xC9ReH\xA7}^\xFA\xED~>5\xF9\xB2\xEAn"\xB7\x80\xC9]T\xA3\xAA\xEC?S\xFC\x8C\xB8\xD6Jq\xF6HufqXؼ\xE3\xB0qҐ\xD6U+Yp\xCFa\xF4?\xB4e=\x82ՑNR\x8Ak\xC4\xEB\xF6\x9D?w灡\xE5\x99\xD9|\xF3\xF8s}\xB9\xADT\x94\xBB\x9DwD\xB5\xDC-9C\xDB8܂Fh\xD1wz6#D6\x82\x9B\xFDW=&\x9AV\xAE꟱\xCA\xFA\x85f\xCCֻ\x80\xA1\x8D\xDESvp\xBET\x8F\xF2\x9C#"\xDC\xCB\xD4u\xCD\xE9\xFB\x82\xBD\xAC\xF2i\xB
 B\xD6fo\x9F[\x89\xAB\x881vq\xB2\x8F\xEC\xEA\x88%X\x8B\xFD\xBE\xED)\xFFq]\x87\xE9'\\xAFg\xBC鱮\xDF\xD4\xFC+\xAFе<\x94s\x9Fs<\xF7>\xE5\xEA\x88\xFF9=oj\xDF\xF3\xF4|\xBC\xDAĶ\xCFq\xB2\I\xAA\x88O\xD9\xCB\xE66\x92
+\xFB\xC4\xE3.%\xB3\xF6\x9C\xD9N\xA8`M\xDD\xDE\x9D\x85\xCBU\x93\xDAs\x86Y]\xE5\xD7Ş\x85\x91\xAE\xAF\x91Oz\x81Wjr\xC5J\xEC\xDAe\x99cƥ\xCAif\xB5\xEB&\xF7s\xE0c\x9E\xE1p\x97,\xEF\x83P,\xF5=\xE7G\xDA\xE5\xFC\xD8Y\xB6͸\xAD\x98\xD3s\xAC\x98\xB3\xA6IY\xC7t\xA9\x8D.\xE7L\xA5^\xDA\xFE1.\xE7\xF6\xF3\xF7\xA9!#E\xFD]\xC6\xD63\xB1\x98\xDA\xDFU\x85\xDBXYҚՌU\x92#>ތ\xAE\xD38\xB5\xECY\xC5G\xF6\xB9A-\x98\xF0\xD9l\xC4g\xB2\xDFstи\xBBW)nY\x96\x98\xE3\xAB:\x99\x99\xFCi\xE4\xD5\xD6rF\xF7\xC4\xCA\xE5\x89z\xA7\xED\xCE\xA6;^
+];E8\xA4\x9BZ\xA7\xA0Z\xD8Jl|Ar\xF7\xEE2־Ϟֻ\xE2\xB4-\xCF\xF9\xAE\xD3\xDDپ\xC4\xD04\xAF\xAEIXu{\xCDnx\xC7y\xAA뫟CL׺\xA7{iS\xEF\x9FV7
+\x87\xA7G\xA7\xAD<\xAA\xAD\xC9\xEEĶ\xEF!\x9BS\xEE@M\x94ߚ۳T\xCA5\xF6-\xFB\xCB+\xAE\xC8C\xEE6\xEA=\xD8\xD3Q\x99X\xCFn\xE6\x98\xC8\xC6|d\xF9\x99\xDEvksȱ\xCC\xE3\xD9
+\xAD\x8E\xE4\xC3\xE1\xA9L\x9D[\xEB5Oj\xCDS\x86\x91\x8Bl\xB5\xB0\x91\xF2\x9A5\xFFz\x9E\xCF\xF7\xD0}\xD9\xF6O\xFF_\xE7\x8B*o?ah>\x97\xAFj"\xCB,d"\xB3~\xE64\xB7\xF7eٯ\xB4\xA6;\x8ElWU\x9Dӏ\xF7wU\x9F[\x8Aչl\xBFc\x9B\xB3\xACu\xFFt\xBDOa\xF9\\xB0\xED\x8CW\x99\x9C\xFCŞ\xEA\xBD݊{6\xDAqa\xBB\xF2y\xEDfneg\\x9D \xBC\x9DgVl,\xA2\xD6\xDD\xDD\xCD\xC4IS3\x8EQ\x8F\xB9ڛ\xB9\xC2\xDESD\xEC\x8Fs\xE6\xE6\xAC\xE9\xF89+\x8C3\xEB\x9F\xE6N\xACޓ\x9F>}\xA7\xD9&\x9F\xE6\xF9\xD7\xF4\xF2\x91\xED\xAC\xEFy\xE5\xC3\xD1\xDEjk\xFBY;ol\xD6H\x9F)_'[+\xBB\xDBs\xBA\x9F\x96e?]?]tr\xD6\xF0\x9F\xD5"\xEE\x9EF\xDAT\xE7Bh\xDBK\x9D\xAE\x80͚\xB7\x8FI\xC8\xD61\xE7\xF3M\x99aM-{\xAAm\x9ET+\xFBͮ9)oY6V}\xA4\xE76\xDE\xD7<\xC4a\xECN\xAE\x93ޔ\xF7	\x95VMZ\xCE\xD2\xEE\x8CyŨ\xBA;\x82d\xED\xA6m\x9Fׁ7O\xB9\xAAѯ\xA7{\xBA\xBA;9S\x83\x9Bw\xD5]H\xFD\xB60\xE65\xBA\xEC\xF4\xE6\xCC7\xB7}\x8C\xC9.s{\xABQ\xB0}\>\xA3\xFC\xF8\x94\xB7{\xD6\xE7(\xD3mjՙ\xF2\xC3g\x96\xEF\xC1
 \xE6\xFDe\xC3\xC3\xBB?C\xEFO{\x97\xDBU\xCF§\x91\xCEդ~\xF7\xF0T\xF4ȣ\xD1c\xFC懆\xDF<޿vGF\xAAc\x9D\x93\xBB|\xFAD\x955f/\xA8|\xE2T\x955\xF1\xD9;\x8E\x9Dx\xDE-E\xBD\xAC8ս\xF0\xF4\xD9\xF5\xA9{\xB0S\xF5\xD2d\x8B\xBF\xE5\xDEK\x8A\xFF\xEB{\xAF\xC3S\xD4\xE3\xF7^\xF2\xE8\xBD\xD7Sg\x99iy\x96\xC2sݩ\xE5\xB1wu\x84\xB8\xE91\x9D\xE4[\x9B\x9C\x95\xEE\xF14\xE6\x8E~!N\x9D\x90\xF7{\x9D\xFD\xDE\xD9ݻ\xCAS\xDFݭ\x9D\xBE:b\xA9\xFB\x90\x9F\xB4 \xA9\xAF\xF9-X\xF5~l·\xFCS\xF1\xEB\xC6\xFC\x8C\xF6)~\xDF4B^\xE9\xF3\xFD^3t\xA6\x9D\xD8\xE7g\xECu\xF9w\x8DuwL\xCB\xD0\xE37\xD1\xFE$\xCC\xC5\xDF\xE9\xDBO\x8Cb\x97c\xC2\xB2\xEF\xB4&Lu\x84\xB1bIo\xF9\x9D\x9D\xCF\xEB\xEF -\xEEX\xA3\xA1x\x8F\xB9w\x96\xDF\xBB\xDC;\xBE\x96\xC5H:\xC5|ŵ)U\x9F9ɤť\xCC\xD36h\xF7\x99\xC9\xEF1R4\x96r\xF6\xAC\xA4mƈ(O\xF9+\xE3#=\xE6\xD9;|\xDEb\x9Dy\xE3\xD8f\x9D\x8D\xB4C֡\x87\xE7F\x9F% \xCE\xD2b\xD5ᷘ\x9Fx\xC5{\xC85e)n\xD9\xF7\xCCJ\x8F5$}\xBA\xBC\x9F\xB8\xFEijF\xB2\x91\xB52\x8D+*-\x8B\xA
 5\x91C\xE1\xF9K\x8F|\x80\xF4\xF0\xBB\xB3W\x91C\xB1\xA5\xCCu\xCCV\xF0-\xF6m\xFBN\xB2\x8E\x8E\xC1\xBE\xF2?\x92\xAF\xCB\xEF/۬\xF7䨼\x8EZ\xDD\xF2\xA88\xEFY\x9F\xF10\x97	\xDF?t\x98Ҡ\xF4!\xDA9\xE6\xF9iͯ\x8Cw\xCBjv\xEC݄/~W\xDFzN\x9B\xDFt7\xB50q@\xF2WZ\x9C\xDB\xF6w\xA7\xCC\xAAf㡵a\xA7\xB4\xE8\x88}\xE9\x95\x8Fq>\xAFj\xB3=&ɞ4\xB2\xE8\xBA(4<\\xA4\xDFY/\x95\x925\xF1u\xD1\xE2\xD6='CZ\x8E\xB7lX\xB0\xCBo\xA9V\xC2I\x89\xC6\xD3t)o\x89N\xBA\xD9e\xD1rU\xA8\xE1\xB9z}\xF9\xEAGO\xF5\x97\xC1:
+Ԥ5h\xA9\xAB\xA2ؼ}\xF92\xE2\xB9V\x98\xC6/ϥ\x9C\xAE\xA2\\xF5ҤP\x93tQ<\x99V\x98XG\xA1Nr=W\xDBd\xAE3U\xAC\xB4\x9A\xF4j\xB4щY<0<\xF5Agy\x94&\xEAU\xEBU\xCB\xB3{\x89L\x98n"\x99\xE9u\xFA\xE0\xA9 \x99\xD3d\xB0\xCES\xDC\xD1:\x98\xAD\xB5z\x88\x8A\x95
+T\xAF\xFD\xB3
+\x8A\xB7\xD2
+\x99\x87Y\xB4)\xF2V\xAD[i\xB6|9\xEA+\xA4\x94_\xFF\x9Fd\xF9o\xFD\xA1ꍆS5\xE8w\xFC\xE1į\x8B\xAF.\xD4\xEBUOϲm\x90\xED\xE0\xE5\xFEW\xE5\xED\xD8o߼\xF8\x80E\xABe
+\xBDU\xBA`,pT/\xA0\xE0\xB9"\xF4\x8BT\xE5Eo\xD7Ap\xD2l=\x88\xE6Z\xCE\xF5=P\xDC\xC4\x9B@%L׀/͂"\xBA\xD7jA\xA46Y\xFA\xB9\xC7$\xB6\x9BM\x9A̍\x9F\x86\x99\xC6\xDA4\x91z\xB1\xC0%\x83\xB9\x8E\xA3\x90-\xB3\x8E\x92\xE56\xEB\xC4\xE3x\x9BDE\xA4sc5\xF5{\xC8K-2\xADiV\xA6\xA4\xC5"b+1?\xAB(Q\xAB(\1\xBF\\xC5\xC1\x86W\xF9
+J͍\xEDc"\x82/X\xB9	\xB2"\xF6\xABh#\xD9RH\x9A\xE5-\xC9`\xB8	\x9C&gJo4\x94!+o1\xE1\xAA\xED<\xA2A\x9CΣEd8Ip\x84&Y4\xDB\xB4\xAFw*\x80k\xA6ɒ>At\xC7`'i\xA1\xF2t+\xDD\xD1d\x9C\xEB\xF5\xBD\xCE[
+BHf\xE6A\xD8p+\xB41\xD9)DCto@'\xA5\xF1<g\x86HY\x93 :\x9E\xE9\xF9\x9CF{b@\xB0\x97if\xD8\xA7\xBD\xDC\x9D\xC5X\xAF\x82\x82e:\xD7\xE0\x92	\xCEKqIow_\xDA"DhW\xCFsO\xAE\xD2\xF8O\xC6\xD2\x9C\xE9\xB5\xAA'\x8ElU\xEC6\x9A\xBCân\xC0\xC8\xF4_\xB7Q\xA6\xD9\xFD\xE0?\x95%0\xC0\x9E.O\xD4\xE2\x9EBjbl6\xEB\x9D\xC4Z0+\xB7L\x85\x92\xD8\xE7\x84mQʞr\xBA\x89\xB2\xBAp\x8B\xAE\xDF\xEB\xFB\xD3\xFEh8\x91g\x8D|u\xF0\x92\x86\xC8\xE4\x9A#d\xAD\xC1\xBF\xD4\xD2X\x95IR^\xC3:{\x91\x9F\x93\x9D\xB13\x83\xDF\xC4A\xF6\x99̗#\xA8\xC2\xC1\xB1wK\xE3`\x98n\xB3P\x86!\x82\x81m\xFE2\x96\xB0*s\xFCA\x95\xB3\xB1\xB5\xACIC\x98\xB7\xAE\xA1dL\x9Eoth\x9D\xDA0W\xC1\xA20\xE9X\x86e\xB6\xCFA\x98+]\x88\xFA\xD3Q\xAC]n\xDBLJR\xF2e=\xC0\xD4L\xFD\x88\xFCM\x9Ah\xF6\xA1\ֽw?U\xE2G<o\\xF4\xE1\xB961rQ\xE6TE\xEA\xE1\xE9Z\xF8\xE2I\x8A\x8F\xEDI\xA8\xD8҄\xBA\xB8pɂ\xFC\x823L\x8A\x9A\x81i\xF6ׅU\xA8\xDA\xCC\xC8}<b\xAE\x82dID\xE1\xBFq`<+Ӕ&\x9D6\xC1 \xD9e
 \xA2\x94N\xEE\xA3,McR\xB6\xBD-Viv\xA8b-\x8A1Ml4\x8D\xD4K\xE4ǘƅWIk\xF9\x90EdE\xB07\xB7\x95\x94U\x83*I\x89\xB85WC&\xB0\xBF\xF5\xC77\xFD\xC9\x81\xA0~\xAF:\xA3a\xD7ŭ\xCE\xE2(\xE7b\xFF]+\xE5\xC0=)(qҦ\xBA\x81t\xBCԞڲNg\x82(Ȁjv\x89l\x837o\xDARͧ\xA4\xBB\xF3x%\xAFf\x82\x9C\xF6l\xDEy\x8D\xD4gjR뺑\xA5w\xE5Wn\xF2:[Y\xB1\x85GPas\x80,R\xAAd2\xA05\x8Fȑ\xF3\xB7R\xBE:WC\x99v`\xCA$͜\xC7D\xB0|\x84}ȶ[xH\xE5<Z\x95\x9E\x83+\xFBN\x8D\xE0vE͖\xD0\xD2\xEB\x8C\xF2\xFA\xFC\xF1\x9DGu\xD4\\xE9\xF8[ꅷW0t\x80\xEC@\x91\xE4B0\xA6\xA9\x9Chr\xD212\x9C\xA9\xE9\xB5|\xC79i\xCF\xD42\x97\xD8\xE6\xCA\xE2I٧\xC0\x9E\x8Bq\xA1\xBF.ۭ\xB6q\x90\ \x95Ϲ\x99[a@1\x91f&K\xB0\x81\xA0\x9B,\xA2n&\x86\x90\x88\x8Cjy\xAC\x8C
+\xF4\x91^\xCFsV\x93\xF6\x90\x98Otb&\x937\xCAw\x9Ak\xB7\xC7\xD6_d\xF9\xC9\xFA>\xD2U\xB6\x82\xB7f\xB0\xCE\xB8Fz`\x94\xD36\xC16~\xD2\xC8Ӓ\xF2\xB4)'W\xFA\xCB\xE8E\x85\xA2p.\xD0	mh#\xCFI\xA6\xEA\xF9\x86Q\xB6\x9FEmQ\xC1
+Xߦ\xE6\x84ZTN\x8A\xEB\xF9\x801f@Hb*\x94\xA47\xD4'$\xB5\x84AJSż:\xE7\x8E \xB1b[m\x8F$p[r\x95\xC9k\xB5\xB5\x8D8\xA4Nl\xBB\xEEBL[\xA7\xE2:\x99\xA7p\xA3@\x9B\xA3\xD5(".\xA3;\xB9;\x96~	\xF5\x86\xC39?'\xE9|\xA9-J6\xFDa]%\xC7\\xF4ȸpC\xE8̄\x89\xE9\xF6\xCD#+\xF3\x9B6{\xF9\xADLG U%'\xEFX	\xF2d\xBC\xCD\x89z\xC8\xC2h\x92`\xB8Ö\xC2$A\xDEd lT\xD7\xFD\xAC\x97\xEAT\xEF%\x9F\xDB{\xA9\xBD\x97\xACz\xAF\xFD*3\xA5*3lSii\x9E\xEAf\x93\x88o\xE1\xA4\xD2}\xA1\xA3_\xD4\xB2\xCB:.;S\xEF*I\xC4;\xB5r\xFDIg\xD0\xEE\xDF\xF8c9\xBD\xF6\xCDyl2\xEAM?\xB6Ǿ\xEAO\xD4\xEDx\xF4\xA1\xDF\xF5\xBB\xEA\xAC=\xC1\xF73O}\xECO\xAFGwS\x85\xE3\xF6p\xFA	\xD5~R?\xF5\x87]O\xFA\xC2Ik2Q\xA3\xB1\xEA\xDF\xDC\xFA~\xDFagp\xD7\xED߫w\xD87щ\xEF\xA6?\xD1鈷ZR}\xFBz\xB2t\xAE\xF1\xB5\xFD\xAE?\xE8O?y\xAAן\x89fD\xDB\xEA\xB6=\x9E\xF6;w\x83\xF6X\xDDލoG88\xB6\x87]\x90\xF6\x87\xBD1\xB8\xF87\xFEp*!Ugt\xFBi\xDC=\xF5\xB0i\x8AIOM\xC7\xED\xAE\xD3\xFF䑄#\xA8<V\xBC\xA4)AC\xF9|B\xE0\xBA
 =(<\x95%+u=t\xB1\xFA\x9D\xE9\xDB8Iq =\xE3\xE7\xA9n\xFB\xA6\xFDޟTti\x99\xD1@VІ\xF7\xFE\xD0\xB7\x9E\x9A\xDC\xFA\x9D>+]\xECw\xA6\x8C\xE0\x86\xF2\x96=\xC5\xC4\xFF\xF9X'-\xD8\xE0\xDAg\x90\xB9\x8D\xFF;\xE4\x8A5BC\xA23\x8D\xA7\xA5(\xFB\xDFS\xEDqdo<\x82\xB8dB\xEC \xA3\xDFB\xB2\xD7\xD0\xCAKf\xA1\xB9C\x87\xC0*\xDA-\x8D\x82]\xBF=\xC1	\x89q\xB0\xB6%_\xE8\xD2\xE2\xFFE\x85\x91\xDAW_yӋ\x91\xA4\xC9\xC5,\xDE\\xE0\xFC\x8A\xF33\xB2\x96\xE0\x94K\xFB\xD7\xF53|\xD5K\x9C\xBF1pW\xDC=\x91ڿvB\xFF\xA4\xA1%.\xF1\xF9\xD6^\xAD?\xCEͬ{-~\xC0\xD3?\xE2\xC7\xFD\x93A\xD7K\xD1;\xA9׭K\xF5VH\x85\xB9\xD7?\\xFC\xF1\x82nr\xBEV\xAF\xFDW\xB9\x97̽ş\xA4\x83p\xB5\xF0\xF2\xF2U\xEB\xF2\xF2R}-\xA3\xAF\xF9\x97/\xE2\xF4]\x8F\xF8"F\xEB\x9Dx\x9Cc```e```b \xE6\xE2F\x98e\x8B3C\xC5Y4\x804\x90fd`bP`\x88\xFF\xFF\xC8\xD3\xFF\xFE_\xD5\xC7\xC0\xC0&\xA0<\xB0\xA9\x88\x87b&\xC6+`\xB2\x9F\xF1\xDD \xFEQ\xCF\xC8\xC67 $O0Q\xA6\x9D\xF6\
 x97\xF2;x\x9Cc`f\x83\xFF\xCDF@\x8A\x91+(U\xB9x\x9C\x8DRKK\xEB@>\xA7\xC9m\xB9\xB5\xADZ_\xE2%h}!-\xAD\xA8\xB8\xA0\xDC\xDD]\xB80\x9BX\xA2bSb\xEE%׭\x8F\xF1\xB5w㏘\x95\x90?\xD0\xE0_p-d\xD3\xE2L\xAB"\xB8q`>\xCE\xCC\xF7\x9D\xEF\x9C\x82,"fkV\xAD\xB0sP/Xu\xC3\xD6\xCB>\x8CB\x81uG6c\x93\xCBɗ)$$tC\xF7\x87O\xDD
+@\x8F\x82R\xAF\xBF\x94\xD8b\xD2"%i\xE8\x83a\x81Q\x87\x98\x87%\xD8\xFE\x95W\xE7J\xA5\xA3\xF2\xDA\xDAz\xCB\xA3\xE6\xB6i\xEC:vuo\xDFq\xAC\xFA\x8E\xC5\xF1`߲\xAB\xFF\xAC\x9A\xA3\x9Bdž\xEDT+\xBA\xB9b\xD5\xFF\xB65\xEATeZ\x9D-\x95ԍ=ݬ\xEA\xEA\x9F\xE2\xEF\xE2\x97濾\x86/\x84e<\xC53<\xC7$x\x89Wx\x8D7x\xDB\xE9zƠ\xC4;݄-8\x81;x\x80GxF\x87\x88\xC7z^@=\xC9sA\xB1\x95\x8B{Q4\xC0\x8D\x89L\x86\xFF\xF2-YM~\xF7p\xCC\xF2\xBE\x86$\x96\xF45\x96q\xC4\xF1\x85cđ\xE5\xE3\xEF2\xC2UD\xA2\x80\xFAZ\x93
+\xD1)\xAE\xA4\x80r\x8F\xD0\xB9M\xFA\xA2TЂ\xF9T"\xA0"n\xB9k\xF2\xCE9tE\xE5\x80\xE75iĩ\xB7\xD6\xDA\xF7-W8}rE\xE2\x99\xD0\xED'$\x95\xF4\xB5\xA40N\xA5|\xAD\xAB\xA4\xF9,\xF4\x89\x89\xFA)\xA6\x84gw\xBD\x9E(\xEC\x8Fx\x9Cc```d\x82\xCB"\xEA\xF9`\xFA\xC9\xC42+AZ\xFBx\x9Cc`d``\xE0bx\xC0\xE8\xC4\xC0`\xC3z\x87\x814pJk\xA1vc\xEA\x8C j\xC14\x8C\x8Dd\x8A\xB8v\xCC(\xCA\xC0\xF0\xF7*\x90m\xC3\xC0\xC1\xA0\xA4-$X\xB1\xDA\xC6\xC4\xC0\x84 9F\xB0#\xAA1\x83P\x9FN\x97BT1\x8A1ʀ\xCD\xAAUڧvDFY.@\\xC4k\xA0\xFAY؁*\x8D\x98_\xD9\xDCP#1\xB8\xD8P\xD1\xF15<t\x9Dl*
+x\x9Cc~\xC1\xC0\xC0\xC4\xD8\xE32Hh
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (205110 => 205111)


--- trunk/Source/WebCore/ChangeLog	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/ChangeLog	2016-08-29 06:55:59 UTC (rev 205111)
@@ -1,3 +1,42 @@
+2016-08-25  Frederic Wang  <[email protected]>
+
+        Add support for non-BMP operators U+1EEF0 and U+1EEF1
+        https://bugs.webkit.org/show_bug.cgi?id=153984
+
+        Reviewed by Darin Adler.
+
+        Tests: mathml/presentation/non-bmp-operators-spacing.html
+               mathml/presentation/non-bmp-operators-stretching.html
+
+        * mathml/MathMLOperatorDictionary.cpp: We move the definition of operator dictionary Entry
+        here as it is not used by external code.
+        We now also accept non-BMP operators and add entries for U+1EEF0 and U+1EEF1.
+        (WebCore::extractProperty): Helper function to convert from Entry structure to a Property
+        structure.
+        (WebCore::MathMLOperatorDictionary::search): This function now accepts a non-BMP parameter
+        and returns a Property structure.
+        (WebCore::MathMLOperatorDictionary::isVertical): This function now accepts a non-BMP parameter.
+        * mathml/MathMLOperatorDictionary.h: Replace the Entry structure with a Property structure
+        which was used by MathMLOperatorElement. Update the signatures of search and isVertical.
+        * mathml/MathMLOperatorElement.cpp:
+        (WebCore::MathMLOperatorElement::parseOperatorChar): Remove the special case that excludes
+        non-BMP operators.
+        (WebCore::MathMLOperatorElement::computeDictionaryProperty): Rename the property structure
+        to use the one moved into MathMLOperatorDictionary.h. We no longer need to convert the result
+        of the search call.
+        (WebCore::MathMLOperatorElement::dictionaryProperty): Rename the property structure.
+        * mathml/MathMLOperatorElement.h: Make OperatorChar accept non-BMP operators.
+        MathMLOperatorElement::DictionaryProperty is now moved into MathMLOperatorDictionary
+        and renamed Property.
+        * rendering/mathml/MathOperator.cpp: Accept non-BMP operators.
+        * rendering/mathml/MathOperator.h: Ditto.
+        * rendering/mathml/RenderMathMLFencedOperator.cpp:
+        (WebCore::RenderMathMLFencedOperator::updateOperatorContent):  Adjust code to use the new
+        return type of MathMLOperatorDictionary::search.
+        * rendering/mathml/RenderMathMLFencedOperator.h: Accept non-BMP operators.
+        * rendering/mathml/RenderMathMLOperator.cpp: Ditto.
+        * rendering/mathml/RenderMathMLOperator.h: Ditto.
+
 2016-08-28  Youenn Fablet  <[email protected]>
 
         [Fetch API] Ensure response cloning works when data is loading

Modified: trunk/Source/WebCore/mathml/MathMLOperatorDictionary.cpp (205110 => 205111)


--- trunk/Source/WebCore/mathml/MathMLOperatorDictionary.cpp	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/mathml/MathMLOperatorDictionary.cpp	2016-08-29 06:55:59 UTC (rev 205111)
@@ -32,13 +32,29 @@
 
 using namespace MathMLOperatorDictionary;
 
-typedef std::pair<UChar, Form> Key;
+typedef std::pair<UChar32, Form> Key;
+struct Entry {
+    UChar32 character;
+    unsigned form : 2;
+    unsigned lspace : 3;
+    unsigned rspace : 3;
+    unsigned flags : 8;
+};
 static inline Key ExtractKey(const Entry* entry) { return Key(entry->character, static_cast<Form>(entry->form)); }
-static inline UChar ExtractChar(const Entry* entry) { return entry->character; }
+static inline UChar32 ExtractChar(const Entry* entry) { return entry->character; }
+static inline Property ExtractProperty(const Entry& entry)
+{
+    Property property;
+    property.form = static_cast<Form>(entry.form);
+    property.leadingSpaceInMathUnit = entry.lspace;
+    property.trailingSpaceInMathUnit = entry.rspace;
+    property.flags = entry.flags;
+    return property;
+}
 
 // This table has been automatically generated from the Operator Dictionary of the MathML3 specification (appendix C).
 // Some people use the binary operator "U+2225 PARALLEL TO" as an opening and closing delimiter, so we add the corresponding stretchy prefix and postfix forms.
-static const unsigned dictionarySize = 1041;
+static const unsigned dictionarySize = 1043;
 static const Entry dictionary[dictionarySize] = {
     { 0x21, Postfix, 1, 0, 0}, // EXCLAMATION MARK
     { 0x25, Infix, 3, 3, 0}, // PERCENT SIGN
@@ -1080,16 +1096,18 @@
     { 0x2AFE, Infix, 3, 3, 0}, // WHITE VERTICAL BAR
     { 0x2AFF, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY WHITE VERTICAL BAR
     { 0x2B45, Infix, 5, 5, Stretchy}, // LEFTWARDS QUADRUPLE ARROW
-    { 0x2B46, Infix, 5, 5, Stretchy} // RIGHTWARDS QUADRUPLE ARROW
+    { 0x2B46, Infix, 5, 5, Stretchy}, // RIGHTWARDS QUADRUPLE ARROW
+    { 0x1EEF0, Prefix, 0, 0, Stretchy }, // ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL
+    { 0x1EEF1, Prefix, 0, 0, Stretchy } // ARABIC MATHEMATICAL OPERATOR HAH WITH DAL
 };
 
 // A list of operators that stretch in the horizontal direction. This has been generated from Mozilla's MathML operator dictionary.
-static inline UChar ExtractKeyHorizontal(const UChar* entry) { return *entry; }
-static const UChar horizontalOperators[] = {
-    0x003D, 0x005E, 0x005F, 0x007E, 0x00AF, 0x02C6, 0x02C7, 0x02C9, 0x02CD, 0x02DC, 0x02F7, 0x0302, 0x0332, 0x203E, 0x20D0, 0x20D1, 0x20D6, 0x20D7, 0x20E1, 0x2190, 0x2192, 0x2194, 0x2198, 0x2199, 0x219C, 0x219D, 0x219E, 0x21A0, 0x21A2, 0x21A3, 0x21A4, 0x21A6, 0x21A9, 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21B4, 0x21B9, 0x21BC, 0x21BD, 0x21C0, 0x21C1, 0x21C4, 0x21C6, 0x21C7, 0x21C9, 0x21CB, 0x21CC, 0x21D0, 0x21D2, 0x21D4, 0x21DA, 0x21DB, 0x21DC, 0x21DD, 0x21E0, 0x21E2, 0x21E4, 0x21E5, 0x21E6, 0x21E8, 0x21F0, 0x21F6, 0x21FD, 0x21FE, 0x21FF, 0x23B4, 0x23B5, 0x23DC, 0x23DD, 0x23DE, 0x23DF, 0x23E0, 0x23E1, 0x2500, 0x27F5, 0x27F6, 0x27F7, 0x27F8, 0x27F9, 0x27FA, 0x27FB, 0x27FC, 0x27FD, 0x27FE, 0x27FF, 0x290C, 0x290D, 0x290E, 0x290F, 0x2910, 0x294E, 0x2950, 0x2952, 0x2953, 0x2956, 0x2957, 0x295A, 0x295B, 0x295E, 0x295F, 0x2B45, 0x2B46, 0xFE35, 0xFE36, 0xFE37, 0xFE38
+static inline UChar32 ExtractKeyHorizontal(const UChar32* entry) { return *entry; }
+static const UChar32 horizontalOperators[] = {
+    0x003D, 0x005E, 0x005F, 0x007E, 0x00AF, 0x02C6, 0x02C7, 0x02C9, 0x02CD, 0x02DC, 0x02F7, 0x0302, 0x0332, 0x203E, 0x20D0, 0x20D1, 0x20D6, 0x20D7, 0x20E1, 0x2190, 0x2192, 0x2194, 0x2198, 0x2199, 0x219C, 0x219D, 0x219E, 0x21A0, 0x21A2, 0x21A3, 0x21A4, 0x21A6, 0x21A9, 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21B4, 0x21B9, 0x21BC, 0x21BD, 0x21C0, 0x21C1, 0x21C4, 0x21C6, 0x21C7, 0x21C9, 0x21CB, 0x21CC, 0x21D0, 0x21D2, 0x21D4, 0x21DA, 0x21DB, 0x21DC, 0x21DD, 0x21E0, 0x21E2, 0x21E4, 0x21E5, 0x21E6, 0x21E8, 0x21F0, 0x21F6, 0x21FD, 0x21FE, 0x21FF, 0x23B4, 0x23B5, 0x23DC, 0x23DD, 0x23DE, 0x23DF, 0x23E0, 0x23E1, 0x2500, 0x27F5, 0x27F6, 0x27F7, 0x27F8, 0x27F9, 0x27FA, 0x27FB, 0x27FC, 0x27FD, 0x27FE, 0x27FF, 0x290C, 0x290D, 0x290E, 0x290F, 0x2910, 0x294E, 0x2950, 0x2952, 0x2953, 0x2956, 0x2957, 0x295A, 0x295B, 0x295E, 0x295F, 0x2B45, 0x2B46, 0xFE35, 0xFE36, 0xFE37, 0xFE38, 0x1EEF0, 0x1EEF1
 };
 
-Optional<Entry> MathMLOperatorDictionary::search(UChar character, Form form, bool explicitForm)
+Optional<Property> MathMLOperatorDictionary::search(UChar32 character, Form form, bool explicitForm)
 {
     if (!character)
         return Nullopt;
@@ -1096,7 +1114,7 @@
 
     // We try and find the default values from the operator dictionary.
     if (auto* entry = tryBinarySearch<const Entry, Key>(dictionary, dictionarySize, Key(character, form), ExtractKey))
-        return *entry;
+        return ExtractProperty(*entry);
 
     if (explicitForm)
         return Nullopt;
@@ -1103,21 +1121,21 @@
 
     // If we did not find the desired operator form and if it was not set explicitely, we use the first one in the following order: Infix, Prefix, Postfix.
     // This is to handle bad MathML markup without explicit <mrow> delimiters like "<mo>(</mo><mi>a</mi><mo>)</mo><mo>(</mo><mi>b</mi><mo>)</mo>" where innerfences should not be considered infix.
-    if (auto* entry = tryBinarySearch<const Entry, UChar>(dictionary, dictionarySize, character, ExtractChar)) {
+    if (auto* entry = tryBinarySearch<const Entry, UChar32>(dictionary, dictionarySize, character, ExtractChar)) {
         // There are at most two other entries before the one found.
         if (entry != dictionary && (entry - 1)->character == character)
             entry--;
         if (entry != dictionary && (entry - 1)->character == character)
             entry--;
-        return *entry;
+        return ExtractProperty(*entry);
     }
 
     return Nullopt;
 }
 
-bool MathMLOperatorDictionary::isVertical(UChar textContent)
+bool MathMLOperatorDictionary::isVertical(UChar32 textContent)
 {
-    return !tryBinarySearch<const UChar, UChar>(horizontalOperators, WTF_ARRAY_LENGTH(horizontalOperators), textContent, ExtractKeyHorizontal);
+    return !tryBinarySearch<const UChar32, UChar32>(horizontalOperators, WTF_ARRAY_LENGTH(horizontalOperators), textContent, ExtractKeyHorizontal);
 }
 
 }

Modified: trunk/Source/WebCore/mathml/MathMLOperatorDictionary.h (205110 => 205111)


--- trunk/Source/WebCore/mathml/MathMLOperatorDictionary.h	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/mathml/MathMLOperatorDictionary.h	2016-08-29 06:55:59 UTC (rev 205111)
@@ -44,15 +44,16 @@
     Symmetric = 0x40
 };
 const unsigned allFlags = Accent | Fence | LargeOp | MovableLimits | Separator | Stretchy | Symmetric;
-struct Entry {
-    UChar character;
-    unsigned form : 2;
-    unsigned lspace : 3;
-    unsigned rspace : 3;
-    unsigned flags : 8;
+struct Property {
+    MathMLOperatorDictionary::Form form;
+    // Default leading and trailing spaces are "thickmathspace".
+    unsigned short leadingSpaceInMathUnit { 5 };
+    unsigned short trailingSpaceInMathUnit { 5 };
+    // Default operator properties are all set to "false".
+    unsigned short flags { 0 };
 };
-Optional<Entry> search(UChar, Form, bool explicitForm);
-bool isVertical(UChar);
+Optional<Property> search(UChar32, Form, bool explicitForm);
+bool isVertical(UChar32);
 }
 
 }

Modified: trunk/Source/WebCore/mathml/MathMLOperatorElement.cpp (205110 => 205111)


--- trunk/Source/WebCore/mathml/MathMLOperatorElement.cpp	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/mathml/MathMLOperatorElement.cpp	2016-08-29 06:55:59 UTC (rev 205111)
@@ -52,15 +52,12 @@
     OperatorChar operatorChar;
     // FIXME: This operator dictionary does not accept multiple characters (https://webkit.org/b/124828).
     if (auto codePoint = convertToSingleCodePoint(string)) {
-        // FIXME: MathMLOperatorDictionary/RenderMathMLOperator/MathOperator do not support non-BMP characters (https://webkit.org/b/122296).
-        if (U_IS_BMP(codePoint.value())) {
-            UChar character = codePoint.value();
-            // The minus sign renders better than the hyphen sign used in some MathML formulas.
-            if (character == hyphenMinus)
-                character = minusSign;
-            operatorChar.character = character;
-            operatorChar.isVertical = MathMLOperatorDictionary::isVertical(operatorChar.character);
-        }
+        auto character = codePoint.value();
+        // The minus sign renders better than the hyphen sign used in some MathML formulas.
+        if (character == hyphenMinus)
+            character = minusSign;
+        operatorChar.character = character;
+        operatorChar.isVertical = isVertical(operatorChar.character);
     }
     return operatorChar;
 }
@@ -72,9 +69,9 @@
     return m_operatorChar.value();
 }
 
-MathMLOperatorElement::DictionaryProperty MathMLOperatorElement::computeDictionaryProperty()
+Property MathMLOperatorElement::computeDictionaryProperty()
 {
-    DictionaryProperty dictionaryProperty;
+    Property dictionaryProperty;
 
     // We first determine the form attribute and use the default spacing and properties.
     const auto& value = attributeWithoutSynchronization(formAttr);
@@ -97,17 +94,13 @@
     }
 
     // We then try and find an entry in the operator dictionary to override the default values.
-    if (auto entry = search(operatorChar().character, dictionaryProperty.form, explicitForm)) {
-        dictionaryProperty.form = static_cast<MathMLOperatorDictionary::Form>(entry.value().form);
-        dictionaryProperty.leadingSpaceInMathUnit = entry.value().lspace;
-        dictionaryProperty.trailingSpaceInMathUnit = entry.value().rspace;
-        dictionaryProperty.flags = entry.value().flags;
-    }
+    if (auto entry = search(operatorChar().character, dictionaryProperty.form, explicitForm))
+        dictionaryProperty = entry.value();
 
     return dictionaryProperty;
 }
 
-const MathMLOperatorElement::DictionaryProperty& MathMLOperatorElement::dictionaryProperty()
+const Property& MathMLOperatorElement::dictionaryProperty()
 {
     if (!m_dictionaryProperty)
         m_dictionaryProperty = computeDictionaryProperty();

Modified: trunk/Source/WebCore/mathml/MathMLOperatorElement.h (205110 => 205111)


--- trunk/Source/WebCore/mathml/MathMLOperatorElement.h	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/mathml/MathMLOperatorElement.h	2016-08-29 06:55:59 UTC (rev 205111)
@@ -36,7 +36,7 @@
 public:
     static Ref<MathMLOperatorElement> create(const QualifiedName& tagName, Document&);
     struct OperatorChar {
-        UChar character { 0 };
+        UChar32 character { 0 };
         bool isVertical { true };
     };
     static OperatorChar parseOperatorChar(const String&);
@@ -59,17 +59,9 @@
 
     Optional<OperatorChar> m_operatorChar;
 
-    struct DictionaryProperty {
-        MathMLOperatorDictionary::Form form;
-        // Default leading and trailing spaces are "thickmathspace".
-        unsigned short leadingSpaceInMathUnit { 5 };
-        unsigned short trailingSpaceInMathUnit { 5 };
-        // Default operator properties are all set to "false".
-        unsigned short flags { 0 };
-    };
-    Optional<DictionaryProperty> m_dictionaryProperty;
-    DictionaryProperty computeDictionaryProperty();
-    const DictionaryProperty& dictionaryProperty();
+    Optional<MathMLOperatorDictionary::Property> m_dictionaryProperty;
+    MathMLOperatorDictionary::Property computeDictionaryProperty();
+    const MathMLOperatorDictionary::Property& dictionaryProperty();
 
     struct OperatorProperties {
         unsigned short flags;

Modified: trunk/Source/WebCore/rendering/mathml/MathOperator.cpp (205110 => 205111)


--- trunk/Source/WebCore/rendering/mathml/MathOperator.cpp	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/rendering/mathml/MathOperator.cpp	2016-08-29 06:55:59 UTC (rev 205111)
@@ -60,7 +60,7 @@
 
 // FIXME: This hardcoded data can be removed when OpenType MATH font are widely available (http://wkbug/156837).
 struct StretchyCharacter {
-    UChar character;
+    UChar32 character;
     UChar topChar;
     UChar extensionChar;
     UChar bottomChar;
@@ -85,7 +85,7 @@
     { 0x222b, 0x2320, 0x23ae, 0x2321, 0x0    } // integral sign
 };
 
-void MathOperator::setOperator(const RenderStyle& style, UChar baseCharacter, Type operatorType)
+void MathOperator::setOperator(const RenderStyle& style, UChar32 baseCharacter, Type operatorType)
 {
     m_baseCharacter = baseCharacter;
     m_operatorType = operatorType;
@@ -121,7 +121,7 @@
     return m_operatorType == Type::VerticalOperator ? m_ascent + m_descent : m_width;
 }
 
-bool MathOperator::getGlyph(const RenderStyle& style, UChar character, GlyphData& glyph) const
+bool MathOperator::getGlyph(const RenderStyle& style, UChar32 character, GlyphData& glyph) const
 {
     glyph = style.fontCascade().glyphDataForCharacter(character, !style.isLeftToRightDirection());
     return glyph.font && glyph.font == &style.fontCascade().primaryFont();
@@ -171,7 +171,7 @@
 // See https://www.w3.org/TR/MathML/chapter7.html#chars.comb-chars
 // However, many math fonts do not provide constructions for the non-combining equivalent.
 const unsigned maxFallbackPerCharacter = 3;
-static const UChar characterFallback[][maxFallbackPerCharacter] = {
+static const UChar32 characterFallback[][maxFallbackPerCharacter] = {
     { 0x005E, 0x0302, 0 }, // CIRCUMFLEX ACCENT
     { 0x005F, 0x0332, 0 }, // LOW LINE
     { 0x007E, 0x0303, 0 }, // TILDE

Modified: trunk/Source/WebCore/rendering/mathml/MathOperator.h (205110 => 205111)


--- trunk/Source/WebCore/rendering/mathml/MathOperator.h	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/rendering/mathml/MathOperator.h	2016-08-29 06:55:59 UTC (rev 205111)
@@ -41,7 +41,7 @@
 public:
     MathOperator() { }
     enum class Type { NormalOperator, DisplayOperator, VerticalOperator, HorizontalOperator };
-    void setOperator(const RenderStyle&, UChar baseCharacter, Type);
+    void setOperator(const RenderStyle&, UChar32 baseCharacter, Type);
     void reset(const RenderStyle&);
 
     LayoutUnit width() const { return m_width; }
@@ -73,7 +73,7 @@
     };
 
     LayoutUnit stretchSize() const;
-    bool getGlyph(const RenderStyle&, UChar character, GlyphData&) const;
+    bool getGlyph(const RenderStyle&, UChar32 character, GlyphData&) const;
     bool getBaseGlyph(const RenderStyle& style, GlyphData& baseGlyph) const { return getGlyph(style, m_baseCharacter, baseGlyph); }
     void setSizeVariant(const GlyphData&);
     void setGlyphAssembly(const GlyphAssemblyData&);
@@ -88,7 +88,7 @@
     void paintVerticalGlyphAssembly(const RenderStyle&, PaintInfo&, const LayoutPoint&);
     void paintHorizontalGlyphAssembly(const RenderStyle&, PaintInfo&, const LayoutPoint&);
 
-    UChar m_baseCharacter { 0 };
+    UChar32 m_baseCharacter { 0 };
     Type m_operatorType { Type::NormalOperator };
     StretchType m_stretchType { StretchType::Unstretched };
     union {

Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.cpp (205110 => 205111)


--- trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.cpp	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.cpp	2016-08-29 06:55:59 UTC (rev 205111)
@@ -50,8 +50,8 @@
     // We try and read spacing and boolean properties from the operator dictionary.
     // However we preserve the Fence and Separator properties specified in the constructor.
     if (auto entry = search(m_operatorChar.character, m_operatorForm, true)) {
-        m_leadingSpaceInMathUnit = entry.value().lspace;
-        m_trailingSpaceInMathUnit = entry.value().rspace;
+        m_leadingSpaceInMathUnit = entry.value().leadingSpaceInMathUnit;
+        m_trailingSpaceInMathUnit = entry.value().trailingSpaceInMathUnit;
         m_operatorFlags = (m_operatorFlags & (MathMLOperatorDictionary::Fence | MathMLOperatorDictionary::Separator)) | entry.value().flags;
     } else {
         m_operatorFlags &= MathMLOperatorDictionary::Fence | MathMLOperatorDictionary::Separator; // Flags are disabled by default.

Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.h (205110 => 205111)


--- trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.h	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.h	2016-08-29 06:55:59 UTC (rev 205111)
@@ -41,7 +41,7 @@
 private:
     bool isRenderMathMLFencedOperator() const final { return true; }
     bool isVertical() const final { return m_operatorChar.isVertical; }
-    UChar textContent() const final { return m_operatorChar.character; }
+    UChar32 textContent() const final { return m_operatorChar.character; }
     LayoutUnit leadingSpace() const final;
     LayoutUnit trailingSpace() const final;
 

Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp (205110 => 205111)


--- trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp	2016-08-29 06:55:59 UTC (rev 205111)
@@ -62,7 +62,7 @@
     return static_cast<MathMLOperatorElement&>(nodeForNonAnonymous());
 }
 
-UChar RenderMathMLOperator::textContent() const
+UChar32 RenderMathMLOperator::textContent() const
 {
     return element().operatorChar().character;
 }
@@ -70,7 +70,7 @@
 bool RenderMathMLOperator::isInvisibleOperator() const
 {
     // The following operators are invisible: U+2061 FUNCTION APPLICATION, U+2062 INVISIBLE TIMES, U+2063 INVISIBLE SEPARATOR, U+2064 INVISIBLE PLUS.
-    UChar character = textContent();
+    UChar32 character = textContent();
     return 0x2061 <= character && character <= 0x2064;
 }
 

Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.h (205110 => 205111)


--- trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.h	2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.h	2016-08-29 06:55:59 UTC (rev 205111)
@@ -55,7 +55,7 @@
 
     void updateTokenContent() final;
     void updateFromElement() final;
-    virtual UChar textContent() const;
+    virtual UChar32 textContent() const;
 
 protected:
     virtual void updateMathOperator();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to