Title: [119069] trunk
Revision
119069
Author
[email protected]
Date
2012-05-31 00:55:29 -0700 (Thu, 31 May 2012)

Log Message

ComposedShadowTreeWalker should support traversing nodes in an orphaned shadow subtree.
https://bugs.webkit.org/show_bug.cgi?id=87493

Reviewed by Dimitri Glazkov.

Source/WebCore:

ComposedShadowTreeWalker assumed that a visited shadow root is
always assigned to a shadow insertion point since it only
traverses nodes which are rendered.  But there is an exceptional
use case such as an event dispatching. Some events, such as a
'click' event, may happen in an orphaned shadow subtree.  In such
cases, traversal might start with a node in an orphaned shadow
subtree.  So ComposedShadowTreeWalker can not assume that visited
shadow root is always assigned to a shadow insertion point.

This patch only fixes ComposedShadowTreeWalker.
ComposedShadowTreeParentWalker will be fixed in another patch with
an event dispatching test.

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

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

LayoutTests:

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

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (119068 => 119069)


--- trunk/LayoutTests/ChangeLog	2012-05-31 07:33:16 UTC (rev 119068)
+++ trunk/LayoutTests/ChangeLog	2012-05-31 07:55:29 UTC (rev 119069)
@@ -1,3 +1,12 @@
+2012-05-31  Hayato Ito  <[email protected]>
+
+        ComposedShadowTreeWalker should support traversing nodes in an orphaned shadow subtree.
+        https://bugs.webkit.org/show_bug.cgi?id=87493
+
+        Reviewed by Dimitri Glazkov.
+
+        * fast/dom/shadow/composed-shadow-tree-walker.html:
+
 2012-05-31  Shane Stephens  <[email protected]>
 
         text-decoration should not be propagated through absolutely positioned elements to <a> tags

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


--- trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker-expected.txt	2012-05-31 07:33:16 UTC (rev 119068)
+++ trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker-expected.txt	2012-05-31 07:55:29 UTC (rev 119069)
@@ -174,6 +174,30 @@
 CONTENT	 id=b
 DIV	 id=a
 
+Test for an orphaned shadow subtree.
+Composed Shadow Tree:
+DIV	 id=a
+	DIV	 id=d
+
+Traverse in forward.
+DIV	 id=a
+DIV	 id=d
+Traverse in backward.
+DIV	 id=d
+DIV	 id=a
+
+Test for traversal, starting with a node in an orphaned shadow subtree.
+Composed Shadow Tree:
+DIV	 id=b
+	DIV	 id=c
+
+Traverse in forward.
+DIV	 id=b
+DIV	 id=c
+Traverse in backward.
+DIV	 id=c
+DIV	 id=b
+
 PASS successfullyParsed is true
 
 TEST COMPLETE

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


--- trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker.html	2012-05-31 07:33:16 UTC (rev 119068)
+++ trunk/LayoutTests/fast/dom/shadow/composed-shadow-tree-walker.html	2012-05-31 07:55:29 UTC (rev 119069)
@@ -6,6 +6,7 @@
 </head>
 <body>
 <div id="console"></div>
+<div id="sandbox"></div>
 <script>
 description("Tests for Composed Shadow DOM Tree Traversal APIs. Can only run within DRT");
 
@@ -65,9 +66,6 @@
 
 function showComposedShadowTree(node)
 {
-    document.body.appendChild(node);
-    document.body.offsetLeft;
-
     debug('Composed Shadow Tree:');
     debug(dumpComposedShadowTree(node));
 
@@ -80,14 +78,23 @@
     debug('');
 }
 
+function testComposedShadowTree(node)
+{
+    var sandbox = document.getElementById('sandbox');
+    sandbox.innerHTML = '';
+    sandbox.appendChild(node);
+    document.body.offsetLeft;
+    showComposedShadowTree(node);
+}
+
 debug('ShadowRoot should be used.');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'})),
               createDOM('div', {'id': 'c'})));
 
 debug('A content element should select light children');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'}),
                                createDOM('content')),
@@ -95,7 +102,7 @@
               createDOM('div', {'id': 'd'})));
 
 debug('Test for content element selector.');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'}),
                                createDOM('content', {'select': '#d'})),
@@ -104,7 +111,7 @@
               createDOM('div', {'id': 'e'})));
 
 debug('Light children should be selected only at once.');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'}),
                                createDOM('content', {'select': '#d'}),
@@ -114,7 +121,7 @@
               createDOM('div', {'id': 'e'})));
 
 debug('A content element can have fallback elements.');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'}),
                                createDOM('content', {'select': '#z'},
@@ -123,7 +130,7 @@
               createDOM('div', {'id': 'c'})));
 
 debug('Fallback elements should not be used if <content> element selects any elements.');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'}),
                                createDOM('content', {'select': '#c'},
@@ -132,7 +139,7 @@
               createDOM('div', {'id': 'c'})));
 
 debug('Test for Nested ShadowRoots.');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'},
                                          createShadowRoot(createDOM('div', {'id': 'c'}),
@@ -146,7 +153,7 @@
               createDOM('div', {'id': 'i'})));
 
 debug('Test for Multiple ShadowRoots.');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createShadowRoot(createDOM('div', {'id': 'b'}),
                                createDOM('content'),
@@ -157,11 +164,23 @@
               createDOM('div', {'id': 'f'})));
 
 debug('Test for inactive insertion points.');
-showComposedShadowTree(
+testComposedShadowTree(
     createDOM('div', {'id': 'a'},
               createDOM('content', {'id': 'b'},
                         createDOM('content', {'id': 'c'}))));
 
+debug('Test for an orphaned shadow subtree.');
+testComposedShadowTree(
+    createDOM('div', {'id': 'a'},
+              createShadowRoot(
+                  createDOM('div', {'id': 'b'},
+                            createDOM('div', {'id': 'c'}))),
+              createShadowRoot(
+                  createDOM('div', {'id': 'd'}))));
+
+debug('Test for traversal, starting with a node in an orphaned shadow subtree.');
+showComposedShadowTree(getNodeInShadowTreeStack('a/b'));
+
 </script>
 <script src=""
 </body>

Modified: trunk/Source/WebCore/ChangeLog (119068 => 119069)


--- trunk/Source/WebCore/ChangeLog	2012-05-31 07:33:16 UTC (rev 119068)
+++ trunk/Source/WebCore/ChangeLog	2012-05-31 07:55:29 UTC (rev 119069)
@@ -1,3 +1,29 @@
+2012-05-31  Hayato Ito  <[email protected]>
+
+        ComposedShadowTreeWalker should support traversing nodes in an orphaned shadow subtree.
+        https://bugs.webkit.org/show_bug.cgi?id=87493
+
+        Reviewed by Dimitri Glazkov.
+
+        ComposedShadowTreeWalker assumed that a visited shadow root is
+        always assigned to a shadow insertion point since it only
+        traverses nodes which are rendered.  But there is an exceptional
+        use case such as an event dispatching. Some events, such as a
+        'click' event, may happen in an orphaned shadow subtree.  In such
+        cases, traversal might start with a node in an orphaned shadow
+        subtree.  So ComposedShadowTreeWalker can not assume that visited
+        shadow root is always assigned to a shadow insertion point.
+
+        This patch only fixes ComposedShadowTreeWalker.
+        ComposedShadowTreeParentWalker will be fixed in another patch with
+        an event dispatching test.
+
+        Test: fast/dom/shadow/composed-shadow-tree-walker.html
+
+        * dom/ComposedShadowTreeWalker.cpp:
+        (WebCore::ComposedShadowTreeWalker::traverseParentBackToYoungerShadowRootOrHost):
+
+
 2012-05-30  Yury Semikhatsky  <[email protected]>
 
         Web Inspector: add MemoryUsageSupport::processMemorySizesInBytes

Modified: trunk/Source/WebCore/dom/ComposedShadowTreeWalker.cpp (119068 => 119069)


--- trunk/Source/WebCore/dom/ComposedShadowTreeWalker.cpp	2012-05-31 07:33:16 UTC (rev 119068)
+++ trunk/Source/WebCore/dom/ComposedShadowTreeWalker.cpp	2012-05-31 07:55:29 UTC (rev 119069)
@@ -229,8 +229,7 @@
         return const_cast<ShadowRoot*>(shadowRoot);
     }
     InsertionPoint* assignedInsertionPoint = shadowRoot->assignedTo();
-    ASSERT(assignedInsertionPoint);
-    return traverseParent(assignedInsertionPoint);
+    return assignedInsertionPoint ? traverseParent(assignedInsertionPoint) : 0;
 }
 
 Node* ComposedShadowTreeWalker::traverseNextSibling(const Node* node)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to