Optimize fetching the Node for never-anonymous renderers.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Sep 2013 12:16:13 +0000 (12:16 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Sep 2013 12:16:13 +0000 (12:16 +0000)
<https://webkit.org/b/121627>

Reviewed by Antti Koivisto.

Add a RenderObject::nodeForNonAnonymous() that can be used instead
of node() when a renderer is guaranteed non-anonymous.

Use this to implement reference element getters for the various
renderers that are known at compile-time to correspond to a DOM node.

Also renamed existingElement() => element() since using an alternate
name for a reference overload isn't actually necessary.

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

38 files changed:
Source/WebCore/ChangeLog
Source/WebCore/dom/Text.h
Source/WebCore/html/HTMLFormControlElement.h
Source/WebCore/html/HTMLFrameOwnerElement.h
Source/WebCore/html/HTMLTextFormControlElement.h
Source/WebCore/rendering/RenderButton.cpp
Source/WebCore/rendering/RenderCombineText.h
Source/WebCore/rendering/RenderDeprecatedFlexibleBox.h
Source/WebCore/rendering/RenderDetailsMarker.h
Source/WebCore/rendering/RenderFieldset.h
Source/WebCore/rendering/RenderFileUploadControl.cpp
Source/WebCore/rendering/RenderFrameSet.cpp
Source/WebCore/rendering/RenderGrid.h
Source/WebCore/rendering/RenderHTMLCanvas.cpp
Source/WebCore/rendering/RenderListBox.cpp
Source/WebCore/rendering/RenderListItem.cpp
Source/WebCore/rendering/RenderListItem.h
Source/WebCore/rendering/RenderMedia.h
Source/WebCore/rendering/RenderMenuList.cpp
Source/WebCore/rendering/RenderMultiColumnBlock.h
Source/WebCore/rendering/RenderObject.h
Source/WebCore/rendering/RenderRuby.h
Source/WebCore/rendering/RenderRubyText.h
Source/WebCore/rendering/RenderTableCaption.h
Source/WebCore/rendering/RenderTableCol.cpp
Source/WebCore/rendering/RenderTableCol.h
Source/WebCore/rendering/RenderTextControl.cpp
Source/WebCore/rendering/RenderTextControlMultiLine.cpp
Source/WebCore/rendering/RenderTextControlSingleLine.cpp
Source/WebCore/rendering/RenderWidget.h
Source/WebCore/rendering/svg/RenderSVGBlock.h
Source/WebCore/rendering/svg/RenderSVGInline.h
Source/WebCore/rendering/svg/RenderSVGInlineText.h
Source/WebCore/rendering/svg/RenderSVGModelObject.h
Source/WebCore/rendering/svg/RenderSVGResourceClipper.h
Source/WebCore/rendering/svg/RenderSVGRoot.cpp
Source/WebCore/svg/SVGElement.h
Source/WebCore/svg/SVGGraphicsElement.h

index 3fe7859..cbeb418 100644 (file)
@@ -1,3 +1,19 @@
+2013-09-20  Andreas Kling  <akling@apple.com>
+
+        Optimize fetching the Node for never-anonymous renderers.
+        <https://webkit.org/b/121627>
+
+        Reviewed by Antti Koivisto.
+
+        Add a RenderObject::nodeForNonAnonymous() that can be used instead
+        of node() when a renderer is guaranteed non-anonymous.
+
+        Use this to implement reference element getters for the various
+        renderers that are known at compile-time to correspond to a DOM node.
+
+        Also renamed existingElement() => element() since using an alternate
+        name for a reference overload isn't actually necessary.
+
 2013-09-20  Patrick Gansterer  <paroga@webkit.org>
 
         Remove duplicated secondsPerDay variables
 2013-09-20  Patrick Gansterer  <paroga@webkit.org>
 
         Remove duplicated secondsPerDay variables
index 723a8fe..67a2491 100644 (file)
@@ -70,6 +70,12 @@ private:
 #endif
 };
 
 #endif
 };
 
+inline Text& toText(Node& node)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(node.isTextNode());
+    return static_cast<Text&>(node);
+}
+
 inline Text* toText(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isTextNode());
 inline Text* toText(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isTextNode());
@@ -82,6 +88,9 @@ inline const Text* toText(const Node* node)
     return static_cast<const Text*>(node);
 }
 
     return static_cast<const Text*>(node);
 }
 
+void toText(const Text&);
+void toText(const Text*);
+
 } // namespace WebCore
 
 #endif // Text_h
 } // namespace WebCore
 
 #endif // Text_h
index cfbe6dc..380cf0f 100644 (file)
@@ -178,13 +178,20 @@ inline bool isHTMLFormControlElement(const Node* node)
     return node->isElementNode() && toElement(node)->isFormControlElement();
 }
 
     return node->isElementNode() && toElement(node)->isFormControlElement();
 }
 
+inline HTMLFormControlElement& toHTMLFormControlElement(Node& node)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(isHTMLFormControlElement(&node));
+    return static_cast<HTMLFormControlElement&>(node);
+}
+
 inline HTMLFormControlElement* toHTMLFormControlElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || isHTMLFormControlElement(node));
     return static_cast<HTMLFormControlElement*>(node);
 }
 inline HTMLFormControlElement* toHTMLFormControlElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || isHTMLFormControlElement(node));
     return static_cast<HTMLFormControlElement*>(node);
 }
-// This will catch anyone doing an unnecessary cast.
+
 void toHTMLFormControlElement(const HTMLFormControlElement*);
 void toHTMLFormControlElement(const HTMLFormControlElement*);
+void toHTMLFormControlElement(const HTMLFormControlElement&);
 
 template <> inline bool isElementOfType<HTMLFormControlElement>(const Element* element) { return isHTMLFormControlElement(element); }
 
 
 template <> inline bool isElementOfType<HTMLFormControlElement>(const Element* element) { return isHTMLFormControlElement(element); }
 
index c087f2b..5b626cf 100644 (file)
@@ -71,6 +71,12 @@ private:
     SandboxFlags m_sandboxFlags;
 };
 
     SandboxFlags m_sandboxFlags;
 };
 
+inline HTMLFrameOwnerElement& toFrameOwnerElement(Node& node)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(node.isFrameOwnerElement());
+    return static_cast<HTMLFrameOwnerElement&>(node);
+}
+
 inline HTMLFrameOwnerElement* toFrameOwnerElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isFrameOwnerElement());
 inline HTMLFrameOwnerElement* toFrameOwnerElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isFrameOwnerElement());
index 4d9349a..483f78f 100644 (file)
@@ -142,12 +142,21 @@ inline bool isHTMLTextFormControlElement(const Node* node)
     return node->isElementNode() && toElement(node)->isTextFormControl();
 }
 
     return node->isElementNode() && toElement(node)->isTextFormControl();
 }
 
+inline HTMLTextFormControlElement& toHTMLTextFormControlElement(Node& node)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(isHTMLTextFormControlElement(&node));
+    return static_cast<HTMLTextFormControlElement&>(node);
+}
+
 inline HTMLTextFormControlElement* toHTMLTextFormControlElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || isHTMLTextFormControlElement(node));
     return static_cast<HTMLTextFormControlElement*>(node);
 }
 
 inline HTMLTextFormControlElement* toHTMLTextFormControlElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || isHTMLTextFormControlElement(node));
     return static_cast<HTMLTextFormControlElement*>(node);
 }
 
+void toHTMLTextFormControlElement(const HTMLTextFormControlElement&);
+void toHTMLTextFormControlElement(const HTMLTextFormControlElement*);
+
 HTMLTextFormControlElement* enclosingTextFormControl(const Position&);
 
 } // namespace
 HTMLTextFormControlElement* enclosingTextFormControl(const Position&);
 
 } // namespace
index bd1f034..195c235 100644 (file)
@@ -47,8 +47,7 @@ RenderButton::~RenderButton()
 
 HTMLFormControlElement& RenderButton::formControlElement() const
 {
 
 HTMLFormControlElement& RenderButton::formControlElement() const
 {
-    ASSERT(RenderObject::node());
-    return *toHTMLFormControlElement(RenderObject::node());
+    return toHTMLFormControlElement(nodeForNonAnonymous());
 }
 
 bool RenderButton::canBeSelectionLeaf() const
 }
 
 bool RenderButton::canBeSelectionLeaf() const
index 55b3663..5905d4c 100644 (file)
@@ -32,7 +32,7 @@ class RenderCombineText FINAL : public RenderText {
 public:
     RenderCombineText(Text&, PassRefPtr<StringImpl>);
 
 public:
     RenderCombineText(Text&, PassRefPtr<StringImpl>);
 
-    Text& textNode() const { return *toText(RenderText::textNode()); }
+    Text& textNode() const { return toText(nodeForNonAnonymous()); }
 
     void combineText();
     void adjustTextOrigin(FloatPoint& textOrigin, const FloatRect& boxRect) const;
 
     void combineText();
     void adjustTextOrigin(FloatPoint& textOrigin, const FloatRect& boxRect) const;
index 0c594dc..b4dcf98 100644 (file)
@@ -34,7 +34,7 @@ public:
     explicit RenderDeprecatedFlexibleBox(Element&);
     virtual ~RenderDeprecatedFlexibleBox();
 
     explicit RenderDeprecatedFlexibleBox(Element&);
     virtual ~RenderDeprecatedFlexibleBox();
 
-    Element& existingElement() const { return *RenderBlock::element(); }
+    Element& element() const { return toElement(nodeForNonAnonymous()); }
 
     virtual const char* renderName() const;
 
 
     virtual const char* renderName() const;
 
@@ -52,8 +52,6 @@ public:
     void placeChild(RenderBox* child, const LayoutPoint& location, LayoutSize* childLayoutDelta = 0);
 
 private:
     void placeChild(RenderBox* child, const LayoutPoint& location, LayoutSize* childLayoutDelta = 0);
 
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const OVERRIDE;
     virtual void computePreferredLogicalWidths() OVERRIDE;
 
     virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const OVERRIDE;
     virtual void computePreferredLogicalWidths() OVERRIDE;
 
index 63562af..4ca76b5 100644 (file)
@@ -30,14 +30,12 @@ namespace WebCore {
 class RenderDetailsMarker FINAL : public RenderBlockFlow {
 public:
     explicit RenderDetailsMarker(DetailsMarkerControl&);
 class RenderDetailsMarker FINAL : public RenderBlockFlow {
 public:
     explicit RenderDetailsMarker(DetailsMarkerControl&);
-    DetailsMarkerControl& detailsMarkerControl() const { return static_cast<DetailsMarkerControl&>(*RenderBlockFlow::element()); }
+    DetailsMarkerControl& element() const { return static_cast<DetailsMarkerControl&>(nodeForNonAnonymous()); }
 
     enum Orientation { Up, Down, Left, Right };
     Orientation orientation() const;
 
 private:
 
     enum Orientation { Up, Down, Left, Right };
     Orientation orientation() const;
 
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual const char* renderName() const OVERRIDE { return "RenderDetailsMarker"; }
     virtual bool isDetailsMarker() const OVERRIDE { return true; }
     virtual void paint(PaintInfo&, const LayoutPoint&) OVERRIDE;
     virtual const char* renderName() const OVERRIDE { return "RenderDetailsMarker"; }
     virtual bool isDetailsMarker() const OVERRIDE { return true; }
     virtual void paint(PaintInfo&, const LayoutPoint&) OVERRIDE;
index 1669c0a..9f24fca 100644 (file)
@@ -38,7 +38,7 @@ public:
     enum FindLegendOption { IgnoreFloatingOrOutOfFlow, IncludeFloatingOrOutOfFlow };
     RenderBox* findLegend(FindLegendOption = IgnoreFloatingOrOutOfFlow) const;
 
     enum FindLegendOption { IgnoreFloatingOrOutOfFlow, IncludeFloatingOrOutOfFlow };
     RenderBox* findLegend(FindLegendOption = IgnoreFloatingOrOutOfFlow) const;
 
-    HTMLFieldSetElement& fieldSetElement() const { return *toHTMLFieldSetElement(RenderObject::node()); }
+    HTMLFieldSetElement& fieldSetElement() const { return toHTMLFieldSetElement(nodeForNonAnonymous()); }
 
 private:
     void element() const WTF_DELETED_FUNCTION;
 
 private:
     void element() const WTF_DELETED_FUNCTION;
index 642c9e3..7fa4f07 100644 (file)
@@ -62,7 +62,7 @@ RenderFileUploadControl::~RenderFileUploadControl()
 
 HTMLInputElement& RenderFileUploadControl::inputElement() const
 {
 
 HTMLInputElement& RenderFileUploadControl::inputElement() const
 {
-    return toHTMLInputElement(*RenderBlockFlow::element());
+    return toHTMLInputElement(nodeForNonAnonymous());
 }
 
 bool RenderFileUploadControl::canBeReplacedWithInlineRunIn() const
 }
 
 bool RenderFileUploadControl::canBeReplacedWithInlineRunIn() const
index 16cae34..dbe492b 100644 (file)
@@ -58,7 +58,7 @@ RenderFrameSet::~RenderFrameSet()
 
 HTMLFrameSetElement& RenderFrameSet::frameSetElement() const
 {
 
 HTMLFrameSetElement& RenderFrameSet::frameSetElement() const
 {
-    return toHTMLFrameSetElement(*RenderBox::element());
+    return toHTMLFrameSetElement(nodeForNonAnonymous());
 }
 
 RenderFrameSet::GridAxis::GridAxis()
 }
 
 RenderFrameSet::GridAxis::GridAxis()
index 1ca3401..e8d1b9f 100644 (file)
@@ -37,7 +37,7 @@ public:
     explicit RenderGrid(Element&);
     virtual ~RenderGrid();
 
     explicit RenderGrid(Element&);
     virtual ~RenderGrid();
 
-    Element& existingElement() const { return *RenderBlock::element(); }
+    Element& element() const { return toElement(nodeForNonAnonymous()); }
 
     virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE;
 
 
     virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE;
 
@@ -52,8 +52,6 @@ public:
     };
 
 private:
     };
 
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual const char* renderName() const OVERRIDE;
     virtual bool isRenderGrid() const OVERRIDE { return true; }
     virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const OVERRIDE;
     virtual const char* renderName() const OVERRIDE;
     virtual bool isRenderGrid() const OVERRIDE { return true; }
     virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const OVERRIDE;
index e4cdbf5..2ad5473 100644 (file)
@@ -50,8 +50,7 @@ RenderHTMLCanvas::RenderHTMLCanvas(HTMLCanvasElement& element)
 
 HTMLCanvasElement& RenderHTMLCanvas::canvasElement() const
 {
 
 HTMLCanvasElement& RenderHTMLCanvas::canvasElement() const
 {
-    ASSERT(RenderObject::node());
-    return toHTMLCanvasElement(*RenderObject::node());
+    return toHTMLCanvasElement(nodeForNonAnonymous());
 }
 
 bool RenderHTMLCanvas::requiresLayer() const
 }
 
 bool RenderHTMLCanvas::requiresLayer() const
index cdefe86..1598f16 100644 (file)
@@ -101,8 +101,7 @@ RenderListBox::~RenderListBox()
 
 HTMLSelectElement& RenderListBox::selectElement() const
 {
 
 HTMLSelectElement& RenderListBox::selectElement() const
 {
-    ASSERT(RenderObject::node());
-    return toHTMLSelectElement(*RenderObject::node());
+    return toHTMLSelectElement(nodeForNonAnonymous());
 }
 
 void RenderListBox::updateFromElement()
 }
 
 void RenderListBox::updateFromElement()
index 65c4a35..62a2245 100644 (file)
@@ -101,7 +101,7 @@ static bool isList(const Element* element)
 // Returns the enclosing list with respect to the DOM order.
 static Element* enclosingList(const RenderListItem* listItem)
 {
 // Returns the enclosing list with respect to the DOM order.
 static Element* enclosingList(const RenderListItem* listItem)
 {
-    Element& listItemElement = listItem->existingElement();
+    Element& listItemElement = listItem->element();
     Element* firstNode = 0;
     Element* parent = listItemElement.isPseudoElement() ? toPseudoElement(listItemElement).hostElement() : listItemElement.parentElement();
     // We use parentNode because the enclosing list could be a ShadowRoot that's not Element.
     Element* firstNode = 0;
     Element* parent = listItemElement.isPseudoElement() ? toPseudoElement(listItemElement).hostElement() : listItemElement.parentElement();
     // We use parentNode because the enclosing list could be a ShadowRoot that's not Element.
@@ -124,7 +124,7 @@ static RenderListItem* nextListItem(const Element* listNode, const RenderListIte
     if (!listNode)
         return 0;
 
     if (!listNode)
         return 0;
 
-    const Element* current = item ? &item->existingElement() : listNode;
+    const Element* current = item ? &item->element() : listNode;
     current = ElementTraversal::nextIncludingPseudo(current, listNode);
 
     while (current) {
     current = ElementTraversal::nextIncludingPseudo(current, listNode);
 
     while (current) {
@@ -148,7 +148,7 @@ static RenderListItem* nextListItem(const Element* listNode, const RenderListIte
 // Returns the previous list item with respect to the DOM order.
 static RenderListItem* previousListItem(const Element* listNode, const RenderListItem* item)
 {
 // Returns the previous list item with respect to the DOM order.
 static RenderListItem* previousListItem(const Element* listNode, const RenderListItem* item)
 {
-    Element* current = &item->existingElement();
+    Element* current = &item->element();
     for (current = ElementTraversal::previousIncludingPseudo(current, listNode); current; current = ElementTraversal::previousIncludingPseudo(current, listNode)) {
         RenderObject* renderer = current->renderer();
         if (!renderer || (renderer && !renderer->isListItem()))
     for (current = ElementTraversal::previousIncludingPseudo(current, listNode); current; current = ElementTraversal::previousIncludingPseudo(current, listNode)) {
         RenderObject* renderer = current->renderer();
         if (!renderer || (renderer && !renderer->isListItem()))
index 1dd1034..50894a8 100644 (file)
@@ -33,7 +33,7 @@ class RenderListMarker;
 class RenderListItem FINAL : public RenderBlockFlow {
 public:
     explicit RenderListItem(Element&);
 class RenderListItem FINAL : public RenderBlockFlow {
 public:
     explicit RenderListItem(Element&);
-    Element& existingElement() const { return *RenderBlockFlow::element(); }
+    Element& element() const { return toElement(nodeForNonAnonymous()); }
 
     int value() const { if (!m_isValueUpToDate) updateValueNow(); return m_value; }
     void updateValue();
 
     int value() const { if (!m_isValueUpToDate) updateValueNow(); return m_value; }
     void updateValue();
@@ -55,8 +55,6 @@ public:
     static unsigned itemCountForOrderedList(const HTMLOListElement*);
 
 private:
     static unsigned itemCountForOrderedList(const HTMLOListElement*);
 
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual const char* renderName() const { return "RenderListItem"; }
 
     virtual bool isListItem() const { return true; }
     virtual const char* renderName() const { return "RenderListItem"; }
 
     virtual bool isListItem() const { return true; }
index 2aeb3ba..93c8764 100644 (file)
@@ -39,7 +39,7 @@ public:
     RenderMedia(HTMLMediaElement&, const IntSize& intrinsicSize);
     virtual ~RenderMedia();
 
     RenderMedia(HTMLMediaElement&, const IntSize& intrinsicSize);
     virtual ~RenderMedia();
 
-    HTMLMediaElement& mediaElement() const { return *toHTMLMediaElement(RenderImage::element()); }
+    HTMLMediaElement& mediaElement() const { return toHTMLMediaElement(nodeForNonAnonymous()); }
 
     RenderObject* firstChild() const { return m_children.firstChild(); }
     RenderObject* lastChild() const { return m_children.lastChild(); }
 
     RenderObject* firstChild() const { return m_children.firstChild(); }
     RenderObject* lastChild() const { return m_children.lastChild(); }
index 9fbc9f0..1c83096 100644 (file)
@@ -131,8 +131,7 @@ void RenderMenuList::adjustInnerStyle()
 
 HTMLSelectElement& RenderMenuList::selectElement() const
 {
 
 HTMLSelectElement& RenderMenuList::selectElement() const
 {
-    ASSERT(RenderObject::node());
-    return toHTMLSelectElement(*RenderObject::node());
+    return toHTMLSelectElement(nodeForNonAnonymous());
 }
 
 void RenderMenuList::addChild(RenderObject* newChild, RenderObject* beforeChild)
 }
 
 void RenderMenuList::addChild(RenderObject* newChild, RenderObject* beforeChild)
index 56e3cde..e11661a 100644 (file)
@@ -36,7 +36,7 @@ class RenderMultiColumnFlowThread;
 class RenderMultiColumnBlock FINAL : public RenderBlockFlow {
 public:
     explicit RenderMultiColumnBlock(Element&);
 class RenderMultiColumnBlock FINAL : public RenderBlockFlow {
 public:
     explicit RenderMultiColumnBlock(Element&);
-    Element& existingElement() const { return *RenderBlockFlow::element(); }
+    Element& element() const { return toElement(nodeForNonAnonymous()); }
 
     LayoutUnit columnHeightAvailable() const { return m_columnHeightAvailable; }
 
 
     LayoutUnit columnHeightAvailable() const { return m_columnHeightAvailable; }
 
@@ -48,8 +48,6 @@ public:
     bool requiresBalancing() const { return !m_columnHeightAvailable; }
 
 private:
     bool requiresBalancing() const { return !m_columnHeightAvailable; }
 
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual bool isRenderMultiColumnBlock() const { return true; }
     virtual const char* renderName() const;
 
     virtual bool isRenderMultiColumnBlock() const { return true; }
     virtual const char* renderName() const;
 
index 2dc6603..9a1eff5 100644 (file)
@@ -1006,6 +1006,8 @@ protected:
     void paintFocusRing(PaintInfo&, const LayoutPoint&, RenderStyle*);
     void paintOutline(PaintInfo&, const LayoutRect&);
     void addPDFURLRect(GraphicsContext*, const LayoutRect&);
     void paintFocusRing(PaintInfo&, const LayoutPoint&, RenderStyle*);
     void paintOutline(PaintInfo&, const LayoutRect&);
     void addPDFURLRect(GraphicsContext*, const LayoutRect&);
+    Node& nodeForNonAnonymous() const { ASSERT(!isAnonymous()); return *m_node; }
+
     
     virtual LayoutRect viewRect() const;
 
     
     virtual LayoutRect viewRect() const;
 
index cbecefd..3ad0643 100644 (file)
@@ -74,7 +74,7 @@ public:
     explicit RenderRubyAsBlock(Element&);
     virtual ~RenderRubyAsBlock();
 
     explicit RenderRubyAsBlock(Element&);
     virtual ~RenderRubyAsBlock();
 
-    Element& existingElement() const { return *RenderBlockFlow::element(); }
+    Element& element() const { return toElement(nodeForNonAnonymous()); }
 
     virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE;
     virtual void removeChild(RenderObject* child) OVERRIDE;
 
     virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0) OVERRIDE;
     virtual void removeChild(RenderObject* child) OVERRIDE;
@@ -83,8 +83,6 @@ protected:
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE;
 
 private:
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE;
 
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual bool isRuby() const OVERRIDE { return true; }
     virtual const char* renderName() const OVERRIDE { return "RenderRuby (block)"; }
     virtual bool createsAnonymousWrapper() const OVERRIDE { return true; }
     virtual bool isRuby() const OVERRIDE { return true; }
     virtual const char* renderName() const OVERRIDE { return "RenderRuby (block)"; }
     virtual bool createsAnonymousWrapper() const OVERRIDE { return true; }
index 34d525c..dc1fd0d 100644 (file)
@@ -40,13 +40,11 @@ public:
     explicit RenderRubyText(Element&);
     virtual ~RenderRubyText();
 
     explicit RenderRubyText(Element&);
     virtual ~RenderRubyText();
 
-    Element& existingElement() const { return *RenderBlockFlow::element(); }
+    Element& element() const { return toElement(nodeForNonAnonymous()); }
 
     virtual bool isChildAllowed(RenderObject*, RenderStyle*) const OVERRIDE;
 
 private:
 
     virtual bool isChildAllowed(RenderObject*, RenderStyle*) const OVERRIDE;
 
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual const char* renderName() const OVERRIDE { return "RenderRubyText"; }
     virtual bool isRubyText() const OVERRIDE { return true; }
 
     virtual const char* renderName() const OVERRIDE { return "RenderRubyText"; }
     virtual bool isRubyText() const OVERRIDE { return true; }
 
index ba7306c..614092a 100644 (file)
@@ -31,13 +31,11 @@ public:
     explicit RenderTableCaption(Element&);
     virtual ~RenderTableCaption();
 
     explicit RenderTableCaption(Element&);
     virtual ~RenderTableCaption();
 
-    Element& existingElement() const { return *RenderBlockFlow::element(); }
+    Element& element() const { return toElement(nodeForNonAnonymous()); }
 
     virtual LayoutUnit containingBlockLogicalWidthForContent() const OVERRIDE;
     
 private:
 
     virtual LayoutUnit containingBlockLogicalWidthForContent() const OVERRIDE;
     
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual bool isTableCaption() const OVERRIDE { return true; }
 
     virtual void insertedIntoTree() OVERRIDE;
     virtual bool isTableCaption() const OVERRIDE { return true; }
 
     virtual void insertedIntoTree() OVERRIDE;
index f3128d0..4a92ee8 100644 (file)
@@ -59,8 +59,8 @@ void RenderTableCol::styleDidChange(StyleDifference diff, const RenderStyle* old
 void RenderTableCol::updateFromElement()
 {
     unsigned oldSpan = m_span;
 void RenderTableCol::updateFromElement()
 {
     unsigned oldSpan = m_span;
-    if (existingElement().hasTagName(colTag) || existingElement().hasTagName(colgroupTag)) {
-        HTMLTableColElement& tc = static_cast<HTMLTableColElement&>(existingElement());
+    if (element().hasTagName(colTag) || element().hasTagName(colgroupTag)) {
+        HTMLTableColElement& tc = static_cast<HTMLTableColElement&>(element());
         m_span = tc.span();
     } else
         m_span = !(style() && style()->display() == TABLE_COLUMN_GROUP);
         m_span = tc.span();
     } else
         m_span = !(style() && style()->display() == TABLE_COLUMN_GROUP);
index 9a0f39f..764ede6 100644 (file)
@@ -36,7 +36,7 @@ class RenderTableCell;
 class RenderTableCol FINAL : public RenderBox {
 public:
     explicit RenderTableCol(Element&);
 class RenderTableCol FINAL : public RenderBox {
 public:
     explicit RenderTableCol(Element&);
-    Element& existingElement() const { return *RenderBox::element(); }
+    Element& element() const { return toElement(nodeForNonAnonymous()); }
 
     RenderObject* firstChild() const { return m_children.firstChild(); }
     RenderObject* lastChild() const { return m_children.lastChild(); }
 
     RenderObject* firstChild() const { return m_children.firstChild(); }
     RenderObject* lastChild() const { return m_children.lastChild(); }
@@ -78,8 +78,6 @@ public:
     const BorderValue& borderAdjoiningCellAfter(const RenderTableCell*) const;
 
 private:
     const BorderValue& borderAdjoiningCellAfter(const RenderTableCell*) const;
 
 private:
-    void element() const WTF_DELETED_FUNCTION;
-
     virtual const char* renderName() const OVERRIDE { return "RenderTableCol"; }
     virtual bool isRenderTableCol() const OVERRIDE { return true; }
     virtual void updateFromElement() OVERRIDE;
     virtual const char* renderName() const OVERRIDE { return "RenderTableCol"; }
     virtual bool isRenderTableCol() const OVERRIDE { return true; }
     virtual void updateFromElement() OVERRIDE;
index 55fa878..7197821 100644 (file)
@@ -47,8 +47,7 @@ RenderTextControl::~RenderTextControl()
 
 HTMLTextFormControlElement& RenderTextControl::textFormControlElement() const
 {
 
 HTMLTextFormControlElement& RenderTextControl::textFormControlElement() const
 {
-    ASSERT(RenderObject::node());
-    return *toHTMLTextFormControlElement(RenderObject::node());
+    return toHTMLTextFormControlElement(nodeForNonAnonymous());
 }
 
 HTMLElement* RenderTextControl::innerTextElement() const
 }
 
 HTMLElement* RenderTextControl::innerTextElement() const
index 95f7cba..e1a905c 100644 (file)
@@ -45,8 +45,7 @@ RenderTextControlMultiLine::~RenderTextControlMultiLine()
 
 HTMLTextAreaElement& RenderTextControlMultiLine::textAreaElement() const
 {
 
 HTMLTextAreaElement& RenderTextControlMultiLine::textAreaElement() const
 {
-    ASSERT(RenderObject::node());
-    return toHTMLTextAreaElement(*RenderObject::node());
+    return toHTMLTextAreaElement(RenderTextControl::textFormControlElement());
 }
 
 bool RenderTextControlMultiLine::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
 }
 
 bool RenderTextControlMultiLine::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
index 8c5d584..5cb2542 100644 (file)
@@ -473,8 +473,7 @@ bool RenderTextControlSingleLine::logicalScroll(ScrollLogicalDirection direction
 
 HTMLInputElement& RenderTextControlSingleLine::inputElement() const
 {
 
 HTMLInputElement& RenderTextControlSingleLine::inputElement() const
 {
-    ASSERT(RenderObject::node());
-    return toHTMLInputElement(*RenderObject::node());
+    return toHTMLInputElement(RenderTextControl::textFormControlElement());
 }
 
 }
 }
 
 }
index 941d423..e21b9a4 100644 (file)
@@ -60,7 +60,7 @@ class RenderWidget : public RenderReplaced, private OverlapTestRequestClient {
 public:
     virtual ~RenderWidget();
 
 public:
     virtual ~RenderWidget();
 
-    HTMLFrameOwnerElement& frameOwnerElement() const { return *toFrameOwnerElement(RenderReplaced::element()); }
+    HTMLFrameOwnerElement& frameOwnerElement() const { return toFrameOwnerElement(nodeForNonAnonymous()); }
 
     Widget* widget() const { return m_widget.get(); }
     void setWidget(PassRefPtr<Widget>);
 
     Widget* widget() const { return m_widget.get(); }
     void setWidget(PassRefPtr<Widget>);
index 3575b64..f044fe5 100644 (file)
@@ -33,7 +33,7 @@ class RenderSVGBlock : public RenderBlockFlow {
 public:
     virtual LayoutRect visualOverflowRect() const OVERRIDE FINAL;
 
 public:
     virtual LayoutRect visualOverflowRect() const OVERRIDE FINAL;
 
-    SVGGraphicsElement& graphicsElement() const { return *toSVGGraphicsElement(RenderBlockFlow::element()); }
+    SVGGraphicsElement& graphicsElement() const { return toSVGGraphicsElement(nodeForNonAnonymous()); }
 
 protected:
     explicit RenderSVGBlock(SVGGraphicsElement&);
 
 protected:
     explicit RenderSVGBlock(SVGGraphicsElement&);
index 3b25b2b..6073b58 100644 (file)
@@ -31,7 +31,7 @@ class RenderSVGInline : public RenderInline {
 public:
     explicit RenderSVGInline(SVGGraphicsElement&);
 
 public:
     explicit RenderSVGInline(SVGGraphicsElement&);
 
-    SVGGraphicsElement& graphicsElement() const { return *toSVGGraphicsElement(RenderInline::element()); }
+    SVGGraphicsElement& graphicsElement() const { return toSVGGraphicsElement(nodeForNonAnonymous()); }
 
 private:
     void element() const WTF_DELETED_FUNCTION;
 
 private:
     void element() const WTF_DELETED_FUNCTION;
index 02fc878..1a0b5f7 100644 (file)
@@ -36,7 +36,7 @@ class RenderSVGInlineText FINAL : public RenderText {
 public:
     RenderSVGInlineText(Text&, const String&);
 
 public:
     RenderSVGInlineText(Text&, const String&);
 
-    Text& textNode() const { return *toText(RenderText::textNode()); }
+    Text& textNode() const { return toText(nodeForNonAnonymous()); }
 
     bool characterStartsNewTextChunk(int position) const;
     SVGTextLayoutAttributes* layoutAttributes() { return &m_layoutAttributes; }
 
     bool characterStartsNewTextChunk(int position) const;
     SVGTextLayoutAttributes* layoutAttributes() { return &m_layoutAttributes; }
index cfdaeb2..8f786e9 100644 (file)
@@ -67,7 +67,7 @@ public:
     bool hasSVGShadow() const { return m_hasSVGShadow; }
     void setHasSVGShadow(bool hasShadow) { m_hasSVGShadow = hasShadow; }
 
     bool hasSVGShadow() const { return m_hasSVGShadow; }
     void setHasSVGShadow(bool hasShadow) { m_hasSVGShadow = hasShadow; }
 
-    SVGElement& element() const { return *toSVGElement(RenderElement::element()); }
+    SVGElement& element() const { return toSVGElement(nodeForNonAnonymous()); }
 
 protected:
     explicit RenderSVGModelObject(SVGElement&);
 
 protected:
     explicit RenderSVGModelObject(SVGElement&);
index 8209256..6aa9f91 100644 (file)
@@ -46,7 +46,7 @@ public:
     explicit RenderSVGResourceClipper(SVGClipPathElement&);
     virtual ~RenderSVGResourceClipper();
 
     explicit RenderSVGResourceClipper(SVGClipPathElement&);
     virtual ~RenderSVGResourceClipper();
 
-    SVGClipPathElement& clipPathElement() const { return toSVGClipPathElement(RenderSVGResourceContainer::element()); }
+    SVGClipPathElement& clipPathElement() const { return toSVGClipPathElement(nodeForNonAnonymous()); }
 
     virtual void removeAllClientsFromCache(bool markForInvalidation = true);
     virtual void removeClientFromCache(RenderObject*, bool markForInvalidation = true);
 
     virtual void removeAllClientsFromCache(bool markForInvalidation = true);
     virtual void removeClientFromCache(RenderObject*, bool markForInvalidation = true);
index fdb674f..9de20a2 100644 (file)
@@ -71,7 +71,7 @@ RenderSVGRoot::~RenderSVGRoot()
 
 SVGSVGElement& RenderSVGRoot::svgSVGElement() const
 {
 
 SVGSVGElement& RenderSVGRoot::svgSVGElement() const
 {
-    return toSVGSVGElement(*RenderReplaced::element());
+    return toSVGSVGElement(nodeForNonAnonymous());
 }
 
 void RenderSVGRoot::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio, bool& isPercentageIntrinsicSize) const
 }
 
 void RenderSVGRoot::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio, bool& isPercentageIntrinsicSize) const
index 711a6a0..4857085 100644 (file)
@@ -206,6 +206,12 @@ struct SVGAttributeHashTranslator {
     static bool equal(const QualifiedName& a, const QualifiedName& b) { return a.matches(b); }
 };
 
     static bool equal(const QualifiedName& a, const QualifiedName& b) { return a.matches(b); }
 };
 
+inline SVGElement& toSVGElement(Node& node)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(node.isSVGElement());
+    return static_cast<SVGElement&>(node);
+}
+
 inline SVGElement* toSVGElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isSVGElement());
 inline SVGElement* toSVGElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isSVGElement());
@@ -219,6 +225,7 @@ inline const SVGElement* toSVGElement(const Node* node)
 }
 
 void toSVGElement(const SVGElement*);
 }
 
 void toSVGElement(const SVGElement*);
+void toSVGElement(const SVGElement&);
 
 template <> inline bool isElementOfType<SVGElement>(const Element* element) { return element->isSVGElement(); }
 
 
 template <> inline bool isElementOfType<SVGElement>(const Element* element) { return element->isSVGElement(); }
 
index 580b49f..3d93140 100644 (file)
@@ -74,10 +74,11 @@ private:
     OwnPtr<AffineTransform> m_supplementalTransform;
 };
 
     OwnPtr<AffineTransform> m_supplementalTransform;
 };
 
-inline SVGGraphicsElement& toSVGGraphicsElement(SVGElement& element)
+inline SVGGraphicsElement& toSVGGraphicsElement(Node& node)
 {
 {
-    ASSERT_WITH_SECURITY_IMPLICATION(element.isSVGGraphicsElement());
-    return static_cast<SVGGraphicsElement&>(element);
+    ASSERT_WITH_SECURITY_IMPLICATION(node.isSVGElement());
+    ASSERT_WITH_SECURITY_IMPLICATION(toSVGElement(node).isSVGGraphicsElement());
+    return static_cast<SVGGraphicsElement&>(node);
 }
 
 inline SVGGraphicsElement* toSVGGraphicsElement(Node* node)
 }
 
 inline SVGGraphicsElement* toSVGGraphicsElement(Node* node)
@@ -87,6 +88,9 @@ inline SVGGraphicsElement* toSVGGraphicsElement(Node* node)
     return static_cast<SVGGraphicsElement*>(node);
 }
 
     return static_cast<SVGGraphicsElement*>(node);
 }
 
+void toSVGGraphicsElement(const SVGGraphicsElement&);
+void toSVGGraphicsElement(const SVGGraphicsElement*);
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
 } // namespace WebCore
 
 #endif // ENABLE(SVG)