Title: [121481] trunk
Revision
121481
Author
[email protected]
Date
2012-06-28 16:05:59 -0700 (Thu, 28 Jun 2012)

Log Message

CompositeShadowTreeWalker should use InsertionPoint::hasDistribution() instead of InsertionPoint::isActive().
https://bugs.webkit.org/show_bug.cgi?id=89177

Reviewed by Dimitri Glazkov.

Source/WebCore:

Prevents ComposedShadowTreeWalker from escaping out of an
insertion point (which has distributed nodes) from a non-used
fallback element in the insertion point.  Such a fallback element
should be treated as in an orphaned subtree.

ComposedShadowTreeParentWalker will be also fixed in a follow-up patch.

Test: fast/dom/shadow/composed-shadow-tree-walker.html

* dom/ComposedShadowTreeWalker.cpp:
(WebCore::ComposedShadowTreeWalker::traverseNodeEscapingFallbackContents):

LayoutTests:

* fast/dom/shadow/composed-shadow-tree-walker-expected.txt:
* fast/dom/shadow/composed-shadow-tree-walker.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (121480 => 121481)


--- trunk/LayoutTests/ChangeLog	2012-06-28 23:03:07 UTC (rev 121480)
+++ trunk/LayoutTests/ChangeLog	2012-06-28 23:05:59 UTC (rev 121481)
@@ -1,3 +1,13 @@
+2012-06-28  Hayato Ito  <[email protected]>
+
+        CompositeShadowTreeWalker should use InsertionPoint::hasDistribution() instead of InsertionPoint::isActive().
+        https://bugs.webkit.org/show_bug.cgi?id=89177
+
+        Reviewed by Dimitri Glazkov.
+
+        * fast/dom/shadow/composed-shadow-tree-walker-expected.txt:
+        * fast/dom/shadow/composed-shadow-tree-walker.html:
+
 2012-06-28  Gregg Tavares  <[email protected]>
 
         Add support for DEPTH_STENCIL to WEBGL_depth_texture

Modified: trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker-expected.txt (121480 => 121481)


--- trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker-expected.txt	2012-06-28 23:03:07 UTC (rev 121480)
+++ trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker-expected.txt	2012-06-28 23:05:59 UTC (rev 121481)
@@ -87,7 +87,7 @@
 DIV	 id=b
 DIV	 id=a
 
-Fallback elements should not be used if  element selects any elements.
+Fallback elements should not be used if a content element selects an element.
 Composed Shadow Tree:
 DIV	 id=a
 	DIV	 id=b
@@ -102,6 +102,21 @@
 DIV	 id=b
 DIV	 id=a
 
+Test for traversal, starting with a fallback element which is not used.
+Composed Shadow Tree:
+DIV	 id=f1
+	DIV	 id=f2
+
+Traverse in forward.
+DIV	 id=f1
+DIV	 id=f2
+Traverse in backward.
+DIV	 id=f2
+DIV	 id=f1
+
+Next node of [DIV	 id=f1] is [DIV	 id=f2]
+Next node of [DIV	 id=f2] is [(null)]
+
 Test for Nested ShadowRoots.
 Composed Shadow Tree:
 DIV	 id=a

Modified: trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker.html (121480 => 121481)


--- trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker.html	2012-06-28 23:03:07 UTC (rev 121480)
+++ trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker.html	2012-06-28 23:05:59 UTC (rev 121481)
@@ -15,6 +15,8 @@
 
 function dumpNode(node)
 {
+    if (!node)
+        return '(null)'
     var output = node.nodeName + "\t";
     if (node.id)
         output += ' id=' + node.id;
@@ -78,6 +80,11 @@
     debug('');
 }
 
+function showNextNode(node) {
+    var next = internals.nextNodeByWalker(node);
+    debug('Next node of [' + dumpNode(node) + '] is [' + dumpNode(next) + ']');
+}
+
 function testComposedShadowTree(node)
 {
     var sandbox = document.getElementById('sandbox');
@@ -129,15 +136,21 @@
                                          createDOM('div', {'id': 'f2'}))),
               createDOM('div', {'id': 'c'})));
 
-debug('Fallback elements should not be used if <content> element selects any elements.');
+debug('Fallback elements should not be used if a content element selects an element.');
 testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'}),
                                createDOM('content', {'select': '#c'},
-                                         createDOM('div', {'id': 'f1'}),
-                                         createDOM('div', {'id': 'f2'}))),
+                                         createDOM('div', {'id': 'f1'},
+                                                   createDOM('div', {'id': 'f2'})))),
               createDOM('div', {'id': 'c'})));
 
+debug('Test for traversal, starting with a fallback element which is not used.');
+showComposedShadowTree(getNodeInShadowTreeStack('a/f1'));
+showNextNode(getNodeInShadowTreeStack('a/f1'));
+showNextNode(getNodeInShadowTreeStack('a/f2'));
+debug('');
+
 debug('Test for Nested ShadowRoots.');
 testComposedShadowTree(
     createDOM('div', {'id': 'a'},

Modified: trunk/Source/WebCore/ChangeLog (121480 => 121481)


--- trunk/Source/WebCore/ChangeLog	2012-06-28 23:03:07 UTC (rev 121480)
+++ trunk/Source/WebCore/ChangeLog	2012-06-28 23:05:59 UTC (rev 121481)
@@ -1,3 +1,22 @@
+2012-06-28  Hayato Ito  <[email protected]>
+
+        CompositeShadowTreeWalker should use InsertionPoint::hasDistribution() instead of InsertionPoint::isActive().
+        https://bugs.webkit.org/show_bug.cgi?id=89177
+
+        Reviewed by Dimitri Glazkov.
+
+        Prevents ComposedShadowTreeWalker from escaping out of an
+        insertion point (which has distributed nodes) from a non-used
+        fallback element in the insertion point.  Such a fallback element
+        should be treated as in an orphaned subtree.
+
+        ComposedShadowTreeParentWalker will be also fixed in a follow-up patch.
+
+        Test: fast/dom/shadow/composed-shadow-tree-walker.html
+
+        * dom/ComposedShadowTreeWalker.cpp:
+        (WebCore::ComposedShadowTreeWalker::traverseNodeEscapingFallbackContents):
+
 2012-06-27  Ryosuke Niwa  <[email protected]>
 
         Cleanup HTMLFormCollection

Modified: trunk/Source/WebCore/dom/ComposedShadowTreeWalker.cpp (121480 => 121481)


--- trunk/Source/WebCore/dom/ComposedShadowTreeWalker.cpp	2012-06-28 23:03:07 UTC (rev 121480)
+++ trunk/Source/WebCore/dom/ComposedShadowTreeWalker.cpp	2012-06-28 23:05:59 UTC (rev 121481)
@@ -188,9 +188,11 @@
 Node* ComposedShadowTreeWalker::traverseNodeEscapingFallbackContents(const Node* node) const
 {
     ASSERT(node);
-    if (isActiveInsertionPoint(node))
-        return traverseParent(node);
-    return const_cast<Node*>(node);
+    if (!isInsertionPoint(node))
+        return const_cast<Node*>(node);
+    const InsertionPoint* insertionPoint = toInsertionPoint(node);
+    return insertionPoint->hasDistribution() ? 0 :
+        insertionPoint->isActive() ? traverseParent(node) : const_cast<Node*>(node);
 }
 
 void ComposedShadowTreeWalker::parent()
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to