Changeset 148289 in webkit


Ignore:
Timestamp:
Apr 12, 2013 11:06:35 AM (11 years ago)
Author:
rniwa@webkit.org
Message:

Unreviewed, rolling out r147942, r148026, and r148092.
http://trac.webkit.org/changeset/147942
http://trac.webkit.org/changeset/148026
http://trac.webkit.org/changeset/148092
https://bugs.webkit.org/show_bug.cgi?id=114521

"r147942 is buggy. Rollback all the patches depending on it."
(Requested by abucur on #webkit).

Source/WebCore:

  • dom/ContainerNode.cpp:

(WebCore::willRemoveChildren):
(WebCore):
(WebCore::ContainerNode::removeChildren):

  • dom/Document.cpp:

(WebCore::Document::nodeChildrenWillBeRemoved):
(WebCore):

  • dom/Document.h:

(Document):

  • dom/Node.cpp:
  • dom/Node.h:

(Node):

  • dom/NodeTraversal.cpp:
  • dom/NodeTraversal.h:

(ElementTraversal):
(NodeTraversal):

  • dom/Range.cpp:

(WebCore::boundaryNodeChildrenWillBeRemoved):
(WebCore):
(WebCore::Range::nodeChildrenWillBeRemoved):

  • dom/Range.h:
  • html/HTMLLIElement.cpp:

(WebCore::HTMLLIElement::attach):

  • html/HTMLOListElement.cpp:

(WebCore::HTMLOListElement::updateItemValues):
(WebCore::HTMLOListElement::recalculateItemCount):

  • rendering/RenderCounter.cpp:

(WebCore::previousInPreOrder):
(WebCore::previousSiblingOrParent):
(WebCore::parentElement):
(WebCore::nextInPreOrder):

  • rendering/RenderListItem.cpp:

(WebCore::enclosingList):
(WebCore::RenderListItem::nextListItem):
(WebCore::previousListItem):
(WebCore::RenderListItem::calcValue):
(WebCore::RenderListItem::explicitValueChanged):
(WebCore::previousOrNextItem):
(WebCore::RenderListItem::updateListMarkerNumbers):

  • rendering/RenderListItem.h:

(RenderListItem):

LayoutTests:

  • fast/dom/MutationObserver/added-out-of-order-expected.txt:
  • fast/dom/MutationObserver/added-out-of-order.html:
  • fast/dom/Range/range-remove-children-event-expected.txt: Removed.
  • fast/dom/Range/range-remove-children-event.html: Removed.
  • fast/dom/containerNode-expected.txt: Added.
  • fast/dom/containerNode.html: Added.
  • fast/dom/shadow/shadow-and-list-elements-expected.html:
  • fast/events/mutation-during-innerHTML-expected.txt: Removed.
  • fast/events/mutation-during-innerHTML.html: Removed.
  • fast/lists/positioned-count-crash-expected.txt:
  • fast/regions/counters/extract-list-items-001-expected.html: Removed.
  • fast/regions/counters/extract-list-items-001.html: Removed.
  • fast/regions/counters/extract-list-items-002-expected.html: Removed.
  • fast/regions/counters/extract-list-items-002.html: Removed.
  • fast/regions/counters/extract-list-items-003-expected.html: Removed.
  • fast/regions/counters/extract-list-items-003.html: Removed.
  • fast/regions/counters/extract-list-items-004-expected.html: Removed.
  • fast/regions/counters/extract-list-items-004.html: Removed.
  • fast/regions/counters/extract-list-items-005-expected.html: Removed.
  • fast/regions/counters/extract-list-items-005.html: Removed.
  • fast/regions/counters/extract-list-items-006-expected.html: Removed.
  • fast/regions/counters/extract-list-items-006.html: Removed.
  • fast/regions/counters/extract-list-items-007-expected.html: Removed.
  • fast/regions/counters/extract-list-items-007.html: Removed.
  • fast/regions/counters/extract-list-items-008-expected.html: Removed.
  • fast/regions/counters/extract-list-items-008.html: Removed.
  • fast/regions/counters/extract-list-items-009-expected.html: Removed.
  • fast/regions/counters/extract-list-items-009.html: Removed.
  • fast/regions/counters/extract-list-items-010-expected.html: Removed.
  • fast/regions/counters/extract-list-items-010.html: Removed.
  • fast/regions/counters/extract-list-items-011-expected.html: Removed.
  • fast/regions/counters/extract-list-items-011.html: Removed.
  • fast/regions/counters/extract-list-items-012-expected.html: Removed.
  • fast/regions/counters/extract-list-items-012.html: Removed.
  • fast/regions/counters/extract-list-items-013-expected.html: Removed.
  • fast/regions/counters/extract-list-items-013.html: Removed.
  • fast/regions/counters/extract-list-items-014-expected.html: Removed.
  • fast/regions/counters/extract-list-items-014.html: Removed.
  • fast/regions/counters/extract-list-items-015-expected.html: Removed.
  • fast/regions/counters/extract-list-items-015.html: Removed.
  • fast/regions/counters/extract-numbered-paragraphs-divs-001-expected.html: Removed.
  • fast/regions/counters/extract-numbered-paragraphs-divs-001.html: Removed.
  • fast/regions/counters/extract-numbered-paragraphs-divs-002-expected.html: Removed.
  • fast/regions/counters/extract-numbered-paragraphs-divs-002.html: Removed.
  • fast/regions/counters/extract-numbered-paragraphs-expected.html: Removed.
  • fast/regions/counters/extract-numbered-paragraphs.html: Removed.
  • fast/regions/counters/extract-numbered-spans-display-only-some-expected.html: Removed.
  • fast/regions/counters/extract-numbered-spans-display-only-some.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-001-expected.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-001.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-002-expected.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-002.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-003-expected.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-003.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-001-expected.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-001.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-002-expected.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-002.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-003-expected.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-003.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-004-expected.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-004.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-005-expected.html: Removed.
  • fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-005.html: Removed.
  • fast/regions/counters/extract-unordered-lists-in-regions-expected.html: Removed.
  • fast/regions/counters/extract-unordered-lists-in-regions.html: Removed.
Location:
trunk
Files:
2 added
60 deleted
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r148288 r148289  
     12013-04-12  Commit Queue  <rniwa@webkit.org>
     2
     3        Unreviewed, rolling out r147942, r148026, and r148092.
     4        http://trac.webkit.org/changeset/147942
     5        http://trac.webkit.org/changeset/148026
     6        http://trac.webkit.org/changeset/148092
     7        https://bugs.webkit.org/show_bug.cgi?id=114521
     8
     9        "r147942 is buggy. Rollback all the patches depending on it."
     10        (Requested by abucur on #webkit).
     11
     12        * fast/dom/MutationObserver/added-out-of-order-expected.txt:
     13        * fast/dom/MutationObserver/added-out-of-order.html:
     14        * fast/dom/Range/range-remove-children-event-expected.txt: Removed.
     15        * fast/dom/Range/range-remove-children-event.html: Removed.
     16        * fast/dom/containerNode-expected.txt: Added.
     17        * fast/dom/containerNode.html: Added.
     18        * fast/dom/shadow/shadow-and-list-elements-expected.html:
     19        * fast/events/mutation-during-innerHTML-expected.txt: Removed.
     20        * fast/events/mutation-during-innerHTML.html: Removed.
     21        * fast/lists/positioned-count-crash-expected.txt:
     22        * fast/regions/counters/extract-list-items-001-expected.html: Removed.
     23        * fast/regions/counters/extract-list-items-001.html: Removed.
     24        * fast/regions/counters/extract-list-items-002-expected.html: Removed.
     25        * fast/regions/counters/extract-list-items-002.html: Removed.
     26        * fast/regions/counters/extract-list-items-003-expected.html: Removed.
     27        * fast/regions/counters/extract-list-items-003.html: Removed.
     28        * fast/regions/counters/extract-list-items-004-expected.html: Removed.
     29        * fast/regions/counters/extract-list-items-004.html: Removed.
     30        * fast/regions/counters/extract-list-items-005-expected.html: Removed.
     31        * fast/regions/counters/extract-list-items-005.html: Removed.
     32        * fast/regions/counters/extract-list-items-006-expected.html: Removed.
     33        * fast/regions/counters/extract-list-items-006.html: Removed.
     34        * fast/regions/counters/extract-list-items-007-expected.html: Removed.
     35        * fast/regions/counters/extract-list-items-007.html: Removed.
     36        * fast/regions/counters/extract-list-items-008-expected.html: Removed.
     37        * fast/regions/counters/extract-list-items-008.html: Removed.
     38        * fast/regions/counters/extract-list-items-009-expected.html: Removed.
     39        * fast/regions/counters/extract-list-items-009.html: Removed.
     40        * fast/regions/counters/extract-list-items-010-expected.html: Removed.
     41        * fast/regions/counters/extract-list-items-010.html: Removed.
     42        * fast/regions/counters/extract-list-items-011-expected.html: Removed.
     43        * fast/regions/counters/extract-list-items-011.html: Removed.
     44        * fast/regions/counters/extract-list-items-012-expected.html: Removed.
     45        * fast/regions/counters/extract-list-items-012.html: Removed.
     46        * fast/regions/counters/extract-list-items-013-expected.html: Removed.
     47        * fast/regions/counters/extract-list-items-013.html: Removed.
     48        * fast/regions/counters/extract-list-items-014-expected.html: Removed.
     49        * fast/regions/counters/extract-list-items-014.html: Removed.
     50        * fast/regions/counters/extract-list-items-015-expected.html: Removed.
     51        * fast/regions/counters/extract-list-items-015.html: Removed.
     52        * fast/regions/counters/extract-numbered-paragraphs-divs-001-expected.html: Removed.
     53        * fast/regions/counters/extract-numbered-paragraphs-divs-001.html: Removed.
     54        * fast/regions/counters/extract-numbered-paragraphs-divs-002-expected.html: Removed.
     55        * fast/regions/counters/extract-numbered-paragraphs-divs-002.html: Removed.
     56        * fast/regions/counters/extract-numbered-paragraphs-expected.html: Removed.
     57        * fast/regions/counters/extract-numbered-paragraphs.html: Removed.
     58        * fast/regions/counters/extract-numbered-spans-display-only-some-expected.html: Removed.
     59        * fast/regions/counters/extract-numbered-spans-display-only-some.html: Removed.
     60        * fast/regions/counters/extract-ordered-lists-in-regions-001-expected.html: Removed.
     61        * fast/regions/counters/extract-ordered-lists-in-regions-001.html: Removed.
     62        * fast/regions/counters/extract-ordered-lists-in-regions-002-expected.html: Removed.
     63        * fast/regions/counters/extract-ordered-lists-in-regions-002.html: Removed.
     64        * fast/regions/counters/extract-ordered-lists-in-regions-003-expected.html: Removed.
     65        * fast/regions/counters/extract-ordered-lists-in-regions-003.html: Removed.
     66        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-001-expected.html: Removed.
     67        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-001.html: Removed.
     68        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-002-expected.html: Removed.
     69        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-002.html: Removed.
     70        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-003-expected.html: Removed.
     71        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-003.html: Removed.
     72        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-004-expected.html: Removed.
     73        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-004.html: Removed.
     74        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-005-expected.html: Removed.
     75        * fast/regions/counters/extract-ordered-lists-in-regions-explicit-counters-005.html: Removed.
     76        * fast/regions/counters/extract-unordered-lists-in-regions-expected.html: Removed.
     77        * fast/regions/counters/extract-unordered-lists-in-regions.html: Removed.
     78
    1792013-04-12  Jer Noble  <jer.noble@apple.com>
    280
  • trunk/LayoutTests/fast/dom/MutationObserver/added-out-of-order-expected.txt

    r147942 r148289  
    44
    55
    6 PASS mutations.length is 2
    7 PASS mutations[0].addedNodes.length is 1
    8 PASS mutations[0].removedNodes.length is 0
    9 PASS mutations[0].addedNodes[0].tagName is "DIV"
     6PASS mutations.length is 3
     7PASS mutations[0].addedNodes.length is 0
     8PASS mutations[0].removedNodes.length is 1
     9PASS mutations[0].removedNodes[0].tagName is 'SPAN'
    1010PASS mutations[1].addedNodes.length is 1
    11 PASS mutations[1].removedNodes.length is 2
    12 PASS mutations[1].addedNodes[0].nodeValue is "hello world"
    13 PASS mutations[1].removedNodes[0].tagName is "SPAN"
    14 PASS mutations[1].removedNodes[1].tagName is "DIV"
     11PASS mutations[1].removedNodes.length is 0
     12PASS mutations[1].addedNodes[0].tagName is 'DIV'
     13PASS mutations[2].addedNodes.length is 1
     14PASS mutations[2].removedNodes.length is 0
     15PASS mutations[2].addedNodes[0].nodeValue is 'hello world'
    1516PASS successfullyParsed is true
    1617
  • trunk/LayoutTests/fast/dom/MutationObserver/added-out-of-order.html

    r147942 r148289  
    1717
    1818var mutations = observer.takeRecords();
    19 shouldBe("mutations.length", "2");
    20 shouldBe("mutations[0].addedNodes.length", "1");
    21 shouldBe("mutations[0].removedNodes.length", "0");
    22 shouldBeEqualToString("mutations[0].addedNodes[0].tagName", "DIV");
     19shouldBe("mutations.length", "3");
     20shouldBe("mutations[0].addedNodes.length", "0");
     21shouldBe("mutations[0].removedNodes.length", "1");
     22shouldBe("mutations[0].removedNodes[0].tagName", "'SPAN'");
    2323shouldBe("mutations[1].addedNodes.length", "1");
    24 shouldBe("mutations[1].removedNodes.length", "2");
    25 shouldBeEqualToString("mutations[1].addedNodes[0].nodeValue", "hello world");
    26 shouldBeEqualToString("mutations[1].removedNodes[0].tagName", "SPAN");
    27 shouldBeEqualToString("mutations[1].removedNodes[1].tagName", "DIV");
     24shouldBe("mutations[1].removedNodes.length", "0");
     25shouldBe("mutations[1].addedNodes[0].tagName", "'DIV'");
     26shouldBe("mutations[2].addedNodes.length", "1");
     27shouldBe("mutations[2].removedNodes.length", "0");
     28shouldBe("mutations[2].addedNodes[0].nodeValue", "'hello world'");
    2829</script>
    2930<script src="../../js/resources/js-test-post.js"></script>
  • trunk/LayoutTests/fast/dom/shadow/shadow-and-list-elements-expected.html

    r148026 r148289  
    2323// </ol>   
    2424var hostEquivalent = document.getElementById("hostEquivalent");
    25 var shadowListRoot = document.createElement("ol");
    26 shadowListRoot.style.paddingLeft = "0px";
    27 hostEquivalent.appendChild(shadowListRoot);
    2825
    2926var childX = document.createElement("li");
    3027childX.innerHTML = "X";
    31 childX.style.listStylePosition = "inside";
    32 shadowListRoot.appendChild(childX);
     28hostEquivalent.appendChild(childX);
    3329
    3430var childUl = document.createElement("ul");
    3531childUl.innerHTML = "B";
    36 shadowListRoot.appendChild(childUl);
     32hostEquivalent.appendChild(childUl);
    3733
    3834var childY = document.createElement("li");
    3935childY.innerHTML = "Y";
    40 childY.style.listStylePosition = "inside";
    41 shadowListRoot.appendChild(childY);
     36hostEquivalent.appendChild(childY);
    4237</script>
    4338</body>
  • trunk/LayoutTests/fast/lists/positioned-count-crash-expected.txt

    r148026 r148289  
    33
    44For manual test: If you see no crash and "II II", it means this test PASS.
    5 PASS list marker is II.
     5FAIL list marker should be II. Was I.
    66
  • trunk/Source/WebCore/ChangeLog

    r148288 r148289  
     12013-04-12  Commit Queue  <rniwa@webkit.org>
     2
     3        Unreviewed, rolling out r147942, r148026, and r148092.
     4        http://trac.webkit.org/changeset/147942
     5        http://trac.webkit.org/changeset/148026
     6        http://trac.webkit.org/changeset/148092
     7        https://bugs.webkit.org/show_bug.cgi?id=114521
     8
     9        "r147942 is buggy. Rollback all the patches depending on it."
     10        (Requested by abucur on #webkit).
     11
     12        * dom/ContainerNode.cpp:
     13        (WebCore::willRemoveChildren):
     14        (WebCore):
     15        (WebCore::ContainerNode::removeChildren):
     16        * dom/Document.cpp:
     17        (WebCore::Document::nodeChildrenWillBeRemoved):
     18        (WebCore):
     19        * dom/Document.h:
     20        (Document):
     21        * dom/Node.cpp:
     22        * dom/Node.h:
     23        (Node):
     24        * dom/NodeTraversal.cpp:
     25        * dom/NodeTraversal.h:
     26        (ElementTraversal):
     27        (NodeTraversal):
     28        * dom/Range.cpp:
     29        (WebCore::boundaryNodeChildrenWillBeRemoved):
     30        (WebCore):
     31        (WebCore::Range::nodeChildrenWillBeRemoved):
     32        * dom/Range.h:
     33        * html/HTMLLIElement.cpp:
     34        (WebCore::HTMLLIElement::attach):
     35        * html/HTMLOListElement.cpp:
     36        (WebCore::HTMLOListElement::updateItemValues):
     37        (WebCore::HTMLOListElement::recalculateItemCount):
     38        * rendering/RenderCounter.cpp:
     39        (WebCore::previousInPreOrder):
     40        (WebCore::previousSiblingOrParent):
     41        (WebCore::parentElement):
     42        (WebCore::nextInPreOrder):
     43        * rendering/RenderListItem.cpp:
     44        (WebCore::enclosingList):
     45        (WebCore::RenderListItem::nextListItem):
     46        (WebCore::previousListItem):
     47        (WebCore::RenderListItem::calcValue):
     48        (WebCore::RenderListItem::explicitValueChanged):
     49        (WebCore::previousOrNextItem):
     50        (WebCore::RenderListItem::updateListMarkerNumbers):
     51        * rendering/RenderListItem.h:
     52        (RenderListItem):
     53
    1542013-04-12  Jer Noble  <jer.noble@apple.com>
    255
  • trunk/Source/WebCore/dom/ContainerNode.cpp

    r147942 r148289  
    455455}
    456456
     457static void willRemoveChildren(ContainerNode* container)
     458{
     459    NodeVector children;
     460    getChildNodes(container, children);
     461
     462    container->document()->nodeChildrenWillBeRemoved(container);
     463
     464    ChildListMutationScope mutation(container);
     465    for (NodeVector::const_iterator it = children.begin(); it != children.end(); ++it) {
     466        Node* child = it->get();
     467        mutation.willRemoveChild(child);
     468        child->notifyMutationObserversNodeWillDetach();
     469
     470        // fire removed from document mutation events.
     471        dispatchChildRemovalEvents(child);
     472    }
     473
     474    ChildFrameDisconnector(container).disconnect(ChildFrameDisconnector::DescendantsOnly);
     475}
     476
    457477void ContainerNode::disconnectDescendantFrames()
    458478{
     
    576596    RefPtr<ContainerNode> protect(this);
    577597
    578     // Exclude this node when looking for removed focusedNode since only children will be removed.
     598    // exclude this node when looking for removed focusedNode since only children will be removed
    579599    document()->removeFocusedNodeOfSubtree(this, true);
    580600
     
    583603#endif
    584604
    585     ChildListMutationScope mutation(this);
    586     NodeVector removedChildren;
     605    // Do any prep work needed before actually starting to detach
     606    // and remove... e.g. stop loading frames, fire unload events.
     607    willRemoveChildren(protect.get());
     608
     609    Vector<RefPtr<Node>, 10> removedChildren;
    587610    {
    588611        WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
    589 
    590         while (RefPtr<Node> child = m_firstChild) {
    591             // First dispatch the mutation events if any.
    592             // Unfortunately it's possible for this to be called more than once for a node
    593             // because of the nature of mutation events (if the node is moved further in the child list
    594             // by an event handler).
    595             dispatchChildRemovalEvents(child.get());
    596             ChildFrameDisconnector(child.get()).disconnect();
    597 
    598             // Mutation or unload events could have moved this child.
    599             if (child != m_firstChild)
    600                 continue;
    601 
    602             // We can't use a bulk version of document()->nodeWillBeRemoved() before the removal loop.
    603             // We need to call document()->nodeWillBeRemoved() on each node in case the node was created
    604             // by a mutation event handler.
    605             // document()->nodeWillbeRemoved() may modify the children list so we may need to retry.
    606             document()->nodeWillBeRemoved(child.get());
    607             if (child != m_firstChild)
    608                 continue;
    609 
    610             // Notify the mutation observers.
    611             mutation.willRemoveChild(child.get());
    612             child->notifyMutationObserversNodeWillDetach();
    613 
    614             removeBetween(0, child->nextSibling(), child.get());
    615             removedChildren.append(child.release());
     612        {
     613            NoEventDispatchAssertion assertNoEventDispatch;
     614            removedChildren.reserveInitialCapacity(childNodeCount());
     615            while (RefPtr<Node> n = m_firstChild) {
     616                Node* next = n->nextSibling();
     617
     618                // Remove the node from the tree before calling detach or removedFromDocument (4427024, 4129744).
     619                // removeChild() does this after calling detach(). There is no explanation for
     620                // this discrepancy between removeChild() and its optimized version removeChildren().
     621                n->setPreviousSibling(0);
     622                n->setNextSibling(0);
     623                n->setParentOrShadowHostNode(0);
     624                document()->adoptIfNeeded(n.get());
     625
     626                m_firstChild = next;
     627                if (n == m_lastChild)
     628                    m_lastChild = 0;
     629                removedChildren.append(n.release());
     630            }
     631
     632            // Detach the nodes only after properly removed from the tree because
     633            // a. detaching requires a proper DOM tree (for counters and quotes for
     634            // example) and during the previous loop the next sibling still points to
     635            // the node being removed while the node being removed does not point back
     636            // and does not point to the same parent as its next sibling.
     637            // b. destroying Renderers of standalone nodes is sometimes faster.
     638            for (size_t i = 0; i < removedChildren.size(); ++i) {
     639                Node* removedChild = removedChildren[i].get();
     640                if (removedChild->attached())
     641                    removedChild->detach();
     642            }
    616643        }
    617644
    618         // FIXME: We could avoid walking all the children twice by calling
    619         // notify inside the loop and childrenChanged after but that would mean
    620         // calling childrenChanged in a different order than all other methods.
    621         // Figure out if this is safe.
    622645        childrenChanged(false, 0, 0, -static_cast<int>(removedChildren.size()));
     646       
    623647        for (size_t i = 0; i < removedChildren.size(); ++i)
    624648            ChildNodeRemovalNotifier(this).notify(removedChildren[i].get());
  • trunk/Source/WebCore/dom/Document.cpp

    r148123 r148289  
    35763576}
    35773577
     3578void Document::nodeChildrenWillBeRemoved(ContainerNode* container)
     3579{
     3580    if (!m_ranges.isEmpty()) {
     3581        HashSet<Range*>::const_iterator end = m_ranges.end();
     3582        for (HashSet<Range*>::const_iterator it = m_ranges.begin(); it != end; ++it)
     3583            (*it)->nodeChildrenWillBeRemoved(container);
     3584    }
     3585
     3586    HashSet<NodeIterator*>::const_iterator nodeIteratorsEnd = m_nodeIterators.end();
     3587    for (HashSet<NodeIterator*>::const_iterator it = m_nodeIterators.begin(); it != nodeIteratorsEnd; ++it) {
     3588        for (Node* n = container->firstChild(); n; n = n->nextSibling())
     3589            (*it)->nodeWillBeRemoved(n);
     3590    }
     3591
     3592    if (Frame* frame = this->frame()) {
     3593        for (Node* n = container->firstChild(); n; n = n->nextSibling()) {
     3594            frame->eventHandler()->nodeWillBeRemoved(n);
     3595            frame->selection()->nodeWillBeRemoved(n);
     3596            frame->page()->dragCaretController()->nodeWillBeRemoved(n);
     3597        }
     3598    }
     3599}
     3600
    35783601void Document::nodeWillBeRemoved(Node* n)
    35793602{
  • trunk/Source/WebCore/dom/Document.h

    r147942 r148289  
    725725
    726726    void updateRangesAfterChildrenChanged(ContainerNode*);
     727    // nodeChildrenWillBeRemoved is used when removing all node children at once.
     728    void nodeChildrenWillBeRemoved(ContainerNode*);
    727729    // nodeWillBeRemoved is only safe when removing one node at a time.
    728730    void nodeWillBeRemoved(Node*);
  • trunk/Source/WebCore/dom/Node.cpp

    r148072 r148289  
    11331133}
    11341134
    1135 Node* Node::pseudoAwarePreviousSibling() const
    1136 {
    1137     if (parentElement() && !previousSibling()) {
    1138         Element* parent = parentElement();
    1139         if (isAfterPseudoElement() && parent->lastChild())
    1140             return parent->lastChild();
    1141         if (!isBeforePseudoElement())
    1142             return parent->pseudoElement(BEFORE);
    1143     }
    1144     return previousSibling();
    1145 }
    1146 
    1147 Node* Node::pseudoAwareNextSibling() const
    1148 {
    1149     if (parentElement() && !nextSibling()) {
    1150         Element* parent = parentElement();
    1151         if (isBeforePseudoElement() && parent->firstChild())
    1152             return parent->firstChild();
    1153         if (!isAfterPseudoElement())
    1154             return parent->pseudoElement(AFTER);
    1155     }
    1156     return nextSibling();
    1157 }
    1158 
    1159 Node* Node::pseudoAwareFirstChild() const
    1160 {
    1161     if (isElementNode()) {
    1162         const Element* currentElement = toElement(this);
    1163         Node* first = currentElement->pseudoElement(BEFORE);
    1164         if (first)
    1165             return first;
    1166         first = currentElement->firstChild();
    1167         if (!first)
    1168             first = currentElement->pseudoElement(AFTER);
    1169         return first;
    1170     }
    1171 
    1172     return firstChild();
    1173 }
    1174 
    1175 Node* Node::pseudoAwareLastChild() const
    1176 {
    1177     if (isElementNode()) {
    1178         const Element* currentElement = toElement(this);
    1179         Node* last = currentElement->pseudoElement(AFTER);
    1180         if (last)
    1181             return last;
    1182         last = currentElement->lastChild();
    1183         if (!last)
    1184             last = currentElement->pseudoElement(BEFORE);
    1185         return last;
    1186     }
    1187 
    1188     return lastChild();
    1189 }
    1190 
    11911135// FIXME: This code is used by editing.  Seems like it could move over there and not pollute Node.
    11921136Node *Node::previousNodeConsideringAtomicNodes() const
  • trunk/Source/WebCore/dom/Node.h

    r148026 r148289  
    194194    bool hasAttributes() const;
    195195    NamedNodeMap* attributes() const;
    196     Node* pseudoAwareNextSibling() const;
    197     Node* pseudoAwarePreviousSibling() const;
    198     Node* pseudoAwareFirstChild() const;
    199     Node* pseudoAwareLastChild() const;
    200196
    201197    virtual KURL baseURI() const;
  • trunk/Source/WebCore/dom/NodeTraversal.cpp

    r148026 r148289  
    2727
    2828#include "ContainerNode.h"
    29 #include "PseudoElement.h"
    3029
    3130namespace WebCore {
    32 
    3331namespace NodeTraversal {
    34 
    35 Node* previousIncludingPseudo(const Node* current, const Node* stayWithin)
    36 {
    37     Node* previous;
    38     if (current == stayWithin)
    39         return 0;
    40     if ((previous = current->pseudoAwarePreviousSibling())) {
    41         while (previous->pseudoAwareLastChild())
    42             previous = previous->pseudoAwareLastChild();
    43         return previous;
    44     }
    45     return current->parentNode();
    46 }
    47 
    48 Node* nextIncludingPseudo(const Node* current, const Node* stayWithin)
    49 {
    50     Node* next;
    51     if ((next = current->pseudoAwareFirstChild()))
    52         return next;
    53     if (current == stayWithin)
    54         return 0;
    55     if ((next = current->pseudoAwareNextSibling()))
    56         return next;
    57     for (current = current->parentNode(); current; current = current->parentNode()) {
    58         if (current == stayWithin)
    59             return 0;
    60         if ((next = current->pseudoAwareNextSibling()))
    61             return next;
    62     }
    63     return 0;
    64 }
    65 
    66 Node* nextIncludingPseudoSkippingChildren(const Node* current, const Node* stayWithin)
    67 {
    68     Node* next;
    69     if (current == stayWithin)
    70         return 0;
    71     if ((next = current->pseudoAwareNextSibling()))
    72         return next;
    73     for (current = current->parentNode(); current; current = current->parentNode()) {
    74         if (current == stayWithin)
    75             return 0;
    76         if ((next = current->pseudoAwareNextSibling()))
    77             return next;
    78     }
    79     return 0;
    80 }
    8132
    8233Node* nextAncestorSibling(const Node* current)
  • trunk/Source/WebCore/dom/NodeTraversal.h

    r148026 r148289  
    3535Element* firstWithin(const Node*);
    3636Element* firstWithin(const ContainerNode*);
    37 
    3837// Pre-order traversal skipping non-element nodes.
    3938Element* next(const Node*);
     
    4140Element* next(const ContainerNode*);
    4241Element* next(const ContainerNode*, const Node* stayWithin);
    43 
    4442// Like next, but skips children.
    4543Element* nextSkippingChildren(const Node*);
     
    4745Element* nextSkippingChildren(const ContainerNode*);
    4846Element* nextSkippingChildren(const ContainerNode*, const Node* stayWithin);
    49 
    50 // Pre-order traversal including the pseudo-elements.
    51 Element* previousIncludingPseudo(const Node*, const Node* = 0);
    52 Element* nextIncludingPseudo(const Node*, const Node* = 0);
    53 Element* nextIncludingPseudoSkippingChildren(const Node*, const Node* = 0);
    54 
    55 // Utility function to traverse only the element and pseudo-element siblings of a node.
    56 Element* pseudoAwarePreviousSibling(const Node*);
    5747
    5848}
     
    8777Node* previousPostOrder(const Node*, const Node* stayWithin = 0);
    8878Node* previousSkippingChildrenPostOrder(const Node*, const Node* stayWithin = 0);
    89 
    90 // Pre-order traversal including the pseudo-elements.
    91 Node* previousIncludingPseudo(const Node*, const Node* = 0);
    92 Node* nextIncludingPseudo(const Node*, const Node* = 0);
    93 Node* nextIncludingPseudoSkippingChildren(const Node*, const Node* = 0);
    9479
    9580}
     
    151136inline Element* nextSkippingChildren(const ContainerNode* current, const Node* stayWithin) { return traverseNextElementSkippingChildrenTemplate(current, stayWithin); }
    152137inline Element* nextSkippingChildren(const Node* current, const Node* stayWithin) { return traverseNextElementSkippingChildrenTemplate(current, stayWithin); }
    153 
    154 inline Element* previousIncludingPseudo(const Node* current, const Node* stayWithin)
    155 {
    156     Node* node = NodeTraversal::previousIncludingPseudo(current, stayWithin);
    157     while (node && !node->isElementNode())
    158         node = NodeTraversal::previousIncludingPseudo(node, stayWithin);
    159     return toElement(node);
    160 }
    161 
    162 inline Element* nextIncludingPseudo(const Node* current, const Node* stayWithin)
    163 {
    164     Node* node = NodeTraversal::nextIncludingPseudo(current, stayWithin);
    165     while (node && !node->isElementNode())
    166         node = NodeTraversal::nextIncludingPseudo(node, stayWithin);
    167     return toElement(node);
    168 }
    169 
    170 inline Element* nextIncludingPseudoSkippingChildren(const Node* current, const Node* stayWithin)
    171 {
    172     Node* node = NodeTraversal::nextIncludingPseudoSkippingChildren(current, stayWithin);
    173     while (node && !node->isElementNode())
    174         node = NodeTraversal::nextIncludingPseudoSkippingChildren(node, stayWithin);
    175     return toElement(node);
    176 }
    177 
    178 inline Element* pseudoAwarePreviousSibling(const Node* current)
    179 {
    180     Node* node = current->pseudoAwarePreviousSibling();
    181     while (node && !node->isElementNode())
    182         node = node->pseudoAwarePreviousSibling();
    183     return toElement(node);
    184 }
    185 
    186138}
    187139
  • trunk/Source/WebCore/dom/Range.cpp

    r147942 r148289  
    17331733}
    17341734
     1735static inline void boundaryNodeChildrenWillBeRemoved(RangeBoundaryPoint& boundary, ContainerNode* container)
     1736{
     1737    for (Node* nodeToBeRemoved = container->firstChild(); nodeToBeRemoved; nodeToBeRemoved = nodeToBeRemoved->nextSibling()) {
     1738        if (boundary.childBefore() == nodeToBeRemoved) {
     1739            boundary.setToStartOfNode(container);
     1740            return;
     1741        }
     1742
     1743        for (Node* n = boundary.container(); n; n = n->parentNode()) {
     1744            if (n == nodeToBeRemoved) {
     1745                boundary.setToStartOfNode(container);
     1746                return;
     1747            }
     1748        }
     1749    }
     1750}
     1751
     1752void Range::nodeChildrenWillBeRemoved(ContainerNode* container)
     1753{
     1754    ASSERT(container);
     1755    ASSERT(container->document() == m_ownerDocument);
     1756    boundaryNodeChildrenWillBeRemoved(m_start, container);
     1757    boundaryNodeChildrenWillBeRemoved(m_end, container);
     1758}
     1759
    17351760static inline void boundaryNodeWillBeRemoved(RangeBoundaryPoint& boundary, Node* nodeToBeRemoved)
    17361761{
  • trunk/Source/WebCore/dom/Range.h

    r147942 r148289  
    129129
    130130    void nodeChildrenChanged(ContainerNode*);
     131    void nodeChildrenWillBeRemoved(ContainerNode*);
    131132    void nodeWillBeRemoved(Node*);
    132133
  • trunk/Source/WebCore/html/HTMLLIElement.cpp

    r148026 r148289  
    9393
    9494    if (renderer() && renderer()->isListItem()) {
    95         RenderListItem* listItemRenderer = toRenderListItem(renderer());
     95        RenderListItem* render = toRenderListItem(renderer());
    9696
    9797        // Find the enclosing list node.
    98         Element* listNode = 0;
    99         Element* current = this;
     98        Node* listNode = 0;
     99        EventPathWalker walker(this);
    100100        while (!listNode) {
    101             current = current->parentElement();
    102             if (!current)
     101            walker.moveToParent();
     102            if (!walker.node())
    103103                break;
    104             if (current->hasTagName(ulTag) || current->hasTagName(olTag))
    105                 listNode = current;
     104            if (walker.node()->hasTagName(ulTag) || walker.node()->hasTagName(olTag))
     105                listNode = walker.node();
    106106        }
    107107
     
    109109        // We don't want to change our style to say "inside" since that would affect nested nodes.
    110110        if (!listNode)
    111             listItemRenderer->setNotInList(true);
     111            render->setNotInList(true);
    112112
    113113        parseValue(fastGetAttribute(valueAttr));
  • trunk/Source/WebCore/html/HTMLOListElement.cpp

    r148026 r148289  
    107107void HTMLOListElement::updateItemValues()
    108108{
    109     for (RenderListItem* listItem = RenderListItem::nextListItem(this); listItem; listItem = RenderListItem::nextListItem(this, listItem))
     109    for (RenderListItem* listItem = RenderListItem::nextListItem(renderer()); listItem; listItem = RenderListItem::nextListItem(renderer(), listItem))
    110110        listItem->updateValue();
    111111}
     
    115115    m_itemCount = 0;
    116116
    117     for (RenderListItem* listItem = RenderListItem::nextListItem(this); listItem; listItem = RenderListItem::nextListItem(this, listItem))
     117    for (RenderListItem* listItem = RenderListItem::nextListItem(renderer()); listItem; listItem = RenderListItem::nextListItem(renderer(), listItem))
    118118        m_itemCount++;
    119119
  • trunk/Source/WebCore/rendering/RenderCounter.cpp

    r148026 r148289  
    5858static RenderObject* previousInPreOrder(const RenderObject* object)
    5959{
    60     Element* self = toElement(object->node());
    61     Element* previous = ElementTraversal::previousIncludingPseudo(self);
    62     while (previous && !previous->renderer())
    63         previous = ElementTraversal::previousIncludingPseudo(previous);
    64     return previous ? previous->renderer() : 0;
     60    Element* parent;
     61    Element* sibling;
     62    switch (object->style()->styleType()) {
     63    case NOPSEUDO:
     64        ASSERT(!object->isAnonymous());
     65        parent = toElement(object->node());
     66        sibling = parent->previousElementSibling();
     67        parent = parent->parentElement();
     68        break;
     69    case BEFORE:
     70        return object->generatingNode()->renderer(); // It is always the generating node's renderer
     71    case AFTER:
     72        parent = toElement(object->generatingNode());
     73        sibling = parent->lastElementChild();
     74        break;
     75    default:
     76        ASSERT_NOT_REACHED();
     77        return 0;
     78    }
     79    while (sibling) {
     80        if (RenderObject* renderer = sibling->renderer()) {
     81            if (RenderObject* after = sibling->pseudoElementRenderer(AFTER))
     82                return after;
     83            parent = sibling;
     84            sibling = sibling->lastElementChild();
     85            if (!sibling) {
     86                if (RenderObject* before = toElement(renderer->node())->pseudoElementRenderer(BEFORE))
     87                    return before;
     88                return renderer;
     89            }
     90        } else
     91            sibling = sibling->previousElementSibling();
     92    }
     93    if (!parent)
     94        return 0;
     95    if (RenderObject* before = parent->pseudoElementRenderer(BEFORE))
     96        return before;
     97    return parent->renderer();
    6598}
    6699
     
    69102static RenderObject* previousSiblingOrParent(const RenderObject* object)
    70103{
    71     Element* self = toElement(object->node());
    72     Element* previous = ElementTraversal::pseudoAwarePreviousSibling(self);
    73     while (previous && !previous->renderer())
    74         previous = ElementTraversal::pseudoAwarePreviousSibling(previous);
    75     if (previous)
    76         return previous->renderer();
    77     previous = self->parentElement();
    78     return previous ? previous->renderer() : 0;
    79 }
    80 
    81 static inline Element* parentElement(RenderObject* object)
    82 {
    83     return toElement(object->node())->parentElement();
     104    Element* parent;
     105    Element* sibling;
     106    switch (object->style()->styleType()) {
     107    case NOPSEUDO:
     108        ASSERT(!object->isAnonymous());
     109        parent = toElement(object->node());
     110        sibling = parent->previousElementSibling();
     111        parent = parent->parentElement();
     112        break;
     113    case BEFORE:
     114        return object->generatingNode()->renderer(); // It is always the generating node's renderer
     115    case AFTER:
     116        parent = toElement(object->generatingNode());
     117        sibling = parent->lastElementChild();
     118        break;
     119    default:
     120        ASSERT_NOT_REACHED();
     121        return 0;
     122    }
     123    while (sibling) {
     124        if (RenderObject* renderer = sibling->renderer()) // This skips invisible nodes
     125            return renderer;
     126        sibling = sibling->previousElementSibling();
     127    }
     128    if (!parent)
     129        return 0;
     130    if (RenderObject* before = parent->pseudoElementRenderer(BEFORE))
     131        return before;
     132    return parent->renderer();
     133}
     134
     135static Element* parentElement(RenderObject* object)
     136{
     137    switch (object->style()->styleType()) {
     138    case NOPSEUDO:
     139        ASSERT(!object->isAnonymous());
     140        return toElement(object->node())->parentElement();
     141    case BEFORE:
     142    case AFTER:
     143        return toElement(object->generatingNode());
     144    default:
     145        ASSERT_NOT_REACHED();
     146        return 0;
     147    }
    84148}
    85149
     
    93157static RenderObject* nextInPreOrder(const RenderObject* object, const Element* stayWithin, bool skipDescendants = false)
    94158{
    95     Element* self = toElement(object->node());
    96     Element* next = skipDescendants ? ElementTraversal::nextIncludingPseudoSkippingChildren(self, stayWithin) : ElementTraversal::nextIncludingPseudo(self, stayWithin);
    97     while (next && !next->renderer())
    98         next = skipDescendants ? ElementTraversal::nextIncludingPseudoSkippingChildren(next, stayWithin) : ElementTraversal::nextIncludingPseudo(next, stayWithin);
    99     return next ? next->renderer() : 0;
     159    Element* self;
     160    Element* child;
     161    self = toElement(object->generatingNode());
     162    if (skipDescendants)
     163        goto nextsibling;
     164    switch (object->style()->styleType()) {
     165    case NOPSEUDO:
     166        ASSERT(!object->isAnonymous());
     167        if (RenderObject* before = self->pseudoElementRenderer(BEFORE))
     168            return before;
     169        break;
     170    case BEFORE:
     171        break;
     172    case AFTER:
     173        goto nextsibling;
     174    default:
     175        ASSERT_NOT_REACHED();
     176        return 0;
     177    }
     178    child = ElementTraversal::firstWithin(self);
     179    while (true) {
     180        while (child) {
     181            if (RenderObject* renderer = child->renderer())
     182                return renderer;
     183            child = ElementTraversal::nextSkippingChildren(child, self);
     184        }
     185        if (RenderObject* after = self->pseudoElementRenderer(AFTER))
     186            return after;
     187nextsibling:
     188        if (self == stayWithin)
     189            return 0;
     190        child = ElementTraversal::nextSkippingChildren(self);
     191        self = self->parentElement();
     192        if (!self) {
     193            ASSERT(!child); // We can only reach this if we are searching beyond the root element
     194            return 0; //  which cannot have siblings
     195        }
     196    }
    100197}
    101198
  • trunk/Source/WebCore/rendering/RenderListItem.cpp

    r148175 r148289  
    2727#include "HTMLNames.h"
    2828#include "HTMLOListElement.h"
    29 #include "NodeTraversal.h"
    3029#include "RenderListMarker.h"
    3130#include "RenderView.h"
     
    9796}
    9897
    99 // Returns the enclosing list with respect to the DOM order.
    10098static Node* enclosingList(const RenderListItem* listItem)
    10199{
    102     Node* listItemNode = listItem->node();
    103100    Node* firstNode = 0;
    104     // We use parentNode because the enclosing list could be a ShadowRoot that's not Element.
    105     for (Node* parent = listItemNode->parentNode(); parent; parent = parent->parentNode()) {
    106         if (isList(parent))
    107             return parent;
    108         if (!firstNode)
    109             firstNode = parent;
     101
     102    for (const RenderObject* renderer = listItem->parent(); renderer; renderer = renderer->parent()) {
     103        Node* node = renderer->node();
     104        if (node) {
     105            if (isList(node))
     106                return node;
     107            if (!firstNode)
     108                firstNode = node;
     109        }
    110110    }
    111111
     
    116116}
    117117
    118 // Returns the next list item with respect to the DOM order.
    119 RenderListItem* RenderListItem::nextListItem(Node* listNode, const RenderListItem* item)
    120 {
    121     if (!listNode)
     118RenderListItem* RenderListItem::nextListItem(RenderObject* list, const RenderListItem* item)
     119{
     120    if (!list)
    122121        return 0;
    123122
    124     Node* current = item ? item->node() : listNode;
    125     current = ElementTraversal::nextIncludingPseudo(current, listNode);
    126 
    127     while (current) {
    128         if (isList(current)) {
     123    RenderObject* renderer = item ? item->nextInPreOrder(list) : list->nextInPreOrder(list);
     124    while (renderer) {
     125        if (renderer->node() && isList(renderer->node())) {
    129126            // We've found a nested, independent list: nothing to do here.
    130             current = ElementTraversal::nextIncludingPseudoSkippingChildren(current, listNode);
     127            renderer = renderer->nextInPreOrderAfterChildren(list);
    131128            continue;
    132129        }
    133130
    134         RenderObject* renderer = current->renderer();
    135         if (renderer && renderer->isListItem())
     131        if (renderer->isListItem())
    136132            return toRenderListItem(renderer);
    137133
    138         // FIXME: Can this be optimized to skip the children of the elements without a renderer?
    139         current = ElementTraversal::nextIncludingPseudo(current, listNode);
    140     }
    141 
     134        renderer = renderer->nextInPreOrder(list);
     135    }
    142136    return 0;
    143137}
    144138
    145 // Returns the previous list item with respect to the DOM order.
    146 static RenderListItem* previousListItem(Node* listNode, const RenderListItem* item)
    147 {
    148     Node* current = item->node();
    149     for (current = ElementTraversal::previousIncludingPseudo(current, listNode); current; current = ElementTraversal::previousIncludingPseudo(current, listNode)) {
    150         RenderObject* renderer = current->renderer();
    151         if (!renderer || (renderer && !renderer->isListItem()))
     139static RenderListItem* previousListItem(RenderObject* list, const RenderListItem* item)
     140{
     141    for (RenderObject* renderer = item->previousInPreOrder(); renderer && renderer != list; renderer = renderer->previousInPreOrder()) {
     142        if (!renderer->isListItem())
    152143            continue;
    153144        Node* otherList = enclosingList(toRenderListItem(renderer));
    154145        // This item is part of our current list, so it's what we're looking for.
    155         if (listNode == otherList)
     146        if (list->node() == otherList)
    156147            return toRenderListItem(renderer);
    157148        // We found ourself inside another list; lets skip the rest of it.
    158         // Use nextIncludingPseudo() here because the other list itself may actually
     149        // Use nextInPreOrder() here because the other list itself may actually
    159150        // be a list item itself. We need to examine it, so we do this to counteract
    160         // the previousIncludingPseudo() that will be done by the loop.
     151        // the previousInPreOrder() that will be done by the loop.
    161152        if (otherList)
    162             current = ElementTraversal::nextIncludingPseudo(otherList);
     153            renderer = otherList->renderer()->nextInPreOrder();
    163154    }
    164155    return 0;
     
    171162
    172163    Node* list = enclosingList(this);
     164    RenderObject* listRenderer = list ? list->renderer() : 0;
    173165    HTMLOListElement* oListElement = (list && list->hasTagName(olTag)) ? static_cast<HTMLOListElement*>(list) : 0;
    174166    int valueStep = 1;
     
    178170    // FIXME: This recurses to a possible depth of the length of the list.
    179171    // That's not good -- we need to change this to an iterative algorithm.
    180     if (RenderListItem* previousItem = previousListItem(list, this))
     172    if (RenderListItem* previousItem = previousListItem(listRenderer, this))
    181173        return previousItem->value() + valueStep;
    182174
     
    435427        m_marker->setNeedsLayoutAndPrefWidthsRecalc();
    436428    Node* listNode = enclosingList(this);
    437     for (RenderListItem* item = this; item; item = nextListItem(listNode, item))
     429    RenderObject* listRenderer = 0;
     430    if (listNode)
     431        listRenderer = listNode->renderer();
     432    for (RenderListItem* item = this; item; item = nextListItem(listRenderer, item))
    438433        item->updateValue();
    439434}
     
    462457}
    463458
    464 static RenderListItem* previousOrNextItem(bool isListReversed, Node* list, RenderListItem* item)
     459static RenderListItem* previousOrNextItem(bool isListReversed, RenderObject* list, RenderListItem* item)
    465460{
    466461    return isListReversed ? previousListItem(list, item) : RenderListItem::nextListItem(list, item);
     
    470465{
    471466    Node* listNode = enclosingList(this);
    472     // The list node can be the shadow root which has no renderer.
    473     ASSERT(listNode);
    474     if (!listNode)
     467    ASSERT(listNode && listNode->renderer());
     468    if (!listNode || !listNode->renderer())
    475469        return;
    476470
    477471    bool isListReversed = false;
     472    RenderObject* list = listNode->renderer();
    478473    HTMLOListElement* oListElement = (listNode && listNode->hasTagName(olTag)) ? static_cast<HTMLOListElement*>(listNode) : 0;
    479474    if (oListElement) {
     
    481476        isListReversed = oListElement->isReversed();
    482477    }
    483     for (RenderListItem* item = previousOrNextItem(isListReversed, listNode, this); item; item = previousOrNextItem(isListReversed, listNode, item)) {
     478    for (RenderListItem* item = previousOrNextItem(isListReversed, list, this); item; item = previousOrNextItem(isListReversed, list, item)) {
    484479        if (!item->m_isValueUpToDate) {
    485480            // If an item has been marked for update before, we can safely
  • trunk/Source/WebCore/rendering/RenderListItem.h

    r148026 r148289  
    5050    void updateListMarkerNumbers();
    5151
    52     static RenderListItem* nextListItem(Node*, const RenderListItem* = 0);
     52    static RenderListItem* nextListItem(RenderObject* listRenderer, const RenderListItem* = 0);
    5353
    5454private:
Note: See TracChangeset for help on using the changeset viewer.