Improve parsing of the menclose notation attribute value
authorfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 28 Aug 2016 09:35:33 +0000 (09:35 +0000)
committerfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 28 Aug 2016 09:35:33 +0000 (09:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=161045

Patch by Frederic Wang <fwang@igalia.com> on 2016-08-28
Reviewed by Darin Adler.

Source/WebCore:

We improve the way the list of menclose notations is parsed to avoid allocating a vector and
accept any whitespace as separators.

New test cases in mathml/presentation/menclose-notation-equivalence.html

* mathml/MathMLMencloseElement.cpp: Include HTMLParserIdioms.h to use isHTMLSpace.
(WebCore::MathMLMencloseElement::addNotationFlags): Helper function to perform the relevant
addNotation calls from a notation name.
(WebCore::MathMLMencloseElement::parseNotationAttribute): Use only simple string operations
to determine the list of notations.
* mathml/MathMLMencloseElement.h: Declare the new helper function.

LayoutTests:

We add some cases in menclose-notation-equivalence to verify that one can use any sequence of
whitespace to separate notation values. We try with 0, 1, 2 or 3 notation values.

* mathml/presentation/menclose-notation-equivalence-expected.html:
* mathml/presentation/menclose-notation-equivalence.html:

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

LayoutTests/ChangeLog
LayoutTests/mathml/presentation/menclose-notation-equivalence-expected.html
LayoutTests/mathml/presentation/menclose-notation-equivalence.html
Source/WebCore/ChangeLog
Source/WebCore/mathml/MathMLMencloseElement.cpp
Source/WebCore/mathml/MathMLMencloseElement.h

index 3e1c39f..9e68d05 100644 (file)
@@ -1,5 +1,18 @@
 2016-08-28  Frederic Wang  <fwang@igalia.com>
 
+        Improve parsing of the menclose notation attribute value
+        https://bugs.webkit.org/show_bug.cgi?id=161045
+
+        Reviewed by Darin Adler.
+
+        We add some cases in menclose-notation-equivalence to verify that one can use any sequence of
+        whitespace to separate notation values. We try with 0, 1, 2 or 3 notation values.
+
+        * mathml/presentation/menclose-notation-equivalence-expected.html:
+        * mathml/presentation/menclose-notation-equivalence.html:
+
+2016-08-28  Frederic Wang  <fwang@igalia.com>
+
         More cleanup for the mpadded implementation
         https://bugs.webkit.org/show_bug.cgi?id=161136
 
index 601948b..6e798c6 100644 (file)
     <!-- menclose notations are independent of overall directionality -->
     <math><mrow><menclose notation="left updiagonalstrike"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
 
+    <!-- menclose notations can be separated by any sequence of whitespace. -->
+    <p>
+      <math><mrow><menclose notation=""><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
+      <math><mrow><menclose notation="top"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
+      <math><mrow><menclose notation="top circle"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
+      <math><mrow><menclose notation="top circle horizontalstrike"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
+    </p>
+
   </body>
 </html>
index dca8ab9..23021cd 100644 (file)
     <!-- menclose notations are independent of overall directionality -->
     <math dir="rtl"><mrow><menclose notation="left updiagonalstrike"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
 
+    <!-- menclose notations can be separated by any sequence of whitespace. -->
+    <p>
+      <math><mrow><menclose notation="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
+      <math><mrow><menclose notation="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;top&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
+      <math><mrow><menclose notation="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;top&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;circle&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
+      <math><mrow><menclose notation="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;top&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;circle&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;horizontalstrike&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"><mspace width="100px" height="50px" mathbackground="red"/></menclose></mrow></math>
+    </p>
+
   </body>
 </html>
index 781e28a..7f9d089 100644 (file)
@@ -1,5 +1,24 @@
 2016-08-28  Frederic Wang  <fwang@igalia.com>
 
+        Improve parsing of the menclose notation attribute value
+        https://bugs.webkit.org/show_bug.cgi?id=161045
+
+        Reviewed by Darin Adler.
+
+        We improve the way the list of menclose notations is parsed to avoid allocating a vector and
+        accept any whitespace as separators.
+
+        New test cases in mathml/presentation/menclose-notation-equivalence.html
+
+        * mathml/MathMLMencloseElement.cpp: Include HTMLParserIdioms.h to use isHTMLSpace.
+        (WebCore::MathMLMencloseElement::addNotationFlags): Helper function to perform the relevant
+        addNotation calls from a notation name.
+        (WebCore::MathMLMencloseElement::parseNotationAttribute): Use only simple string operations
+        to determine the list of notations.
+        * mathml/MathMLMencloseElement.h: Declare the new helper function.
+
+2016-08-28  Frederic Wang  <fwang@igalia.com>
+
         Make MathMLSpaceElement and MathMLTokenElement inherit from MathMLPresentationElement
         https://bugs.webkit.org/show_bug.cgi?id=161232
 
index 4d2b93d..1330919 100644 (file)
@@ -29,6 +29,7 @@
 
 #if ENABLE(MATHML)
 
+#include "HTMLParserIdioms.h"
 #include "MathMLNames.h"
 #include "RenderMathMLMenclose.h"
 
@@ -54,6 +55,49 @@ RenderPtr<RenderElement> MathMLMencloseElement::createElementRenderer(RenderStyl
     return createRenderer<RenderMathMLMenclose>(*this, WTFMove(style));
 }
 
+void MathMLMencloseElement::addNotationFlags(StringView notation)
+{
+    ASSERT(m_notationFlags);
+    if (notation == "longdiv") {
+        addNotation(LongDiv);
+    } else if (notation == "roundedbox") {
+        addNotation(RoundedBox);
+    } else if (notation == "circle") {
+        addNotation(Circle);
+    } else if (notation == "left") {
+        addNotation(Left);
+    } else if (notation == "right") {
+        addNotation(Right);
+    } else if (notation == "top") {
+        addNotation(Top);
+    } else if (notation == "bottom") {
+        addNotation(Bottom);
+    } else if (notation == "updiagonalstrike") {
+        addNotation(UpDiagonalStrike);
+    } else if (notation == "downdiagonalstrike") {
+        addNotation(DownDiagonalStrike);
+    } else if (notation == "verticalstrike") {
+        addNotation(VerticalStrike);
+    } else if (notation == "horizontalstrike") {
+        addNotation(HorizontalStrike);
+    } else if (notation == "updiagonalarrow") {
+        addNotation(UpDiagonalArrow);
+    } else if (notation == "phasorangle") {
+        addNotation(PhasorAngle);
+    } else if (notation == "box") {
+        addNotation(Left);
+        addNotation(Right);
+        addNotation(Top);
+        addNotation(Bottom);
+    } else if (notation == "actuarial") {
+        addNotation(Right);
+        addNotation(Top);
+    } else if (notation == "madruwb") {
+        addNotation(Right);
+        addNotation(Bottom);
+    }
+}
+
 void MathMLMencloseElement::parseNotationAttribute()
 {
     clearNotations();
@@ -61,48 +105,20 @@ void MathMLMencloseElement::parseNotationAttribute()
         addNotation(LongDiv); // The default value is longdiv.
         return;
     }
-    auto& value = attributeWithoutSynchronization(notationAttr);
-    Vector<String> notationsList;
-    String(value).split(' ', notationsList);
-    for (auto& notation : notationsList) {
-        if (notation == "longdiv") {
-            addNotation(LongDiv);
-        } else if (notation == "roundedbox") {
-            addNotation(RoundedBox);
-        } else if (notation == "circle") {
-            addNotation(Circle);
-        } else if (notation == "left") {
-            addNotation(Left);
-        } else if (notation == "right") {
-            addNotation(Right);
-        } else if (notation == "top") {
-            addNotation(Top);
-        } else if (notation == "bottom") {
-            addNotation(Bottom);
-        } else if (notation == "updiagonalstrike") {
-            addNotation(UpDiagonalStrike);
-        } else if (notation == "downdiagonalstrike") {
-            addNotation(DownDiagonalStrike);
-        } else if (notation == "verticalstrike") {
-            addNotation(VerticalStrike);
-        } else if (notation == "horizontalstrike") {
-            addNotation(HorizontalStrike);
-        } else if (notation == "updiagonalarrow") {
-            addNotation(UpDiagonalArrow);
-        } else if (notation == "phasorangle") {
-            addNotation(PhasorAngle);
-        } else if (notation == "box") {
-            addNotation(Left);
-            addNotation(Right);
-            addNotation(Top);
-            addNotation(Bottom);
-        } else if (notation == "actuarial") {
-            addNotation(Right);
-            addNotation(Top);
-        } else if (notation == "madruwb") {
-            addNotation(Right);
-            addNotation(Bottom);
+    // We parse the list of whitespace-separated notation names.
+    StringView value = attributeWithoutSynchronization(notationAttr).string();
+    unsigned length = value.length();
+    unsigned start = 0;
+    while (start < length) {
+        if (isHTMLSpace(value[start])) {
+            start++;
+            continue;
         }
+        unsigned end = start + 1;
+        while (end < length && !isHTMLSpace(value[end]))
+            end++;
+        addNotationFlags(value.substring(start, end - start));
+        start = end;
     }
 }
 
index 53524a0..ee745cb 100644 (file)
@@ -62,6 +62,7 @@ private:
     void parseNotationAttribute();
     void clearNotations() { m_notationFlags = 0; }
     void addNotation(MencloseNotationFlag notationFlag) { m_notationFlags.value() |= notationFlag; }
+    void addNotationFlags(StringView notation);
     Optional<uint16_t> m_notationFlags;
 };