/* * Copyright (C) 2011 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.reset(); } WebInspector.ResourceTreeModel.prototype = { reset: function() { this._resourcesByURL = {}; this._resourcesByFrameId = {}; this._subframes = {}; if (WebInspector.panels) WebInspector.panels.resources.clear(); }, 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); this._bindResourceURL(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]; } }