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.js214
1 files changed, 150 insertions, 64 deletions
diff --git a/Source/WebCore/inspector/front-end/ResourceTreeModel.js b/Source/WebCore/inspector/front-end/ResourceTreeModel.js
index da2d47a..fa2c44e 100644
--- a/Source/WebCore/inspector/front-end/ResourceTreeModel.js
+++ b/Source/WebCore/inspector/front-end/ResourceTreeModel.js
@@ -29,62 +29,131 @@
*/
-WebInspector.ResourceTreeModel = function()
+WebInspector.ResourceTreeModel = function(networkManager)
{
- this.reset();
+ WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceFinished, this._onResourceUpdated, this);
+ WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceUpdated, this._onResourceUpdated, this);
+ WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.FrameDetached, this._onFrameDetachedFromParent, this);
+ WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.FrameCommittedLoad, this._onCommitLoad, this);
+
+ this.frontendReused();
+}
+
+WebInspector.ResourceTreeModel.EventTypes = {
+ FrameAdded: "FrameAdded",
+ FrameNavigated: "FrameNavigated",
+ FrameDetached: "FrameDetached",
+ ResourceAdded: "ResourceAdded"
}
WebInspector.ResourceTreeModel.prototype = {
- reset: function()
+ frontendReused: function()
{
this._resourcesByURL = {};
this._resourcesByFrameId = {};
this._subframes = {};
- if (WebInspector.panels)
- WebInspector.panels.resources.clear();
+ NetworkAgent.getCachedResources(this._processCachedResources.bind(this));
+ },
+
+ _processCachedResources: function(error, mainFramePayload)
+ {
+ if (error)
+ return;
+
+ this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, 0);
+
+ WebInspector.mainResource = this._addFramesRecursively(mainFramePayload);
+ this._cachedResourcesProcessed = true;
},
- addOrUpdateFrame: function(frame)
+ _addOrUpdateFrame: function(frame)
{
- var tmpResource = new WebInspector.Resource(null, frame.url);
- WebInspector.panels.resources.addOrUpdateFrame(frame.parentId, frame.id, frame.name, tmpResource.displayName);
+ this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameAdded, frame);
+
var subframes = this._subframes[frame.parentId];
if (!subframes) {
- subframes = {};
+ subframes = [];
this._subframes[frame.parentId || 0] = subframes;
}
- subframes[frame.id] = true;
+ subframes.push(frame);
},
- didCommitLoadForFrame: function(frame, loader)
+ frames: function(parentFrameId)
{
+ return this._subframes[parentFrameId] || [];
+ },
+
+ subframes: function(parentFrameId)
+ {
+ return this._subframes[parentFrameId] || [];
+ },
+
+ resources: function(frameId)
+ {
+ var result = [];
+ var resources = this._resourcesByFrameId[frameId] || {};
+ for (var url in resources)
+ result.push(resources[url]);
+ return result;
+ },
+
+ _onCommitLoad: function(event)
+ {
+ if (!this._cachedResourcesProcessed)
+ return;
+
+ var frame = event.data.frame;
+ var loaderId = event.data.loaderId;
+ var isMainFrame = !frame.parentId;
+
// frame.parentId === 0 is when main frame navigation happens.
- this._clearChildFramesAndResources(frame.parentId ? frame.id : 0, loader.loaderId);
+ this._clearChildFramesAndResources(isMainFrame ? 0 : frame.id, loaderId);
- this.addOrUpdateFrame(frame);
+ 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]);
+ if (resourcesForFrame) {
+ for (var url in resourcesForFrame)
+ this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, resourcesForFrame[url]);
+ }
+
+ if (isMainFrame && this.resourceForURL(frame.url))
+ WebInspector.mainResource = this.resourceForURL(frame.url);
},
- frameDetachedFromParent: function(frameId)
+ _onFrameDetachedFromParent: function(event)
{
+ if (!this._cachedResourcesProcessed)
+ return;
+
+ var frameId = event.data;
this._clearChildFramesAndResources(frameId, 0);
- WebInspector.panels.resources.removeFrame(frameId);
+ this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, frameId);
+ },
+
+ _onResourceUpdated: function(event)
+ {
+ if (!this._cachedResourcesProcessed)
+ return;
+ this._addResourceToFrame(event.data);
},
- addResourceToFrame: function(frameId, resource)
+ _addResourceToFrame: function(resource)
{
+ var frameId = resource.frameId;
var resourcesForFrame = this._resourcesByFrameId[frameId];
if (!resourcesForFrame) {
- resourcesForFrame = [];
+ resourcesForFrame = {};
this._resourcesByFrameId[frameId] = resourcesForFrame;
}
- resourcesForFrame.push(resource);
- this._bindResourceURL(resource);
+ if (resourcesForFrame[resource.url] === resource) {
+ // Already in the tree, we just got an extra update.
+ return;
+ }
- WebInspector.panels.resources.addResourceToFrame(frameId, resource);
+ resourcesForFrame[resource.url] = resource;
+ this._bindResourceURL(resource);
+ this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, resource);
},
forAllResources: function(callback)
@@ -108,7 +177,7 @@ WebInspector.ResourceTreeModel.prototype = {
}
var view = WebInspector.ResourceView.resourceViewForResource(resource);
- if (view.addMessage)
+ if (view.addMessage && msg.isErrorOrWarning() && msg.message)
view.addMessage(msg);
},
@@ -123,36 +192,23 @@ WebInspector.ResourceTreeModel.prototype = {
resourceForURL: function(url)
{
- // FIXME: receive frameId here.
- var entry = this._resourcesByURL[url];
- if (entry instanceof Array)
- return entry[0];
- return entry;
+ return this._resourcesByURL[url];
},
_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];
+ this._resourcesByURL[resource.url] = resource;
},
- _clearChildFramesAndResources: function(frameId, loaderId)
+ _clearChildFramesAndResources: function(frameId, loaderToPreserveId)
{
- WebInspector.panels.resources.removeResourcesFromFrame(frameId);
+ this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, frameId);
- this._clearResources(frameId, loaderId);
+ this._clearResources(frameId, loaderToPreserveId);
var subframes = this._subframes[frameId];
- if (!subframes)
- return;
-
- for (var childFrameId in subframes) {
- WebInspector.panels.resources.removeFrame(childFrameId);
- this._clearChildFramesAndResources(childFrameId, loaderId);
+ for (var i = 0; subframes && i < subframes.length; ++ i) {
+ this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameRemoved, subframes[i].id);
+ this._clearChildFramesAndResources(subframes[i].id, loaderToPreserveId);
}
delete this._subframes[frameId];
},
@@ -164,51 +220,81 @@ WebInspector.ResourceTreeModel.prototype = {
return;
var preservedResourcesForFrame = [];
- for (var i = 0; i < resourcesForFrame.length; ++i) {
- var resource = resourcesForFrame[i];
- if (resource.loader.loaderId === loaderToPreserveId) {
- preservedResourcesForFrame.push(resource);
+ for (var url in resourcesForFrame) {
+ var resource = resourcesForFrame[url];
+ if (resource.loaderId === loaderToPreserveId) {
+ preservedResourcesForFrame[url] = resource;
continue;
}
this._unbindResourceURL(resource);
}
delete this._resourcesByFrameId[frameId];
- if (preservedResourcesForFrame.length)
+ 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]))
+ if (!resources)
+ return;
+
+ for (var url in resources) {
+ if (callback(resources[url]))
return true;
}
var frames = this._subframes[frameId];
- if (frames) {
- for (var id in frames) {
- if (this._callForFrameResources(id, callback))
- return true;
- }
+ for (var i = 0; frames && i < frames.length; ++i) {
+ if (this._callForFrameResources(frames[i].id, callback))
+ return true;
}
return false;
},
_unbindResourceURL: function(resource)
{
- var resourceForURL = this._resourcesByURL[resource.url];
- if (!resourceForURL)
- return;
+ delete this._resourcesByURL[resource.url];
+ },
+
+ _addFramesRecursively: function(frameTreePayload)
+ {
+ var framePayload = frameTreePayload.frame;
+
+ // Create frame resource.
+ var frameResource = this._createResource(framePayload, framePayload.url);
+ frameResource.type = WebInspector.Resource.Type.Document;
+ frameResource.finished = true;
+
+ this._addOrUpdateFrame(framePayload);
+ this._addResourceToFrame(frameResource);
- if (resourceForURL instanceof Array) {
- resourceForURL.remove(resource, true);
- if (resourceForURL.length === 1)
- this._resourcesByURL[resource.url] = resourceForURL[0];
+ for (var i = 0; frameTreePayload.childFrames && i < frameTreePayload.childFrames.length; ++i)
+ this._addFramesRecursively(frameTreePayload.childFrames[i]);
+
+ if (!frameTreePayload.resources)
return;
+
+ // Create frame subresources.
+ for (var i = 0; i < frameTreePayload.resources.length; ++i) {
+ var subresource = frameTreePayload.resources[i];
+ var resource = this._createResource(framePayload, subresource.url);
+ resource.type = WebInspector.Resource.Type[subresource.type];
+ resource.finished = true;
+ this._addResourceToFrame(resource);
}
+ return frameResource;
+ },
- delete this._resourcesByURL[resource.url];
+ _createResource: function(frame, url)
+ {
+ var resource = new WebInspector.Resource(null, url);
+ resource.frameId = frame.id;
+ resource.loaderId = frame.loaderId;
+ return resource;
}
}
+
+WebInspector.ResourceTreeModel.prototype.__proto__ = WebInspector.Object.prototype;