[CTTE] RenderListItem is never anonymous.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Sep 2013 11:15:04 +0000 (11:15 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Sep 2013 11:15:04 +0000 (11:15 +0000)
<https://webkit.org/b/121285>

Reviewed by Antti Koivisto.

Hide element() and provide existingElement() instead, returning an Element&.
Removed some bogus assertions that were exposed by this.

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

Source/WebCore/ChangeLog
Source/WebCore/dom/PseudoElement.h
Source/WebCore/rendering/RenderListItem.cpp
Source/WebCore/rendering/RenderListItem.h
Source/WebCore/rendering/RenderObject.cpp

index 73b6591..134c396 100644 (file)
@@ -1,5 +1,15 @@
 2013-09-13  Andreas Kling  <akling@apple.com>
 
+        [CTTE] RenderListItem is never anonymous.
+        <https://webkit.org/b/121285>
+
+        Reviewed by Antti Koivisto.
+
+        Hide element() and provide existingElement() instead, returning an Element&.
+        Removed some bogus assertions that were exposed by this.
+
+2013-09-13  Andreas Kling  <akling@apple.com>
+
         [CTTE] Tighter element types for RenderSVGInline and subclasses.
         <https://webkit.org/b/121283>
 
index 85e3a32..3de93c6 100644 (file)
@@ -77,6 +77,12 @@ inline bool pseudoElementRendererIsNeeded(const RenderStyle* style)
     return style && style->display() != NONE && (style->contentData() || !style->regionThread().isEmpty());
 }
 
+inline PseudoElement& toPseudoElement(Node& node)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(node.isPseudoElement());
+    return static_cast<PseudoElement&>(node);
+}
+
 inline PseudoElement* toPseudoElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isPseudoElement());
index 1afe526..c2bc114 100644 (file)
@@ -41,8 +41,8 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-RenderListItem::RenderListItem(Element* element)
-    : RenderBlockFlow(element)
+RenderListItem::RenderListItem(Element& element)
+    : RenderBlockFlow(&element)
     , m_marker(0)
     , m_hasExplicitValue(false)
     , m_isValueUpToDate(false)
@@ -101,9 +101,9 @@ static bool isList(const Element* element)
 // Returns the enclosing list with respect to the DOM order.
 static Element* enclosingList(const RenderListItem* listItem)
 {
-    Element* listItemNode = listItem->element();
+    Element& listItemElement = listItem->existingElement();
     Element* firstNode = 0;
-    Element* parent = listItemNode->isPseudoElement() ? toPseudoElement(listItemNode)->hostElement() : listItemNode->parentElement();
+    Element* parent = listItemElement.isPseudoElement() ? toPseudoElement(listItemElement).hostElement() : listItemElement.parentElement();
     // We use parentNode because the enclosing list could be a ShadowRoot that's not Element.
     for (; parent; parent = parent->parentElement()) {
         if (isList(parent))
@@ -124,7 +124,7 @@ static RenderListItem* nextListItem(const Element* listNode, const RenderListIte
     if (!listNode)
         return 0;
 
-    const Element* current = item ? item->element() : listNode;
+    const Element* current = item ? &item->existingElement() : listNode;
     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)
 {
-    Element* current = item->element();
+    Element* current = &item->existingElement();
     for (current = ElementTraversal::previousIncludingPseudo(current, listNode); current; current = ElementTraversal::previousIncludingPseudo(current, listNode)) {
         RenderObject* renderer = current->renderer();
         if (!renderer || (renderer && !renderer->isListItem()))
@@ -471,8 +471,6 @@ void RenderListItem::explicitValueChanged()
 
 void RenderListItem::setExplicitValue(int value)
 {
-    ASSERT(element());
-
     if (m_hasExplicitValue && m_explicitValue == value)
         return;
     m_explicitValue = value;
@@ -483,8 +481,6 @@ void RenderListItem::setExplicitValue(int value)
 
 void RenderListItem::clearExplicitValue()
 {
-    ASSERT(element());
-
     if (!m_hasExplicitValue)
         return;
     m_hasExplicitValue = false;
index c108a15..1dd1034 100644 (file)
@@ -32,7 +32,8 @@ class RenderListMarker;
 
 class RenderListItem FINAL : public RenderBlockFlow {
 public:
-    explicit RenderListItem(Element*);
+    explicit RenderListItem(Element&);
+    Element& existingElement() const { return *RenderBlockFlow::element(); }
 
     int value() const { if (!m_isValueUpToDate) updateValueNow(); return m_value; }
     void updateValue();
@@ -54,6 +55,8 @@ public:
     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; }
index 2d75f9c..4875530 100644 (file)
@@ -209,7 +209,7 @@ RenderObject* RenderObject::createObject(Element* element, RenderStyle* style)
             return new (arena) RenderMultiColumnBlock(element);
         return new (arena) RenderBlockFlow(element);
     case LIST_ITEM:
-        return new (arena) RenderListItem(element);
+        return new (arena) RenderListItem(*element);
     case TABLE:
     case INLINE_TABLE:
         return new (arena) RenderTable(element);