<!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 <pecoraro@apple.com>
</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 <pecoraro@apple.com>
+
</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 <script>.
+ LINE: 28
+ CONTENT: DebuggerAgent.searchInContent(script.id, "SEARCHTEST", 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 = "SEARCHTEST";
+
</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>+<!doctype html>
+<html>
+<head>
+<script type="text/javascript" src="../../http/tests/inspector/inspector-test.js"></script>
+<script>
+// SEARCHTEST: Comment in inline <script>.
+function performEvals()
+{
+ // Find the line with the search term.
+ eval("// SEARCH" + "TEST: Eval 1\n//# sourceURL=eval1.js");
+ // If the search term shows up multiple times on a single line, the line is returned once.
+ eval("var SEARCH" + "TEST = \"SEARCH" + "TEST\";\n//# sourceURL=eval2.js");
+};
+
+function test()
+{
+ function sanitizeScriptURL(url) {
+ return url.substring(url.indexOf("LayoutTests"));
+ }
+
+ function chomp(line) {
+ return line.replace(/\n$/, "");
+ }
+
+ 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) && !/eval\d\.js/.test(script.url))
+ return;
+
+ DebuggerAgent.searchInContent(script.id, "SEARCHTEST", false, false, function(error, results) {
+ InspectorTest.log("");
+ InspectorTest.log("SCRIPT: " + sanitizeScriptURL(script.url));
+ InspectorTest.log("RESULTS: " + results.length);
+ for (var result of results) {
+ InspectorTest.log(" LINE: " + result.lineNumber);
+ InspectorTest.log(" CONTENT: " + chomp(result.lineContent));
+ }
+
+ if (++scriptsCount === expectedScriptsCount)
+ InspectorTest.completeTest();
+ });
+ });
+
+ InspectorTest.eventDispatcher.addEventListener(InspectorTest.EventDispatcher.Event.TestPageDidLoad, function() {
+ InspectorTest.evaluateInPage("performEvals()");
+ });
+
+ InspectorTest.reloadPage();
+}
+</script>
+</head>
+<body onload="runTest(); // SEARCHTEST: onload attribute string">
+ <p>Test <code>DebuggerAgent.searchInContent</code> to search script content.</p>
+</body>
+</html>
</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 <pecoraro@apple.com>
</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 <pecoraro@apple.com>
+
</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& error, const String& scriptIDStr, const String& query, const bool* const optionalCaseSensitive, const bool* const optionalIsRegex, RefPtr<Inspector::Protocol::Array<Inspector::Protocol::GenericTypes::SearchMatch>>& results)
</del><ins>+void InspectorDebuggerAgent::searchInContent(ErrorString& error, const String& scriptIDStr, const String& query, const bool* optionalCaseSensitive, const bool* optionalIsRegex, RefPtr<Inspector::Protocol::Array<Inspector::Protocol::GenericTypes::SearchMatch>>& 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("No script for id: ") + 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->value.source, query, caseSensitive, isRegex);
- else
- error = ASCIILiteral("No script for id: ") + scriptIDStr;
</del><ins>+ results = ContentSearchUtilities::searchInTextByLines(it->value.source, query, caseSensitive, isRegex);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void InspectorDebuggerAgent::getScriptSource(ErrorString& error, const String& 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"> "name": "searchInContent",
</span><ins>+ "description": "Searches for given string in script content.",
</ins><span class="cx"> "parameters": [
</span><span class="cx"> { "name": "scriptId", "$ref": "ScriptId", "description": "Id of the script to search in." },
</span><del>- { "name": "query", "type": "string", "description": "String to search for." },
</del><ins>+ { "name": "query", "type": "string", "description": "String to search for." },
</ins><span class="cx"> { "name": "caseSensitive", "type": "boolean", "optional": true, "description": "If true, search is case sensitive." },
</span><span class="cx"> { "name": "isRegex", "type": "boolean", "optional": true, "description": "If true, treats string parameter as regex." }
</span><span class="cx"> ],
</span><span class="cx"> "returns": [
</span><span class="cx"> { "name": "result", "type": "array", "items": { "$ref": "GenericTypes.SearchMatch" }, "description": "List of search matches." }
</span><del>- ],
- "description": "Searches for given string in script content."
</del><ins>+ ]
</ins><span class="cx"> },
</span><span class="cx"> {
</span><span class="cx"> "name": "getScriptSource",
</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"> "parameters": [
</span><span class="cx"> { "name": "frameId", "$ref": "Network.FrameId", "description": "Frame id for resource to search in." },
</span><span class="cx"> { "name": "url", "type": "string", "description": "URL of the resource to search in." },
</span><del>- { "name": "query", "type": "string", "description": "String to search for." },
</del><ins>+ { "name": "query", "type": "string", "description": "String to search for." },
</ins><span class="cx"> { "name": "caseSensitive", "type": "boolean", "optional": true, "description": "If true, search is case sensitive." },
</span><span class="cx"> { "name": "isRegex", "type": "boolean", "optional": true, "description": "If true, treats string parameter as regex." }
</span><span class="cx"> ],
</span><span class="lines">@@ -174,7 +174,7 @@
</span><span class="cx"> "name": "searchInResources",
</span><span class="cx"> "description": "Searches for given string in frame / resource tree structure.",
</span><span class="cx"> "parameters": [
</span><del>- { "name": "text", "type": "string", "description": "String to search for." },
</del><ins>+ { "name": "text", "type": "string", "description": "String to search for." },
</ins><span class="cx"> { "name": "caseSensitive", "type": "boolean", "optional": true, "description": "If true, search is case sensitive." },
</span><span class="cx"> { "name": "isRegex", "type": "boolean", "optional": true, "description": "If true, treats string parameter as regex." }
</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 <pecoraro@apple.com>
</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 <pecoraro@apple.com>
+
</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&, const String& text, const bool* const optionalCaseSensitive, const bool* const optionalIsRegex, RefPtr<Inspector::Protocol::Array<Inspector::Protocol::Page::SearchResult>>& results)
</del><ins>+void InspectorPageAgent::searchInResources(ErrorString&, const String& text, const bool* const optionalCaseSensitive, const bool* const optionalIsRegex, RefPtr<Inspector::Protocol::Array<Inspector::Protocol::Page::SearchResult>>& result)
</ins><span class="cx"> {
</span><del>- RefPtr<Inspector::Protocol::Array<Inspector::Protocol::Page::SearchResult>> searchResults = Inspector::Protocol::Array<Inspector::Protocol::Page::SearchResult>::create();
</del><ins>+ result = Inspector::Protocol::Array<Inspector::Protocol::Page::SearchResult>::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, &content)) {
</span><span class="cx"> int matchesCount = ContentSearchUtilities::countRegularExpressionMatches(regex, content);
</span><span class="cx"> if (matchesCount)
</span><del>- searchResults->addItem(buildObjectForSearchResult(frameId(frame), cachedResource->url(), matchesCount));
</del><ins>+ result->addItem(buildObjectForSearchResult(frameId(frame), cachedResource->url(), matchesCount));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (mainResourceContent(frame, false, &content)) {
</span><span class="cx"> int matchesCount = ContentSearchUtilities::countRegularExpressionMatches(regex, content);
</span><span class="cx"> if (matchesCount)
</span><del>- searchResults->addItem(buildObjectForSearchResult(frameId(frame), frame->document()->url(), matchesCount));
</del><ins>+ result->addItem(buildObjectForSearchResult(frameId(frame), frame->document()->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& errorString, const String& frameId, const String& 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 <pecoraro@apple.com>
</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 <pecoraro@apple.com>
+
</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"> <script src="Models/ReplaySessionSegment.js"></script>
</span><span class="cx"> <script src="Models/Resource.js"></script>
</span><span class="cx"> <script src="Models/ResourceCollection.js"></script>
</span><del>- <script src="Models/ResourceSearchMatchObject.js"></script>
</del><span class="cx"> <script src="Models/ResourceTimelineRecord.js"></script>
</span><span class="cx"> <script src="Models/Revision.js"></script>
</span><span class="cx"> <script src="Models/ScopeChainNode.js"></script>
</span><span class="lines">@@ -266,6 +265,7 @@
</span><span class="cx"> <script src="Models/Setting.js"></script>
</span><span class="cx"> <script src="Models/SourceCodePosition.js"></script>
</span><span class="cx"> <script src="Models/SourceCodeRevision.js"></script>
</span><ins>+ <script src="Models/SourceCodeSearchMatchObject.js"></script>
</ins><span class="cx"> <script src="Models/SourceCodeTextRange.js"></script>
</span><span class="cx"> <script src="Models/SourceCodeTimeline.js"></script>
</span><span class="cx"> <script src="Models/SourceMap.js"></script>
</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 = "resource-match-icon";
-
-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 = "source-code-match-icon";
+
+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("Filter Search Results");
</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("No Search Results"));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ function forEachMatch(searchTerm, lineContent, callback)
+ {
+ var lineMatch;
+ var searchRegex = new RegExp(searchTerm.escapeForRegExp(), "gi");
+ while ((searchRegex.lastIndex < lineContent.length) && (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 < 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 < 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 < 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(), "gi");
- while ((searchRegex.lastIndex < match.lineContent.length) && (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 < 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(), "gi");
</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 < domNodeTitle.length) && (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 ("_domSearchIdentifier" 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 && !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"> <None Include="..\UserInterface\ResourceContentView.js" />
</span><span class="cx"> <None Include="..\UserInterface\ResourceDetailsSidebarPanel.js" />
</span><span class="cx"> <None Include="..\UserInterface\ResourceIcons.css" />
</span><del>- <None Include="..\UserInterface\ResourceSearchMatchObject.js" />
</del><span class="cx"> <None Include="..\UserInterface\ResourceSidebarPanel.css" />
</span><span class="cx"> <None Include="..\UserInterface\ResourceSidebarPanel.js" />
</span><span class="cx"> <None Include="..\UserInterface\ResourceTimelineDataGridNode.js" />
</span><span class="lines">@@ -777,6 +776,7 @@
</span><span class="cx"> <None Include="..\UserInterface\SourceCodeLocation.js" />
</span><span class="cx"> <None Include="..\UserInterface\SourceCodePosition.js" />
</span><span class="cx"> <None Include="..\UserInterface\SourceCodeRevision.js" />
</span><ins>+ <None Include="..\UserInterface\SourceCodeSearchMatchObject.js" />
</ins><span class="cx"> <None Include="..\UserInterface\SourceCodeTextEditor.css" />
</span><span class="cx"> <None Include="..\UserInterface\SourceCodeTextEditor.js" />
</span><span class="cx"> <None Include="..\UserInterface\SourceCodeTextRange.js" />
</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"> <None Include="..\UserInterface\ResourceIcons.css">
</span><span class="cx"> <Filter>UserInterface</Filter>
</span><span class="cx"> </None>
</span><del>- <None Include="..\UserInterface\ResourceSearchMatchObject.js">
- <Filter>UserInterface</Filter>
- </None>
</del><span class="cx"> <None Include="..\UserInterface\ResourceSidebarPanel.css">
</span><span class="cx"> <Filter>UserInterface</Filter>
</span><span class="cx"> </None>
</span><span class="lines">@@ -915,6 +912,9 @@
</span><span class="cx"> <None Include="..\UserInterface\SourceCodeRevision.js">
</span><span class="cx"> <Filter>UserInterface</Filter>
</span><span class="cx"> </None>
</span><ins>+ <None Include="..\UserInterface\SourceCodeSearchMatchObject.js">
+ <Filter>UserInterface</Filter>
+ </None>
</ins><span class="cx"> <None Include="..\UserInterface\SourceCodeTextEditor.css">
</span><span class="cx"> <Filter>UserInterface</Filter>
</span><span class="cx"> </None>
</span></span></pre>
</div>
</div>
</body>
</html>