| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions are | |
| 6 * met: | |
| 7 * | |
| 8 * * Redistributions of source code must retain the above copyright | |
| 9 * notice, this list of conditions and the following disclaimer. | |
| 10 * * Redistributions in binary form must reproduce the above | |
| 11 * copyright notice, this list of conditions and the following disclaimer | |
| 12 * in the documentation and/or other materials provided with the | |
| 13 * distribution. | |
| 14 * * Neither the name of Google Inc. nor the names of its | |
| 15 * contributors may be used to endorse or promote products derived from | |
| 16 * this software without specific prior written permission. | |
| 17 * | |
| 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 29 */ | |
| 30 | |
| 31 /** | |
| 32 * @constructor | |
| 33 * @param {!WebInspector.NetworkWorkspaceBinding} networkWorkspaceBinding | |
| 34 * @param {!WebInspector.Workspace} workspace | |
| 35 */ | |
| 36 WebInspector.NetworkUISourceCodeProvider = function(networkWorkspaceBinding, wor
kspace) | |
| 37 { | |
| 38 this._networkWorkspaceBinding = networkWorkspaceBinding; | |
| 39 this._workspace = workspace; | |
| 40 this._processedURLs = {}; | |
| 41 WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel,
WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, this._resourceAdded, th
is); | |
| 42 WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel,
WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNav
igated, this); | |
| 43 WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebI
nspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this
); | |
| 44 WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebI
nspector.DebuggerModel.Events.FailedToParseScriptSource, this._parsedScriptSourc
e, this); | |
| 45 WebInspector.targetManager.addModelListener(WebInspector.CSSStyleModel, WebI
nspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this); | |
| 46 } | |
| 47 | |
| 48 WebInspector.NetworkUISourceCodeProvider.prototype = { | |
| 49 /** | |
| 50 * @param {!WebInspector.Target} target | |
| 51 */ | |
| 52 _populate: function(target) | |
| 53 { | |
| 54 /** | |
| 55 * @param {!WebInspector.ResourceTreeFrame} frame | |
| 56 * @this {WebInspector.NetworkUISourceCodeProvider} | |
| 57 */ | |
| 58 function populateFrame(frame) | |
| 59 { | |
| 60 for (var i = 0; i < frame.childFrames.length; ++i) | |
| 61 populateFrame.call(this, frame.childFrames[i]); | |
| 62 | |
| 63 var resources = frame.resources(); | |
| 64 for (var i = 0; i < resources.length; ++i) | |
| 65 this._addFile(resources[i].url, new WebInspector.NetworkUISource
CodeProvider.FallbackResource(resources[i])); | |
| 66 } | |
| 67 | |
| 68 var mainFrame = target.resourceTreeModel.mainFrame; | |
| 69 if (mainFrame) | |
| 70 populateFrame.call(this, mainFrame); | |
| 71 }, | |
| 72 | |
| 73 /** | |
| 74 * @param {!WebInspector.Event} event | |
| 75 */ | |
| 76 _parsedScriptSource: function(event) | |
| 77 { | |
| 78 var script = /** @type {!WebInspector.Script} */ (event.data); | |
| 79 if (!script.sourceURL || script.isInlineScript() || script.isSnippet()) | |
| 80 return; | |
| 81 // Filter out embedder injected content scripts. | |
| 82 if (script.isContentScript() && !script.hasSourceURL) { | |
| 83 var parsedURL = new WebInspector.ParsedURL(script.sourceURL); | |
| 84 if (!parsedURL.isValid) | |
| 85 return; | |
| 86 } | |
| 87 this._addFile(script.sourceURL, script, script.isContentScript()); | |
| 88 }, | |
| 89 | |
| 90 /** | |
| 91 * @param {!WebInspector.Event} event | |
| 92 */ | |
| 93 _styleSheetAdded: function(event) | |
| 94 { | |
| 95 var header = /** @type {!WebInspector.CSSStyleSheetHeader} */ (event.dat
a); | |
| 96 if (header.isInline && header.origin !== "inspector") | |
| 97 return; | |
| 98 | |
| 99 this._addFile(header.resourceURL(), header, false); | |
| 100 }, | |
| 101 | |
| 102 /** | |
| 103 * @param {!WebInspector.Event} event | |
| 104 */ | |
| 105 _resourceAdded: function(event) | |
| 106 { | |
| 107 var resource = /** @type {!WebInspector.Resource} */ (event.data); | |
| 108 this._addFile(resource.url, new WebInspector.NetworkUISourceCodeProvider
.FallbackResource(resource)); | |
| 109 }, | |
| 110 | |
| 111 /** | |
| 112 * @param {!WebInspector.Event} event | |
| 113 */ | |
| 114 _mainFrameNavigated: function(event) | |
| 115 { | |
| 116 var resourceTreeModel = /** @type {!WebInspector.ResourceTreeModel} */ (
event.target); | |
| 117 //We assume that mainFrameNavigated could be fired only in one main targ
et | |
| 118 this._reset(resourceTreeModel.target()); | |
| 119 }, | |
| 120 | |
| 121 /** | |
| 122 * @param {string} url | |
| 123 * @param {!WebInspector.ContentProvider} contentProvider | |
| 124 * @param {boolean=} isContentScript | |
| 125 */ | |
| 126 _addFile: function(url, contentProvider, isContentScript) | |
| 127 { | |
| 128 if (this._workspace.hasMappingForURL(url)) | |
| 129 return; | |
| 130 | |
| 131 var type = contentProvider.contentType(); | |
| 132 if (type !== WebInspector.resourceTypes.Stylesheet && type !== WebInspec
tor.resourceTypes.Document && type !== WebInspector.resourceTypes.Script) | |
| 133 return; | |
| 134 if (this._processedURLs[url]) | |
| 135 return; | |
| 136 this._processedURLs[url] = true; | |
| 137 this._networkWorkspaceBinding.addFileForURL(url, contentProvider, isCont
entScript); | |
| 138 }, | |
| 139 | |
| 140 /** | |
| 141 * @param {!WebInspector.Target} target | |
| 142 */ | |
| 143 _reset: function(target) | |
| 144 { | |
| 145 this._processedURLs = {}; | |
| 146 this._networkWorkspaceBinding.reset(); | |
| 147 this._populate(target); | |
| 148 } | |
| 149 } | |
| 150 | |
| 151 /** | |
| 152 * @constructor | |
| 153 * @implements {WebInspector.ContentProvider} | |
| 154 * @param {!WebInspector.Resource} resource | |
| 155 */ | |
| 156 WebInspector.NetworkUISourceCodeProvider.FallbackResource = function(resource) | |
| 157 { | |
| 158 this._resource = resource; | |
| 159 } | |
| 160 | |
| 161 WebInspector.NetworkUISourceCodeProvider.FallbackResource.prototype = { | |
| 162 | |
| 163 /** | |
| 164 * @return {string} | |
| 165 */ | |
| 166 contentURL: function() | |
| 167 { | |
| 168 return this._resource.contentURL(); | |
| 169 }, | |
| 170 | |
| 171 /** | |
| 172 * @return {!WebInspector.ResourceType} | |
| 173 */ | |
| 174 contentType: function() | |
| 175 { | |
| 176 return this._resource.contentType(); | |
| 177 }, | |
| 178 | |
| 179 /** | |
| 180 * @param {function(?string)} callback | |
| 181 */ | |
| 182 requestContent: function(callback) | |
| 183 { | |
| 184 /** | |
| 185 * @this {WebInspector.NetworkUISourceCodeProvider.FallbackResource} | |
| 186 */ | |
| 187 function loadFallbackContent() | |
| 188 { | |
| 189 var scripts = this._resource.target().debuggerModel.scriptsForSource
URL(this._resource.url); | |
| 190 if (!scripts.length) { | |
| 191 callback(null); | |
| 192 return; | |
| 193 } | |
| 194 | |
| 195 var contentProvider; | |
| 196 if (this._resource.type === WebInspector.resourceTypes.Document) | |
| 197 contentProvider = new WebInspector.ConcatenatedScriptsContentPro
vider(scripts); | |
| 198 else if (this._resource.type === WebInspector.resourceTypes.Script) | |
| 199 contentProvider = scripts[0]; | |
| 200 | |
| 201 console.assert(contentProvider, "Resource content request failed. "
+ this._resource.url); | |
| 202 | |
| 203 contentProvider.requestContent(callback); | |
| 204 } | |
| 205 | |
| 206 /** | |
| 207 * @param {?string} content | |
| 208 * @this {WebInspector.NetworkUISourceCodeProvider.FallbackResource} | |
| 209 */ | |
| 210 function requestContentLoaded(content) | |
| 211 { | |
| 212 if (content) | |
| 213 callback(content) | |
| 214 else | |
| 215 loadFallbackContent.call(this); | |
| 216 } | |
| 217 | |
| 218 this._resource.requestContent(requestContentLoaded.bind(this)); | |
| 219 }, | |
| 220 | |
| 221 /** | |
| 222 * @param {string} query | |
| 223 * @param {boolean} caseSensitive | |
| 224 * @param {boolean} isRegex | |
| 225 * @param {function(!Array.<!WebInspector.ContentProvider.SearchMatch>)} cal
lback | |
| 226 */ | |
| 227 searchInContent: function(query, caseSensitive, isRegex, callback) | |
| 228 { | |
| 229 /** | |
| 230 * @param {?string} content | |
| 231 */ | |
| 232 function documentContentLoaded(content) | |
| 233 { | |
| 234 if (content === null) { | |
| 235 callback([]); | |
| 236 return; | |
| 237 } | |
| 238 | |
| 239 var result = WebInspector.ContentProvider.performSearchInContent(con
tent, query, caseSensitive, isRegex); | |
| 240 callback(result); | |
| 241 } | |
| 242 | |
| 243 if (this.contentType() === WebInspector.resourceTypes.Document) { | |
| 244 this.requestContent(documentContentLoaded); | |
| 245 return; | |
| 246 } | |
| 247 | |
| 248 this._resource.searchInContent(query, caseSensitive, isRegex, callback); | |
| 249 } | |
| 250 } | |
| 251 | |
| 252 /** | |
| 253 * @type {!WebInspector.NetworkWorkspaceBinding} | |
| 254 */ | |
| 255 WebInspector.networkWorkspaceBinding; | |
| OLD | NEW |