Move parsing of accentunder and accent attributes from renderer to element classes
authorfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Jul 2016 05:33:01 +0000 (05:33 +0000)
committerfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Jul 2016 05:33:01 +0000 (05:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=159625

Patch by Frederic Wang <fwang@igalia.com> on 2016-07-21
Reviewed by Brent Fulgham.

We introduce a new MathMLUnderOverElement that is used for elements munder, mover and
munderover in order to create RenderMathMLUnderOver and parse and expose the values of the
accent and accentunder attributes. This is one more step toward moving MathML attribute
parsing to the DOM (bug 156536). We also do minor clean-up for this and previous renderer
classes that no longer do attribute parsing: the MathMLNames namespace is no longer necessary
and constructors can take a more accurate element type.

No new tests, already covered by existing test.

* CMakeLists.txt: Add MathMLUnderOverElement files.
* WebCore.xcodeproj/project.pbxproj: Ditto.
* mathml/MathMLAllInOne.cpp: Ditto.
* mathml/MathMLElement.cpp:
(WebCore::MathMLElement::cachedBooleanAttribute): Add parsing of boolean attributes.
* mathml/MathMLElement.h: New type and helper functions for boolean attributes.
* mathml/MathMLInlineContainerElement.cpp:
(WebCore::MathMLInlineContainerElement::createElementRenderer): Remove handling of
under/over/underover elements.
* mathml/MathMLScriptsElement.cpp:
(WebCore::MathMLScriptsElement::MathMLScriptsElement): Remove inline keyword to avoid link
errors now that MathMLUnderOverElement overrides that class.
* mathml/MathMLScriptsElement.h: Allow MathMLUnderOverElement to override this class.
* mathml/MathMLUnderOverElement.cpp:
(WebCore::MathMLUnderOverElement::MathMLUnderOverElement):
(WebCore::MathMLUnderOverElement::create):
(WebCore::MathMLUnderOverElement::accent): Helper function to access the accent value.
(WebCore::MathMLUnderOverElement::accentUnder): Helper function to access the accentunder value.
(WebCore::MathMLUnderOverElement::parseAttribute): Make accent and accentunder dirty.
(WebCore::MathMLUnderOverElement::createElementRenderer): Create RenderMathMLUnderOver
* mathml/MathMLUnderOverElement.h:
* mathml/mathtags.in: Map under/over/underover to MathMLUnderOverElement.
* rendering/mathml/RenderMathMLFraction.cpp: Remove MathMLNames and make the constructor
take a MathMLFractionElement.
(WebCore::RenderMathMLFraction::RenderMathMLFraction):
* rendering/mathml/RenderMathMLFraction.h:
* rendering/mathml/RenderMathMLPadded.cpp: Remove MathMLNames and make the constructor
take a MathMLPaddedElement.
(WebCore::RenderMathMLPadded::RenderMathMLPadded):
* rendering/mathml/RenderMathMLPadded.h:
* rendering/mathml/RenderMathMLScripts.cpp: Remove MathMLNames and make the constructor
take a MathMLScriptsElement. Also rename scriptsElement() to element().
(WebCore::RenderMathMLScripts::RenderMathMLScripts):
(WebCore::RenderMathMLScripts::element):
(WebCore::RenderMathMLScripts::getScriptMetricsAndLayoutIfNeeded):
(WebCore::RenderMathMLScripts::scriptsElement): Deleted.
* rendering/mathml/RenderMathMLScripts.h:
* rendering/mathml/RenderMathMLUnderOver.cpp: Remove MathMLNames and make the constructor
take a RenderMathMLUnderOver.
(WebCore::RenderMathMLUnderOver::RenderMathMLUnderOver):
(WebCore::RenderMathMLUnderOver::element):
(WebCore::RenderMathMLUnderOver::hasAccent): Use the helper functions for accent and accentunder.
* rendering/mathml/RenderMathMLUnderOver.h:

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

21 files changed:
Source/WebCore/CMakeLists.txt
Source/WebCore/ChangeLog
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/mathml/MathMLAllInOne.cpp
Source/WebCore/mathml/MathMLElement.cpp
Source/WebCore/mathml/MathMLElement.h
Source/WebCore/mathml/MathMLInlineContainerElement.cpp
Source/WebCore/mathml/MathMLScriptsElement.cpp
Source/WebCore/mathml/MathMLScriptsElement.h
Source/WebCore/mathml/MathMLUnderOverElement.cpp [new file with mode: 0644]
Source/WebCore/mathml/MathMLUnderOverElement.h [new file with mode: 0644]
Source/WebCore/mathml/mathtags.in
Source/WebCore/rendering/mathml/RenderMathMLFraction.cpp
Source/WebCore/rendering/mathml/RenderMathMLFraction.h
Source/WebCore/rendering/mathml/RenderMathMLPadded.cpp
Source/WebCore/rendering/mathml/RenderMathMLPadded.h
Source/WebCore/rendering/mathml/RenderMathMLScripts.cpp
Source/WebCore/rendering/mathml/RenderMathMLScripts.h
Source/WebCore/rendering/mathml/RenderMathMLSpace.cpp
Source/WebCore/rendering/mathml/RenderMathMLUnderOver.cpp
Source/WebCore/rendering/mathml/RenderMathMLUnderOver.h

index c01aef8..303cb81 100644 (file)
@@ -1995,6 +1995,7 @@ set(WebCore_SOURCES
     mathml/MathMLSelectElement.cpp
     mathml/MathMLSpaceElement.cpp
     mathml/MathMLTextElement.cpp
+    mathml/MathMLUnderOverElement.cpp
 
     page/AutoscrollController.cpp
     page/BarProp.cpp
index ff0715e..54823f6 100644 (file)
@@ -1,3 +1,63 @@
+2016-07-21  Frederic Wang  <fwang@igalia.com>
+
+        Move parsing of accentunder and accent attributes from renderer to element classes
+        https://bugs.webkit.org/show_bug.cgi?id=159625
+
+        Reviewed by Brent Fulgham.
+
+        We introduce a new MathMLUnderOverElement that is used for elements munder, mover and
+        munderover in order to create RenderMathMLUnderOver and parse and expose the values of the
+        accent and accentunder attributes. This is one more step toward moving MathML attribute
+        parsing to the DOM (bug 156536). We also do minor clean-up for this and previous renderer
+        classes that no longer do attribute parsing: the MathMLNames namespace is no longer necessary
+        and constructors can take a more accurate element type.
+
+        No new tests, already covered by existing test.
+
+        * CMakeLists.txt: Add MathMLUnderOverElement files.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+        * mathml/MathMLAllInOne.cpp: Ditto.
+        * mathml/MathMLElement.cpp:
+        (WebCore::MathMLElement::cachedBooleanAttribute): Add parsing of boolean attributes.
+        * mathml/MathMLElement.h: New type and helper functions for boolean attributes.
+        * mathml/MathMLInlineContainerElement.cpp:
+        (WebCore::MathMLInlineContainerElement::createElementRenderer): Remove handling of
+        under/over/underover elements.
+        * mathml/MathMLScriptsElement.cpp:
+        (WebCore::MathMLScriptsElement::MathMLScriptsElement): Remove inline keyword to avoid link
+        errors now that MathMLUnderOverElement overrides that class.
+        * mathml/MathMLScriptsElement.h: Allow MathMLUnderOverElement to override this class.
+        * mathml/MathMLUnderOverElement.cpp:
+        (WebCore::MathMLUnderOverElement::MathMLUnderOverElement):
+        (WebCore::MathMLUnderOverElement::create):
+        (WebCore::MathMLUnderOverElement::accent): Helper function to access the accent value.
+        (WebCore::MathMLUnderOverElement::accentUnder): Helper function to access the accentunder value.
+        (WebCore::MathMLUnderOverElement::parseAttribute): Make accent and accentunder dirty.
+        (WebCore::MathMLUnderOverElement::createElementRenderer): Create RenderMathMLUnderOver
+        * mathml/MathMLUnderOverElement.h:
+        * mathml/mathtags.in: Map under/over/underover to MathMLUnderOverElement.
+        * rendering/mathml/RenderMathMLFraction.cpp: Remove MathMLNames and make the constructor
+        take a MathMLFractionElement.
+        (WebCore::RenderMathMLFraction::RenderMathMLFraction):
+        * rendering/mathml/RenderMathMLFraction.h:
+        * rendering/mathml/RenderMathMLPadded.cpp: Remove MathMLNames and make the constructor
+        take a MathMLPaddedElement.
+        (WebCore::RenderMathMLPadded::RenderMathMLPadded):
+        * rendering/mathml/RenderMathMLPadded.h:
+        * rendering/mathml/RenderMathMLScripts.cpp: Remove MathMLNames and make the constructor
+        take a MathMLScriptsElement. Also rename scriptsElement() to element().
+        (WebCore::RenderMathMLScripts::RenderMathMLScripts):
+        (WebCore::RenderMathMLScripts::element):
+        (WebCore::RenderMathMLScripts::getScriptMetricsAndLayoutIfNeeded):
+        (WebCore::RenderMathMLScripts::scriptsElement): Deleted.
+        * rendering/mathml/RenderMathMLScripts.h:
+        * rendering/mathml/RenderMathMLUnderOver.cpp: Remove MathMLNames and make the constructor
+        take a RenderMathMLUnderOver.
+        (WebCore::RenderMathMLUnderOver::RenderMathMLUnderOver):
+        (WebCore::RenderMathMLUnderOver::element):
+        (WebCore::RenderMathMLUnderOver::hasAccent): Use the helper functions for accent and accentunder.
+        * rendering/mathml/RenderMathMLUnderOver.h:
+
 2016-07-21  Chris Dumez  <cdumez@apple.com>
 
         Parameter to Node.isSameNode() / isEqualNode() should be mandatory
index 0ce67ab..fbd647e 100644 (file)
                F9F0ED7A0DB50CA200D16DB9 /* XMLHttpRequestProgressEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = F9F0ED770DB50CA200D16DB9 /* XMLHttpRequestProgressEvent.h */; };
                FA654A6B1108ABED002615E0 /* MathMLTextElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA654A691108ABED002615E0 /* MathMLTextElement.cpp */; };
                FA654A6C1108ABED002615E0 /* MathMLTextElement.h in Headers */ = {isa = PBXBuildFile; fileRef = FA654A6A1108ABED002615E0 /* MathMLTextElement.h */; };
+               FA654A6B1108ABED002626F1 /* MathMLUnderOverElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA654A691108ABED002626F1 /* MathMLUnderOverElement.cpp */; };
+               FA654A6C1108ABED002626F1 /* MathMLUnderOverElement.h in Headers */ = {isa = PBXBuildFile; fileRef = FA654A6A1108ABED002626F1 /* MathMLUnderOverElement.h */; };
                FABE72F41059C1EB00D999DD /* MathMLElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABE72ED1059C1EB00D999DD /* MathMLElement.cpp */; };
                FABE72F51059C1EB00D999DD /* MathMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = FABE72EE1059C1EB00D999DD /* MathMLElement.h */; };
                FABE72F61059C1EB00D999DD /* MathMLInlineContainerElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FABE72EF1059C1EB00D999DD /* MathMLInlineContainerElement.cpp */; };
                FA654A671108ABE2002615E0 /* mathattrs.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mathattrs.in; sourceTree = "<group>"; };
                FA654A691108ABED002615E0 /* MathMLTextElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLTextElement.cpp; sourceTree = "<group>"; };
                FA654A6A1108ABED002615E0 /* MathMLTextElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathMLTextElement.h; sourceTree = "<group>"; };
+               FA654A691108ABED002626F1 /* MathMLUnderOverElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLUnderOverElement.cpp; sourceTree = "<group>"; };
+               FA654A6A1108ABED002626F1 /* MathMLUnderOverElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathMLUnderOverElement.h; sourceTree = "<group>"; };
                FA6E466FCD0418A9966A5B60 /* DNSResolveQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNSResolveQueue.h; sourceTree = "<group>"; };
                FABE72ED1059C1EB00D999DD /* MathMLElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLElement.cpp; sourceTree = "<group>"; };
                FABE72EE1059C1EB00D999DD /* MathMLElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathMLElement.h; sourceTree = "<group>"; };
                                4FA65A6A1108ABED002615E0 /* MathMLSpaceElement.h */,
                                FA654A691108ABED002615E0 /* MathMLTextElement.cpp */,
                                FA654A6A1108ABED002615E0 /* MathMLTextElement.h */,
+                               FA654A691108ABED002626F1 /* MathMLUnderOverElement.cpp */,
+                               FA654A6A1108ABED002626F1 /* MathMLUnderOverElement.h */,
                                FABE72F31059C1EB00D999DD /* mathtags.in */,
                        );
                        path = mathml;
                                439176E012DA25E17BAF80A2 /* MathMLStyle.h in Headers */,
                                4FA65A6C1108ABED002615E0 /* MathMLSpaceElement.h in Headers */,
                                FA654A6C1108ABED002615E0 /* MathMLTextElement.h in Headers */,
+                               FA654A6C1108ABED002626F1 /* MathMLUnderOverElement.h in Headers */,
                                439046EA12DA25E812AF80AC /* MathOperator.h in Headers */,
                                49D5DC2C0F423A73008F20FD /* Matrix3DTransformOperation.h in Headers */,
                                49E911C70EF86D47009D0CAF /* MatrixTransformOperation.h in Headers */,
                                FED48390CED66C3255F72C59 /* MathMLSelectElement.cpp in Sources */,
                                4FA65A6B1108ABED002615E0 /* MathMLSpaceElement.cpp in Sources */,
                                FA654A6B1108ABED002615E0 /* MathMLTextElement.cpp in Sources */,
+                               FA654A6B1108ABED002626F1 /* MathMLUnderOverElement.cpp in Sources */,
                                439046E912DA25E812AF80AC /* MathOperator.cpp in Sources */,
                                49D5DC2B0F423A73008F20FD /* Matrix3DTransformOperation.cpp in Sources */,
                                49E911C60EF86D47009D0CAF /* MatrixTransformOperation.cpp in Sources */,
index 735330c..babf82b 100644 (file)
@@ -35,4 +35,5 @@
 #include "MathMLScriptsElement.cpp"
 #include "MathMLSelectElement.cpp"
 #include "MathMLTextElement.cpp"
+#include "MathMLUnderOverElement.cpp"
 
index da97f07..80974bc 100644 (file)
@@ -525,6 +525,24 @@ const MathMLElement::Length& MathMLElement::cachedMathMLLength(const QualifiedNa
     return length;
 }
 
+const MathMLElement::BooleanValue& MathMLElement::cachedBooleanAttribute(const QualifiedName& name, BooleanAttribute& attribute)
+{
+    if (!attribute.dirty)
+        return attribute.value;
+
+    // In MathML, attribute values are case-sensitive.
+    const AtomicString& value = attributeWithoutSynchronization(name);
+    if (value == "true")
+        attribute.value = BooleanValue::True;
+    else if (value == "false")
+        attribute.value = BooleanValue::False;
+    else
+        attribute.value = BooleanValue::Default;
+    attribute.dirty = false;
+
+    return attribute.value;
+}
+
 }
 
 #endif // ENABLE(MATHML)
index 4c9600a..978cf20 100644 (file)
@@ -66,6 +66,12 @@ public:
     };
     static Length parseMathMLLength(const String&);
 
+    enum class BooleanValue { True, False, Default };
+    struct BooleanAttribute {
+        BooleanValue value { BooleanValue::Default };
+        bool dirty { true };
+    };
+
 protected:
     MathMLElement(const QualifiedName& tagName, Document&);
 
@@ -83,6 +89,7 @@ protected:
     void defaultEventHandler(Event*) override;
 
     const Length& cachedMathMLLength(const QualifiedName&, Length&);
+    const BooleanValue& cachedBooleanAttribute(const QualifiedName&, BooleanAttribute&);
 
 private:
     virtual void updateSelectedChild() { }
index 36219d2..0b40707 100644 (file)
@@ -36,7 +36,6 @@
 #include "RenderMathMLMenclose.h"
 #include "RenderMathMLRoot.h"
 #include "RenderMathMLRow.h"
-#include "RenderMathMLUnderOver.h"
 
 namespace WebCore {
 
@@ -65,8 +64,6 @@ RenderPtr<RenderElement> MathMLInlineContainerElement::createElementRenderer(Ren
 {
     if (hasTagName(annotation_xmlTag) || hasTagName(merrorTag) || hasTagName(mphantomTag) || hasTagName(mrowTag) || hasTagName(mstyleTag))
         return createRenderer<RenderMathMLRow>(*this, WTFMove(style));
-    if (hasTagName(moverTag) || hasTagName(munderTag) || hasTagName(munderoverTag))
-        return createRenderer<RenderMathMLUnderOver>(*this, WTFMove(style));
     if (hasTagName(msqrtTag) || hasTagName(mrootTag))
         return createRenderer<RenderMathMLRoot>(*this, WTFMove(style));
     if (hasTagName(mfencedTag))
index e0bf486..5eada1a 100644 (file)
@@ -35,7 +35,7 @@ namespace WebCore {
 
 using namespace MathMLNames;
 
-inline MathMLScriptsElement::MathMLScriptsElement(const QualifiedName& tagName, Document& document)
+MathMLScriptsElement::MathMLScriptsElement(const QualifiedName& tagName, Document& document)
     : MathMLInlineContainerElement(tagName, document)
 {
 }
index 75e17c9..5747e74 100644 (file)
 
 namespace WebCore {
 
-class MathMLScriptsElement final : public MathMLInlineContainerElement {
+class MathMLScriptsElement : public MathMLInlineContainerElement {
 public:
     static Ref<MathMLScriptsElement> create(const QualifiedName& tagName, Document&);
     const Length& subscriptShift();
     const Length& superscriptShift();
 
-private:
+protected:
     MathMLScriptsElement(const QualifiedName& tagName, Document&);
-    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
-    void parseAttribute(const QualifiedName&, const AtomicString&) final;
+
+private:
+    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
+    void parseAttribute(const QualifiedName&, const AtomicString&) override;
 
     Length m_subscriptShift;
     Length m_superscriptShift;
diff --git a/Source/WebCore/mathml/MathMLUnderOverElement.cpp b/Source/WebCore/mathml/MathMLUnderOverElement.cpp
new file mode 100644 (file)
index 0000000..af193e6
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2016 Igalia S.L. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "config.h"
+
+#if ENABLE(MATHML)
+#include "MathMLUnderOverElement.h"
+
+#include "RenderMathMLUnderOver.h"
+
+namespace WebCore {
+
+using namespace MathMLNames;
+
+inline MathMLUnderOverElement::MathMLUnderOverElement(const QualifiedName& tagName, Document& document)
+    : MathMLScriptsElement(tagName, document)
+{
+}
+
+Ref<MathMLUnderOverElement> MathMLUnderOverElement::create(const QualifiedName& tagName, Document& document)
+{
+    return adoptRef(*new MathMLUnderOverElement(tagName, document));
+}
+
+const MathMLElement::BooleanValue& MathMLUnderOverElement::accent()
+{
+    return cachedBooleanAttribute(accentAttr, m_accent);
+}
+
+const MathMLElement::BooleanValue& MathMLUnderOverElement::accentUnder()
+{
+    return cachedBooleanAttribute(accentunderAttr, m_accentUnder);
+}
+
+void MathMLUnderOverElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
+{
+    if (name == accentAttr)
+        m_accent.dirty = true;
+    else if (name == accentunderAttr)
+        m_accentUnder.dirty = true;
+
+    MathMLElement::parseAttribute(name, value);
+}
+
+RenderPtr<RenderElement> MathMLUnderOverElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&)
+{
+    ASSERT(hasTagName(munderTag) || hasTagName(moverTag) || hasTagName(munderoverTag));
+    return createRenderer<RenderMathMLUnderOver>(*this, WTFMove(style));
+}
+
+}
+
+#endif // ENABLE(MATHML)
diff --git a/Source/WebCore/mathml/MathMLUnderOverElement.h b/Source/WebCore/mathml/MathMLUnderOverElement.h
new file mode 100644 (file)
index 0000000..f76374e
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2016 Igalia S.L. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(MATHML)
+#include "MathMLScriptsElement.h"
+
+namespace WebCore {
+
+class MathMLUnderOverElement final : public MathMLScriptsElement {
+public:
+    static Ref<MathMLUnderOverElement> create(const QualifiedName& tagName, Document&);
+    const BooleanValue& accent();
+    const BooleanValue& accentUnder();
+
+private:
+    MathMLUnderOverElement(const QualifiedName& tagName, Document&);
+    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
+    void parseAttribute(const QualifiedName&, const AtomicString&) final;
+
+    BooleanAttribute m_accent;
+    BooleanAttribute m_accentUnder;
+};
+
+}
+
+#endif // ENABLE(MATHML)
index d992ce4..fd862ec 100644 (file)
@@ -15,9 +15,9 @@ mpadded interfaceName=MathMLPaddedElement
 mphantom interfaceName=MathMLInlineContainerElement
 mrow interfaceName=MathMLInlineContainerElement
 mstyle interfaceName=MathMLInlineContainerElement
-mover interfaceName=MathMLInlineContainerElement
-munder interfaceName=MathMLInlineContainerElement
-munderover interfaceName=MathMLInlineContainerElement
+mover interfaceName=MathMLUnderOverElement
+munder interfaceName=MathMLUnderOverElement
+munderover interfaceName=MathMLUnderOverElement
 msqrt interfaceName=MathMLInlineContainerElement
 mroot interfaceName=MathMLInlineContainerElement
 mi interfaceName=MathMLTextElement
index bf7f87d..64a09a0 100644 (file)
 #include "RenderMathMLFraction.h"
 
 #include "GraphicsContext.h"
-#include "MathMLNames.h"
+#include "MathMLFractionElement.h"
 #include "PaintInfo.h"
 #include <cmath>
 
 namespace WebCore {
 
-using namespace MathMLNames;
-
-RenderMathMLFraction::RenderMathMLFraction(MathMLInlineContainerElement& element, RenderStyle&& style)
+RenderMathMLFraction::RenderMathMLFraction(MathMLFractionElement& element, RenderStyle&& style)
     : RenderMathMLBlock(element, WTFMove(style))
 {
 }
index 29b58cc..085a75d 100644 (file)
 
 namespace WebCore {
 
+class MathMLFractionElement;
+
 class RenderMathMLFraction final : public RenderMathMLBlock {
 public:
-    RenderMathMLFraction(MathMLInlineContainerElement&, RenderStyle&&);
+    RenderMathMLFraction(MathMLFractionElement&, RenderStyle&&);
 
     float relativeLineThickness() const { return m_defaultLineThickness ? m_lineThickness / m_defaultLineThickness : LayoutUnit(0); }
 
index c2d1e76..3eca55c 100644 (file)
 
 #if ENABLE(MATHML)
 
-#include "MathMLNames.h"
 #include <cmath>
 
 namespace WebCore {
 
-using namespace MathMLNames;
-
-RenderMathMLPadded::RenderMathMLPadded(Element& element, RenderStyle&& style)
+RenderMathMLPadded::RenderMathMLPadded(MathMLPaddedElement& element, RenderStyle&& style)
     : RenderMathMLRow(element, WTFMove(style))
 {
 }
index 690e18f..d106ce3 100644 (file)
@@ -34,7 +34,7 @@ namespace WebCore {
 
 class RenderMathMLPadded final : public RenderMathMLRow {
 public:
-    RenderMathMLPadded(Element&, RenderStyle&&);
+    RenderMathMLPadded(MathMLPaddedElement&, RenderStyle&&);
 
 private:
     const char* renderName() const final { return "RenderMathMLPadded"; }
index 13fbfd4..5e8838c 100644 (file)
 
 namespace WebCore {
 
-using namespace MathMLNames;
-
 static bool isPrescriptDelimiter(const RenderObject& renderObject)
 {
     return renderObject.node() && renderObject.node()->hasTagName(MathMLNames::mprescriptsTag);
 }
 
-RenderMathMLScripts::RenderMathMLScripts(Element& element, RenderStyle&& style)
+RenderMathMLScripts::RenderMathMLScripts(MathMLScriptsElement& element, RenderStyle&& style)
     : RenderMathMLBlock(element, WTFMove(style))
 {
     // Determine what kind of sub/sup expression we have by element name
@@ -66,9 +64,8 @@ RenderMathMLScripts::RenderMathMLScripts(Element& element, RenderStyle&& style)
     }
 }
 
-MathMLScriptsElement& RenderMathMLScripts::scriptsElement() const
+MathMLScriptsElement& RenderMathMLScripts::element() const
 {
-    ASSERT(!isRenderMathMLUnderOver());
     return static_cast<MathMLScriptsElement&>(nodeForNonAnonymous());
 }
 
@@ -260,7 +257,7 @@ void RenderMathMLScripts::getScriptMetricsAndLayoutIfNeeded(RenderBox* base, Ren
         if (!isRenderMathMLUnderOver()) {
             // It is not clear how to interpret the default shift and it is not available yet anyway.
             // Hence we just pass 0 as the default value used by toUserUnits.
-            LayoutUnit specifiedMinSubShift = toUserUnits(scriptsElement().subscriptShift(), style(), 0);
+            LayoutUnit specifiedMinSubShift = toUserUnits(element().subscriptShift(), style(), 0);
             minSubScriptShift = std::max(minSubScriptShift, specifiedMinSubShift);
         }
     }
@@ -269,7 +266,7 @@ void RenderMathMLScripts::getScriptMetricsAndLayoutIfNeeded(RenderBox* base, Ren
         if (!isRenderMathMLUnderOver()) {
             // It is not clear how to interpret the default shift and it is not available yet anyway.
             // Hence we just pass 0 as the default value used by toUserUnits.
-            LayoutUnit specifiedMinSupShift = toUserUnits(scriptsElement().superscriptShift(), style(), 0);
+            LayoutUnit specifiedMinSupShift = toUserUnits(element().superscriptShift(), style(), 0);
             minSupScriptShift = std::max(minSupScriptShift, specifiedMinSupShift);
         }
     }
index 5503c7a..03d487d 100644 (file)
@@ -38,7 +38,7 @@ class MathMLScriptsElement;
 // Render a base with scripts.
 class RenderMathMLScripts : public RenderMathMLBlock {
 public:
-    RenderMathMLScripts(Element&, RenderStyle&&);
+    RenderMathMLScripts(MathMLScriptsElement&, RenderStyle&&);
     RenderMathMLOperator* unembellishedOperator() final;
 
 protected:
@@ -51,7 +51,7 @@ protected:
     ScriptsType m_scriptType;
 
 private:
-    MathMLScriptsElement& scriptsElement() const;
+    MathMLScriptsElement& element() const;
     Optional<int> firstLineBaseline() const final;
     bool getBaseAndScripts(RenderBox*& base, RenderBox*& firstPostScript, RenderBox*& firstPreScript);
     LayoutUnit spaceAfterScript();
index 5ef8106..4c1fe9e 100644 (file)
 #if ENABLE(MATHML)
 
 #include "GraphicsContext.h"
-#include "MathMLNames.h"
 #include "PaintInfo.h"
 
 namespace WebCore {
 
-using namespace MathMLNames;
-
 RenderMathMLSpace::RenderMathMLSpace(MathMLSpaceElement& element, RenderStyle&& style)
     : RenderMathMLBlock(element, WTFMove(style))
 {
index 5b8c6d4..709f0f0 100644 (file)
 #include "RenderMathMLUnderOver.h"
 
 #include "MathMLElement.h"
-#include "MathMLNames.h"
 #include "MathMLOperatorDictionary.h"
+#include "MathMLUnderOverElement.h"
 #include "RenderIterator.h"
 #include "RenderMathMLOperator.h"
 
 namespace WebCore {
 
-using namespace MathMLNames;
-
-RenderMathMLUnderOver::RenderMathMLUnderOver(Element& element, RenderStyle&& style)
+RenderMathMLUnderOver::RenderMathMLUnderOver(MathMLUnderOverElement& element, RenderStyle&& style)
     : RenderMathMLScripts(element, WTFMove(style))
 {
 }
 
+MathMLUnderOverElement& RenderMathMLUnderOver::element() const
+{
+    return static_cast<MathMLUnderOverElement&>(nodeForNonAnonymous());
+}
+
 void RenderMathMLUnderOver::computeOperatorsHorizontalStretch()
 {
     LayoutUnit stretchWidth = 0;
@@ -165,10 +168,10 @@ bool RenderMathMLUnderOver::hasAccent(bool accentUnder) const
 {
     ASSERT(m_scriptType == UnderOver || (accentUnder && m_scriptType == Under) || (!accentUnder && m_scriptType == Over));
 
-    const AtomicString& attributeValue = element()->attributeWithoutSynchronization(accentUnder ? accentunderAttr : accentAttr);
-    if (attributeValue == "true")
+    const MathMLElement::BooleanValue& attributeValue = accentUnder ? element().accentUnder() : element().accent();
+    if (attributeValue == MathMLElement::BooleanValue::True)
         return true;
-    if (attributeValue == "false")
+    if (attributeValue == MathMLElement::BooleanValue::False)
         return false;
     RenderBox& script = accentUnder ? under() : over();
     if (!is<RenderMathMLBlock>(script))
index 86c1927..19a2bc7 100644 (file)
 
 namespace WebCore {
 
+class MathMLUnderOverElement;
+
 class RenderMathMLUnderOver final : public RenderMathMLScripts {
 public:
-    RenderMathMLUnderOver(Element&, RenderStyle&&);
+    RenderMathMLUnderOver(MathMLUnderOverElement&, RenderStyle&&);
 
 private:
     bool isRenderMathMLScripts() const final { return false; }
     bool isRenderMathMLUnderOver() const final { return true; }
     const char* renderName() const final { return "RenderMathMLUnderOver"; }
+    MathMLUnderOverElement& element() const;
 
     void computePreferredLogicalWidths() final;
     void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;