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
