<!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>[176358] 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/176358">176358</a></dd>
<dt>Author</dt> <dd>joepeck@webkit.org</dd>
<dt>Date</dt> <dd>2014-11-19 15:49:40 -0800 (Wed, 19 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: JSContext inspection Resource search does not work
https://bugs.webkit.org/show_bug.cgi?id=131252

Reviewed by Timothy Hatcher.

Source/JavaScriptCore:

* inspector/agents/InspectorDebuggerAgent.cpp:
(Inspector::InspectorDebuggerAgent::searchInContent):
* inspector/protocol/Debugger.json:
Do some cleanup of the description and implementation of content searching.

Source/WebCore:

Test: inspector/debugger/search-scripts.html

* inspector/InspectorPageAgent.cpp:
(WebCore::InspectorPageAgent::searchInResources):
A little cleanup.

Source/WebInspectorUI:

* UserInterface/Views/ResourceSidebarPanel.js:
(WebInspector.ResourceSidebarPanel.prototype.performSearch.resourceCallback):
(WebInspector.ResourceSidebarPanel.prototype.performSearch.resourcesCallback):
Cleanup by reordering things a bit.

(WebInspector.ResourceSidebarPanel.prototype.performSearch.searchScripts.scriptCallback):
(WebInspector.ResourceSidebarPanel.prototype.performSearch.searchScripts):
(WebInspector.ResourceSidebarPanel.prototype.performSearch):
Search non-resource scripts individually.

(WebInspector.ResourceSidebarPanel.prototype._searchTreeElementForScript):
Lazily create a ScriptTreeElement for the search tree outline as needed.

(WebInspector.ResourceSidebarPanel.prototype._scriptsToSearch):
When searching scripts, just perform a shallow walk of the tree outline to find
Script resources that are not also Resources. Scripts are always guarenteed to
be in a folder when inspecting a web resource. For JSContext inspection, scripts
are promoted to the top level.

* UserInterface/Main.html:
* UserInterface/Models/SourceCodeSearchMatchObject.js: Renamed from Source/WebInspectorUI/UserInterface/Models/ResourceSearchMatchObject.js.
(WebInspector.SourceCodeSearchMatchObject):
* UserInterface/Views/SearchIcons.css:
(.source-code-match-icon .icon):
(.resource-match-icon .icon): Deleted.
* UserInterface/Views/SearchResultTreeElement.js:
(WebInspector.SearchResultTreeElement):
Rename ResourceSearchMatchObject to SourceCodeSearchMatchObject.

LayoutTests:

* inspector/debugger/search-scripts-expected.txt: Added.
* inspector/debugger/search-scripts.html: Added.
Tests for Debugger.searchInContent.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgentcpp">trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolDebuggerjson">trunk/Source/JavaScriptCore/inspector/protocol/Debugger.json</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolPagejson">trunk/Source/JavaScriptCore/inspector/protocol/Page.json</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorPageAgentcpp">trunk/Source/WebCore/inspector/InspectorPageAgent.cpp</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceMainhtml">trunk/Source/WebInspectorUI/UserInterface/Main.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsResourceSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsSearchIconscss">trunk/Source/WebInspectorUI/UserInterface/Views/SearchIcons.css</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsSearchResultTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/SearchResultTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIWebInspectorUIvcxprojWebInspectorUIvcxproj">trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj</a></li>
<li><a href="#trunkSourceWebInspectorUIWebInspectorUIvcxprojWebInspectorUIvcxprojfilters">trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsinspectordebuggersearchscriptsexpectedtxt">trunk/LayoutTests/inspector/debugger/search-scripts-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggersearchscriptshtml">trunk/LayoutTests/inspector/debugger/search-scripts.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsSourceCodeSearchMatchObjectjs">trunk/Source/WebInspectorUI/UserInterface/Models/SourceCodeSearchMatchObject.js</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsResourceSearchMatchObjectjs">trunk/Source/WebInspectorUI/UserInterface/Models/ResourceSearchMatchObject.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/LayoutTests/ChangeLog        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -1,5 +1,16 @@
</span><span class="cx"> 2014-11-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Web Inspector: JSContext inspection Resource search does not work
+        https://bugs.webkit.org/show_bug.cgi?id=131252
+
+        Reviewed by Timothy Hatcher.
+
+        * inspector/debugger/search-scripts-expected.txt: Added.
+        * inspector/debugger/search-scripts.html: Added.
+        Tests for Debugger.searchInContent.
+
+2014-11-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
</ins><span class="cx">         Web Inspector: Provide $exception in the console for the thrown exception value
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=138726
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggersearchscriptsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/search-scripts-expected.txt (0 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/search-scripts-expected.txt                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/search-scripts-expected.txt        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+Test DebuggerAgent.searchInContent to search script content.
+
+
+SCRIPT: LayoutTests/http/tests/inspector/inspector-test.js
+RESULTS: 0
+
+SCRIPT: LayoutTests/inspector/debugger/search-scripts.html
+RESULTS: 2
+  LINE: 1
+  CONTENT: // SEARCHTEST: Comment in inline &lt;script&gt;.
+  LINE: 28
+  CONTENT:         DebuggerAgent.searchInContent(script.id, &quot;SEARCHTEST&quot;, false, false, function(error, results) {
+
+SCRIPT: LayoutTests/inspector/debugger/search-scripts.html
+RESULTS: 1
+  LINE: 0
+  CONTENT: (function(event) {runTest(); // SEARCHTEST: onload attribute string
+
+SCRIPT: eval1.js
+RESULTS: 1
+  LINE: 0
+  CONTENT: // SEARCHTEST: Eval 1
+
+SCRIPT: eval2.js
+RESULTS: 1
+  LINE: 0
+  CONTENT: var SEARCHTEST = &quot;SEARCHTEST&quot;;
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggersearchscriptshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/search-scripts.html (0 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/search-scripts.html                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/search-scripts.html        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -0,0 +1,58 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script type=&quot;text/javascript&quot; src=&quot;../../http/tests/inspector/inspector-test.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+// SEARCHTEST: Comment in inline &lt;script&gt;.
+function performEvals()
+{
+    // Find the line with the search term.
+    eval(&quot;// SEARCH&quot; + &quot;TEST: Eval 1\n//# sourceURL=eval1.js&quot;);
+    // If the search term shows up multiple times on a single line, the line is returned once.
+    eval(&quot;var SEARCH&quot; + &quot;TEST = \&quot;SEARCH&quot; + &quot;TEST\&quot;;\n//# sourceURL=eval2.js&quot;);
+};
+
+function test()
+{
+    function sanitizeScriptURL(url) {
+        return url.substring(url.indexOf(&quot;LayoutTests&quot;));
+    }
+
+    function chomp(line) {
+        return line.replace(/\n$/, &quot;&quot;);
+    }
+
+    var scriptsCount = 0;
+    const expectedScriptsCount = 5;
+
+    WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.ScriptAdded, function(event) {
+        var script = event.data.script;
+        if (!/LayoutTests/.test(script.url) &amp;&amp; !/eval\d\.js/.test(script.url))
+            return;
+
+        DebuggerAgent.searchInContent(script.id, &quot;SEARCHTEST&quot;, false, false, function(error, results) {
+            InspectorTest.log(&quot;&quot;);
+            InspectorTest.log(&quot;SCRIPT: &quot; + sanitizeScriptURL(script.url));
+            InspectorTest.log(&quot;RESULTS: &quot; + results.length);
+            for (var result of results) {
+                InspectorTest.log(&quot;  LINE: &quot; + result.lineNumber);
+                InspectorTest.log(&quot;  CONTENT: &quot; + chomp(result.lineContent));
+            }
+
+            if (++scriptsCount === expectedScriptsCount)
+                InspectorTest.completeTest();
+        });
+    });
+
+    InspectorTest.eventDispatcher.addEventListener(InspectorTest.EventDispatcher.Event.TestPageDidLoad, function() {
+        InspectorTest.evaluateInPage(&quot;performEvals()&quot;);
+    });
+
+    InspectorTest.reloadPage();
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest(); // SEARCHTEST: onload attribute string&quot;&gt;
+    &lt;p&gt;Test &lt;code&gt;DebuggerAgent.searchInContent&lt;/code&gt; to search script content.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -1,5 +1,17 @@
</span><span class="cx"> 2014-11-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Web Inspector: JSContext inspection Resource search does not work
+        https://bugs.webkit.org/show_bug.cgi?id=131252
+
+        Reviewed by Timothy Hatcher.
+
+        * inspector/agents/InspectorDebuggerAgent.cpp:
+        (Inspector::InspectorDebuggerAgent::searchInContent):
+        * inspector/protocol/Debugger.json:
+        Do some cleanup of the description and implementation of content searching.
+
+2014-11-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
</ins><span class="cx">         Web Inspector: Provide $exception in the console for the thrown exception value
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=138726
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -401,17 +401,18 @@
</span><span class="cx">     return location;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorDebuggerAgent::searchInContent(ErrorString&amp; error, const String&amp; scriptIDStr, const String&amp; query, const bool* const optionalCaseSensitive, const bool* const optionalIsRegex, RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::GenericTypes::SearchMatch&gt;&gt;&amp; results)
</del><ins>+void InspectorDebuggerAgent::searchInContent(ErrorString&amp; error, const String&amp; scriptIDStr, const String&amp; query, const bool* optionalCaseSensitive, const bool* optionalIsRegex, RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::GenericTypes::SearchMatch&gt;&gt;&amp; results)
</ins><span class="cx"> {
</span><ins>+    JSC::SourceID sourceID = scriptIDStr.toIntPtr();
+    auto it = m_scripts.find(sourceID);
+    if (it == m_scripts.end()) {
+        error = ASCIILiteral(&quot;No script for id: &quot;) + scriptIDStr;
+        return;
+    }
+
</ins><span class="cx">     bool isRegex = optionalIsRegex ? *optionalIsRegex : false;
</span><span class="cx">     bool caseSensitive = optionalCaseSensitive ? *optionalCaseSensitive : false;
</span><del>-
-    JSC::SourceID sourceID = scriptIDStr.toIntPtr();
-    ScriptsMap::iterator it = m_scripts.find(sourceID);
-    if (it != m_scripts.end())
-        results = ContentSearchUtilities::searchInTextByLines(it-&gt;value.source, query, caseSensitive, isRegex);
-    else
-        error = ASCIILiteral(&quot;No script for id: &quot;) + scriptIDStr;
</del><ins>+    results = ContentSearchUtilities::searchInTextByLines(it-&gt;value.source, query, caseSensitive, isRegex);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorDebuggerAgent::getScriptSource(ErrorString&amp; error, const String&amp; scriptIDStr, String* scriptSource)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolDebuggerjson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/protocol/Debugger.json (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Debugger.json        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Debugger.json        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -193,16 +193,16 @@
</span><span class="cx">         },
</span><span class="cx">         {
</span><span class="cx">             &quot;name&quot;: &quot;searchInContent&quot;,
</span><ins>+            &quot;description&quot;: &quot;Searches for given string in script content.&quot;,
</ins><span class="cx">             &quot;parameters&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;scriptId&quot;, &quot;$ref&quot;: &quot;ScriptId&quot;, &quot;description&quot;: &quot;Id of the script to search in.&quot; },
</span><del>-                { &quot;name&quot;: &quot;query&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;String to search for.&quot;  },
</del><ins>+                { &quot;name&quot;: &quot;query&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;String to search for.&quot; },
</ins><span class="cx">                 { &quot;name&quot;: &quot;caseSensitive&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;If true, search is case sensitive.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;isRegex&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;If true, treats string parameter as regex.&quot; }
</span><span class="cx">             ],
</span><span class="cx">             &quot;returns&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;result&quot;, &quot;type&quot;: &quot;array&quot;, &quot;items&quot;: { &quot;$ref&quot;: &quot;GenericTypes.SearchMatch&quot; }, &quot;description&quot;: &quot;List of search matches.&quot; }
</span><del>-            ],
-            &quot;description&quot;: &quot;Searches for given string in script content.&quot;
</del><ins>+            ]
</ins><span class="cx">         },
</span><span class="cx">         {
</span><span class="cx">             &quot;name&quot;: &quot;getScriptSource&quot;,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolPagejson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/protocol/Page.json (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Page.json        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Page.json        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -162,7 +162,7 @@
</span><span class="cx">             &quot;parameters&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;frameId&quot;, &quot;$ref&quot;: &quot;Network.FrameId&quot;, &quot;description&quot;: &quot;Frame id for resource to search in.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;url&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;URL of the resource to search in.&quot; },
</span><del>-                { &quot;name&quot;: &quot;query&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;String to search for.&quot;  },
</del><ins>+                { &quot;name&quot;: &quot;query&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;String to search for.&quot; },
</ins><span class="cx">                 { &quot;name&quot;: &quot;caseSensitive&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;If true, search is case sensitive.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;isRegex&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;If true, treats string parameter as regex.&quot; }
</span><span class="cx">             ],
</span><span class="lines">@@ -174,7 +174,7 @@
</span><span class="cx">             &quot;name&quot;: &quot;searchInResources&quot;,
</span><span class="cx">             &quot;description&quot;: &quot;Searches for given string in frame / resource tree structure.&quot;,
</span><span class="cx">             &quot;parameters&quot;: [
</span><del>-                { &quot;name&quot;: &quot;text&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;String to search for.&quot;  },
</del><ins>+                { &quot;name&quot;: &quot;text&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;String to search for.&quot; },
</ins><span class="cx">                 { &quot;name&quot;: &quot;caseSensitive&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;If true, search is case sensitive.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;isRegex&quot;, &quot;type&quot;: &quot;boolean&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;If true, treats string parameter as regex.&quot; }
</span><span class="cx">             ],
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebCore/ChangeLog        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -1,5 +1,18 @@
</span><span class="cx"> 2014-11-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Web Inspector: JSContext inspection Resource search does not work
+        https://bugs.webkit.org/show_bug.cgi?id=131252
+
+        Reviewed by Timothy Hatcher.
+
+        Test: inspector/debugger/search-scripts.html
+
+        * inspector/InspectorPageAgent.cpp:
+        (WebCore::InspectorPageAgent::searchInResources):
+        A little cleanup.
+
+2014-11-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
</ins><span class="cx">         Web Inspector: Provide $exception in the console for the thrown exception value
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=138726
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorPageAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorPageAgent.cpp (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorPageAgent.cpp        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebCore/inspector/InspectorPageAgent.cpp        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -607,9 +607,9 @@
</span><span class="cx">         .release();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorPageAgent::searchInResources(ErrorString&amp;, const String&amp; text, const bool* const optionalCaseSensitive, const bool* const optionalIsRegex, RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::Page::SearchResult&gt;&gt;&amp; results)
</del><ins>+void InspectorPageAgent::searchInResources(ErrorString&amp;, const String&amp; text, const bool* const optionalCaseSensitive, const bool* const optionalIsRegex, RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::Page::SearchResult&gt;&gt;&amp; result)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::Page::SearchResult&gt;&gt; searchResults = Inspector::Protocol::Array&lt;Inspector::Protocol::Page::SearchResult&gt;::create();
</del><ins>+    result = Inspector::Protocol::Array&lt;Inspector::Protocol::Page::SearchResult&gt;::create();
</ins><span class="cx"> 
</span><span class="cx">     bool isRegex = optionalIsRegex ? *optionalIsRegex : false;
</span><span class="cx">     bool caseSensitive = optionalCaseSensitive ? *optionalCaseSensitive : false;
</span><span class="lines">@@ -622,18 +622,16 @@
</span><span class="cx">             if (textContentForCachedResource(cachedResource, &amp;content)) {
</span><span class="cx">                 int matchesCount = ContentSearchUtilities::countRegularExpressionMatches(regex, content);
</span><span class="cx">                 if (matchesCount)
</span><del>-                    searchResults-&gt;addItem(buildObjectForSearchResult(frameId(frame), cachedResource-&gt;url(), matchesCount));
</del><ins>+                    result-&gt;addItem(buildObjectForSearchResult(frameId(frame), cachedResource-&gt;url(), matchesCount));
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (mainResourceContent(frame, false, &amp;content)) {
</span><span class="cx">             int matchesCount = ContentSearchUtilities::countRegularExpressionMatches(regex, content);
</span><span class="cx">             if (matchesCount)
</span><del>-                searchResults-&gt;addItem(buildObjectForSearchResult(frameId(frame), frame-&gt;document()-&gt;url(), matchesCount));
</del><ins>+                result-&gt;addItem(buildObjectForSearchResult(frameId(frame), frame-&gt;document()-&gt;url(), matchesCount));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><del>-
-    results = searchResults;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorPageAgent::setDocumentContent(ErrorString&amp; errorString, const String&amp; frameId, const String&amp; html)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebInspectorUI/ChangeLog        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -1,5 +1,41 @@
</span><span class="cx"> 2014-11-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Web Inspector: JSContext inspection Resource search does not work
+        https://bugs.webkit.org/show_bug.cgi?id=131252
+
+        Reviewed by Timothy Hatcher.
+
+        * UserInterface/Views/ResourceSidebarPanel.js:
+        (WebInspector.ResourceSidebarPanel.prototype.performSearch.resourceCallback):
+        (WebInspector.ResourceSidebarPanel.prototype.performSearch.resourcesCallback):
+        Cleanup by reordering things a bit.
+
+        (WebInspector.ResourceSidebarPanel.prototype.performSearch.searchScripts.scriptCallback):
+        (WebInspector.ResourceSidebarPanel.prototype.performSearch.searchScripts):
+        (WebInspector.ResourceSidebarPanel.prototype.performSearch):
+        Search non-resource scripts individually.
+
+        (WebInspector.ResourceSidebarPanel.prototype._searchTreeElementForScript):
+        Lazily create a ScriptTreeElement for the search tree outline as needed.
+
+        (WebInspector.ResourceSidebarPanel.prototype._scriptsToSearch):
+        When searching scripts, just perform a shallow walk of the tree outline to find
+        Script resources that are not also Resources. Scripts are always guarenteed to
+        be in a folder when inspecting a web resource. For JSContext inspection, scripts
+        are promoted to the top level.
+
+        * UserInterface/Main.html:
+        * UserInterface/Models/SourceCodeSearchMatchObject.js: Renamed from Source/WebInspectorUI/UserInterface/Models/ResourceSearchMatchObject.js.
+        (WebInspector.SourceCodeSearchMatchObject):
+        * UserInterface/Views/SearchIcons.css:
+        (.source-code-match-icon .icon):
+        (.resource-match-icon .icon): Deleted.
+        * UserInterface/Views/SearchResultTreeElement.js:
+        (WebInspector.SearchResultTreeElement):
+        Rename ResourceSearchMatchObject to SourceCodeSearchMatchObject.
+
+2014-11-19  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
</ins><span class="cx">         Web Inspector: Provide $exception in the console for the thrown exception value
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=138726
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceMainhtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Main.html (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Main.html        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebInspectorUI/UserInterface/Main.html        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -256,7 +256,6 @@
</span><span class="cx">     &lt;script src=&quot;Models/ReplaySessionSegment.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/Resource.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/ResourceCollection.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;Models/ResourceSearchMatchObject.js&quot;&gt;&lt;/script&gt;
</del><span class="cx">     &lt;script src=&quot;Models/ResourceTimelineRecord.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/Revision.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/ScopeChainNode.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -266,6 +265,7 @@
</span><span class="cx">     &lt;script src=&quot;Models/Setting.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/SourceCodePosition.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/SourceCodeRevision.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Models/SourceCodeSearchMatchObject.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Models/SourceCodeTextRange.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/SourceCodeTimeline.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/SourceMap.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsResourceSearchMatchObjectjs"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebInspectorUI/UserInterface/Models/ResourceSearchMatchObject.js (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/ResourceSearchMatchObject.js        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/ResourceSearchMatchObject.js        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -1,69 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ResourceSearchMatchObject = function(resource, lineText, searchTerm, textRange)
-{
-    console.assert(resource instanceof WebInspector.Resource);
-
-    WebInspector.Object.call(this);
-
-    this._resource = resource;
-    this._lineText = lineText;
-    this._searchTerm = searchTerm;
-    this._sourceCodeTextRange = resource.createSourceCodeTextRange(textRange);
-};
-
-WebInspector.ResourceSearchMatchObject.ResourceMatchIconStyleClassName = &quot;resource-match-icon&quot;;
-
-WebInspector.ResourceSearchMatchObject.prototype = {
-    constructor: WebInspector.ResourceSearchMatchObject,
-
-    get resource()
-    {
-        return this._resource;
-    },
-
-    get title()
-    {
-        return this._lineText;
-    },
-
-    get className()
-    {
-        return WebInspector.ResourceSearchMatchObject.ResourceMatchIconStyleClassName;
-    },
-
-    get searchTerm()
-    {
-        return this._searchTerm;
-    },
-
-    get sourceCodeTextRange()
-    {
-        return this._sourceCodeTextRange;
-    }
-};
-
-WebInspector.ResourceSearchMatchObject.prototype.__proto__ = WebInspector.Object.prototype;
</del></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsSourceCodeSearchMatchObjectjsfromrev176357trunkSourceWebInspectorUIUserInterfaceModelsResourceSearchMatchObjectjs"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebInspectorUI/UserInterface/Models/SourceCodeSearchMatchObject.js (from rev 176357, trunk/Source/WebInspectorUI/UserInterface/Models/ResourceSearchMatchObject.js) (0 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/SourceCodeSearchMatchObject.js                                (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/SourceCodeSearchMatchObject.js        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.SourceCodeSearchMatchObject = function(sourceCode, lineText, searchTerm, textRange)
+{
+    console.assert(sourceCode instanceof WebInspector.SourceCode);
+
+    WebInspector.Object.call(this);
+
+    this._sourceCode = sourceCode;
+    this._lineText = lineText;
+    this._searchTerm = searchTerm;
+    this._sourceCodeTextRange = sourceCode.createSourceCodeTextRange(textRange);
+};
+
+WebInspector.SourceCodeSearchMatchObject.SourceCodeMatchIconStyleClassName = &quot;source-code-match-icon&quot;;
+
+WebInspector.SourceCodeSearchMatchObject.prototype = {
+    constructor: WebInspector.SourceCodeSearchMatchObject,
+
+    get sourceCode()
+    {
+        return this._sourceCode;
+    },
+
+    get title()
+    {
+        return this._lineText;
+    },
+
+    get className()
+    {
+        return WebInspector.SourceCodeSearchMatchObject.SourceCodeMatchIconStyleClassName;
+    },
+
+    get searchTerm()
+    {
+        return this._searchTerm;
+    },
+
+    get sourceCodeTextRange()
+    {
+        return this._sourceCodeTextRange;
+    }
+};
+
+WebInspector.SourceCodeSearchMatchObject.prototype.__proto__ = WebInspector.Object.prototype;
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsResourceSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSidebarPanel.js        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -323,6 +323,10 @@
</span><span class="cx">         this.filterBar.placeholder = WebInspector.UIString(&quot;Filter Search Results&quot;);
</span><span class="cx">         this.contentTreeOutline = this._searchContentTreeOutline;
</span><span class="cx"> 
</span><ins>+        // FIXME: Provide UI to toggle regex and case sensitive searches.
+        var isCaseSensitive = false;
+        var isRegex = false;
+
</ins><span class="cx">         var updateEmptyContentPlaceholderTimeout = null;
</span><span class="cx"> 
</span><span class="cx">         function updateEmptyContentPlaceholderSoon()
</span><span class="lines">@@ -342,6 +346,14 @@
</span><span class="cx">             this.updateEmptyContentPlaceholder(WebInspector.UIString(&quot;No Search Results&quot;));
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        function forEachMatch(searchTerm, lineContent, callback)
+        {
+            var lineMatch;
+            var searchRegex = new RegExp(searchTerm.escapeForRegExp(), &quot;gi&quot;);
+            while ((searchRegex.lastIndex &lt; lineContent.length) &amp;&amp; (lineMatch = searchRegex.exec(lineContent)))
+                callback(lineMatch, searchRegex.lastIndex);
+        }
+
</ins><span class="cx">         function resourcesCallback(error, result)
</span><span class="cx">         {
</span><span class="cx">             updateEmptyContentPlaceholderSoon.call(this);
</span><span class="lines">@@ -349,45 +361,74 @@
</span><span class="cx">             if (error)
</span><span class="cx">                 return;
</span><span class="cx"> 
</span><ins>+            function resourceCallback(url, error, resourceMatches)
+            {
+                updateEmptyContentPlaceholderSoon.call(this);
+
+                if (error || !resourceMatches || !resourceMatches.length)
+                    return;
+
+                var frame = WebInspector.frameResourceManager.frameForIdentifier(searchResult.frameId);
+                if (!frame)
+                    return;
+
+                var resource = frame.url === url ? frame.mainResource : frame.resourceForURL(url);
+                if (!resource)
+                    return;
+
+                var resourceTreeElement = this._searchTreeElementForResource(resource);
+
+                for (var i = 0; i &lt; resourceMatches.length; ++i) {
+                    var match = resourceMatches[i];
+                    forEachMatch(searchTerm, match.lineContent, function(lineMatch, lastIndex) {
+                        var matchObject = new WebInspector.SourceCodeSearchMatchObject(resource, match.lineContent, searchTerm, new WebInspector.TextRange(match.lineNumber, lineMatch.index, match.lineNumber, lastIndex));
+                        var matchTreeElement = new WebInspector.SearchResultTreeElement(matchObject);
+                        resourceTreeElement.appendChild(matchTreeElement);
+                    });
+                }
+
+                updateEmptyContentPlaceholder.call(this);
+            }
+
</ins><span class="cx">             for (var i = 0; i &lt; result.length; ++i) {
</span><span class="cx">                 var searchResult = result[i];
</span><span class="cx">                 if (!searchResult.url || !searchResult.frameId)
</span><span class="cx">                     continue;
</span><span class="cx"> 
</span><del>-                function resourceCallback(url, error, resourceMatches)
-                {
-                    updateEmptyContentPlaceholderSoon.call(this);
</del><ins>+                PageAgent.searchInResource(searchResult.frameId, searchResult.url, searchTerm, isCaseSensitive, isRegex, resourceCallback.bind(this, searchResult.url));
+            }
+        }
</ins><span class="cx"> 
</span><del>-                    if (error || !resourceMatches || !resourceMatches.length)
-                        return;
</del><ins>+        function searchScripts(scriptsToSearch)
+        {
+            updateEmptyContentPlaceholderSoon.call(this);
</ins><span class="cx"> 
</span><del>-                    var frame = WebInspector.frameResourceManager.frameForIdentifier(searchResult.frameId);
-                    if (!frame)
-                        return;
</del><ins>+            if (!scriptsToSearch.length)
+                return;
</ins><span class="cx"> 
</span><del>-                    var resource = frame.url === url ? frame.mainResource : frame.resourceForURL(url);
-                    if (!resource)
-                        return;
</del><ins>+            function scriptCallback(script, error, scriptMatches)
+            {
+                updateEmptyContentPlaceholderSoon.call(this);
</ins><span class="cx"> 
</span><del>-                    var resourceTreeElement = this._searchTreeElementForResource(resource);
</del><ins>+                if (error || !scriptMatches || !scriptMatches.length)
+                    return;
</ins><span class="cx"> 
</span><del>-                    for (var i = 0; i &lt; resourceMatches.length; ++i) {
-                        var match = resourceMatches[i];
</del><ins>+                var scriptTreeElement = this._searchTreeElementForScript(script);
</ins><span class="cx"> 
</span><del>-                        var lineMatch;
-                        var searchRegex = new RegExp(searchTerm.escapeForRegExp(), &quot;gi&quot;);
-                        while ((searchRegex.lastIndex &lt; match.lineContent.length) &amp;&amp; (lineMatch = searchRegex.exec(match.lineContent))) {
-                            var matchObject = new WebInspector.ResourceSearchMatchObject(resource, match.lineContent, searchTerm, new WebInspector.TextRange(match.lineNumber, lineMatch.index, match.lineNumber, searchRegex.lastIndex));
-                            var matchTreeElement = new WebInspector.SearchResultTreeElement(matchObject);
-                            resourceTreeElement.appendChild(matchTreeElement);
-                        }
-                    }
-
-                    updateEmptyContentPlaceholder.call(this);
</del><ins>+                for (var i = 0; i &lt; scriptMatches.length; ++i) {
+                    var match = scriptMatches[i];
+                    forEachMatch(searchTerm, match.lineContent, function(lineMatch, lastIndex) {
+                        var matchObject = new WebInspector.SourceCodeSearchMatchObject(script, match.lineContent, searchTerm, new WebInspector.TextRange(match.lineNumber, lineMatch.index, match.lineNumber, lastIndex));
+                        var matchTreeElement = new WebInspector.SearchResultTreeElement(matchObject);
+                        scriptTreeElement.appendChild(matchTreeElement);
+                    });
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                PageAgent.searchInResource(searchResult.frameId, searchResult.url, searchTerm, false, false, resourceCallback.bind(this, searchResult.url));
</del><ins>+                updateEmptyContentPlaceholder.call(this);
</ins><span class="cx">             }
</span><ins>+
+            for (var script of scriptsToSearch)
+                DebuggerAgent.searchInContent(script.id, searchTerm, isCaseSensitive, isRegex, scriptCallback.bind(this, script));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         function domCallback(error, searchId, resultsCount)
</span><span class="lines">@@ -419,25 +460,22 @@
</span><span class="cx">                     if (domNode.nodeType() === Node.DOCUMENT_NODE)
</span><span class="cx">                         continue;
</span><span class="cx"> 
</span><del>-                    // FIXME: Use this should use a frame to do resourceForURL, but DOMAgent does not provide a frameId.
</del><ins>+                    // FIXME: This should use a frame to do resourceForURL, but DOMAgent does not provide a frameId.
</ins><span class="cx">                     var resource = WebInspector.frameResourceManager.resourceForURL(domNode.ownerDocument.documentURL);
</span><span class="cx">                     if (!resource)
</span><span class="cx">                         continue;
</span><span class="cx"> 
</span><span class="cx">                     var resourceTreeElement = this._searchTreeElementForResource(resource);
</span><del>-
</del><span class="cx">                     var domNodeTitle = WebInspector.DOMSearchMatchObject.titleForDOMNode(domNode);
</span><del>-                    var searchRegex = new RegExp(searchTerm.escapeForRegExp(), &quot;gi&quot;);
</del><span class="cx"> 
</span><span class="cx">                     // Textual matches.
</span><del>-                    var lineMatch;
</del><span class="cx">                     var didFindTextualMatch = false;
</span><del>-                    while ((searchRegex.lastIndex &lt; domNodeTitle.length) &amp;&amp; (lineMatch = searchRegex.exec(domNodeTitle))) {
-                        var matchObject = new WebInspector.DOMSearchMatchObject(resource, domNode, domNodeTitle, searchTerm, new WebInspector.TextRange(0, lineMatch.index, 0, searchRegex.lastIndex));
</del><ins>+                    forEachMatch(searchTerm, domNodeTitle, function(lineMatch, lastIndex) {
+                        var matchObject = new WebInspector.DOMSearchMatchObject(resource, domNode, domNodeTitle, searchTerm, new WebInspector.TextRange(0, lineMatch.index, 0, lastIndex));
</ins><span class="cx">                         var matchTreeElement = new WebInspector.SearchResultTreeElement(matchObject);
</span><span class="cx">                         resourceTreeElement.appendChild(matchTreeElement);
</span><span class="cx">                         didFindTextualMatch = true;
</span><del>-                    }
</del><ins>+                    });
</ins><span class="cx"> 
</span><span class="cx">                     // Non-textual matches are CSS Selector or XPath matches. In such cases, display the node entirely highlighted.
</span><span class="cx">                     if (!didFindTextualMatch) {
</span><span class="lines">@@ -456,10 +494,11 @@
</span><span class="cx">         if (window.DOMAgent)
</span><span class="cx">             WebInspector.domTreeManager.requestDocument();
</span><span class="cx"> 
</span><del>-        // FIXME: Should we be searching for regexes or just plain text?
</del><span class="cx">         if (window.PageAgent)
</span><del>-            PageAgent.searchInResources(searchTerm, false, false, resourcesCallback.bind(this));
</del><ins>+            PageAgent.searchInResources(searchTerm, isCaseSensitive, isRegex, resourcesCallback.bind(this));
</ins><span class="cx"> 
</span><ins>+        setTimeout(searchScripts.bind(this, this._scriptsToSearch()), 0);
+
</ins><span class="cx">         if (window.DOMAgent) {
</span><span class="cx">             if (&quot;_domSearchIdentifier&quot; in this) {
</span><span class="cx">                 DOMAgent.discardSearchResults(this._domSearchIdentifier);
</span><span class="lines">@@ -491,9 +530,6 @@
</span><span class="cx"> 
</span><span class="cx">     _searchTreeElementForResource: function(resource)
</span><span class="cx">     {
</span><del>-        // FIXME: This should take a frame ID (if one is available) - so we can differentiate between multiple resources
-        // with the same URL.
-
</del><span class="cx">         var resourceTreeElement = this._searchContentTreeOutline.getCachedTreeElement(resource);
</span><span class="cx">         if (!resourceTreeElement) {
</span><span class="cx">             resourceTreeElement = new WebInspector.ResourceTreeElement(resource);
</span><span class="lines">@@ -506,6 +542,20 @@
</span><span class="cx">         return resourceTreeElement;
</span><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    _searchTreeElementForScript: function(script)
+    {
+        var scriptTreeElement = this._searchContentTreeOutline.getCachedTreeElement(script);
+        if (!scriptTreeElement) {
+            scriptTreeElement = new WebInspector.ScriptTreeElement(script);
+            scriptTreeElement.hasChildren = true;
+            scriptTreeElement.expand();
+
+            this._searchContentTreeOutline.appendChild(scriptTreeElement);
+        }
+
+        return scriptTreeElement;
+    },
+
</ins><span class="cx">     _focusSearchField: function(keyboardShortcut, event)
</span><span class="cx">     {
</span><span class="cx">         this.show();
</span><span class="lines">@@ -670,6 +720,33 @@
</span><span class="cx">         }
</span><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    _scriptsToSearch: function(event)
+    {
+        var nonResourceScripts = [];
+
+        function collectFromTreeElement(folderTreeElement)
+        {
+            if (!folderTreeElement)
+                return;
+
+            var children = folderTreeElement.children;
+            for (var treeElement of children) {
+                if (treeElement instanceof WebInspector.ScriptTreeElement)
+                    nonResourceScripts.push(treeElement.script);
+            }
+        }
+
+        if (WebInspector.debuggableType === WebInspector.DebuggableType.JavaScript &amp;&amp; !WebInspector.hasExtraDomains)
+            collectFromTreeElement(this._resourcesContentTreeOutline);
+        else {
+            collectFromTreeElement(this._extensionScriptsFolderTreeElement);
+            collectFromTreeElement(this._extraScriptsFolderTreeElement);
+            collectFromTreeElement(this._anonymousScriptsFolderTreeElement);
+        }
+
+        return nonResourceScripts;
+    },
+
</ins><span class="cx">     _treeElementSelected: function(treeElement, selectedByUser)
</span><span class="cx">     {
</span><span class="cx">         if (treeElement instanceof WebInspector.FolderTreeElement || treeElement instanceof WebInspector.DatabaseHostTreeElement ||
</span><span class="lines">@@ -691,7 +768,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (treeElement.representedObject instanceof WebInspector.DOMSearchMatchObject)
</span><span class="cx">             this.showMainFrameDOMTree(treeElement.representedObject.domNode, true);
</span><del>-        else if (treeElement.representedObject instanceof WebInspector.ResourceSearchMatchObject)
</del><ins>+        else if (treeElement.representedObject instanceof WebInspector.SourceCodeSearchMatchObject)
</ins><span class="cx">             this.showOriginalOrFormattedSourceCodeTextRange(treeElement.representedObject.sourceCodeTextRange);
</span><span class="cx">     },
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsSearchIconscss"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SearchIcons.css (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/SearchIcons.css        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SearchIcons.css        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -47,6 +47,6 @@
</span><span class="cx">     content: url(../Images/DOMNode.svg);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.resource-match-icon .icon {
</del><ins>+.source-code-match-icon .icon {
</ins><span class="cx">     content: url(../Images/ResultLine.svg);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsSearchResultTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SearchResultTreeElement.js (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/SearchResultTreeElement.js        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SearchResultTreeElement.js        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> WebInspector.SearchResultTreeElement = function(representedObject)
</span><span class="cx"> {
</span><del>-    console.assert(representedObject instanceof WebInspector.DOMSearchMatchObject || representedObject instanceof WebInspector.ResourceSearchMatchObject);
</del><ins>+    console.assert(representedObject instanceof WebInspector.DOMSearchMatchObject || representedObject instanceof WebInspector.SourceCodeSearchMatchObject);
</ins><span class="cx"> 
</span><span class="cx">     var title = WebInspector.SearchResultTreeElement.truncateAndHighlightTitle(representedObject.title, representedObject.searchTerm, representedObject.sourceCodeTextRange);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIWebInspectorUIvcxprojWebInspectorUIvcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -737,7 +737,6 @@
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\ResourceContentView.js&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\ResourceDetailsSidebarPanel.js&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\ResourceIcons.css&quot; /&gt;
</span><del>-    &lt;None Include=&quot;..\UserInterface\ResourceSearchMatchObject.js&quot; /&gt;
</del><span class="cx">     &lt;None Include=&quot;..\UserInterface\ResourceSidebarPanel.css&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\ResourceSidebarPanel.js&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\ResourceTimelineDataGridNode.js&quot; /&gt;
</span><span class="lines">@@ -777,6 +776,7 @@
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\SourceCodeLocation.js&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\SourceCodePosition.js&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\SourceCodeRevision.js&quot; /&gt;
</span><ins>+    &lt;None Include=&quot;..\UserInterface\SourceCodeSearchMatchObject.js&quot; /&gt;
</ins><span class="cx">     &lt;None Include=&quot;..\UserInterface\SourceCodeTextEditor.css&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\SourceCodeTextEditor.js&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\SourceCodeTextRange.js&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIWebInspectorUIvcxprojWebInspectorUIvcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters (176357 => 176358)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters        2014-11-19 23:49:36 UTC (rev 176357)
+++ trunk/Source/WebInspectorUI/WebInspectorUI.vcxproj/WebInspectorUI.vcxproj.filters        2014-11-19 23:49:40 UTC (rev 176358)
</span><span class="lines">@@ -795,9 +795,6 @@
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\ResourceIcons.css&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;UserInterface&lt;/Filter&gt;
</span><span class="cx">     &lt;/None&gt;
</span><del>-    &lt;None Include=&quot;..\UserInterface\ResourceSearchMatchObject.js&quot;&gt;
-      &lt;Filter&gt;UserInterface&lt;/Filter&gt;
-    &lt;/None&gt;
</del><span class="cx">     &lt;None Include=&quot;..\UserInterface\ResourceSidebarPanel.css&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;UserInterface&lt;/Filter&gt;
</span><span class="cx">     &lt;/None&gt;
</span><span class="lines">@@ -915,6 +912,9 @@
</span><span class="cx">     &lt;None Include=&quot;..\UserInterface\SourceCodeRevision.js&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;UserInterface&lt;/Filter&gt;
</span><span class="cx">     &lt;/None&gt;
</span><ins>+    &lt;None Include=&quot;..\UserInterface\SourceCodeSearchMatchObject.js&quot;&gt;
+      &lt;Filter&gt;UserInterface&lt;/Filter&gt;
+    &lt;/None&gt;
</ins><span class="cx">     &lt;None Include=&quot;..\UserInterface\SourceCodeTextEditor.css&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;UserInterface&lt;/Filter&gt;
</span><span class="cx">     &lt;/None&gt;
</span></span></pre>
</div>
</div>

</body>
</html>