<!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>[243207] 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/243207">243207</a></dd>
<dt>Author</dt> <dd>drousso@apple.com</dd>
<dt>Date</dt> <dd>2019-03-20 09:21:37 -0700 (Wed, 20 Mar 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Search: allow DOM searches to be case sensitive
https://bugs.webkit.org/show_bug.cgi?id=194673
<rdar://problem/48087577>

Reviewed by Timothy Hatcher.

Source/JavaScriptCore:

Since `DOM.performSearch` also searches by selector and XPath, some results may appear
as unexpected. As an example, searching for "BoDy" will still return the <body> as a result,
as although the literal node name ("BODY") didn't match, it did match via selector/XPath.

* inspector/protocol/DOM.json:
Allow `DOM.performSearch` to be case sensitive.

Source/WebCore:

Tests: inspector/dom/dom-search.html
       inspector/dom/dom-search-caseSensitive.html

Since `DOM.performSearch` also searches by selector and XPath, some results may appear
as unexpected. As an example, searching for "BoDy" will still return the <body> as a result,
as although the literal node name ("BODY") didn't match, it did match via selector/XPath.

* inspector/agents/InspectorDOMAgent.h:
* inspector/agents/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::performSearch):

* inspector/InspectorNodeFinder.h:
* inspector/InspectorNodeFinder.cpp:
(WebCore::InspectorNodeFinder::InspectorNodeFinder):
(WebCore::InspectorNodeFinder::searchUsingDOMTreeTraversal):
(WebCore::InspectorNodeFinder::checkEquals): Added.
(WebCore::InspectorNodeFinder::checkContains): Added.
(WebCore::InspectorNodeFinder::checkStartsWith): Added.
(WebCore::InspectorNodeFinder::checkEndsWith): Added.
(WebCore::InspectorNodeFinder::matchesAttribute):
(WebCore::InspectorNodeFinder::matchesElement):
(WebCore::InspectorNodeFinder::searchUsingXPath):
(WebCore::InspectorNodeFinder::searchUsingCSSSelectors):

Source/WebInspectorUI:

* UserInterface/Views/SearchSidebarPanel.js:
(WI.SearchSidebarPanel.prototype.performSearch):

* UserInterface/Views/DOMTreeContentView.js:
(WI.DOMTreeContentView.prototype.performSearch.contextNodesReady):

* UserInterface/Controllers/DOMManager.js:
(WI.DOMManager.prototype.performSearch.callback): Deleted.
(WI.DOMManager.prototype.performSearch): Deleted.
(WI.DOMManager.prototype.searchResult.mycallback): Deleted.
(WI.DOMManager.prototype.searchResult): Deleted.
(WI.DOMManager.prototype.cancelSearch): Deleted.
Drive-by: remove unused code.

LayoutTests:

* inspector/dom/dom-search-caseSensitive.html: Copied from LayoutTests/inspector/dom/dom-search.html.
* inspector/dom/dom-search-caseSensitive-expected.txt: Copied from LayoutTests/inspector/dom/dom-search-expected.txt.
* inspector/dom/dom-search-expected.txt:
* inspector/dom/resources/dom-search-queries.js:
(TestPage.registerInitializer):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsinspectordomdomsearchexpectedtxt">trunk/LayoutTests/inspector/dom/dom-search-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectordomresourcesdomsearchqueriesjs">trunk/LayoutTests/inspector/dom/resources/dom-search-queries.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolDOMjson">trunk/Source/JavaScriptCore/inspector/protocol/DOM.json</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorNodeFindercpp">trunk/Source/WebCore/inspector/InspectorNodeFinder.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorNodeFinderh">trunk/Source/WebCore/inspector/InspectorNodeFinder.h</a></li>
<li><a href="#trunkSourceWebCoreinspectoragentsInspectorDOMAgentcpp">trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectoragentsInspectorDOMAgenth">trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.h</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersDOMManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsDOMTreeContentViewjs">trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeContentView.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsSearchSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsinspectordomdomsearchcaseSensitiveexpectedtxt">trunk/LayoutTests/inspector/dom/dom-search-caseSensitive-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectordomdomsearchcaseSensitivehtml">trunk/LayoutTests/inspector/dom/dom-search-caseSensitive.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/LayoutTests/ChangeLog 2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2019-03-20  Devin Rousso  <drousso@apple.com>
+
+        Web Inspector: Search: allow DOM searches to be case sensitive
+        https://bugs.webkit.org/show_bug.cgi?id=194673
+        <rdar://problem/48087577>
+
+        Reviewed by Timothy Hatcher.
+
+        * inspector/dom/dom-search-caseSensitive.html: Copied from LayoutTests/inspector/dom/dom-search.html.
+        * inspector/dom/dom-search-caseSensitive-expected.txt: Copied from LayoutTests/inspector/dom/dom-search-expected.txt.
+        * inspector/dom/dom-search-expected.txt:
+        * inspector/dom/resources/dom-search-queries.js:
+        (TestPage.registerInitializer):
+
</ins><span class="cx"> 2019-03-20  Zalan Bujtas  <zalan@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Unreviewed test gardening.
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordomdomsearchcaseSensitiveexpectedtxtfromrev243206trunkLayoutTestsinspectordomdomsearchexpectedtxt"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/inspector/dom/dom-search-caseSensitive-expected.txt (from rev 243206, trunk/LayoutTests/inspector/dom/dom-search-expected.txt) (0 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/dom/dom-search-caseSensitive-expected.txt                            (rev 0)
+++ trunk/LayoutTests/inspector/dom/dom-search-caseSensitive-expected.txt       2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -0,0 +1,115 @@
</span><ins>+Testing DOM.performSearch with no parent node ids.
+
+
+=== Query: "body" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "<body" ===
+Count: 0
+=== Query: "body>" ===
+Count: 0
+=== Query: "<body>" ===
+Count: 0
+=== Query: "bOdY" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "<bOdY" ===
+Count: 0
+=== Query: "bOdY>" ===
+Count: 0
+=== Query: "<bOdY>" ===
+Count: 0
+=== Query: "BODY" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "<BODY" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "BODY>" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "<BODY>" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "onload" ===
+Count: 1
+body.main-frame
+=== Query: "oNLoAd" ===
+Count: 0
+=== Query: "ONLOAD" ===
+Count: 0
+=== Query: "runTest()" ===
+Count: 1
+body.main-frame
+=== Query: "\"runTest()" ===
+Count: 1
+body.main-frame
+=== Query: "runTest()\"" ===
+Count: 1
+body.main-frame
+=== Query: "\"runTest()\"" ===
+Count: 1
+body.main-frame
+=== Query: "runtest()" ===
+Count: 0
+=== Query: "\"runtest()" ===
+Count: 0
+=== Query: "runtest()\"" ===
+Count: 0
+=== Query: "\"runtest()\"" ===
+Count: 0
+=== Query: "rUnTeSt()" ===
+Count: 0
+=== Query: "\"rUnTeSt()" ===
+Count: 0
+=== Query: "rUnTeSt()\"" ===
+Count: 0
+=== Query: "\"rUnTeSt()\"" ===
+Count: 0
+=== Query: "RUNTEST()" ===
+Count: 0
+=== Query: "\"RUNTEST()" ===
+Count: 0
+=== Query: "RUNTEST()\"" ===
+Count: 0
+=== Query: "\"RUNTEST()\"" ===
+Count: 0
+=== Query: ".body-inside-iframe" ===
+Count: 0
+=== Query: "*" ===
+Count: 14
+html
+head
+script
+script
+script
+script
+body.main-frame
+p
+iframe
+html.inside-iframe
+head.inside-iframe
+body.inside-iframe
+div.base1.inside-iframe
+p.inside-iframe
+=== Query: "BODY[ONLOAD]" ===
+Count: 1
+body.main-frame
+=== Query: "/html/body" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "/html/body/@onload" ===
+Count: 1
+body.main-frame
+=== Query: "/HTML/BODY" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordomdomsearchcaseSensitivehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/dom/dom-search-caseSensitive.html (0 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/dom/dom-search-caseSensitive.html                            (rev 0)
+++ trunk/LayoutTests/inspector/dom/dom-search-caseSensitive.html       2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -0,0 +1,70 @@
</span><ins>+<html>
+<head>
+<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
+<script src="../../http/tests/inspector/dom/resources/InspectorDOMListener.js"></script>
+<!-- Loading the queries from external file to avoid having them show up in the results. -->
+<script src="resources/dom-search-queries.js"></script>
+<script>
+function test()
+{
+    // Create a DOM listener to convert nodeIds to tag names.
+    var dom = createDOMListener();
+
+    // Caching the output to avoid searching through the log.
+    var output = [];
+
+    InspectorProtocol.sendCommand("DOM.getDocument", {}, onGotDocument);
+
+    function onGotDocument(message) {
+        InspectorProtocol.checkForError(message);
+        dom.collectNode(message.result.root);
+        performSearches(domSearchQueries, testFinished);
+    }
+
+    function performSearches(list, callback)
+    {
+        function next() {
+            if (list.length)
+                search(list.shift(), next);
+            else
+                callback();
+        }
+        next();
+    }
+
+    function search(query, callback)
+    {
+        output.push("=== Query: " + JSON.stringify(query) + " ===");
+        InspectorProtocol.sendCommand("DOM.performSearch", {query, caseSensitive: true}, function(message) {
+            InspectorProtocol.checkForError(message);
+            printSearchResults(message.result, callback);
+        });
+    }
+
+    function printSearchResults(results, callback)
+    {
+        output.push("Count: " + results.resultCount);
+        if (!results.resultCount)
+            return callback();
+
+        var options = {"searchId": results.searchId, "fromIndex": 0, "toIndex": results.resultCount};
+        InspectorProtocol.sendCommand("DOM.getSearchResults", options, function onResultsReceived(message) {
+            for (var nodeId of message.result.nodeIds)
+                output.push(dom.getNodeIdentifier(nodeId));
+            callback();
+        });
+    }
+
+    function testFinished()
+    {
+        ProtocolTest.log(output.join("\n"));
+        ProtocolTest.completeTest();
+    }
+}
+</script>
+</head>
+<body onload="runTest()" class="main-frame">
+    <p>Testing DOM.performSearch with no parent node ids.</p>
+    <iframe src="resources/dom-search-iframe.html"></iframe>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordomdomsearchexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/dom/dom-search-expected.txt (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/dom/dom-search-expected.txt  2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/LayoutTests/inspector/dom/dom-search-expected.txt     2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -17,6 +17,34 @@
</span><span class="cx"> Count: 2
</span><span class="cx"> body.main-frame
</span><span class="cx"> body.inside-iframe
</span><ins>+=== Query: "bOdY" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "<bOdY" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "bOdY>" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "<bOdY>" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "BODY" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "<BODY" ===
+Count: 2
+body.main-frame
+body.inside-iframe
+=== Query: "BODY>" ===
+Count: 2
+body.main-frame
+body.inside-iframe
</ins><span class="cx"> === Query: "<BODY>" ===
</span><span class="cx"> Count: 2
</span><span class="cx"> body.main-frame
</span><span class="lines">@@ -24,6 +52,9 @@
</span><span class="cx"> === Query: "onload" ===
</span><span class="cx"> Count: 1
</span><span class="cx"> body.main-frame
</span><ins>+=== Query: "oNLoAd" ===
+Count: 1
+body.main-frame
</ins><span class="cx"> === Query: "ONLOAD" ===
</span><span class="cx"> Count: 1
</span><span class="cx"> body.main-frame
</span><span class="lines">@@ -33,18 +64,48 @@
</span><span class="cx"> === Query: "\"runTest()" ===
</span><span class="cx"> Count: 1
</span><span class="cx"> body.main-frame
</span><ins>+=== Query: "runTest()\"" ===
+Count: 1
+body.main-frame
</ins><span class="cx"> === Query: "\"runTest()\"" ===
</span><span class="cx"> Count: 1
</span><span class="cx"> body.main-frame
</span><del>-=== Query: "runTest()\"" ===
</del><ins>+=== Query: "runtest()" ===
</ins><span class="cx"> Count: 1
</span><span class="cx"> body.main-frame
</span><ins>+=== Query: "\"runtest()" ===
+Count: 1
+body.main-frame
+=== Query: "runtest()\"" ===
+Count: 1
+body.main-frame
+=== Query: "\"runtest()\"" ===
+Count: 1
+body.main-frame
+=== Query: "rUnTeSt()" ===
+Count: 1
+body.main-frame
+=== Query: "\"rUnTeSt()" ===
+Count: 1
+body.main-frame
+=== Query: "rUnTeSt()\"" ===
+Count: 1
+body.main-frame
+=== Query: "\"rUnTeSt()\"" ===
+Count: 1
+body.main-frame
</ins><span class="cx"> === Query: "RUNTEST()" ===
</span><span class="cx"> Count: 1
</span><span class="cx"> body.main-frame
</span><del>-=== Query: "runtest()" ===
</del><ins>+=== Query: "\"RUNTEST()" ===
</ins><span class="cx"> Count: 1
</span><span class="cx"> body.main-frame
</span><ins>+=== Query: "RUNTEST()\"" ===
+Count: 1
+body.main-frame
+=== Query: "\"RUNTEST()\"" ===
+Count: 1
+body.main-frame
</ins><span class="cx"> === Query: ".body-inside-iframe" ===
</span><span class="cx"> Count: 0
</span><span class="cx"> === Query: "*" ===
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordomresourcesdomsearchqueriesjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/dom/resources/dom-search-queries.js (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/dom/resources/dom-search-queries.js  2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/LayoutTests/inspector/dom/resources/dom-search-queries.js     2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -3,30 +3,59 @@
</span><span class="cx"> // Having the queries in an external file, so that DOM search will not find the script when searching for values.
</span><span class="cx"> 
</span><span class="cx"> window.domSearchQueries = [
</span><ins>+    // Tag names
+
</ins><span class="cx">     "body",
</span><span class="cx">     "<body",
</span><span class="cx">     "body>",
</span><span class="cx">     "<body>",
</span><ins>+
+    "bOdY",
+    "<bOdY",
+    "bOdY>",
+    "<bOdY>",
+
+    "BODY",
+    "<BODY",
+    "BODY>",
</ins><span class="cx">     "<BODY>",
</span><span class="cx"> 
</span><span class="cx">     // Attribute names
</span><ins>+
</ins><span class="cx">     "onload",
</span><ins>+    "oNLoAd",
</ins><span class="cx">     "ONLOAD",
</span><span class="cx"> 
</span><span class="cx">     // Attribute values
</span><ins>+
</ins><span class="cx">     "runTest()",
</span><span class="cx">     "\"runTest()",
</span><ins>+    "runTest()\"",
</ins><span class="cx">     "\"runTest()\"",
</span><del>-    "runTest()\"",
-    "RUNTEST()",
</del><ins>+
</ins><span class="cx">     "runtest()",
</span><ins>+    "\"runtest()",
+    "runtest()\"",
+    "\"runtest()\"",
</ins><span class="cx"> 
</span><ins>+    "rUnTeSt()",
+    "\"rUnTeSt()",
+    "rUnTeSt()\"",
+    "\"rUnTeSt()\"",
+
+    "RUNTEST()",
+    "\"RUNTEST()",
+    "RUNTEST()\"",
+    "\"RUNTEST()\"",
+
</ins><span class="cx">     // CSS selectors
</span><ins>+
</ins><span class="cx">     ".body-inside-iframe",
</span><span class="cx">     "*",
</span><span class="cx">     "BODY[ONLOAD]",
</span><span class="cx"> 
</span><span class="cx">     // XPath query
</span><ins>+
</ins><span class="cx">     "/html/body",
</span><span class="cx">     "/html/body/@onload",
</span><span class="cx">     "/HTML/BODY"
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog    2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/JavaScriptCore/ChangeLog       2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2019-03-20  Devin Rousso  <drousso@apple.com>
+
+        Web Inspector: Search: allow DOM searches to be case sensitive
+        https://bugs.webkit.org/show_bug.cgi?id=194673
+        <rdar://problem/48087577>
+
+        Reviewed by Timothy Hatcher.
+
+        Since `DOM.performSearch` also searches by selector and XPath, some results may appear
+        as unexpected. As an example, searching for "BoDy" will still return the <body> as a result,
+        as although the literal node name ("BODY") didn't match, it did match via selector/XPath.
+
+        * inspector/protocol/DOM.json:
+        Allow `DOM.performSearch` to be case sensitive.
+
</ins><span class="cx"> 2019-03-20  Saam Barati  <sbarati@apple.com>
</span><span class="cx"> 
</span><span class="cx">         AI rule for ValueBitNot/ValueBitXor/ValueBitAnd/ValueBitOr is wrong
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolDOMjson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/protocol/DOM.json (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/DOM.json  2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/JavaScriptCore/inspector/protocol/DOM.json     2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -359,7 +359,8 @@
</span><span class="cx">             "description": "Searches for a given string in the DOM tree. Use <code>getSearchResults</code> to access search results or <code>cancelSearch</code> to end this search session.",
</span><span class="cx">             "parameters": [
</span><span class="cx">                 { "name": "query", "type": "string", "description": "Plain text or query selector or XPath search query." },
</span><del>-                { "name": "nodeIds", "type": "array", "items": { "$ref": "NodeId" }, "optional": true, "description": "Ids of nodes to use as starting points for the search." }
</del><ins>+                { "name": "nodeIds", "type": "array", "items": { "$ref": "NodeId" }, "optional": true, "description": "Ids of nodes to use as starting points for the search." },
+                { "name": "caseSensitive", "type": "boolean", "optional": true, "description": "If true, search is case sensitive." }
</ins><span class="cx">             ],
</span><span class="cx">             "returns": [
</span><span class="cx">                 { "name": "searchId", "type": "string", "description": "Unique search session identifier." },
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebCore/ChangeLog      2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2019-03-20  Devin Rousso  <drousso@apple.com>
+
+        Web Inspector: Search: allow DOM searches to be case sensitive
+        https://bugs.webkit.org/show_bug.cgi?id=194673
+        <rdar://problem/48087577>
+
+        Reviewed by Timothy Hatcher.
+
+        Tests: inspector/dom/dom-search.html
+               inspector/dom/dom-search-caseSensitive.html
+
+        Since `DOM.performSearch` also searches by selector and XPath, some results may appear
+        as unexpected. As an example, searching for "BoDy" will still return the <body> as a result,
+        as although the literal node name ("BODY") didn't match, it did match via selector/XPath.
+
+        * inspector/agents/InspectorDOMAgent.h:
+        * inspector/agents/InspectorDOMAgent.cpp:
+        (WebCore::InspectorDOMAgent::performSearch):
+
+        * inspector/InspectorNodeFinder.h:
+        * inspector/InspectorNodeFinder.cpp:
+        (WebCore::InspectorNodeFinder::InspectorNodeFinder):
+        (WebCore::InspectorNodeFinder::searchUsingDOMTreeTraversal):
+        (WebCore::InspectorNodeFinder::checkEquals): Added.
+        (WebCore::InspectorNodeFinder::checkContains): Added.
+        (WebCore::InspectorNodeFinder::checkStartsWith): Added.
+        (WebCore::InspectorNodeFinder::checkEndsWith): Added.
+        (WebCore::InspectorNodeFinder::matchesAttribute):
+        (WebCore::InspectorNodeFinder::matchesElement):
+        (WebCore::InspectorNodeFinder::searchUsingXPath):
+        (WebCore::InspectorNodeFinder::searchUsingCSSSelectors):
+
</ins><span class="cx"> 2019-03-20  Michael Catanzaro  <mcatanzaro@igalia.com>
</span><span class="cx"> 
</span><span class="cx">         Remove copyRef() calls added in r243163
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorNodeFindercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorNodeFinder.cpp (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorNodeFinder.cpp   2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebCore/inspector/InspectorNodeFinder.cpp      2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -53,13 +53,14 @@
</span><span class="cx">     return string.substring(start, end - start);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-InspectorNodeFinder::InspectorNodeFinder(const String& whitespaceTrimmedQuery)
-    : m_whitespaceTrimmedQuery(whitespaceTrimmedQuery)
</del><ins>+InspectorNodeFinder::InspectorNodeFinder(const String& query, bool caseSensitive)
+    : m_query(query)
+    , m_caseSensitive(caseSensitive)
</ins><span class="cx"> {
</span><del>-    m_tagNameQuery = stripCharacters(whitespaceTrimmedQuery, '<', '>', m_startTagFound, m_endTagFound);
</del><ins>+    m_tagNameQuery = stripCharacters(query, '<', '>', m_startTagFound, m_endTagFound);
</ins><span class="cx"> 
</span><span class="cx">     bool startQuoteFound, endQuoteFound;
</span><del>-    m_attributeQuery = stripCharacters(whitespaceTrimmedQuery, '"', '"', startQuoteFound, endQuoteFound);
</del><ins>+    m_attributeQuery = stripCharacters(query, '"', '"', startQuoteFound, endQuoteFound);
</ins><span class="cx">     m_exactAttributeMatch = startQuoteFound && endQuoteFound;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -83,7 +84,7 @@
</span><span class="cx">         case Node::TEXT_NODE:
</span><span class="cx">         case Node::COMMENT_NODE:
</span><span class="cx">         case Node::CDATA_SECTION_NODE:
</span><del>-            if (node->nodeValue().containsIgnoringASCIICase(m_whitespaceTrimmedQuery))
</del><ins>+            if (checkContains(node->nodeValue(), m_query))
</ins><span class="cx">                 m_results.add(node);
</span><span class="cx">             break;
</span><span class="cx">         case Node::ELEMENT_NODE:
</span><span class="lines">@@ -98,20 +99,50 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool InspectorNodeFinder::checkEquals(const String& a, const String& b)
+{
+    if (m_caseSensitive)
+        return a == b;
+    return equalIgnoringASCIICase(a, b);
+}
+
+bool InspectorNodeFinder::checkContains(const String& a, const String& b)
+{
+    if (m_caseSensitive)
+        return a.contains(b);
+    return a.containsIgnoringASCIICase(b);
+}
+
+bool InspectorNodeFinder::checkStartsWith(const String& a, const String& b)
+{
+    if (m_caseSensitive)
+        return a.startsWith(b);
+    return a.startsWithIgnoringASCIICase(b);
+}
+
+bool InspectorNodeFinder::checkEndsWith(const String& a, const String& b)
+{
+    if (m_caseSensitive)
+        return a.endsWith(b);
+    return a.endsWithIgnoringASCIICase(b);
+}
+
</ins><span class="cx"> bool InspectorNodeFinder::matchesAttribute(const Attribute& attribute)
</span><span class="cx"> {
</span><del>-    if (attribute.localName().string().containsIgnoringASCIICase(m_whitespaceTrimmedQuery))
</del><ins>+    if (checkContains(attribute.localName().string(), m_query))
</ins><span class="cx">         return true;
</span><del>-    return m_exactAttributeMatch ? attribute.value() == m_attributeQuery : attribute.value().string().containsIgnoringASCIICase(m_attributeQuery);
</del><ins>+
+    auto value = attribute.value().string();
+    return m_exactAttributeMatch ? checkEquals(value, m_attributeQuery) : checkContains(value, m_attributeQuery);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool InspectorNodeFinder::matchesElement(const Element& element)
</span><span class="cx"> {
</span><span class="cx">     String nodeName = element.nodeName();
</span><del>-    if ((!m_startTagFound && !m_endTagFound && nodeName.containsIgnoringASCIICase(m_tagNameQuery))
-        || (m_startTagFound && m_endTagFound && equalIgnoringASCIICase(nodeName, m_tagNameQuery))
-        || (m_startTagFound && !m_endTagFound && nodeName.startsWithIgnoringASCIICase(m_tagNameQuery))
-        || (!m_startTagFound && m_endTagFound && nodeName.endsWithIgnoringASCIICase(m_tagNameQuery)))
</del><ins>+    if ((!m_startTagFound && !m_endTagFound && checkContains(nodeName, m_tagNameQuery))
+        || (m_startTagFound && m_endTagFound && checkEquals(nodeName, m_tagNameQuery))
+        || (m_startTagFound && !m_endTagFound && checkStartsWith(nodeName, m_tagNameQuery))
+        || (!m_startTagFound && m_endTagFound && checkEndsWith(nodeName, m_tagNameQuery)))
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     if (!element.hasAttributes())
</span><span class="lines">@@ -127,7 +158,7 @@
</span><span class="cx"> 
</span><span class="cx"> void InspectorNodeFinder::searchUsingXPath(Node& parentNode)
</span><span class="cx"> {
</span><del>-    auto evaluateResult = parentNode.document().evaluate(m_whitespaceTrimmedQuery, &parentNode, nullptr, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE, nullptr);
</del><ins>+    auto evaluateResult = parentNode.document().evaluate(m_query, &parentNode, nullptr, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE, nullptr);
</ins><span class="cx">     if (evaluateResult.hasException())
</span><span class="cx">         return;
</span><span class="cx">     auto result = evaluateResult.releaseReturnValue();
</span><span class="lines">@@ -157,7 +188,7 @@
</span><span class="cx">     if (!is<ContainerNode>(parentNode))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    auto queryResult = downcast<ContainerNode>(parentNode).querySelectorAll(m_whitespaceTrimmedQuery);
</del><ins>+    auto queryResult = downcast<ContainerNode>(parentNode).querySelectorAll(m_query);
</ins><span class="cx">     if (queryResult.hasException())
</span><span class="cx">         return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorNodeFinderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorNodeFinder.h (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorNodeFinder.h     2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebCore/inspector/InspectorNodeFinder.h        2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -41,11 +41,16 @@
</span><span class="cx"> 
</span><span class="cx"> class InspectorNodeFinder {
</span><span class="cx"> public:
</span><del>-    InspectorNodeFinder(const String& whitespaceTrimmedQuery);
</del><ins>+    InspectorNodeFinder(const String& query, bool caseSensitive);
</ins><span class="cx">     void performSearch(Node*);
</span><span class="cx">     const ListHashSet<Node*>& results() const { return m_results; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    bool checkEquals(const String&, const String&);
+    bool checkContains(const String&, const String&);
+    bool checkStartsWith(const String&, const String&);
+    bool checkEndsWith(const String&, const String&);
+
</ins><span class="cx">     bool matchesAttribute(const Attribute&);
</span><span class="cx">     bool matchesElement(const Element&);
</span><span class="cx"> 
</span><span class="lines">@@ -53,15 +58,15 @@
</span><span class="cx">     void searchUsingXPath(Node&);
</span><span class="cx">     void searchUsingCSSSelectors(Node&);
</span><span class="cx"> 
</span><del>-    bool m_startTagFound;
-    bool m_endTagFound;
-    bool m_exactAttributeMatch;
-
-    String m_whitespaceTrimmedQuery;
</del><ins>+    String m_query;
</ins><span class="cx">     String m_tagNameQuery;
</span><span class="cx">     String m_attributeQuery;
</span><ins>+    bool m_caseSensitive;
</ins><span class="cx"> 
</span><span class="cx">     ListHashSet<Node*> m_results;
</span><ins>+    bool m_startTagFound;
+    bool m_endTagFound;
+    bool m_exactAttributeMatch;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectoragentsInspectorDOMAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp      2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp 2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -1005,10 +1005,10 @@
</span><span class="cx">     axProperties = buildObjectForAccessibilityProperties(node);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorDOMAgent::performSearch(ErrorString& errorString, const String& whitespaceTrimmedQuery, const JSON::Array* nodeIds, String* searchId, int* resultCount)
</del><ins>+void InspectorDOMAgent::performSearch(ErrorString& errorString, const String& query, const JSON::Array* nodeIds, const bool* caseSensitive, String* searchId, int* resultCount)
</ins><span class="cx"> {
</span><span class="cx">     // FIXME: Search works with node granularity - number of matches within node is not calculated.
</span><del>-    InspectorNodeFinder finder(whitespaceTrimmedQuery);
</del><ins>+    InspectorNodeFinder finder(query, caseSensitive && *caseSensitive);
</ins><span class="cx"> 
</span><span class="cx">     if (nodeIds) {
</span><span class="cx">         for (auto& nodeValue : *nodeIds) {
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectoragentsInspectorDOMAgenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.h (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.h        2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.h   2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -134,7 +134,7 @@
</span><span class="cx">     void setBreakpointForEventListener(ErrorString&, int eventListenerId) override;
</span><span class="cx">     void removeBreakpointForEventListener(ErrorString&, int eventListenerId) override;
</span><span class="cx">     void getAccessibilityPropertiesForNode(ErrorString&, int nodeId, RefPtr<Inspector::Protocol::DOM::AccessibilityProperties>& axProperties) override;
</span><del>-    void performSearch(ErrorString&, const String& whitespaceTrimmedQuery, const JSON::Array* nodeIds, String* searchId, int* resultCount) override;
</del><ins>+    void performSearch(ErrorString&, const String& query, const JSON::Array* nodeIds, const bool* caseSensitive, String* searchId, int* resultCount) override;
</ins><span class="cx">     void getSearchResults(ErrorString&, const String& searchId, int fromIndex, int toIndex, RefPtr<JSON::ArrayOf<int>>&) override;
</span><span class="cx">     void discardSearchResults(ErrorString&, const String& searchId) override;
</span><span class="cx">     void resolveNode(ErrorString&, int nodeId, const String* objectGroup, RefPtr<Inspector::Protocol::Runtime::RemoteObject>& result) override;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog    2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebInspectorUI/ChangeLog       2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2019-03-20  Devin Rousso  <drousso@apple.com>
+
+        Web Inspector: Search: allow DOM searches to be case sensitive
+        https://bugs.webkit.org/show_bug.cgi?id=194673
+        <rdar://problem/48087577>
+
+        Reviewed by Timothy Hatcher.
+
+        * UserInterface/Views/SearchSidebarPanel.js:
+        (WI.SearchSidebarPanel.prototype.performSearch):
+
+        * UserInterface/Views/DOMTreeContentView.js:
+        (WI.DOMTreeContentView.prototype.performSearch.contextNodesReady):
+
+        * UserInterface/Controllers/DOMManager.js:
+        (WI.DOMManager.prototype.performSearch.callback): Deleted.
+        (WI.DOMManager.prototype.performSearch): Deleted.
+        (WI.DOMManager.prototype.searchResult.mycallback): Deleted.
+        (WI.DOMManager.prototype.searchResult): Deleted.
+        (WI.DOMManager.prototype.cancelSearch): Deleted.
+        Drive-by: remove unused code.
+
</ins><span class="cx"> 2019-03-19  Devin Rousso  <drousso@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Sources: provide option to group by path
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersDOMManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMManager.js (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMManager.js      2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMManager.js 2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -438,47 +438,6 @@
</span><span class="cx">         remoteObject.pushNodeToFrontend(nodeAvailable.bind(this));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    performSearch(query, searchCallback)
-    {
-        this.cancelSearch();
-
-        function callback(error, searchId, resultsCount)
-        {
-            this._searchId = searchId;
-            searchCallback(resultsCount);
-        }
-        DOMAgent.performSearch(query, callback.bind(this));
-    }
-
-    searchResult(index, callback)
-    {
-        function mycallback(error, nodeIds)
-        {
-            if (error) {
-                console.error(error);
-                callback(null);
-                return;
-            }
-            if (nodeIds.length !== 1)
-                return;
-
-            callback(this._idToDOMNode[nodeIds[0]]);
-        }
-
-        if (this._searchId)
-            DOMAgent.getSearchResults(this._searchId, index, index + 1, mycallback.bind(this));
-        else
-            callback(null);
-    }
-
-    cancelSearch()
-    {
-        if (this._searchId) {
-            DOMAgent.discardSearchResults(this._searchId);
-            this._searchId = undefined;
-        }
-    }
-
</del><span class="cx">     querySelector(nodeOrNodeId, selector, callback)
</span><span class="cx">     {
</span><span class="cx">         let nodeId = nodeOrNodeId instanceof WI.DOMNode ? nodeOrNodeId.id : nodeOrNodeId;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsDOMTreeContentViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeContentView.js (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeContentView.js    2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeContentView.js       2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -302,7 +302,15 @@
</span><span class="cx"> 
</span><span class="cx">         function contextNodesReady(nodeIds)
</span><span class="cx">         {
</span><del>-            DOMAgent.performSearch(query, nodeIds, searchResultsReady.bind(this));
</del><ins>+            if (this._searchQuery !== query)
+                return;
+
+            let commandArguments = {
+                query: this._searchQuery,
+                nodeIds,
+                caseSensitive: WI.SearchUtilities.defaultSettings.caseSensitive.value,
+            };
+            DOMAgent.performSearch.invoke(commandArguments, searchResultsReady.bind(this));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         this.getSearchContextNodes(contextNodesReady.bind(this));
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsSearchSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js (243206 => 243207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js    2019-03-20 16:17:44 UTC (rev 243206)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js       2019-03-20 16:21:37 UTC (rev 243207)
</span><span class="lines">@@ -304,7 +304,11 @@
</span><span class="cx">                 this._domSearchIdentifier = undefined;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            countPromise(DOMAgent.performSearch(searchQuery), domCallback);
</del><ins>+            let commandArguments = {
+                query: searchQuery,
+                caseSensitive: isCaseSensitive,
+            };
+            countPromise(DOMAgent.performSearch.invoke(commandArguments), domCallback);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // FIXME: Resource search should work in JSContext inspection.
</span></span></pre>
</div>
</div>

</body>
</html>