diff options
Diffstat (limited to 'Source/WebCore/inspector/front-end/ResourceTreeModel.js')
-rw-r--r-- | Source/WebCore/inspector/front-end/ResourceTreeModel.js | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/Source/WebCore/inspector/front-end/ResourceTreeModel.js b/Source/WebCore/inspector/front-end/ResourceTreeModel.js new file mode 100644 index 0000000..7c7b86d --- /dev/null +++ b/Source/WebCore/inspector/front-end/ResourceTreeModel.js @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2010 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT + * OWNER OR 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.ResourceTreeModel = function() +{ + this._resourcesByURL = {}; + this._resourcesByFrameId = {}; + this._subframes = {}; + InspectorBackend.registerDomainDispatcher("Resources", this); + InspectorBackend.cachedResources(this._processCachedResources.bind(this)); +} + +WebInspector.ResourceTreeModel.createResource = function(identifier, url, loader, stackTrace) +{ + var resource = new WebInspector.Resource(identifier, url); + resource.loader = loader; + if (loader) + resource.documentURL = loader.url; + resource.stackTrace = stackTrace; + + return resource; +} + +WebInspector.ResourceTreeModel.prototype = { + addOrUpdateFrame: function(frame) + { + var tmpResource = new WebInspector.Resource(null, frame.url); + WebInspector.panels.resources.addOrUpdateFrame(frame.parentId, frame.id, frame.name, tmpResource.displayName); + var subframes = this._subframes[frame.parentId]; + if (!subframes) { + subframes = {}; + this._subframes[frame.parentId || 0] = subframes; + } + subframes[frame.id] = true; + }, + + didCommitLoadForFrame: function(frame, loader) + { + // frame.parentId === 0 is when main frame navigation happens. + this._clearChildFramesAndResources(frame.parentId ? frame.id : 0, loader.loaderId); + + this.addOrUpdateFrame(frame); + + var resourcesForFrame = this._resourcesByFrameId[frame.id]; + for (var i = 0; resourcesForFrame && i < resourcesForFrame.length; ++i) + WebInspector.panels.resources.addResourceToFrame(frame.id, resourcesForFrame[i]); + }, + + frameDetachedFromParent: function(frameId) + { + this._clearChildFramesAndResources(frameId, 0); + WebInspector.panels.resources.removeFrame(frameId); + }, + + addResourceToFrame: function(frameId, resource) + { + var resourcesForFrame = this._resourcesByFrameId[frameId]; + if (!resourcesForFrame) { + resourcesForFrame = []; + this._resourcesByFrameId[frameId] = resourcesForFrame; + } + resourcesForFrame.push(resource); + + WebInspector.panels.resources.addResourceToFrame(frameId, resource); + }, + + forAllResources: function(callback) + { + this._callForFrameResources(0, callback); + }, + + addConsoleMessage: function(msg) + { + var resource = this.resourceForURL(msg.url); + if (!resource) + return; + + switch (msg.level) { + case WebInspector.ConsoleMessage.MessageLevel.Warning: + resource.warnings += msg.repeatDelta; + break; + case WebInspector.ConsoleMessage.MessageLevel.Error: + resource.errors += msg.repeatDelta; + break; + } + + var view = WebInspector.ResourceView.resourceViewForResource(resource); + if (view.addMessage) + view.addMessage(msg); + }, + + clearConsoleMessages: function() + { + function callback(resource) + { + resource.clearErrorsAndWarnings(); + } + this.forAllResources(callback); + }, + + resourceForURL: function(url) + { + // FIXME: receive frameId here. + var entry = this._resourcesByURL[url]; + if (entry instanceof Array) + return entry[0]; + return entry; + }, + + bindResourceURL: function(resource) + { + var resourceForURL = this._resourcesByURL[resource.url]; + if (!resourceForURL) + this._resourcesByURL[resource.url] = resource; + else if (resourceForURL instanceof Array) + resourceForURL.push(resource); + else + this._resourcesByURL[resource.url] = [resourceForURL, resource]; + }, + + _clearChildFramesAndResources: function(frameId, loaderId) + { + WebInspector.panels.resources.removeResourcesFromFrame(frameId); + + this._clearResources(frameId, loaderId); + var subframes = this._subframes[frameId]; + if (!subframes) + return; + + for (var childFrameId in subframes) { + WebInspector.panels.resources.removeFrame(childFrameId); + this._clearChildFramesAndResources(childFrameId, loaderId); + } + delete this._subframes[frameId]; + }, + + _clearResources: function(frameId, loaderToPreserveId) + { + var resourcesForFrame = this._resourcesByFrameId[frameId]; + if (!resourcesForFrame) + return; + + var preservedResourcesForFrame = []; + for (var i = 0; i < resourcesForFrame.length; ++i) { + var resource = resourcesForFrame[i]; + if (resource.loader.loaderId === loaderToPreserveId) { + preservedResourcesForFrame.push(resource); + continue; + } + this._unbindResourceURL(resource); + } + + delete this._resourcesByFrameId[frameId]; + if (preservedResourcesForFrame.length) + this._resourcesByFrameId[frameId] = preservedResourcesForFrame; + }, + + _callForFrameResources: function(frameId, callback) + { + var resources = this._resourcesByFrameId[frameId]; + for (var i = 0; resources && i < resources.length; ++i) { + if (callback(resources[i])) + return true; + } + + var frames = this._subframes[frameId]; + if (frames) { + for (var id in frames) { + if (this._callForFrameResources(id, callback)) + return true; + } + } + return false; + }, + + _unbindResourceURL: function(resource) + { + var resourceForURL = this._resourcesByURL[resource.url]; + if (!resourceForURL) + return; + + if (resourceForURL instanceof Array) { + resourceForURL.remove(resource, true); + if (resourceForURL.length === 1) + this._resourcesByURL[resource.url] = resourceForURL[0]; + return; + } + + delete this._resourcesByURL[resource.url]; + }, + + _processCachedResources: function(mainFramePayload) + { + var mainResource = this._addFramesRecursively(mainFramePayload); + WebInspector.mainResource = mainResource; + mainResource.isMainResource = true; + }, + + _addFramesRecursively: function(framePayload) + { + var frameResource = WebInspector.ResourceTreeModel.createResource(null, framePayload.resource.url, framePayload.resource.loader); + WebInspector.NetworkManager.updateResourceWithRequest(frameResource, framePayload.resource.request); + WebInspector.NetworkManager.updateResourceWithResponse(frameResource, framePayload.resource.response); + frameResource.type = WebInspector.Resource.Type["Document"]; + frameResource.finished = true; + + this.bindResourceURL(frameResource); + this.addOrUpdateFrame(framePayload); + this.addResourceToFrame(framePayload.id, frameResource); + + for (var i = 0; framePayload.children && i < framePayload.children.length; ++i) + this._addFramesRecursively(framePayload.children[i]); + + if (!framePayload.subresources) + return; + + for (var i = 0; i < framePayload.subresources.length; ++i) { + var cachedResource = framePayload.subresources[i]; + var resource = WebInspector.ResourceTreeModel.createResource(null, cachedResource.url, cachedResource.loader); + WebInspector.NetworkManager.updateResourceWithCachedResource(resource, cachedResource); + resource.finished = true; + this.bindResourceURL(resource); + this.addResourceToFrame(framePayload.id, resource); + } + return frameResource; + } +} |