Implement the MathML Operator Dictionary.
[WebKit-https.git] / Source / WebCore / rendering / mathml / RenderMathMLOperator.h
index da502d7..9f764c1 100644 (file)
 
 #if ENABLE(MATHML)
 
+#include "MathMLElement.h"
 #include "RenderMathMLBlock.h"
 #include <wtf/unicode/CharacterNames.h>
 
 namespace WebCore {
     
-class RenderMathMLOperator : public RenderMathMLBlock {
+namespace MathMLOperatorDictionary {
+
+enum Form { Infix, Prefix, Postfix };
+enum Flag {
+    Accent = 0x1, // FIXME: This must be used to implement accentunder/accent on munderover (https://bugs.webkit.org/show_bug.cgi?id=124826).
+    Fence = 0x2, // This has no visual effect but allows to expose semantic information via the accessibility tree.
+    LargeOp = 0x4, // FIXME: This must be used to implement displaystyle (https://bugs.webkit.org/show_bug.cgi?id=118737)
+    MovableLimits = 0x8, // FIXME: This must be used to implement displaystyle  (https://bugs.webkit.org/show_bug.cgi?id=118737).
+    Separator = 0x10, // This has no visual effect but allows to expose semantic information via the accessibility tree.
+    Stretchy = 0x20,
+    Symmetric = 0x40, // FIXME: This is not implemented yet (https://bugs.webkit.org/show_bug.cgi?id=124827).
+};
+struct Entry {
+    UChar character;
+    Form form;
+    // FIXME: spacing around <mo> operators is not implemented yet (https://bugs.webkit.org/show_bug.cgi?id=115787).
+    unsigned short lspace;
+    unsigned short rspace;
+    unsigned short flags;
+};
+
+}
+
+class RenderMathMLOperator final : public RenderMathMLBlock {
 public:
-    RenderMathMLOperator(Element&);
-    RenderMathMLOperator(Element&, UChar operatorChar);
+    RenderMathMLOperator(MathMLElement&, PassRef<RenderStyle>);
+    RenderMathMLOperator(MathMLElement&, PassRef<RenderStyle>, UChar operatorChar, MathMLOperatorDictionary::Form, MathMLOperatorDictionary::Flag);
+
+    MathMLElement& element() { return toMathMLElement(nodeForNonAnonymous()); }
 
-    virtual bool isRenderMathMLOperator() const OVERRIDE { return true; }
-    
-    virtual bool isChildAllowed(RenderObject*, RenderStyle*) const OVERRIDE;
-    virtual void updateFromElement() OVERRIDE;
-    virtual void computePreferredLogicalWidths() OVERRIDE;
-    virtual void computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues&) const OVERRIDE;
-    
-    virtual RenderMathMLOperator* unembellishedOperator() OVERRIDE { return this; }
     void stretchToHeight(int pixelHeight);
     int stretchHeight() { return m_stretchHeight; }
     float expandedStretchHeight() const;
     
-    virtual int firstLineBoxBaseline() const OVERRIDE;
-    
-    enum OperatorType { Default, Separator, Fence };
-    void setOperatorType(OperatorType type) { m_operatorType = type; }
-    OperatorType operatorType() const { return m_operatorType; }
+    bool hasOperatorFlag(MathMLOperatorDictionary::Flag flag) const { return m_operatorFlags & flag; }
+
     void updateStyle();
 
     void paint(PaintInfo&, const LayoutPoint&);
@@ -67,10 +82,18 @@ public:
         UChar middleGlyph;
     };
 
+    virtual void updateFromElement() override;
+
 private:
-    virtual const char* renderName() const OVERRIDE { return isAnonymous() ? "RenderMathMLOperator (anonymous)" : "RenderMathMLOperator"; }
-    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE;
-    virtual void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect);
+    virtual const char* renderName() const override { return isAnonymous() ? "RenderMathMLOperator (anonymous)" : "RenderMathMLOperator"; }
+    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override;
+    virtual void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect) override;
+    virtual bool isRenderMathMLOperator() const override { return true; }
+    virtual bool isChildAllowed(const RenderObject&, const RenderStyle&) const override;
+    virtual void computePreferredLogicalWidths() override;
+    virtual void computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues&) const override;
+    virtual int firstLineBaseline() const override;
+    virtual RenderMathMLOperator* unembellishedOperator() override { return this; }
 
     bool shouldAllowStretching(UChar& characterForStretching);
     StretchyCharacter* findAcceptableStretchyCharacter(UChar);
@@ -92,33 +115,21 @@ private:
     bool m_isStretched;
 
     UChar m_operator;
-    OperatorType m_operatorType;
     StretchyCharacter* m_stretchyCharacter;
+    bool m_isFencedOperator;
+    MathMLOperatorDictionary::Form m_operatorForm;
+    unsigned short m_operatorFlags;
+    LayoutUnit m_leadingSpace;
+    LayoutUnit m_trailingSpace;
+    LayoutUnit m_minSize;
+    LayoutUnit m_maxSize;
+
+    void setOperatorFlagFromAttribute(MathMLOperatorDictionary::Flag, const QualifiedName&);
+    void setOperatorPropertiesFromOpDictEntry(const MathMLOperatorDictionary::Entry*);
+    void SetOperatorProperties();
 };
 
-inline RenderMathMLOperator* toRenderMathMLOperator(RenderMathMLBlock* block)
-{ 
-    ASSERT_WITH_SECURITY_IMPLICATION(!block || block->isRenderMathMLOperator());
-    return static_cast<RenderMathMLOperator*>(block);
-}
-
-inline const RenderMathMLOperator* toRenderMathMLOperator(const RenderMathMLBlock* block)
-{ 
-    ASSERT_WITH_SECURITY_IMPLICATION(!block || block->isRenderMathMLOperator());
-    return static_cast<const RenderMathMLOperator*>(block);
-}
-
-// This will catch anyone doing an unnecessary cast.
-void toRenderMathMLOperator(const RenderMathMLOperator*);
-
-inline UChar convertHyphenMinusToMinusSign(UChar glyph)
-{
-    // When rendered as a mathematical operator, minus glyph should be larger.
-    if (glyph == hyphenMinus)
-        return minusSign;
-    
-    return glyph;
-}
+RENDER_OBJECT_TYPE_CASTS(RenderMathMLOperator, isRenderMathMLOperator())
 
 }