Changeset 148289 in webkit
- Timestamp:
- Apr 12, 2013 11:06:35 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 60 deleted
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r148288 r148289 1 2013-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 1 79 2013-04-12 Jer Noble <jer.noble@apple.com> 2 80 -
trunk/LayoutTests/fast/dom/MutationObserver/added-out-of-order-expected.txt
r147942 r148289 4 4 5 5 6 PASS mutations.length is 27 PASS mutations[0].addedNodes.length is 18 PASS mutations[0].removedNodes.length is 09 PASS mutations[0]. addedNodes[0].tagName is "DIV"6 PASS mutations.length is 3 7 PASS mutations[0].addedNodes.length is 0 8 PASS mutations[0].removedNodes.length is 1 9 PASS mutations[0].removedNodes[0].tagName is 'SPAN' 10 10 PASS 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" 11 PASS mutations[1].removedNodes.length is 0 12 PASS mutations[1].addedNodes[0].tagName is 'DIV' 13 PASS mutations[2].addedNodes.length is 1 14 PASS mutations[2].removedNodes.length is 0 15 PASS mutations[2].addedNodes[0].nodeValue is 'hello world' 15 16 PASS successfullyParsed is true 16 17 -
trunk/LayoutTests/fast/dom/MutationObserver/added-out-of-order.html
r147942 r148289 17 17 18 18 var mutations = observer.takeRecords(); 19 shouldBe("mutations.length", " 2");20 shouldBe("mutations[0].addedNodes.length", " 1");21 shouldBe("mutations[0].removedNodes.length", " 0");22 shouldBe EqualToString("mutations[0].addedNodes[0].tagName", "DIV");19 shouldBe("mutations.length", "3"); 20 shouldBe("mutations[0].addedNodes.length", "0"); 21 shouldBe("mutations[0].removedNodes.length", "1"); 22 shouldBe("mutations[0].removedNodes[0].tagName", "'SPAN'"); 23 23 shouldBe("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"); 24 shouldBe("mutations[1].removedNodes.length", "0"); 25 shouldBe("mutations[1].addedNodes[0].tagName", "'DIV'"); 26 shouldBe("mutations[2].addedNodes.length", "1"); 27 shouldBe("mutations[2].removedNodes.length", "0"); 28 shouldBe("mutations[2].addedNodes[0].nodeValue", "'hello world'"); 28 29 </script> 29 30 <script src="../../js/resources/js-test-post.js"></script> -
trunk/LayoutTests/fast/dom/shadow/shadow-and-list-elements-expected.html
r148026 r148289 23 23 // </ol> 24 24 var hostEquivalent = document.getElementById("hostEquivalent"); 25 var shadowListRoot = document.createElement("ol");26 shadowListRoot.style.paddingLeft = "0px";27 hostEquivalent.appendChild(shadowListRoot);28 25 29 26 var childX = document.createElement("li"); 30 27 childX.innerHTML = "X"; 31 childX.style.listStylePosition = "inside"; 32 shadowListRoot.appendChild(childX); 28 hostEquivalent.appendChild(childX); 33 29 34 30 var childUl = document.createElement("ul"); 35 31 childUl.innerHTML = "B"; 36 shadowListRoot.appendChild(childUl);32 hostEquivalent.appendChild(childUl); 37 33 38 34 var childY = document.createElement("li"); 39 35 childY.innerHTML = "Y"; 40 childY.style.listStylePosition = "inside"; 41 shadowListRoot.appendChild(childY); 36 hostEquivalent.appendChild(childY); 42 37 </script> 43 38 </body> -
trunk/LayoutTests/fast/lists/positioned-count-crash-expected.txt
r148026 r148289 3 3 4 4 For manual test: If you see no crash and "II II", it means this test PASS. 5 PASS list marker is II.5 FAIL list marker should be II. Was I. 6 6 -
trunk/Source/WebCore/ChangeLog
r148288 r148289 1 2013-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 1 54 2013-04-12 Jer Noble <jer.noble@apple.com> 2 55 -
trunk/Source/WebCore/dom/ContainerNode.cpp
r147942 r148289 455 455 } 456 456 457 static 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 457 477 void ContainerNode::disconnectDescendantFrames() 458 478 { … … 576 596 RefPtr<ContainerNode> protect(this); 577 597 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 579 599 document()->removeFocusedNodeOfSubtree(this, true); 580 600 … … 583 603 #endif 584 604 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; 587 610 { 588 611 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 } 616 643 } 617 644 618 // FIXME: We could avoid walking all the children twice by calling619 // notify inside the loop and childrenChanged after but that would mean620 // calling childrenChanged in a different order than all other methods.621 // Figure out if this is safe.622 645 childrenChanged(false, 0, 0, -static_cast<int>(removedChildren.size())); 646 623 647 for (size_t i = 0; i < removedChildren.size(); ++i) 624 648 ChildNodeRemovalNotifier(this).notify(removedChildren[i].get()); -
trunk/Source/WebCore/dom/Document.cpp
r148123 r148289 3576 3576 } 3577 3577 3578 void 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 3578 3601 void Document::nodeWillBeRemoved(Node* n) 3579 3602 { -
trunk/Source/WebCore/dom/Document.h
r147942 r148289 725 725 726 726 void updateRangesAfterChildrenChanged(ContainerNode*); 727 // nodeChildrenWillBeRemoved is used when removing all node children at once. 728 void nodeChildrenWillBeRemoved(ContainerNode*); 727 729 // nodeWillBeRemoved is only safe when removing one node at a time. 728 730 void nodeWillBeRemoved(Node*); -
trunk/Source/WebCore/dom/Node.cpp
r148072 r148289 1133 1133 } 1134 1134 1135 Node* Node::pseudoAwarePreviousSibling() const1136 {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() const1148 {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() const1160 {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() const1176 {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 1191 1135 // FIXME: This code is used by editing. Seems like it could move over there and not pollute Node. 1192 1136 Node *Node::previousNodeConsideringAtomicNodes() const -
trunk/Source/WebCore/dom/Node.h
r148026 r148289 194 194 bool hasAttributes() const; 195 195 NamedNodeMap* attributes() const; 196 Node* pseudoAwareNextSibling() const;197 Node* pseudoAwarePreviousSibling() const;198 Node* pseudoAwareFirstChild() const;199 Node* pseudoAwareLastChild() const;200 196 201 197 virtual KURL baseURI() const; -
trunk/Source/WebCore/dom/NodeTraversal.cpp
r148026 r148289 27 27 28 28 #include "ContainerNode.h" 29 #include "PseudoElement.h"30 29 31 30 namespace WebCore { 32 33 31 namespace 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 }81 32 82 33 Node* nextAncestorSibling(const Node* current) -
trunk/Source/WebCore/dom/NodeTraversal.h
r148026 r148289 35 35 Element* firstWithin(const Node*); 36 36 Element* firstWithin(const ContainerNode*); 37 38 37 // Pre-order traversal skipping non-element nodes. 39 38 Element* next(const Node*); … … 41 40 Element* next(const ContainerNode*); 42 41 Element* next(const ContainerNode*, const Node* stayWithin); 43 44 42 // Like next, but skips children. 45 43 Element* nextSkippingChildren(const Node*); … … 47 45 Element* nextSkippingChildren(const ContainerNode*); 48 46 Element* 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*);57 47 58 48 } … … 87 77 Node* previousPostOrder(const Node*, const Node* stayWithin = 0); 88 78 Node* 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);94 79 95 80 } … … 151 136 inline Element* nextSkippingChildren(const ContainerNode* current, const Node* stayWithin) { return traverseNextElementSkippingChildrenTemplate(current, stayWithin); } 152 137 inline 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 186 138 } 187 139 -
trunk/Source/WebCore/dom/Range.cpp
r147942 r148289 1733 1733 } 1734 1734 1735 static 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 1752 void 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 1735 1760 static inline void boundaryNodeWillBeRemoved(RangeBoundaryPoint& boundary, Node* nodeToBeRemoved) 1736 1761 { -
trunk/Source/WebCore/dom/Range.h
r147942 r148289 129 129 130 130 void nodeChildrenChanged(ContainerNode*); 131 void nodeChildrenWillBeRemoved(ContainerNode*); 131 132 void nodeWillBeRemoved(Node*); 132 133 -
trunk/Source/WebCore/html/HTMLLIElement.cpp
r148026 r148289 93 93 94 94 if (renderer() && renderer()->isListItem()) { 95 RenderListItem* listItemRenderer = toRenderListItem(renderer());95 RenderListItem* render = toRenderListItem(renderer()); 96 96 97 97 // Find the enclosing list node. 98 Element* listNode = 0;99 E lement* current = this;98 Node* listNode = 0; 99 EventPathWalker walker(this); 100 100 while (!listNode) { 101 current = current->parentElement();102 if (! current)101 walker.moveToParent(); 102 if (!walker.node()) 103 103 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(); 106 106 } 107 107 … … 109 109 // We don't want to change our style to say "inside" since that would affect nested nodes. 110 110 if (!listNode) 111 listItemRenderer->setNotInList(true);111 render->setNotInList(true); 112 112 113 113 parseValue(fastGetAttribute(valueAttr)); -
trunk/Source/WebCore/html/HTMLOListElement.cpp
r148026 r148289 107 107 void HTMLOListElement::updateItemValues() 108 108 { 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)) 110 110 listItem->updateValue(); 111 111 } … … 115 115 m_itemCount = 0; 116 116 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)) 118 118 m_itemCount++; 119 119 -
trunk/Source/WebCore/rendering/RenderCounter.cpp
r148026 r148289 58 58 static RenderObject* previousInPreOrder(const RenderObject* object) 59 59 { 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(); 65 98 } 66 99 … … 69 102 static RenderObject* previousSiblingOrParent(const RenderObject* object) 70 103 { 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 135 static 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 } 84 148 } 85 149 … … 93 157 static RenderObject* nextInPreOrder(const RenderObject* object, const Element* stayWithin, bool skipDescendants = false) 94 158 { 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; 187 nextsibling: 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 } 100 197 } 101 198 -
trunk/Source/WebCore/rendering/RenderListItem.cpp
r148175 r148289 27 27 #include "HTMLNames.h" 28 28 #include "HTMLOListElement.h" 29 #include "NodeTraversal.h"30 29 #include "RenderListMarker.h" 31 30 #include "RenderView.h" … … 97 96 } 98 97 99 // Returns the enclosing list with respect to the DOM order.100 98 static Node* enclosingList(const RenderListItem* listItem) 101 99 { 102 Node* listItemNode = listItem->node();103 100 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 } 110 110 } 111 111 … … 116 116 } 117 117 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) 118 RenderListItem* RenderListItem::nextListItem(RenderObject* list, const RenderListItem* item) 119 { 120 if (!list) 122 121 return 0; 123 122 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())) { 129 126 // We've found a nested, independent list: nothing to do here. 130 current = ElementTraversal::nextIncludingPseudoSkippingChildren(current, listNode);127 renderer = renderer->nextInPreOrderAfterChildren(list); 131 128 continue; 132 129 } 133 130 134 RenderObject* renderer = current->renderer(); 135 if (renderer && renderer->isListItem()) 131 if (renderer->isListItem()) 136 132 return toRenderListItem(renderer); 137 133 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 } 142 136 return 0; 143 137 } 144 138 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())) 139 static RenderListItem* previousListItem(RenderObject* list, const RenderListItem* item) 140 { 141 for (RenderObject* renderer = item->previousInPreOrder(); renderer && renderer != list; renderer = renderer->previousInPreOrder()) { 142 if (!renderer->isListItem()) 152 143 continue; 153 144 Node* otherList = enclosingList(toRenderListItem(renderer)); 154 145 // This item is part of our current list, so it's what we're looking for. 155 if (list Node== otherList)146 if (list->node() == otherList) 156 147 return toRenderListItem(renderer); 157 148 // We found ourself inside another list; lets skip the rest of it. 158 // Use nextIn cludingPseudo() here because the other list itself may actually149 // Use nextInPreOrder() here because the other list itself may actually 159 150 // be a list item itself. We need to examine it, so we do this to counteract 160 // the previousIn cludingPseudo() that will be done by the loop.151 // the previousInPreOrder() that will be done by the loop. 161 152 if (otherList) 162 current = ElementTraversal::nextIncludingPseudo(otherList);153 renderer = otherList->renderer()->nextInPreOrder(); 163 154 } 164 155 return 0; … … 171 162 172 163 Node* list = enclosingList(this); 164 RenderObject* listRenderer = list ? list->renderer() : 0; 173 165 HTMLOListElement* oListElement = (list && list->hasTagName(olTag)) ? static_cast<HTMLOListElement*>(list) : 0; 174 166 int valueStep = 1; … … 178 170 // FIXME: This recurses to a possible depth of the length of the list. 179 171 // 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)) 181 173 return previousItem->value() + valueStep; 182 174 … … 435 427 m_marker->setNeedsLayoutAndPrefWidthsRecalc(); 436 428 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)) 438 433 item->updateValue(); 439 434 } … … 462 457 } 463 458 464 static RenderListItem* previousOrNextItem(bool isListReversed, Node* list, RenderListItem* item)459 static RenderListItem* previousOrNextItem(bool isListReversed, RenderObject* list, RenderListItem* item) 465 460 { 466 461 return isListReversed ? previousListItem(list, item) : RenderListItem::nextListItem(list, item); … … 470 465 { 471 466 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()) 475 469 return; 476 470 477 471 bool isListReversed = false; 472 RenderObject* list = listNode->renderer(); 478 473 HTMLOListElement* oListElement = (listNode && listNode->hasTagName(olTag)) ? static_cast<HTMLOListElement*>(listNode) : 0; 479 474 if (oListElement) { … … 481 476 isListReversed = oListElement->isReversed(); 482 477 } 483 for (RenderListItem* item = previousOrNextItem(isListReversed, list Node, this); item; item = previousOrNextItem(isListReversed, listNode, item)) {478 for (RenderListItem* item = previousOrNextItem(isListReversed, list, this); item; item = previousOrNextItem(isListReversed, list, item)) { 484 479 if (!item->m_isValueUpToDate) { 485 480 // If an item has been marked for update before, we can safely -
trunk/Source/WebCore/rendering/RenderListItem.h
r148026 r148289 50 50 void updateListMarkerNumbers(); 51 51 52 static RenderListItem* nextListItem( Node*, const RenderListItem* = 0);52 static RenderListItem* nextListItem(RenderObject* listRenderer, const RenderListItem* = 0); 53 53 54 54 private:
Note: See TracChangeset
for help on using the changeset viewer.