diff options
Diffstat (limited to 'Source/WebCore/inspector/front-end/ResourceTreeModel.js')
-rw-r--r-- | Source/WebCore/inspector/front-end/ResourceTreeModel.js | 214 |
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; |