<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[205111] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/205111">205111</a></dd>
<dt>Author</dt> <dd>fred.wang@free.fr</dd>
<dt>Date</dt> <dd>2016-08-28 23:55:59 -0700 (Sun, 28 Aug 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>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 <fwang@igalia.com> 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 <fwang@igalia.com> 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.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoremathmlMathMLOperatorDictionarycpp">trunk/Source/WebCore/mathml/MathMLOperatorDictionary.cpp</a></li>
<li><a href="#trunkSourceWebCoremathmlMathMLOperatorDictionaryh">trunk/Source/WebCore/mathml/MathMLOperatorDictionary.h</a></li>
<li><a href="#trunkSourceWebCoremathmlMathMLOperatorElementcpp">trunk/Source/WebCore/mathml/MathMLOperatorElement.cpp</a></li>
<li><a href="#trunkSourceWebCoremathmlMathMLOperatorElementh">trunk/Source/WebCore/mathml/MathMLOperatorElement.h</a></li>
<li><a href="#trunkSourceWebCorerenderingmathmlMathOperatorcpp">trunk/Source/WebCore/rendering/mathml/MathOperator.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingmathmlMathOperatorh">trunk/Source/WebCore/rendering/mathml/MathOperator.h</a></li>
<li><a href="#trunkSourceWebCorerenderingmathmlRenderMathMLFencedOperatorcpp">trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingmathmlRenderMathMLFencedOperatorh">trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.h</a></li>
<li><a href="#trunkSourceWebCorerenderingmathmlRenderMathMLOperatorcpp">trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingmathmlRenderMathMLOperatorh">trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.h</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsmathmlpresentationnonbmpoperatorsspacingexpectedhtml">trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing-expected.html</a></li>
<li><a href="#trunkLayoutTestsmathmlpresentationnonbmpoperatorsspacinghtml">trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing.html</a></li>
<li><a href="#trunkLayoutTestsmathmlpresentationnonbmpoperatorsstretchingexpectedhtml">trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching-expected.html</a></li>
<li><a href="#trunkLayoutTestsmathmlpresentationnonbmpoperatorsstretchinghtml">trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching.html</a></li>
<li><a href="#trunkLayoutTestsmathmlpresentationnonbmpoperatorswoff">trunk/LayoutTests/mathml/presentation/non-bmp-operators.woff</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-08-29 06:49:42 UTC (rev 205110)
+++ trunk/LayoutTests/ChangeLog        2016-08-29 06:55:59 UTC (rev 205111)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2016-08-25 Frederic Wang <fwang@igalia.com>
+
+ 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.
+
</ins><span class="cx"> 2016-08-28 Youenn Fablet <youenn@apple.com>
</span><span class="cx">
</span><span class="cx"> [Fetch API] Ensure response cloning works when data is loading
</span></span></pre></div>
<a id="trunkLayoutTestsmathmlpresentationnonbmpoperatorsspacingexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing-expected.html (0 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,58 @@
</span><ins>+<!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>
</ins><span class="cx">Property changes on: trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing-expected.html
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+LF
</ins><span class="cx">\ No newline at end of property
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+text/html
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkLayoutTestsmathmlpresentationnonbmpoperatorsspacinghtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing.html (0 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,59 @@
</span><ins>+<!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>
</ins><span class="cx">Property changes on: trunk/LayoutTests/mathml/presentation/non-bmp-operators-spacing.html
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+LF
</ins><span class="cx">\ No newline at end of property
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+text/html
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkLayoutTestsmathmlpresentationnonbmpoperatorsstretchingexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching-expected.html (0 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+<!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>
</ins><span class="cx">Property changes on: trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching-expected.html
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+LF
</ins><span class="cx">\ No newline at end of property
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+text/html
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkLayoutTestsmathmlpresentationnonbmpoperatorsstretchinghtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching.html (0 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+<!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>
</ins><span class="cx">Property changes on: trunk/LayoutTests/mathml/presentation/non-bmp-operators-stretching.html
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+LF
</ins><span class="cx">\ No newline at end of property
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+text/html
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkLayoutTestsmathmlpresentationnonbmpoperatorswoff"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/mathml/presentation/non-bmp-operators.woff (0 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+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\x9C0\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\x8EcLm\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\xEDI\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\xAAd2\xA05\x8Fȑ\xF3\xB7R\xBE:WC\x99v`\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\x9Chr\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\x9B6{\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;\xA9K\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\xCDF@\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^@=\xC9sA\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
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2016-08-25 Frederic Wang <fwang@igalia.com>
+
+ 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.
+
</ins><span class="cx"> 2016-08-28 Youenn Fablet <youenn@apple.com>
</span><span class="cx">
</span><span class="cx"> [Fetch API] Ensure response cloning works when data is loading
</span></span></pre></div>
<a id="trunkSourceWebCoremathmlMathMLOperatorDictionarycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/mathml/MathMLOperatorDictionary.cpp (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -32,13 +32,29 @@
</span><span class="cx">
</span><span class="cx"> using namespace MathMLOperatorDictionary;
</span><span class="cx">
</span><del>-typedef std::pair<UChar, Form> Key;
</del><ins>+typedef std::pair<UChar32, Form> Key;
+struct Entry {
+ UChar32 character;
+ unsigned form : 2;
+ unsigned lspace : 3;
+ unsigned rspace : 3;
+ unsigned flags : 8;
+};
</ins><span class="cx"> static inline Key ExtractKey(const Entry* entry) { return Key(entry->character, static_cast<Form>(entry->form)); }
</span><del>-static inline UChar ExtractChar(const Entry* entry) { return entry->character; }
</del><ins>+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;
+}
</ins><span class="cx">
</span><span class="cx"> // This table has been automatically generated from the Operator Dictionary of the MathML3 specification (appendix C).
</span><span class="cx"> // 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.
</span><del>-static const unsigned dictionarySize = 1041;
</del><ins>+static const unsigned dictionarySize = 1043;
</ins><span class="cx"> static const Entry dictionary[dictionarySize] = {
</span><span class="cx"> { 0x21, Postfix, 1, 0, 0}, // EXCLAMATION MARK
</span><span class="cx"> { 0x25, Infix, 3, 3, 0}, // PERCENT SIGN
</span><span class="lines">@@ -1080,16 +1096,18 @@
</span><span class="cx"> { 0x2AFE, Infix, 3, 3, 0}, // WHITE VERTICAL BAR
</span><span class="cx"> { 0x2AFF, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY WHITE VERTICAL BAR
</span><span class="cx"> { 0x2B45, Infix, 5, 5, Stretchy}, // LEFTWARDS QUADRUPLE ARROW
</span><del>- { 0x2B46, Infix, 5, 5, Stretchy} // RIGHTWARDS QUADRUPLE ARROW
</del><ins>+ { 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
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> // A list of operators that stretch in the horizontal direction. This has been generated from Mozilla's MathML operator dictionary.
</span><del>-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
</del><ins>+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
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-Optional<Entry> MathMLOperatorDictionary::search(UChar character, Form form, bool explicitForm)
</del><ins>+Optional<Property> MathMLOperatorDictionary::search(UChar32 character, Form form, bool explicitForm)
</ins><span class="cx"> {
</span><span class="cx"> if (!character)
</span><span class="cx"> return Nullopt;
</span><span class="lines">@@ -1096,7 +1114,7 @@
</span><span class="cx">
</span><span class="cx"> // We try and find the default values from the operator dictionary.
</span><span class="cx"> if (auto* entry = tryBinarySearch<const Entry, Key>(dictionary, dictionarySize, Key(character, form), ExtractKey))
</span><del>- return *entry;
</del><ins>+ return ExtractProperty(*entry);
</ins><span class="cx">
</span><span class="cx"> if (explicitForm)
</span><span class="cx"> return Nullopt;
</span><span class="lines">@@ -1103,21 +1121,21 @@
</span><span class="cx">
</span><span class="cx"> // 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.
</span><span class="cx"> // 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.
</span><del>- if (auto* entry = tryBinarySearch<const Entry, UChar>(dictionary, dictionarySize, character, ExtractChar)) {
</del><ins>+ if (auto* entry = tryBinarySearch<const Entry, UChar32>(dictionary, dictionarySize, character, ExtractChar)) {
</ins><span class="cx"> // There are at most two other entries before the one found.
</span><span class="cx"> if (entry != dictionary && (entry - 1)->character == character)
</span><span class="cx"> entry--;
</span><span class="cx"> if (entry != dictionary && (entry - 1)->character == character)
</span><span class="cx"> entry--;
</span><del>- return *entry;
</del><ins>+ return ExtractProperty(*entry);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> return Nullopt;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool MathMLOperatorDictionary::isVertical(UChar textContent)
</del><ins>+bool MathMLOperatorDictionary::isVertical(UChar32 textContent)
</ins><span class="cx"> {
</span><del>- return !tryBinarySearch<const UChar, UChar>(horizontalOperators, WTF_ARRAY_LENGTH(horizontalOperators), textContent, ExtractKeyHorizontal);
</del><ins>+ return !tryBinarySearch<const UChar32, UChar32>(horizontalOperators, WTF_ARRAY_LENGTH(horizontalOperators), textContent, ExtractKeyHorizontal);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoremathmlMathMLOperatorDictionaryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/mathml/MathMLOperatorDictionary.h (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -44,15 +44,16 @@
</span><span class="cx"> Symmetric = 0x40
</span><span class="cx"> };
</span><span class="cx"> const unsigned allFlags = Accent | Fence | LargeOp | MovableLimits | Separator | Stretchy | Symmetric;
</span><del>-struct Entry {
- UChar character;
- unsigned form : 2;
- unsigned lspace : 3;
- unsigned rspace : 3;
- unsigned flags : 8;
</del><ins>+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 };
</ins><span class="cx"> };
</span><del>-Optional<Entry> search(UChar, Form, bool explicitForm);
-bool isVertical(UChar);
</del><ins>+Optional<Property> search(UChar32, Form, bool explicitForm);
+bool isVertical(UChar32);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoremathmlMathMLOperatorElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/mathml/MathMLOperatorElement.cpp (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -52,15 +52,12 @@
</span><span class="cx"> OperatorChar operatorChar;
</span><span class="cx"> // FIXME: This operator dictionary does not accept multiple characters (https://webkit.org/b/124828).
</span><span class="cx"> if (auto codePoint = convertToSingleCodePoint(string)) {
</span><del>- // 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);
- }
</del><ins>+ 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);
</ins><span class="cx"> }
</span><span class="cx"> return operatorChar;
</span><span class="cx"> }
</span><span class="lines">@@ -72,9 +69,9 @@
</span><span class="cx"> return m_operatorChar.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-MathMLOperatorElement::DictionaryProperty MathMLOperatorElement::computeDictionaryProperty()
</del><ins>+Property MathMLOperatorElement::computeDictionaryProperty()
</ins><span class="cx"> {
</span><del>- DictionaryProperty dictionaryProperty;
</del><ins>+ Property dictionaryProperty;
</ins><span class="cx">
</span><span class="cx"> // We first determine the form attribute and use the default spacing and properties.
</span><span class="cx"> const auto& value = attributeWithoutSynchronization(formAttr);
</span><span class="lines">@@ -97,17 +94,13 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // We then try and find an entry in the operator dictionary to override the default values.
</span><del>- 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;
- }
</del><ins>+ if (auto entry = search(operatorChar().character, dictionaryProperty.form, explicitForm))
+ dictionaryProperty = entry.value();
</ins><span class="cx">
</span><span class="cx"> return dictionaryProperty;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-const MathMLOperatorElement::DictionaryProperty& MathMLOperatorElement::dictionaryProperty()
</del><ins>+const Property& MathMLOperatorElement::dictionaryProperty()
</ins><span class="cx"> {
</span><span class="cx"> if (!m_dictionaryProperty)
</span><span class="cx"> m_dictionaryProperty = computeDictionaryProperty();
</span></span></pre></div>
<a id="trunkSourceWebCoremathmlMathMLOperatorElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/mathml/MathMLOperatorElement.h (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> public:
</span><span class="cx"> static Ref<MathMLOperatorElement> create(const QualifiedName& tagName, Document&);
</span><span class="cx"> struct OperatorChar {
</span><del>- UChar character { 0 };
</del><ins>+ UChar32 character { 0 };
</ins><span class="cx"> bool isVertical { true };
</span><span class="cx"> };
</span><span class="cx"> static OperatorChar parseOperatorChar(const String&);
</span><span class="lines">@@ -59,17 +59,9 @@
</span><span class="cx">
</span><span class="cx"> Optional<OperatorChar> m_operatorChar;
</span><span class="cx">
</span><del>- 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();
</del><ins>+ Optional<MathMLOperatorDictionary::Property> m_dictionaryProperty;
+ MathMLOperatorDictionary::Property computeDictionaryProperty();
+ const MathMLOperatorDictionary::Property& dictionaryProperty();
</ins><span class="cx">
</span><span class="cx"> struct OperatorProperties {
</span><span class="cx"> unsigned short flags;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingmathmlMathOperatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/mathml/MathOperator.cpp (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx">
</span><span class="cx"> // FIXME: This hardcoded data can be removed when OpenType MATH font are widely available (http://wkbug/156837).
</span><span class="cx"> struct StretchyCharacter {
</span><del>- UChar character;
</del><ins>+ UChar32 character;
</ins><span class="cx"> UChar topChar;
</span><span class="cx"> UChar extensionChar;
</span><span class="cx"> UChar bottomChar;
</span><span class="lines">@@ -85,7 +85,7 @@
</span><span class="cx"> { 0x222b, 0x2320, 0x23ae, 0x2321, 0x0 } // integral sign
</span><span class="cx"> };
</span><span class="cx">
</span><del>-void MathOperator::setOperator(const RenderStyle& style, UChar baseCharacter, Type operatorType)
</del><ins>+void MathOperator::setOperator(const RenderStyle& style, UChar32 baseCharacter, Type operatorType)
</ins><span class="cx"> {
</span><span class="cx"> m_baseCharacter = baseCharacter;
</span><span class="cx"> m_operatorType = operatorType;
</span><span class="lines">@@ -121,7 +121,7 @@
</span><span class="cx"> return m_operatorType == Type::VerticalOperator ? m_ascent + m_descent : m_width;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool MathOperator::getGlyph(const RenderStyle& style, UChar character, GlyphData& glyph) const
</del><ins>+bool MathOperator::getGlyph(const RenderStyle& style, UChar32 character, GlyphData& glyph) const
</ins><span class="cx"> {
</span><span class="cx"> glyph = style.fontCascade().glyphDataForCharacter(character, !style.isLeftToRightDirection());
</span><span class="cx"> return glyph.font && glyph.font == &style.fontCascade().primaryFont();
</span><span class="lines">@@ -171,7 +171,7 @@
</span><span class="cx"> // See https://www.w3.org/TR/MathML/chapter7.html#chars.comb-chars
</span><span class="cx"> // However, many math fonts do not provide constructions for the non-combining equivalent.
</span><span class="cx"> const unsigned maxFallbackPerCharacter = 3;
</span><del>-static const UChar characterFallback[][maxFallbackPerCharacter] = {
</del><ins>+static const UChar32 characterFallback[][maxFallbackPerCharacter] = {
</ins><span class="cx"> { 0x005E, 0x0302, 0 }, // CIRCUMFLEX ACCENT
</span><span class="cx"> { 0x005F, 0x0332, 0 }, // LOW LINE
</span><span class="cx"> { 0x007E, 0x0303, 0 }, // TILDE
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingmathmlMathOperatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/mathml/MathOperator.h (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> public:
</span><span class="cx"> MathOperator() { }
</span><span class="cx"> enum class Type { NormalOperator, DisplayOperator, VerticalOperator, HorizontalOperator };
</span><del>- void setOperator(const RenderStyle&, UChar baseCharacter, Type);
</del><ins>+ void setOperator(const RenderStyle&, UChar32 baseCharacter, Type);
</ins><span class="cx"> void reset(const RenderStyle&);
</span><span class="cx">
</span><span class="cx"> LayoutUnit width() const { return m_width; }
</span><span class="lines">@@ -73,7 +73,7 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> LayoutUnit stretchSize() const;
</span><del>- bool getGlyph(const RenderStyle&, UChar character, GlyphData&) const;
</del><ins>+ bool getGlyph(const RenderStyle&, UChar32 character, GlyphData&) const;
</ins><span class="cx"> bool getBaseGlyph(const RenderStyle& style, GlyphData& baseGlyph) const { return getGlyph(style, m_baseCharacter, baseGlyph); }
</span><span class="cx"> void setSizeVariant(const GlyphData&);
</span><span class="cx"> void setGlyphAssembly(const GlyphAssemblyData&);
</span><span class="lines">@@ -88,7 +88,7 @@
</span><span class="cx"> void paintVerticalGlyphAssembly(const RenderStyle&, PaintInfo&, const LayoutPoint&);
</span><span class="cx"> void paintHorizontalGlyphAssembly(const RenderStyle&, PaintInfo&, const LayoutPoint&);
</span><span class="cx">
</span><del>- UChar m_baseCharacter { 0 };
</del><ins>+ UChar32 m_baseCharacter { 0 };
</ins><span class="cx"> Type m_operatorType { Type::NormalOperator };
</span><span class="cx"> StretchType m_stretchType { StretchType::Unstretched };
</span><span class="cx"> union {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingmathmlRenderMathMLFencedOperatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.cpp (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -50,8 +50,8 @@
</span><span class="cx"> // We try and read spacing and boolean properties from the operator dictionary.
</span><span class="cx"> // However we preserve the Fence and Separator properties specified in the constructor.
</span><span class="cx"> if (auto entry = search(m_operatorChar.character, m_operatorForm, true)) {
</span><del>- m_leadingSpaceInMathUnit = entry.value().lspace;
- m_trailingSpaceInMathUnit = entry.value().rspace;
</del><ins>+ m_leadingSpaceInMathUnit = entry.value().leadingSpaceInMathUnit;
+ m_trailingSpaceInMathUnit = entry.value().trailingSpaceInMathUnit;
</ins><span class="cx"> m_operatorFlags = (m_operatorFlags & (MathMLOperatorDictionary::Fence | MathMLOperatorDictionary::Separator)) | entry.value().flags;
</span><span class="cx"> } else {
</span><span class="cx"> m_operatorFlags &= MathMLOperatorDictionary::Fence | MathMLOperatorDictionary::Separator; // Flags are disabled by default.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingmathmlRenderMathMLFencedOperatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLFencedOperator.h (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> private:
</span><span class="cx"> bool isRenderMathMLFencedOperator() const final { return true; }
</span><span class="cx"> bool isVertical() const final { return m_operatorChar.isVertical; }
</span><del>- UChar textContent() const final { return m_operatorChar.character; }
</del><ins>+ UChar32 textContent() const final { return m_operatorChar.character; }
</ins><span class="cx"> LayoutUnit leadingSpace() const final;
</span><span class="cx"> LayoutUnit trailingSpace() const final;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingmathmlRenderMathMLOperatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx"> return static_cast<MathMLOperatorElement&>(nodeForNonAnonymous());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-UChar RenderMathMLOperator::textContent() const
</del><ins>+UChar32 RenderMathMLOperator::textContent() const
</ins><span class="cx"> {
</span><span class="cx"> return element().operatorChar().character;
</span><span class="cx"> }
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx"> bool RenderMathMLOperator::isInvisibleOperator() const
</span><span class="cx"> {
</span><span class="cx"> // The following operators are invisible: U+2061 FUNCTION APPLICATION, U+2062 INVISIBLE TIMES, U+2063 INVISIBLE SEPARATOR, U+2064 INVISIBLE PLUS.
</span><del>- UChar character = textContent();
</del><ins>+ UChar32 character = textContent();
</ins><span class="cx"> return 0x2061 <= character && character <= 0x2064;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingmathmlRenderMathMLOperatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.h (205110 => 205111)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">
</span><span class="cx"> void updateTokenContent() final;
</span><span class="cx"> void updateFromElement() final;
</span><del>- virtual UChar textContent() const;
</del><ins>+ virtual UChar32 textContent() const;
</ins><span class="cx">
</span><span class="cx"> protected:
</span><span class="cx"> virtual void updateMathOperator();
</span></span></pre>
</div>
</div>
</body>
</html>