Title: [199097] trunk
Revision
199097
Author
[email protected]
Date
2016-04-06 02:27:22 -0700 (Wed, 06 Apr 2016)

Log Message

ComposedTreeIterator may crash when first child of shadow root is a comment node
https://bugs.webkit.org/show_bug.cgi?id=156281

Reviewed by Andreas Kling.

Source/WebCore:

It should not use plain firstChild() and assume it is Element or Text.

* dom/ComposedTreeIterator.cpp:
(WebCore::ComposedTreeIterator::Context::Context):

    Add FirstChildTag to various iterator constructors to make clear that they search for the first child.

(WebCore::ComposedTreeIterator::ComposedTreeIterator):
(WebCore::ComposedTreeIterator::traverseShadowRoot):

    Fix by using ElementAndTextDescendantIterator to find the first child.

* dom/ComposedTreeIterator.h:
(WebCore::ComposedTreeIterator::operator*):
(WebCore::ComposedTreeDescendantAdapter::ComposedTreeDescendantAdapter):
(WebCore::ComposedTreeDescendantAdapter::begin):
(WebCore::ComposedTreeDescendantAdapter::end):
(WebCore::ComposedTreeDescendantAdapter::at):
(WebCore::ComposedTreeChildAdapter::Iterator::Iterator):
* dom/ElementAndTextDescendantIterator.h:
(WebCore::ElementAndTextDescendantIterator::operator++):
(WebCore::ElementAndTextDescendantIterator::ElementAndTextDescendantIterator):
(WebCore::ElementAndTextDescendantIteratorAdapter::begin):
(WebCore::ElementAndTextDescendantIteratorAdapter::end):

LayoutTests:

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

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (199096 => 199097)


--- trunk/LayoutTests/ChangeLog	2016-04-06 06:10:32 UTC (rev 199096)
+++ trunk/LayoutTests/ChangeLog	2016-04-06 09:27:22 UTC (rev 199097)
@@ -1,3 +1,13 @@
+2016-04-06  Antti Koivisto  <[email protected]>
+
+        ComposedTreeIterator may crash when first child of shadow root is a comment node
+        https://bugs.webkit.org/show_bug.cgi?id=156281
+
+        Reviewed by Andreas Kling.
+
+        * fast/shadow-dom/composed-tree-shadow-subtree-expected.txt:
+        * fast/shadow-dom/composed-tree-shadow-subtree.html:
+
 2016-04-05  Chris Dumez  <[email protected]>
 
         MessageEvent.source window is incorrect once window has been reified

Modified: trunk/LayoutTests/fast/shadow-dom/composed-tree-shadow-subtree-expected.txt (199096 => 199097)


--- trunk/LayoutTests/fast/shadow-dom/composed-tree-shadow-subtree-expected.txt	2016-04-06 06:10:32 UTC (rev 199096)
+++ trunk/LayoutTests/fast/shadow-dom/composed-tree-shadow-subtree-expected.txt	2016-04-06 09:27:22 UTC (rev 199097)
@@ -1,16 +1,21 @@
 
-Test 1
+Test 1.1
   div (shadow root)
 
 Shadow host subtree
 
-Test 2
+Test 1.2
   div (shadow root)
 
 Shadow host subtree
 
-Test 3
+Test 1.3
   div (shadow root)
+
+Shadow host subtree
+
+Test 2.1
+  div (shadow root)
     slot
       div
 
@@ -21,7 +26,7 @@
 Slot subtree
   div
 
-Test 4
+Test 2.2
   div (shadow root)
     slot
       #text
@@ -33,3 +38,51 @@
 Slot subtree
   #text
 
+Test 2.3
+  div (shadow root)
+    slot
+      #text
+
+Shadow host subtree
+  slot
+    #text
+
+Slot subtree
+  #text
+
+Test 3.1
+  div (shadow root)
+    slot
+      div
+
+Shadow host subtree
+  slot
+    div
+
+Slot subtree
+  div
+
+Test 3.2
+  div (shadow root)
+    slot
+      #text
+
+Shadow host subtree
+  slot
+    #text
+
+Slot subtree
+  #text
+
+Test 3.3
+  div (shadow root)
+    slot
+      #text
+
+Shadow host subtree
+  slot
+    #text
+
+Slot subtree
+  #text
+

Modified: trunk/LayoutTests/fast/shadow-dom/composed-tree-shadow-subtree.html (199096 => 199097)


--- trunk/LayoutTests/fast/shadow-dom/composed-tree-shadow-subtree.html	2016-04-06 06:10:32 UTC (rev 199096)
+++ trunk/LayoutTests/fast/shadow-dom/composed-tree-shadow-subtree.html	2016-04-06 09:27:22 UTC (rev 199097)
@@ -6,12 +6,20 @@
 
 <template id=shadow1></template>
 <template id=shadow2><slot><div></div></slot></template>
+<template id=shadow3><!--comment--><slot><div></div></slot></template>
 
-<template test=1><div shadow=shadow1></div></template>
-<template test=2><div shadow=shadow1>text</div></template>
-<template test=3><div shadow=shadow2></div></template>
-<template test=4><div shadow=shadow2>text</div></template>
+<template test=1.1><div shadow=shadow1></div></template>
+<template test=1.2><div shadow=shadow1>text</div></template>
+<template test=1.3><div shadow=shadow1><!--comment-->text</div></template>
 
+<template test=2.1><div shadow=shadow2></div></template>
+<template test=2.2><div shadow=shadow2>text</div></template>
+<template test=2.3><div shadow=shadow2><!--comment-->text</div></template>
+
+<template test=3.1><div shadow=shadow3></div></template>
+<template test=3.2><div shadow=shadow3>text</div></template>
+<template test=3.3><div shadow=shadow3><!--comment-->text</div></template>
+
 <body>
 <pre id=console></pre>
 <script>

Modified: trunk/Source/WebCore/ChangeLog (199096 => 199097)


--- trunk/Source/WebCore/ChangeLog	2016-04-06 06:10:32 UTC (rev 199096)
+++ trunk/Source/WebCore/ChangeLog	2016-04-06 09:27:22 UTC (rev 199097)
@@ -1,3 +1,35 @@
+2016-04-06  Antti Koivisto  <[email protected]>
+
+        ComposedTreeIterator may crash when first child of shadow root is a comment node
+        https://bugs.webkit.org/show_bug.cgi?id=156281
+
+        Reviewed by Andreas Kling.
+
+        It should not use plain firstChild() and assume it is Element or Text.
+
+        * dom/ComposedTreeIterator.cpp:
+        (WebCore::ComposedTreeIterator::Context::Context):
+
+            Add FirstChildTag to various iterator constructors to make clear that they search for the first child.
+
+        (WebCore::ComposedTreeIterator::ComposedTreeIterator):
+        (WebCore::ComposedTreeIterator::traverseShadowRoot):
+
+            Fix by using ElementAndTextDescendantIterator to find the first child.
+
+        * dom/ComposedTreeIterator.h:
+        (WebCore::ComposedTreeIterator::operator*):
+        (WebCore::ComposedTreeDescendantAdapter::ComposedTreeDescendantAdapter):
+        (WebCore::ComposedTreeDescendantAdapter::begin):
+        (WebCore::ComposedTreeDescendantAdapter::end):
+        (WebCore::ComposedTreeDescendantAdapter::at):
+        (WebCore::ComposedTreeChildAdapter::Iterator::Iterator):
+        * dom/ElementAndTextDescendantIterator.h:
+        (WebCore::ElementAndTextDescendantIterator::operator++):
+        (WebCore::ElementAndTextDescendantIterator::ElementAndTextDescendantIterator):
+        (WebCore::ElementAndTextDescendantIteratorAdapter::begin):
+        (WebCore::ElementAndTextDescendantIteratorAdapter::end):
+
 2016-04-05  Chris Dumez  <[email protected]>
 
         Add support for [EnabledAtRuntime] operations on DOMWindow

Modified: trunk/Source/WebCore/dom/ComposedTreeIterator.cpp (199096 => 199097)


--- trunk/Source/WebCore/dom/ComposedTreeIterator.cpp	2016-04-06 06:10:32 UTC (rev 199096)
+++ trunk/Source/WebCore/dom/ComposedTreeIterator.cpp	2016-04-06 09:27:22 UTC (rev 199097)
@@ -35,8 +35,8 @@
 {
 }
 
-ComposedTreeIterator::Context::Context(ContainerNode& root)
-    : iterator(root)
+ComposedTreeIterator::Context::Context(ContainerNode& root, FirstChildTag)
+    : iterator(root, ElementAndTextDescendantIterator::FirstChild)
 {
 }
 
@@ -54,7 +54,7 @@
 }
 #endif
 
-ComposedTreeIterator::ComposedTreeIterator(ContainerNode& root)
+ComposedTreeIterator::ComposedTreeIterator(ContainerNode& root, FirstChildTag)
 {
     ASSERT(!is<ShadowRoot>(root));
 
@@ -68,12 +68,12 @@
     }
 #endif
     if (auto* shadowRoot = root.shadowRoot()) {
-        auto* firstChild = shadowRoot->firstChild();
+        ElementAndTextDescendantIterator firstChild(*shadowRoot, ElementAndTextDescendantIterator::FirstChild);
         initializeContextStack(root, firstChild ? *firstChild : root);
         return;
     }
 
-    m_contextStack.uncheckedAppend(Context(root));
+    m_contextStack.uncheckedAppend(Context(root, FirstChild));
 }
 
 ComposedTreeIterator::ComposedTreeIterator(ContainerNode& root, Node& current)
@@ -148,7 +148,7 @@
 
 void ComposedTreeIterator::traverseShadowRoot(ShadowRoot& shadowRoot)
 {
-    Context shadowContext(shadowRoot);
+    Context shadowContext(shadowRoot, FirstChild);
     if (!shadowContext.iterator) {
         // Empty shadow root.
         traverseNextSkippingChildren();

Modified: trunk/Source/WebCore/dom/ComposedTreeIterator.h (199096 => 199097)


--- trunk/Source/WebCore/dom/ComposedTreeIterator.h	2016-04-06 06:10:32 UTC (rev 199096)
+++ trunk/Source/WebCore/dom/ComposedTreeIterator.h	2016-04-06 09:27:22 UTC (rev 199097)
@@ -36,7 +36,8 @@
 class ComposedTreeIterator {
 public:
     ComposedTreeIterator();
-    ComposedTreeIterator(ContainerNode& root);
+    enum FirstChildTag { FirstChild };
+    ComposedTreeIterator(ContainerNode& root, FirstChildTag);
     ComposedTreeIterator(ContainerNode& root, Node& current);
 
     Node& operator*() { return current(); }
@@ -68,7 +69,7 @@
 
     struct Context {
         Context();
-        explicit Context(ContainerNode& root);
+        Context(ContainerNode& root, FirstChildTag);
         Context(ContainerNode& root, Node& node);
 
 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
@@ -156,7 +157,7 @@
         : m_parent(parent)
     { }
 
-    ComposedTreeIterator begin() { return ComposedTreeIterator(m_parent); }
+    ComposedTreeIterator begin() { return ComposedTreeIterator(m_parent, ComposedTreeIterator::FirstChild); }
     ComposedTreeIterator end() { return { }; }
     ComposedTreeIterator at(const Node& child) { return ComposedTreeIterator(m_parent, const_cast<Node&>(child)); }
     
@@ -170,7 +171,7 @@
     public:
         Iterator() = default;
         explicit Iterator(ContainerNode& root)
-            : ComposedTreeIterator(root)
+            : ComposedTreeIterator(root, ComposedTreeIterator::FirstChild)
         { }
         Iterator(ContainerNode& root, Node& current)
             : ComposedTreeIterator(root, current)

Modified: trunk/Source/WebCore/dom/ElementAndTextDescendantIterator.h (199096 => 199097)


--- trunk/Source/WebCore/dom/ElementAndTextDescendantIterator.h	2016-04-06 06:10:32 UTC (rev 199096)
+++ trunk/Source/WebCore/dom/ElementAndTextDescendantIterator.h	2016-04-06 09:27:22 UTC (rev 199097)
@@ -36,7 +36,8 @@
 class ElementAndTextDescendantIterator {
 public:
     ElementAndTextDescendantIterator();
-    explicit ElementAndTextDescendantIterator(ContainerNode& root);
+    enum FirstChildTag { FirstChild };
+    ElementAndTextDescendantIterator(ContainerNode& root, FirstChildTag);
     ElementAndTextDescendantIterator(ContainerNode& root, Node* current);
 
     ElementAndTextDescendantIterator& operator++() { return traverseNext(); }
@@ -101,7 +102,7 @@
 {
 }
 
-inline ElementAndTextDescendantIterator::ElementAndTextDescendantIterator(ContainerNode& root)
+inline ElementAndTextDescendantIterator::ElementAndTextDescendantIterator(ContainerNode& root, FirstChildTag)
     : m_current(firstChild(root))
 #if !ASSERT_DISABLED
     , m_assertions(m_current)
@@ -301,7 +302,7 @@
 
 inline ElementAndTextDescendantIterator ElementAndTextDescendantIteratorAdapter::begin()
 {
-    return ElementAndTextDescendantIterator(m_root);
+    return ElementAndTextDescendantIterator(m_root, ElementAndTextDescendantIterator::FirstChild);
 }
 
 inline ElementAndTextDescendantIterator ElementAndTextDescendantIteratorAdapter::end()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to