summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/inspector/front-end/ResourceTreeModel.js
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/inspector/front-end/ResourceTreeModel.js')
-rw-r--r--Source/WebCore/inspector/front-end/ResourceTreeModel.js255
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;
+ }
+}