Skip to content
  • abucur@adobe.com's avatar
    Use DOM ordering for list counts · 259fe836
    abucur@adobe.com authored
    https://bugs.webkit.org/show_bug.cgi?id=110352
    
    Reviewed by Elliott Sprehn.
    
    Source/WebCore:
    
    Currently the list items ordering is made by traversing the render tree. This gives bad results for:
    - list items flown inside regions because they are not rendered as descendants of their DOM list ancestors.
    - list items matched to insertion points inside a shadow tree. The insertion point may be a child of a
    list so the numbering gets broken.
    
    To implement correct DOM ordering I've taken into account the fact that pseudo-elements can have display: list-item
    so they should be included when traversing the DOM tree. I've added helper methods on the NodeTraversal
    namespace that should allow easily traversing the tree including the pseudo-elements (e.g. firstChildWithPseudo
    for an element with pseudo-before will return the before PseudoElement). Using these helper methods I've implemented
    pre-order traversal methods aware of the pseudo-elements.
    An effect of this change is how the list items inside shadow tree update their counting. With the patch, if there's
    no <ol> or <ul> element on the ancestor chain of a <li> element to the shadow root, the list node will be considered the
    first parent of the <li> or the shadow root if there is no ancestor.
    The RenderListItem class now makes use of this new method of traversal, replacing the one based on the render tree.
    To simplify the CSS counters implementation, I've changed the traversal functions inside RenderCounter to also make use
    of this method. The CSS counters and the list items now have the same traversal algorithm.
    
    In later patches I'll add tests that should cover the regions and shadow DOM use cases.
    Tests bug for shadow DOM: https://bugs.webkit.org/show_bug.cgi?id=113193
    Tests bug for regions: https://bugs.webkit.org/show_bug.cgi?id=103975
    
    Tests: no new tests is this patch; added the correct expectations for fast/lists/positioned-count-crash.html
    and fast/dom/shadow/shadow-and-list-elements.html
    
    * dom/Node.cpp:
    (WebCore::Node::pseudoAwarePreviousSibling):
    (WebCore):
    (WebCore::Node::pseudoAwareNextSibling):
    (WebCore::Node::pseudoAwareFirstChild):
    (WebCore::Node::pseudoAwareLastChild):
    * dom/Node.h:
    (Node):
    * dom/NodeTraversal.cpp:
    (WebCore):
    (WebCore::NodeTraversal::previousIncludingPseudo):
    (NodeTraversal):
    (WebCore::NodeTraversal::nextIncludingPseudo):
    (WebCore::NodeTraversal::nextIncludingPseudoSkippingChildren):
    * dom/NodeTraversal.h:
    (ElementTraversal):
    (NodeTraversal):
    (WebCore::ElementTraversal::previousIncludingPseudo):
    (WebCore::ElementTraversal::nextIncludingPseudo):
    (WebCore::ElementTraversal::nextIncludingPseudoSkippingChildren):
    (WebCore::ElementTraversal::pseudoAwarePreviousSibling):
    * 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):
    (WebCore::enclosingList):
    (WebCore::RenderListItem::nextListItem):
    (WebCore::previousListItem):
    (WebCore::RenderListItem::calcValue):
    (WebCore::RenderListItem::explicitValueChanged):
    (WebCore::previousOrNextItem):
    (WebCore::RenderListItem::updateListMarkerNumbers):
    * rendering/RenderListItem.h:
    (RenderListItem):
    
    LayoutTests:
    
    The fast/dom/shadow/shadow-and-list-elements-expected.html has changed because the list items
    inside the shadow tree no longer see the root <ol> element.
    The test fast/lists/positioned-count-crash.html has the correct rendering after changing
    the list counting to be in DOM order.
    
    * fast/dom/shadow/shadow-and-list-elements-expected.html:
    * fast/lists/positioned-count-crash-expected.txt:
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@148026 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    259fe836