<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[211139] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/211139">211139</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-25 01:11:52 -0800 (Wed, 25 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>collectMatchingElementsInFlatTree should not find elements inside an user agent shadow tree
https://bugs.webkit.org/show_bug.cgi?id=167409

Reviewed by Antti Koivisto.

Source/JavaScriptCore:

Added matchingElementInFlatTree as a common identifier since it's required in the bindings code.

* runtime/CommonIdentifiers.h:

Source/WebCore:

The bug was caused by collectMatchingElementsInFlatTree including elements inside an user agent shadow tree
even though it shouldn't. Fixed the bug by checking that condition.

Also added matchingElementInFlatTree to find the first element matching a selector as opposed to all,
again, only exposed in a world which forces all shadow trees to be accessible.

* page/DOMWindow.cpp:
(WebCore::selectorQueryInFrame):
(WebCore::DOMWindow::collectMatchingElementsInFlatTree):
(WebCore::DOMWindow::matchingElementInFlatTree):
* page/DOMWindow.h:
* page/DOMWindow.idl:

Tools:

Added a test case for collectMatchingElementsInFlatTree not finding elements inside an user agent shadow tree
as well as tests for the newly added matchingElementInFlatTree.

* TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen.cpp:
(TestWebKitAPI::runJavaScriptAlert):
* TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen_Bundle.cpp:
(TestWebKitAPI::InjectedBundleMakeAllShadowRootOpenTest::initialize):
* TestWebKitAPI/Tests/WebKit2/closed-shadow-tree-test.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCommonIdentifiersh">trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowcpp">trunk/Source/WebCore/page/DOMWindow.cpp</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowh">trunk/Source/WebCore/page/DOMWindow.h</a></li>
<li><a href="#trunkSourceWebCorepageDOMWindowidl">trunk/Source/WebCore/page/DOMWindow.idl</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2InjectedBundleMakeAllShadowRootsOpencpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2InjectedBundleMakeAllShadowRootsOpen_Bundlecpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen_Bundle.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2closedshadowtreetesthtml">trunk/Tools/TestWebKitAPI/Tests/WebKit2/closed-shadow-tree-test.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-01-25  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        collectMatchingElementsInFlatTree should not find elements inside an user agent shadow tree
+        https://bugs.webkit.org/show_bug.cgi?id=167409
+
+        Reviewed by Antti Koivisto.
+
+        Added matchingElementInFlatTree as a common identifier since it's required in the bindings code.
+
+        * runtime/CommonIdentifiers.h:
+
</ins><span class="cx"> 2017-01-24  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fold USER_TIMING into WEB_TIMING and make it a RuntimeEnabledFeature
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCommonIdentifiersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -280,6 +280,7 @@
</span><span class="cx">     macro(valueOf) \
</span><span class="cx">     macro(webkit) \
</span><span class="cx">     macro(collectMatchingElementsInFlatTree) \
</span><ins>+    macro(matchingElementInFlatTree) \
</ins><span class="cx">     macro(webkitIDBCursor) \
</span><span class="cx">     macro(webkitIDBDatabase) \
</span><span class="cx">     macro(webkitIDBFactory) \
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Source/WebCore/ChangeLog        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2017-01-25  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        collectMatchingElementsInFlatTree should not find elements inside an user agent shadow tree
+        https://bugs.webkit.org/show_bug.cgi?id=167409
+
+        Reviewed by Antti Koivisto.
+
+        The bug was caused by collectMatchingElementsInFlatTree including elements inside an user agent shadow tree
+        even though it shouldn't. Fixed the bug by checking that condition.
+
+        Also added matchingElementInFlatTree to find the first element matching a selector as opposed to all,
+        again, only exposed in a world which forces all shadow trees to be accessible.
+
+        * page/DOMWindow.cpp:
+        (WebCore::selectorQueryInFrame):
+        (WebCore::DOMWindow::collectMatchingElementsInFlatTree):
+        (WebCore::DOMWindow::matchingElementInFlatTree):
+        * page/DOMWindow.h:
+        * page/DOMWindow.idl:
+
</ins><span class="cx"> 2017-01-24  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r208902): URLWithUserTypedString returns nil with file URLs
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.cpp (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.cpp        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Source/WebCore/page/DOMWindow.cpp        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -623,16 +623,21 @@
</span><span class="cx">     return *m_customElementRegistry;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ExceptionOr&lt;Ref&lt;NodeList&gt;&gt; DOMWindow::collectMatchingElementsInFlatTree(Node&amp; scope, const String&amp; selectors)
</del><ins>+static ExceptionOr&lt;SelectorQuery&amp;&gt; selectorQueryInFrame(Frame* frame, const String&amp; selectors)
</ins><span class="cx"> {
</span><del>-    if (!m_frame)
</del><ins>+    if (!frame)
</ins><span class="cx">         return Exception { NOT_SUPPORTED_ERR };
</span><span class="cx"> 
</span><del>-    Document* document = m_frame-&gt;document();
</del><ins>+    Document* document = frame-&gt;document();
</ins><span class="cx">     if (!document)
</span><span class="cx">         return Exception { NOT_SUPPORTED_ERR };
</span><span class="cx"> 
</span><del>-    auto queryOrException = document-&gt;selectorQueryForString(selectors);
</del><ins>+    return document-&gt;selectorQueryForString(selectors);
+}
+
+ExceptionOr&lt;Ref&lt;NodeList&gt;&gt; DOMWindow::collectMatchingElementsInFlatTree(Node&amp; scope, const String&amp; selectors)
+{
+    auto queryOrException = selectorQueryInFrame(m_frame, selectors);
</ins><span class="cx">     if (queryOrException.hasException())
</span><span class="cx">         return queryOrException.releaseException();
</span><span class="cx"> 
</span><span class="lines">@@ -643,7 +648,7 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;Ref&lt;Element&gt;&gt; result;
</span><span class="cx">     for (auto&amp; node : composedTreeDescendants(downcast&lt;ContainerNode&gt;(scope))) {
</span><del>-        if (is&lt;Element&gt;(node) &amp;&amp; query.matches(downcast&lt;Element&gt;(node)))
</del><ins>+        if (is&lt;Element&gt;(node) &amp;&amp; query.matches(downcast&lt;Element&gt;(node)) &amp;&amp; !node.isInUserAgentShadowTree())
</ins><span class="cx">             result.append(downcast&lt;Element&gt;(node));
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -650,6 +655,25 @@
</span><span class="cx">     return Ref&lt;NodeList&gt; { StaticElementList::create(WTFMove(result)) };
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ExceptionOr&lt;RefPtr&lt;Element&gt;&gt; DOMWindow::matchingElementInFlatTree(Node&amp; scope, const String&amp; selectors)
+{
+    auto queryOrException = selectorQueryInFrame(m_frame, selectors);
+    if (queryOrException.hasException())
+        return queryOrException.releaseException();
+
+    if (!is&lt;ContainerNode&gt;(scope))
+        return RefPtr&lt;Element&gt; { nullptr };
+
+    SelectorQuery&amp; query = queryOrException.releaseReturnValue();
+
+    for (auto&amp; node : composedTreeDescendants(downcast&lt;ContainerNode&gt;(scope))) {
+        if (is&lt;Element&gt;(node) &amp;&amp; query.matches(downcast&lt;Element&gt;(node)) &amp;&amp; !node.isInUserAgentShadowTree())
+            return &amp;downcast&lt;Element&gt;(node);
+    }
+
+    return RefPtr&lt;Element&gt; { nullptr };
+}
+
</ins><span class="cx"> #if ENABLE(ORIENTATION_EVENTS)
</span><span class="cx"> 
</span><span class="cx"> int DOMWindow::orientation() const
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.h (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.h        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Source/WebCore/page/DOMWindow.h        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -278,6 +278,7 @@
</span><span class="cx">     CustomElementRegistry&amp; ensureCustomElementRegistry();
</span><span class="cx"> 
</span><span class="cx">     ExceptionOr&lt;Ref&lt;NodeList&gt;&gt; collectMatchingElementsInFlatTree(Node&amp;, const String&amp; selectors);
</span><ins>+    ExceptionOr&lt;RefPtr&lt;Element&gt;&gt; matchingElementInFlatTree(Node&amp;, const String&amp; selectors);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(ORIENTATION_EVENTS)
</span><span class="cx">     // This is the interface orientation in degrees. Some examples are:
</span></span></pre></div>
<a id="trunkSourceWebCorepageDOMWindowidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DOMWindow.idl (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DOMWindow.idl        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Source/WebCore/page/DOMWindow.idl        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -177,6 +177,8 @@
</span><span class="cx"> 
</span><span class="cx">     [MayThrowException, EnabledForWorld=shadowRootIsAlwaysOpen]
</span><span class="cx">     NodeList collectMatchingElementsInFlatTree(Node scope, DOMString selectors);
</span><ins>+    [MayThrowException, EnabledForWorld=shadowRootIsAlwaysOpen]
+    Element? matchingElementInFlatTree(Node scope, DOMString selectors);
</ins><span class="cx"> 
</span><span class="cx">     // Event handlers unique to Element and DOMWindow.
</span><span class="cx">     // FIXME: Should these be exposed on Document as well (and therefore moved to GlobalEventHandlers.idl)?
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Tools/ChangeLog        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2017-01-25  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        collectMatchingElementsInFlatTree should not find elements inside an user agent shadow tree
+        https://bugs.webkit.org/show_bug.cgi?id=167409
+
+        Reviewed by Antti Koivisto.
+
+        Added a test case for collectMatchingElementsInFlatTree not finding elements inside an user agent shadow tree
+        as well as tests for the newly added matchingElementInFlatTree.
+
+        * TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen.cpp:
+        (TestWebKitAPI::runJavaScriptAlert):
+        * TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen_Bundle.cpp:
+        (TestWebKitAPI::InjectedBundleMakeAllShadowRootOpenTest::initialize):
+        * TestWebKitAPI/Tests/WebKit2/closed-shadow-tree-test.html:
+
</ins><span class="cx"> 2017-01-24  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Add API to create ephemeral web views and deprecate the private browsing setting
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2InjectedBundleMakeAllShadowRootsOpencpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen.cpp (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen.cpp        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen.cpp        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -50,10 +50,10 @@
</span><span class="cx">         EXPECT_WK_STREQ(&quot;PASS: shadowRoot created by normal world&quot;, alertText);
</span><span class="cx">         break;
</span><span class="cx">     case 3:
</span><del>-        EXPECT_WK_STREQ(&quot;PASS: query method exists&quot;, alertText);
</del><ins>+        EXPECT_WK_STREQ(&quot;PASS: collectMatchingElementsInFlatTree exists&quot;, alertText);
</ins><span class="cx">         break;
</span><span class="cx">     case 4:
</span><del>-        EXPECT_WK_STREQ(&quot;PASS: query method was not present in the normal world&quot;, alertText);
</del><ins>+        EXPECT_WK_STREQ(&quot;PASS: collectMatchingElementsInFlatTree was not present in the normal world&quot;, alertText);
</ins><span class="cx">         break;
</span><span class="cx">     case 5:
</span><span class="cx">         EXPECT_WK_STREQ(&quot;Found:1,2,3,4,5,6&quot;, alertText);
</span><span class="lines">@@ -60,6 +60,24 @@
</span><span class="cx">         break;
</span><span class="cx">     case 6:
</span><span class="cx">         EXPECT_WK_STREQ(&quot;Found:2,3,4&quot;, alertText);
</span><ins>+        break;
+    case 7:
+        EXPECT_WK_STREQ(&quot;PASS: matchingElementInFlatTree exists&quot;, alertText);
+        break;
+    case 8:
+        EXPECT_WK_STREQ(&quot;PASS: matchingElementInFlatTree was not present in the normal world&quot;, alertText);
+        break;
+    case 9:
+        EXPECT_WK_STREQ(&quot;Found:1&quot;, alertText);
+        break;
+    case 10:
+        EXPECT_WK_STREQ(&quot;Found:2&quot;, alertText);
+        break;
+    case 11:
+        EXPECT_WK_STREQ(&quot;Found:0 divs&quot;, alertText);
+        break;
+    case 12:
+        EXPECT_WK_STREQ(&quot;Found:false&quot;, alertText);
</ins><span class="cx">         done = true;
</span><span class="cx">         break;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2InjectedBundleMakeAllShadowRootsOpen_Bundlecpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen_Bundle.cpp (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen_Bundle.cpp        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/InjectedBundleMakeAllShadowRootsOpen_Bundle.cpp        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -60,9 +60,9 @@
</span><span class="cx">             // Test 2
</span><span class="cx">             &quot;    alert(document.querySelector('shadow-host').shadowRoot ? 'PASS: shadowRoot created by normal world' : 'FAIL');\n&quot;
</span><span class="cx">             // Test 3
</span><del>-            &quot;    alert(window[queryMethodName] ? 'PASS: query method exists' : 'FAIL');\n&quot;
</del><ins>+            &quot;    alert(window[queryMethodName] ? `PASS: ${queryMethodName} exists` : `FAIL: ${queryMethodName} does not exist`);\n&quot;
</ins><span class="cx">             // Test 4
</span><del>-            &quot;    document.dispatchEvent(new Event('testnormalworld'));\n&quot;
</del><ins>+            &quot;    document.dispatchEvent(new CustomEvent('testnormalworld', {detail: queryMethodName}));\n&quot;
</ins><span class="cx">             // Test 5
</span><span class="cx">             &quot;    const queryMethod = window[queryMethodName];\n&quot;
</span><span class="cx">             &quot;    let queryResult = Array.from(queryMethod(document, 'span'));\n&quot;
</span><span class="lines">@@ -71,6 +71,21 @@
</span><span class="cx">             &quot;    const innerHost = queryMethod(document, 'inner-host')[0];\n&quot;
</span><span class="cx">             &quot;    queryResult = Array.from(queryMethod(innerHost, 'span'));\n&quot;
</span><span class="cx">             &quot;    alert('Found:' + queryResult.map((span) =&gt; span.textContent).join(','));\n&quot;
</span><ins>+            // Test 7
+            &quot;    alert(window.matchingElementInFlatTree ? `PASS: matchingElementInFlatTree exists` : `FAIL: matchingElementInFlatTree does not exist`);\n&quot;
+            // Test 8
+            &quot;    document.dispatchEvent(new CustomEvent('testnormalworld', {detail: 'matchingElementInFlatTree'}));\n&quot;
+            // Test 9
+            &quot;    queryResult = window.matchingElementInFlatTree(document, 'span');\n&quot;
+            &quot;    alert('Found:' + (queryResult ? queryResult.textContent : 'null'));\n&quot;
+            // Test 10
+            &quot;    queryResult = window.matchingElementInFlatTree(innerHost, 'span');\n&quot;
+            &quot;    alert('Found:' + (queryResult ? queryResult.textContent : 'null'));\n&quot;
+            // Test 11
+            &quot;    alert(`Found:${queryMethod(document, 'div').length} divs`);\n&quot;
+            // Test 12
+            &quot;    queryResult = window.matchingElementInFlatTree(document, 'div');\n&quot;
+            &quot;    alert(`Found:${!!queryResult}`);\n&quot;
</ins><span class="cx">             &quot;}\n&quot;));
</span><span class="cx">         WKBundleAddUserScript(bundle, pageGroup, world, source.get(), 0, 0, 0, kWKInjectAtDocumentStart, kWKInjectInAllFrames);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2closedshadowtreetesthtml"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2/closed-shadow-tree-test.html (211138 => 211139)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/closed-shadow-tree-test.html        2017-01-25 08:01:08 UTC (rev 211138)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/closed-shadow-tree-test.html        2017-01-25 09:11:52 UTC (rev 211139)
</span><span class="lines">@@ -2,6 +2,7 @@
</span><span class="cx"> &lt;html&gt;
</span><span class="cx"> &lt;body&gt;
</span><span class="cx"> &lt;shadow-host&gt;&lt;span&gt;5&lt;/span&gt;&lt;span slot=&quot;bar&quot;&gt;2&lt;/span&gt;&lt;/shadow-host&gt;
</span><ins>+&lt;input type=&quot;text&quot;&gt;
</ins><span class="cx"> &lt;script&gt;
</span><span class="cx"> const shadowRoot = document.querySelector('shadow-host').attachShadow({mode: 'closed'});
</span><span class="cx"> shadowRoot.innerHTML = `
</span><span class="lines">@@ -18,9 +19,8 @@
</span><span class="cx">     &lt;slot name=&quot;foo&quot;&gt;&lt;/slot&gt;
</span><span class="cx">     &lt;span&gt;4&lt;/span&gt;`;
</span><span class="cx"> 
</span><del>-document.addEventListener('testnormalworld', function () {
-    alert(window.collectMatchingElementsInFlatTree ?
-        'FAIL' : 'PASS: query method was not present in the normal world');
</del><ins>+document.addEventListener('testnormalworld', function (event) {
+    alert(window[event.detail] ? `FAIL: ${event.detail} was present in the normal world` : `PASS: ${event.detail} was not present in the normal world`);
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> &lt;/script&gt;
</span></span></pre>
</div>
</div>

</body>
</html>