| Index: chrome_frame/tools/test/reference_build/chrome/resources/inspector/ResourcesPanel.js
|
| ===================================================================
|
| --- chrome_frame/tools/test/reference_build/chrome/resources/inspector/ResourcesPanel.js (revision 0)
|
| +++ chrome_frame/tools/test/reference_build/chrome/resources/inspector/ResourcesPanel.js (revision 0)
|
| @@ -0,0 +1,1462 @@
|
| +/*
|
| + * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
|
| + * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org>
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions
|
| + * are met:
|
| + *
|
| + * 1. Redistributions of source code must retain the above copyright
|
| + * notice, this list of conditions and the following disclaimer.
|
| + * 2. 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.
|
| + * 3. Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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.ResourcesPanel = function()
|
| +{
|
| + WebInspector.Panel.call(this);
|
| +
|
| + this.element.addStyleClass("resources");
|
| +
|
| + this.filterBarElement = document.createElement("div");
|
| + this.filterBarElement.id = "resources-filter";
|
| + this.element.appendChild(this.filterBarElement);
|
| +
|
| + this.viewsContainerElement = document.createElement("div");
|
| + this.viewsContainerElement.id = "resource-views";
|
| + this.element.appendChild(this.viewsContainerElement);
|
| +
|
| + this.containerElement = document.createElement("div");
|
| + this.containerElement.id = "resources-container";
|
| + this.containerElement.addEventListener("scroll", this._updateDividersLabelBarPosition.bind(this), false);
|
| + this.element.appendChild(this.containerElement);
|
| +
|
| + this.sidebarElement = document.createElement("div");
|
| + this.sidebarElement.id = "resources-sidebar";
|
| + this.sidebarElement.className = "sidebar";
|
| + this.containerElement.appendChild(this.sidebarElement);
|
| +
|
| + this.sidebarResizeElement = document.createElement("div");
|
| + this.sidebarResizeElement.className = "sidebar-resizer-vertical";
|
| + this.sidebarResizeElement.addEventListener("mousedown", this._startSidebarDragging.bind(this), false);
|
| + this.element.appendChild(this.sidebarResizeElement);
|
| +
|
| + this.containerContentElement = document.createElement("div");
|
| + this.containerContentElement.id = "resources-container-content";
|
| + this.containerElement.appendChild(this.containerContentElement);
|
| +
|
| + this.summaryBar = new WebInspector.SummaryBar(this.categories);
|
| + this.summaryBar.element.id = "resources-summary";
|
| + this.containerContentElement.appendChild(this.summaryBar.element);
|
| +
|
| + this.resourcesGraphsElement = document.createElement("div");
|
| + this.resourcesGraphsElement.id = "resources-graphs";
|
| + this.containerContentElement.appendChild(this.resourcesGraphsElement);
|
| +
|
| + this.dividersElement = document.createElement("div");
|
| + this.dividersElement.id = "resources-dividers";
|
| + this.containerContentElement.appendChild(this.dividersElement);
|
| +
|
| + this.dividersLabelBarElement = document.createElement("div");
|
| + this.dividersLabelBarElement.id = "resources-dividers-label-bar";
|
| + this.containerContentElement.appendChild(this.dividersLabelBarElement);
|
| +
|
| + this.sidebarTreeElement = document.createElement("ol");
|
| + this.sidebarTreeElement.className = "sidebar-tree";
|
| + this.sidebarElement.appendChild(this.sidebarTreeElement);
|
| +
|
| + this.sidebarTree = new TreeOutline(this.sidebarTreeElement);
|
| +
|
| + var timeGraphItem = new WebInspector.SidebarTreeElement("resources-time-graph-sidebar-item", WebInspector.UIString("Time"));
|
| + timeGraphItem.onselect = this._graphSelected.bind(this);
|
| +
|
| + var transferTimeCalculator = new WebInspector.ResourceTransferTimeCalculator();
|
| + var transferDurationCalculator = new WebInspector.ResourceTransferDurationCalculator();
|
| +
|
| + timeGraphItem.sortingOptions = [
|
| + { name: WebInspector.UIString("Sort by Start Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime, calculator: transferTimeCalculator },
|
| + { name: WebInspector.UIString("Sort by Response Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime, calculator: transferTimeCalculator },
|
| + { name: WebInspector.UIString("Sort by End Time"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime, calculator: transferTimeCalculator },
|
| + { name: WebInspector.UIString("Sort by Duration"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration, calculator: transferDurationCalculator },
|
| + { name: WebInspector.UIString("Sort by Latency"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency, calculator: transferDurationCalculator },
|
| + ];
|
| +
|
| + timeGraphItem.selectedSortingOptionIndex = 1;
|
| +
|
| + var sizeGraphItem = new WebInspector.SidebarTreeElement("resources-size-graph-sidebar-item", WebInspector.UIString("Size"));
|
| + sizeGraphItem.onselect = this._graphSelected.bind(this);
|
| +
|
| + var transferSizeCalculator = new WebInspector.ResourceTransferSizeCalculator();
|
| + sizeGraphItem.sortingOptions = [
|
| + { name: WebInspector.UIString("Sort by Size"), sortingFunction: WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize, calculator: transferSizeCalculator },
|
| + ];
|
| +
|
| + sizeGraphItem.selectedSortingOptionIndex = 0;
|
| +
|
| + this.graphsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("GRAPHS"), {}, true);
|
| + this.sidebarTree.appendChild(this.graphsTreeElement);
|
| +
|
| + this.graphsTreeElement.appendChild(timeGraphItem);
|
| + this.graphsTreeElement.appendChild(sizeGraphItem);
|
| + this.graphsTreeElement.expand();
|
| +
|
| + this.resourcesTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESOURCES"), {}, true);
|
| + this.sidebarTree.appendChild(this.resourcesTreeElement);
|
| +
|
| + this.resourcesTreeElement.expand();
|
| +
|
| + var panelEnablerHeading = WebInspector.UIString("You need to enable resource tracking to use this panel.");
|
| + var panelEnablerDisclaimer = WebInspector.UIString("Enabling resource tracking will reload the page and make page loading slower.");
|
| + var panelEnablerButton = WebInspector.UIString("Enable resource tracking");
|
| +
|
| + this.panelEnablerView = new WebInspector.PanelEnablerView("resources", panelEnablerHeading, panelEnablerDisclaimer, panelEnablerButton);
|
| + this.panelEnablerView.addEventListener("enable clicked", this._enableResourceTracking, this);
|
| +
|
| + this.element.appendChild(this.panelEnablerView.element);
|
| +
|
| + this.enableToggleButton = new WebInspector.StatusBarButton("", "enable-toggle-status-bar-item");
|
| + this.enableToggleButton.addEventListener("click", this._toggleResourceTracking.bind(this), false);
|
| +
|
| + this.largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "resources-larger-resources-status-bar-item");
|
| + this.largerResourcesButton.toggled = true;
|
| + this.largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);
|
| +
|
| + this.sortingSelectElement = document.createElement("select");
|
| + this.sortingSelectElement.className = "status-bar-item";
|
| + this.sortingSelectElement.addEventListener("change", this._changeSortingFunction.bind(this), false);
|
| +
|
| + var createFilterElement = function (category) {
|
| + var categoryElement = document.createElement("li");
|
| + categoryElement.category = category;
|
| + categoryElement.addStyleClass(category);
|
| + var label = WebInspector.UIString("All");
|
| + if (WebInspector.resourceCategories[category])
|
| + label = WebInspector.resourceCategories[category].title;
|
| + categoryElement.appendChild(document.createTextNode(label));
|
| + categoryElement.addEventListener("click", this._updateFilter.bind(this), false);
|
| + this.filterBarElement.appendChild(categoryElement);
|
| + return categoryElement;
|
| + };
|
| +
|
| + var allElement = createFilterElement.call(this, "all");
|
| + this.filter(allElement.category);
|
| + for (var category in this.categories)
|
| + createFilterElement.call(this, category);
|
| +
|
| + this.reset();
|
| +
|
| + timeGraphItem.select();
|
| +}
|
| +
|
| +WebInspector.ResourcesPanel.prototype = {
|
| + toolbarItemClass: "resources",
|
| +
|
| + get categories()
|
| + {
|
| + if (!this._categories) {
|
| + this._categories = {documents: {color: {r: 47, g: 102, b: 236}}, stylesheets: {color: {r: 157, g: 231, b: 119}}, images: {color: {r: 164, g: 60, b: 255}}, scripts: {color: {r: 255, g: 121, b: 0}}, xhr: {color: {r: 231, g: 231, b: 10}}, fonts: {color: {r: 255, g: 82, b: 62}}, other: {color: {r: 186, g: 186, b: 186}}};
|
| + for (var category in this._categories) {
|
| + this._categories[category].title = WebInspector.resourceCategories[category].title;
|
| + }
|
| + }
|
| + return this._categories;
|
| + },
|
| +
|
| + filter: function (category) {
|
| + if (this._filterCategory && this._filterCategory === category)
|
| + return;
|
| +
|
| + if (this._filterCategory) {
|
| + var filterElement = this.filterBarElement.getElementsByClassName(this._filterCategory)[0];
|
| + filterElement.removeStyleClass("selected");
|
| + var oldClass = "filter-" + this._filterCategory;
|
| + this.resourcesTreeElement.childrenListElement.removeStyleClass(oldClass);
|
| + this.resourcesGraphsElement.removeStyleClass(oldClass);
|
| + }
|
| + this._filterCategory = category;
|
| + var filterElement = this.filterBarElement.getElementsByClassName(this._filterCategory)[0];
|
| + filterElement.addStyleClass("selected");
|
| + var newClass = "filter-" + this._filterCategory;
|
| + this.resourcesTreeElement.childrenListElement.addStyleClass(newClass);
|
| + this.resourcesGraphsElement.addStyleClass(newClass);
|
| + },
|
| +
|
| + _updateFilter: function (e) {
|
| + this.filter(e.target.category);
|
| + },
|
| +
|
| + get toolbarItemLabel()
|
| + {
|
| + return WebInspector.UIString("Resources");
|
| + },
|
| +
|
| + get statusBarItems()
|
| + {
|
| + return [this.enableToggleButton.element, this.largerResourcesButton.element, this.sortingSelectElement];
|
| + },
|
| +
|
| + show: function()
|
| + {
|
| + WebInspector.Panel.prototype.show.call(this);
|
| +
|
| + this._updateDividersLabelBarPosition();
|
| + this._updateSidebarWidth();
|
| + this.refreshIfNeeded();
|
| +
|
| + var visibleView = this.visibleView;
|
| + if (visibleView) {
|
| + visibleView.headersVisible = true;
|
| + visibleView.show(this.viewsContainerElement);
|
| + }
|
| +
|
| + // Hide any views that are visible that are not this panel's current visible view.
|
| + // This can happen when a ResourceView is visible in the Scripts panel then switched
|
| + // to the this panel.
|
| + var resourcesLength = this._resources.length;
|
| + for (var i = 0; i < resourcesLength; ++i) {
|
| + var resource = this._resources[i];
|
| + var view = resource._resourcesView;
|
| + if (!view || view === visibleView)
|
| + continue;
|
| + view.visible = false;
|
| + }
|
| + },
|
| +
|
| + resize: function()
|
| + {
|
| + this._updateGraphDividersIfNeeded();
|
| +
|
| + var visibleView = this.visibleView;
|
| + if (visibleView && "resize" in visibleView)
|
| + visibleView.resize();
|
| + },
|
| +
|
| + get searchableViews()
|
| + {
|
| + var views = [];
|
| +
|
| + const visibleView = this.visibleView;
|
| + if (visibleView && visibleView.performSearch)
|
| + views.push(visibleView);
|
| +
|
| + var resourcesLength = this._resources.length;
|
| + for (var i = 0; i < resourcesLength; ++i) {
|
| + var resource = this._resources[i];
|
| + if (!resource._resourcesTreeElement)
|
| + continue;
|
| + var resourceView = this.resourceViewForResource(resource);
|
| + if (!resourceView.performSearch || resourceView === visibleView)
|
| + continue;
|
| + views.push(resourceView);
|
| + }
|
| +
|
| + return views;
|
| + },
|
| +
|
| + get searchResultsSortFunction()
|
| + {
|
| + const resourceTreeElementSortFunction = this.sortingFunction;
|
| +
|
| + function sortFuction(a, b)
|
| + {
|
| + return resourceTreeElementSortFunction(a.resource._resourcesTreeElement, b.resource._resourcesTreeElement);
|
| + }
|
| +
|
| + return sortFuction;
|
| + },
|
| +
|
| + searchMatchFound: function(view, matches)
|
| + {
|
| + view.resource._resourcesTreeElement.searchMatches = matches;
|
| + },
|
| +
|
| + searchCanceled: function(startingNewSearch)
|
| + {
|
| + WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
|
| +
|
| + if (startingNewSearch || !this._resources)
|
| + return;
|
| +
|
| + for (var i = 0; i < this._resources.length; ++i) {
|
| + var resource = this._resources[i];
|
| + if (resource._resourcesTreeElement)
|
| + resource._resourcesTreeElement.updateErrorsAndWarnings();
|
| + }
|
| + },
|
| +
|
| + performSearch: function(query)
|
| + {
|
| + for (var i = 0; i < this._resources.length; ++i) {
|
| + var resource = this._resources[i];
|
| + if (resource._resourcesTreeElement)
|
| + resource._resourcesTreeElement.resetBubble();
|
| + }
|
| +
|
| + WebInspector.Panel.prototype.performSearch.call(this, query);
|
| + },
|
| +
|
| + get visibleView()
|
| + {
|
| + if (this.visibleResource)
|
| + return this.visibleResource._resourcesView;
|
| + return null;
|
| + },
|
| +
|
| + get calculator()
|
| + {
|
| + return this._calculator;
|
| + },
|
| +
|
| + set calculator(x)
|
| + {
|
| + if (!x || this._calculator === x)
|
| + return;
|
| +
|
| + this._calculator = x;
|
| + this._calculator.reset();
|
| +
|
| + this._staleResources = this._resources;
|
| + this.refresh();
|
| + },
|
| +
|
| + get sortingFunction()
|
| + {
|
| + return this._sortingFunction;
|
| + },
|
| +
|
| + set sortingFunction(x)
|
| + {
|
| + this._sortingFunction = x;
|
| + this._sortResourcesIfNeeded();
|
| + },
|
| +
|
| + get needsRefresh()
|
| + {
|
| + return this._needsRefresh;
|
| + },
|
| +
|
| + set needsRefresh(x)
|
| + {
|
| + if (this._needsRefresh === x)
|
| + return;
|
| +
|
| + this._needsRefresh = x;
|
| +
|
| + if (x) {
|
| + if (this.visible && !("_refreshTimeout" in this))
|
| + this._refreshTimeout = setTimeout(this.refresh.bind(this), 500);
|
| + } else {
|
| + if ("_refreshTimeout" in this) {
|
| + clearTimeout(this._refreshTimeout);
|
| + delete this._refreshTimeout;
|
| + }
|
| + }
|
| + },
|
| +
|
| + refreshIfNeeded: function()
|
| + {
|
| + if (this.needsRefresh)
|
| + this.refresh();
|
| + },
|
| +
|
| + refresh: function()
|
| + {
|
| + this.needsRefresh = false;
|
| +
|
| + var staleResourcesLength = this._staleResources.length;
|
| + var boundariesChanged = false;
|
| +
|
| + for (var i = 0; i < staleResourcesLength; ++i) {
|
| + var resource = this._staleResources[i];
|
| + if (!resource._resourcesTreeElement) {
|
| + // Create the resource tree element and graph.
|
| + resource._resourcesTreeElement = new WebInspector.ResourceSidebarTreeElement(resource);
|
| + resource._resourcesTreeElement._resourceGraph = new WebInspector.ResourceGraph(resource);
|
| +
|
| + this.resourcesTreeElement.appendChild(resource._resourcesTreeElement);
|
| + this.resourcesGraphsElement.appendChild(resource._resourcesTreeElement._resourceGraph.graphElement);
|
| + }
|
| +
|
| + resource._resourcesTreeElement.refresh();
|
| +
|
| + if (this.calculator.updateBoundaries(resource))
|
| + boundariesChanged = true;
|
| + }
|
| +
|
| + if (boundariesChanged) {
|
| + // The boundaries changed, so all resource graphs are stale.
|
| + this._staleResources = this._resources;
|
| + staleResourcesLength = this._staleResources.length;
|
| + }
|
| +
|
| + for (var i = 0; i < staleResourcesLength; ++i)
|
| + this._staleResources[i]._resourcesTreeElement._resourceGraph.refresh(this.calculator);
|
| +
|
| + this._staleResources = [];
|
| +
|
| + this._updateGraphDividersIfNeeded();
|
| + this._sortResourcesIfNeeded();
|
| + this._updateSummaryGraph();
|
| + },
|
| +
|
| + resourceTrackingWasEnabled: function()
|
| + {
|
| + this.reset();
|
| + },
|
| +
|
| + resourceTrackingWasDisabled: function()
|
| + {
|
| + this.reset();
|
| + },
|
| +
|
| + reset: function()
|
| + {
|
| + this.closeVisibleResource();
|
| +
|
| + this.containerElement.scrollTop = 0;
|
| +
|
| + delete this.currentQuery;
|
| + this.searchCanceled();
|
| +
|
| + if (this._calculator)
|
| + this._calculator.reset();
|
| +
|
| + if (this._resources) {
|
| + var resourcesLength = this._resources.length;
|
| + for (var i = 0; i < resourcesLength; ++i) {
|
| + var resource = this._resources[i];
|
| +
|
| + resource.warnings = 0;
|
| + resource.errors = 0;
|
| +
|
| + delete resource._resourcesTreeElement;
|
| + delete resource._resourcesView;
|
| + }
|
| + }
|
| +
|
| + this._resources = [];
|
| + this._staleResources = [];
|
| +
|
| + this.resourcesTreeElement.removeChildren();
|
| + this.viewsContainerElement.removeChildren();
|
| + this.resourcesGraphsElement.removeChildren();
|
| + this.summaryBar.reset();
|
| +
|
| + this._updateGraphDividersIfNeeded(true);
|
| +
|
| + if (InspectorController.resourceTrackingEnabled()) {
|
| + this.enableToggleButton.title = WebInspector.UIString("Resource tracking enabled. Click to disable.");
|
| + this.enableToggleButton.toggled = true;
|
| + this.largerResourcesButton.visible = true;
|
| + this.sortingSelectElement.removeStyleClass("hidden");
|
| + this.panelEnablerView.visible = false;
|
| + } else {
|
| + this.enableToggleButton.title = WebInspector.UIString("Resource tracking disabled. Click to enable.");
|
| + this.enableToggleButton.toggled = false;
|
| + this.largerResourcesButton.visible = false;
|
| + this.sortingSelectElement.addStyleClass("hidden");
|
| + this.panelEnablerView.visible = true;
|
| + }
|
| + },
|
| +
|
| + addResource: function(resource)
|
| + {
|
| + this._resources.push(resource);
|
| + this.refreshResource(resource);
|
| + },
|
| +
|
| + removeResource: function(resource)
|
| + {
|
| + if (this.visibleView === resource._resourcesView)
|
| + this.closeVisibleResource();
|
| +
|
| + this._resources.remove(resource, true);
|
| +
|
| + if (resource._resourcesTreeElement) {
|
| + this.resourcesTreeElement.removeChild(resource._resourcesTreeElement);
|
| + this.resourcesGraphsElement.removeChild(resource._resourcesTreeElement._resourceGraph.graphElement);
|
| + }
|
| +
|
| + resource.warnings = 0;
|
| + resource.errors = 0;
|
| +
|
| + delete resource._resourcesTreeElement;
|
| + delete resource._resourcesView;
|
| +
|
| + this._adjustScrollPosition();
|
| + },
|
| +
|
| + addMessageToResource: function(resource, msg)
|
| + {
|
| + 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;
|
| + }
|
| +
|
| + if (!this.currentQuery && resource._resourcesTreeElement)
|
| + resource._resourcesTreeElement.updateErrorsAndWarnings();
|
| +
|
| + var view = this.resourceViewForResource(resource);
|
| + if (view.addMessage)
|
| + view.addMessage(msg);
|
| + },
|
| +
|
| + clearMessages: function()
|
| + {
|
| + var resourcesLength = this._resources.length;
|
| + for (var i = 0; i < resourcesLength; ++i) {
|
| + var resource = this._resources[i];
|
| + resource.warnings = 0;
|
| + resource.errors = 0;
|
| +
|
| + if (!this.currentQuery && resource._resourcesTreeElement)
|
| + resource._resourcesTreeElement.updateErrorsAndWarnings();
|
| +
|
| + var view = resource._resourcesView;
|
| + if (!view || !view.clearMessages)
|
| + continue;
|
| + view.clearMessages();
|
| + }
|
| + },
|
| +
|
| + refreshResource: function(resource)
|
| + {
|
| + this._staleResources.push(resource);
|
| + this.needsRefresh = true;
|
| + },
|
| +
|
| + recreateViewForResourceIfNeeded: function(resource)
|
| + {
|
| + if (!resource || !resource._resourcesView)
|
| + return;
|
| +
|
| + var newView = this._createResourceView(resource);
|
| + if (newView.prototype === resource._resourcesView.prototype)
|
| + return;
|
| +
|
| + resource.warnings = 0;
|
| + resource.errors = 0;
|
| +
|
| + if (!this.currentQuery && resource._resourcesTreeElement)
|
| + resource._resourcesTreeElement.updateErrorsAndWarnings();
|
| +
|
| + var oldView = resource._resourcesView;
|
| +
|
| + resource._resourcesView.detach();
|
| + delete resource._resourcesView;
|
| +
|
| + resource._resourcesView = newView;
|
| +
|
| + newView.headersVisible = oldView.headersVisible;
|
| +
|
| + if (oldView.visible && oldView.element.parentNode)
|
| + newView.show(oldView.element.parentNode);
|
| + },
|
| +
|
| + showResource: function(resource, line)
|
| + {
|
| + if (!resource)
|
| + return;
|
| +
|
| + this.containerElement.addStyleClass("viewing-resource");
|
| +
|
| + if (this.visibleResource && this.visibleResource._resourcesView)
|
| + this.visibleResource._resourcesView.hide();
|
| +
|
| + var view = this.resourceViewForResource(resource);
|
| + view.headersVisible = true;
|
| + view.show(this.viewsContainerElement);
|
| +
|
| + if (line) {
|
| + if (view.revealLine)
|
| + view.revealLine(line);
|
| + if (view.highlightLine)
|
| + view.highlightLine(line);
|
| + }
|
| +
|
| + if (resource._resourcesTreeElement) {
|
| + resource._resourcesTreeElement.reveal();
|
| + resource._resourcesTreeElement.select(true);
|
| + }
|
| +
|
| + this.visibleResource = resource;
|
| +
|
| + this._updateSidebarWidth();
|
| + },
|
| +
|
| + showView: function(view)
|
| + {
|
| + if (!view)
|
| + return;
|
| + this.showResource(view.resource);
|
| + },
|
| +
|
| + closeVisibleResource: function()
|
| + {
|
| + this.containerElement.removeStyleClass("viewing-resource");
|
| + this._updateDividersLabelBarPosition();
|
| +
|
| + if (this.visibleResource && this.visibleResource._resourcesView)
|
| + this.visibleResource._resourcesView.hide();
|
| + delete this.visibleResource;
|
| +
|
| + if (this._lastSelectedGraphTreeElement)
|
| + this._lastSelectedGraphTreeElement.select(true);
|
| +
|
| + this._updateSidebarWidth();
|
| + },
|
| +
|
| + resourceViewForResource: function(resource)
|
| + {
|
| + if (!resource)
|
| + return null;
|
| + if (!resource._resourcesView)
|
| + resource._resourcesView = this._createResourceView(resource);
|
| + return resource._resourcesView;
|
| + },
|
| +
|
| + sourceFrameForResource: function(resource)
|
| + {
|
| + var view = this.resourceViewForResource(resource);
|
| + if (!view)
|
| + return null;
|
| +
|
| + if (!view.setupSourceFrameIfNeeded)
|
| + return null;
|
| +
|
| + // Setting up the source frame requires that we be attached.
|
| + if (!this.element.parentNode)
|
| + this.attach();
|
| +
|
| + view.setupSourceFrameIfNeeded();
|
| + return view.sourceFrame;
|
| + },
|
| +
|
| + handleKeyEvent: function(event)
|
| + {
|
| + this.sidebarTree.handleKeyEvent(event);
|
| + },
|
| +
|
| + _sortResourcesIfNeeded: function()
|
| + {
|
| + var sortedElements = [].concat(this.resourcesTreeElement.children);
|
| + sortedElements.sort(this.sortingFunction);
|
| +
|
| + var sortedElementsLength = sortedElements.length;
|
| + for (var i = 0; i < sortedElementsLength; ++i) {
|
| + var treeElement = sortedElements[i];
|
| + if (treeElement === this.resourcesTreeElement.children[i])
|
| + continue;
|
| +
|
| + var wasSelected = treeElement.selected;
|
| + this.resourcesTreeElement.removeChild(treeElement);
|
| + this.resourcesTreeElement.insertChild(treeElement, i);
|
| + if (wasSelected)
|
| + treeElement.select(true);
|
| +
|
| + var graphElement = treeElement._resourceGraph.graphElement;
|
| + this.resourcesGraphsElement.insertBefore(graphElement, this.resourcesGraphsElement.children[i]);
|
| + }
|
| + },
|
| +
|
| + _updateGraphDividersIfNeeded: function(force)
|
| + {
|
| + if (!this.visible) {
|
| + this.needsRefresh = true;
|
| + return;
|
| + }
|
| +
|
| + if (document.body.offsetWidth <= 0) {
|
| + // The stylesheet hasn't loaded yet or the window is closed,
|
| + // so we can't calculate what is need. Return early.
|
| + return;
|
| + }
|
| +
|
| + var dividerCount = Math.round(this.dividersElement.offsetWidth / 64);
|
| + var slice = this.calculator.boundarySpan / dividerCount;
|
| + if (!force && this._currentDividerSlice === slice)
|
| + return;
|
| +
|
| + this._currentDividerSlice = slice;
|
| +
|
| + this.dividersElement.removeChildren();
|
| + this.dividersLabelBarElement.removeChildren();
|
| +
|
| + for (var i = 1; i <= dividerCount; ++i) {
|
| + var divider = document.createElement("div");
|
| + divider.className = "resources-divider";
|
| + if (i === dividerCount)
|
| + divider.addStyleClass("last");
|
| + divider.style.left = ((i / dividerCount) * 100) + "%";
|
| +
|
| + this.dividersElement.appendChild(divider.cloneNode());
|
| +
|
| + var label = document.createElement("div");
|
| + label.className = "resources-divider-label";
|
| + if (!isNaN(slice))
|
| + label.textContent = this.calculator.formatValue(slice * i);
|
| + divider.appendChild(label);
|
| +
|
| + this.dividersLabelBarElement.appendChild(divider);
|
| + }
|
| + },
|
| +
|
| + _updateSummaryGraph: function()
|
| + {
|
| + this.summaryBar.update(this._resources);
|
| + },
|
| +
|
| + _updateDividersLabelBarPosition: function()
|
| + {
|
| + var scrollTop = this.containerElement.scrollTop;
|
| + var dividersTop = (scrollTop < this.summaryBar.element.offsetHeight ? this.summaryBar.element.offsetHeight : scrollTop);
|
| + this.dividersElement.style.top = scrollTop + "px";
|
| + this.dividersLabelBarElement.style.top = dividersTop + "px";
|
| + },
|
| +
|
| + _graphSelected: function(treeElement)
|
| + {
|
| + if (this._lastSelectedGraphTreeElement)
|
| + this._lastSelectedGraphTreeElement.selectedSortingOptionIndex = this.sortingSelectElement.selectedIndex;
|
| +
|
| + this._lastSelectedGraphTreeElement = treeElement;
|
| +
|
| + this.sortingSelectElement.removeChildren();
|
| + for (var i = 0; i < treeElement.sortingOptions.length; ++i) {
|
| + var sortingOption = treeElement.sortingOptions[i];
|
| + var option = document.createElement("option");
|
| + option.label = sortingOption.name;
|
| + option.sortingFunction = sortingOption.sortingFunction;
|
| + option.calculator = sortingOption.calculator;
|
| + this.sortingSelectElement.appendChild(option);
|
| + }
|
| +
|
| + this.sortingSelectElement.selectedIndex = treeElement.selectedSortingOptionIndex;
|
| + this._changeSortingFunction();
|
| +
|
| + this.closeVisibleResource();
|
| + this.containerElement.scrollTop = 0;
|
| + },
|
| +
|
| + _toggleLargerResources: function()
|
| + {
|
| + if (!this.resourcesTreeElement._childrenListNode)
|
| + return;
|
| +
|
| + this.resourcesTreeElement.smallChildren = !this.resourcesTreeElement.smallChildren;
|
| +
|
| + if (this.resourcesTreeElement.smallChildren) {
|
| + this.resourcesGraphsElement.addStyleClass("small");
|
| + this.largerResourcesButton.title = WebInspector.UIString("Use large resource rows.");
|
| + this.largerResourcesButton.toggled = false;
|
| + this._adjustScrollPosition();
|
| + } else {
|
| + this.resourcesGraphsElement.removeStyleClass("small");
|
| + this.largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
|
| + this.largerResourcesButton.toggled = true;
|
| + }
|
| + },
|
| +
|
| + _adjustScrollPosition: function()
|
| + {
|
| + // Prevent the container from being scrolled off the end.
|
| + if ((this.containerElement.scrollTop + this.containerElement.offsetHeight) > this.sidebarElement.offsetHeight)
|
| + this.containerElement.scrollTop = (this.sidebarElement.offsetHeight - this.containerElement.offsetHeight);
|
| + },
|
| +
|
| + _changeSortingFunction: function()
|
| + {
|
| + var selectedOption = this.sortingSelectElement[this.sortingSelectElement.selectedIndex];
|
| + this.sortingFunction = selectedOption.sortingFunction;
|
| + this.calculator = this.summaryBar.calculator = selectedOption.calculator;
|
| + },
|
| +
|
| + _createResourceView: function(resource)
|
| + {
|
| + switch (resource.category) {
|
| + case WebInspector.resourceCategories.documents:
|
| + case WebInspector.resourceCategories.stylesheets:
|
| + case WebInspector.resourceCategories.scripts:
|
| + case WebInspector.resourceCategories.xhr:
|
| + return new WebInspector.SourceView(resource);
|
| + case WebInspector.resourceCategories.images:
|
| + return new WebInspector.ImageView(resource);
|
| + case WebInspector.resourceCategories.fonts:
|
| + return new WebInspector.FontView(resource);
|
| + default:
|
| + return new WebInspector.ResourceView(resource);
|
| + }
|
| + },
|
| +
|
| + _startSidebarDragging: function(event)
|
| + {
|
| + WebInspector.elementDragStart(this.sidebarResizeElement, this._sidebarDragging.bind(this), this._endSidebarDragging.bind(this), event, "col-resize");
|
| + },
|
| +
|
| + _sidebarDragging: function(event)
|
| + {
|
| + this._updateSidebarWidth(event.pageX);
|
| +
|
| + event.preventDefault();
|
| + },
|
| +
|
| + _endSidebarDragging: function(event)
|
| + {
|
| + WebInspector.elementDragEnd(event);
|
| + },
|
| +
|
| + _updateSidebarWidth: function(width)
|
| + {
|
| + if (this.sidebarElement.offsetWidth <= 0) {
|
| + // The stylesheet hasn't loaded yet or the window is closed,
|
| + // so we can't calculate what is need. Return early.
|
| + return;
|
| + }
|
| +
|
| + if (!("_currentSidebarWidth" in this))
|
| + this._currentSidebarWidth = this.sidebarElement.offsetWidth;
|
| +
|
| + if (typeof width === "undefined")
|
| + width = this._currentSidebarWidth;
|
| +
|
| + width = Number.constrain(width, Preferences.minSidebarWidth, window.innerWidth / 2);
|
| +
|
| + this._currentSidebarWidth = width;
|
| +
|
| + if (this.visibleResource) {
|
| + this.containerElement.style.width = width + "px";
|
| + this.sidebarElement.style.removeProperty("width");
|
| + } else {
|
| + this.sidebarElement.style.width = width + "px";
|
| + this.containerElement.style.removeProperty("width");
|
| + }
|
| +
|
| + this.containerContentElement.style.left = width + "px";
|
| + this.viewsContainerElement.style.left = width + "px";
|
| + this.sidebarResizeElement.style.left = (width - 3) + "px";
|
| +
|
| + this._updateGraphDividersIfNeeded();
|
| +
|
| + var visibleView = this.visibleView;
|
| + if (visibleView && "resize" in visibleView)
|
| + visibleView.resize();
|
| + },
|
| +
|
| + _enableResourceTracking: function()
|
| + {
|
| + if (InspectorController.resourceTrackingEnabled())
|
| + return;
|
| + this._toggleResourceTracking(this.panelEnablerView.alwaysEnabled);
|
| + },
|
| +
|
| + _toggleResourceTracking: function(optionalAlways)
|
| + {
|
| + if (InspectorController.resourceTrackingEnabled()) {
|
| + this.largerResourcesButton.visible = false;
|
| + this.sortingSelectElement.visible = false;
|
| + InspectorController.disableResourceTracking(true);
|
| + } else {
|
| + this.largerResourcesButton.visible = true;
|
| + this.sortingSelectElement.visible = true;
|
| + InspectorController.enableResourceTracking(!!optionalAlways);
|
| + }
|
| + }
|
| +}
|
| +
|
| +WebInspector.ResourcesPanel.prototype.__proto__ = WebInspector.Panel.prototype;
|
| +
|
| +WebInspector.ResourceCalculator = function()
|
| +{
|
| +}
|
| +
|
| +WebInspector.ResourceCalculator.prototype = {
|
| + computeSummaryValues: function(resources)
|
| + {
|
| + var total = 0;
|
| + var categoryValues = {};
|
| +
|
| + var resourcesLength = resources.length;
|
| + for (var i = 0; i < resourcesLength; ++i) {
|
| + var resource = resources[i];
|
| + var value = this._value(resource);
|
| + if (typeof value === "undefined")
|
| + continue;
|
| + if (!(resource.category.name in categoryValues))
|
| + categoryValues[resource.category.name] = 0;
|
| + categoryValues[resource.category.name] += value;
|
| + total += value;
|
| + }
|
| +
|
| + return {categoryValues: categoryValues, total: total};
|
| + },
|
| +
|
| + computeBarGraphPercentages: function(resource)
|
| + {
|
| + return {start: 0, middle: 0, end: (this._value(resource) / this.boundarySpan) * 100};
|
| + },
|
| +
|
| + computeBarGraphLabels: function(resource)
|
| + {
|
| + const label = this.formatValue(this._value(resource));
|
| + var tooltip = label;
|
| + if (resource.cached)
|
| + tooltip = WebInspector.UIString("%s (from cache)", tooltip);
|
| + return {left: label, right: label, tooltip: tooltip};
|
| + },
|
| +
|
| + get boundarySpan()
|
| + {
|
| + return this.maximumBoundary - this.minimumBoundary;
|
| + },
|
| +
|
| + updateBoundaries: function(resource)
|
| + {
|
| + this.minimumBoundary = 0;
|
| +
|
| + var value = this._value(resource);
|
| + if (typeof this.maximumBoundary === "undefined" || value > this.maximumBoundary) {
|
| + this.maximumBoundary = value;
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| + },
|
| +
|
| + reset: function()
|
| + {
|
| + delete this.minimumBoundary;
|
| + delete this.maximumBoundary;
|
| + },
|
| +
|
| + _value: function(resource)
|
| + {
|
| + return 0;
|
| + },
|
| +
|
| + formatValue: function(value)
|
| + {
|
| + return value.toString();
|
| + }
|
| +}
|
| +
|
| +WebInspector.ResourceTimeCalculator = function(startAtZero)
|
| +{
|
| + WebInspector.ResourceCalculator.call(this);
|
| + this.startAtZero = startAtZero;
|
| +}
|
| +
|
| +WebInspector.ResourceTimeCalculator.prototype = {
|
| + computeSummaryValues: function(resources)
|
| + {
|
| + var resourcesByCategory = {};
|
| + var resourcesLength = resources.length;
|
| + for (var i = 0; i < resourcesLength; ++i) {
|
| + var resource = resources[i];
|
| + if (!(resource.category.name in resourcesByCategory))
|
| + resourcesByCategory[resource.category.name] = [];
|
| + resourcesByCategory[resource.category.name].push(resource);
|
| + }
|
| +
|
| + var earliestStart;
|
| + var latestEnd;
|
| + var categoryValues = {};
|
| + for (var category in resourcesByCategory) {
|
| + resourcesByCategory[category].sort(WebInspector.Resource.CompareByTime);
|
| + categoryValues[category] = 0;
|
| +
|
| + var segment = {start: -1, end: -1};
|
| +
|
| + var categoryResources = resourcesByCategory[category];
|
| + var resourcesLength = categoryResources.length;
|
| + for (var i = 0; i < resourcesLength; ++i) {
|
| + var resource = categoryResources[i];
|
| + if (resource.startTime === -1 || resource.endTime === -1)
|
| + continue;
|
| +
|
| + if (typeof earliestStart === "undefined")
|
| + earliestStart = resource.startTime;
|
| + else
|
| + earliestStart = Math.min(earliestStart, resource.startTime);
|
| +
|
| + if (typeof latestEnd === "undefined")
|
| + latestEnd = resource.endTime;
|
| + else
|
| + latestEnd = Math.max(latestEnd, resource.endTime);
|
| +
|
| + if (resource.startTime <= segment.end) {
|
| + segment.end = Math.max(segment.end, resource.endTime);
|
| + continue;
|
| + }
|
| +
|
| + categoryValues[category] += segment.end - segment.start;
|
| +
|
| + segment.start = resource.startTime;
|
| + segment.end = resource.endTime;
|
| + }
|
| +
|
| + // Add the last segment
|
| + categoryValues[category] += segment.end - segment.start;
|
| + }
|
| +
|
| + return {categoryValues: categoryValues, total: latestEnd - earliestStart};
|
| + },
|
| +
|
| + computeBarGraphPercentages: function(resource)
|
| + {
|
| + if (resource.startTime !== -1)
|
| + var start = ((resource.startTime - this.minimumBoundary) / this.boundarySpan) * 100;
|
| + else
|
| + var start = 0;
|
| +
|
| + if (resource.responseReceivedTime !== -1)
|
| + var middle = ((resource.responseReceivedTime - this.minimumBoundary) / this.boundarySpan) * 100;
|
| + else
|
| + var middle = (this.startAtZero ? start : 100);
|
| +
|
| + if (resource.endTime !== -1)
|
| + var end = ((resource.endTime - this.minimumBoundary) / this.boundarySpan) * 100;
|
| + else
|
| + var end = (this.startAtZero ? middle : 100);
|
| +
|
| + if (this.startAtZero) {
|
| + end -= start;
|
| + middle -= start;
|
| + start = 0;
|
| + }
|
| +
|
| + return {start: start, middle: middle, end: end};
|
| + },
|
| +
|
| + computeBarGraphLabels: function(resource)
|
| + {
|
| + var leftLabel = "";
|
| + if (resource.latency > 0)
|
| + leftLabel = this.formatValue(resource.latency);
|
| +
|
| + var rightLabel = "";
|
| + if (resource.responseReceivedTime !== -1 && resource.endTime !== -1)
|
| + rightLabel = this.formatValue(resource.endTime - resource.responseReceivedTime);
|
| +
|
| + if (leftLabel && rightLabel) {
|
| + var total = this.formatValue(resource.duration);
|
| + var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);
|
| + } else if (leftLabel)
|
| + var tooltip = WebInspector.UIString("%s latency", leftLabel);
|
| + else if (rightLabel)
|
| + var tooltip = WebInspector.UIString("%s download", rightLabel);
|
| +
|
| + if (resource.cached)
|
| + tooltip = WebInspector.UIString("%s (from cache)", tooltip);
|
| +
|
| + return {left: leftLabel, right: rightLabel, tooltip: tooltip};
|
| + },
|
| +
|
| + updateBoundaries: function(resource)
|
| + {
|
| + var didChange = false;
|
| +
|
| + var lowerBound;
|
| + if (this.startAtZero)
|
| + lowerBound = 0;
|
| + else
|
| + lowerBound = this._lowerBound(resource);
|
| +
|
| + if (lowerBound !== -1 && (typeof this.minimumBoundary === "undefined" || lowerBound < this.minimumBoundary)) {
|
| + this.minimumBoundary = lowerBound;
|
| + didChange = true;
|
| + }
|
| +
|
| + var upperBound = this._upperBound(resource);
|
| + if (upperBound !== -1 && (typeof this.maximumBoundary === "undefined" || upperBound > this.maximumBoundary)) {
|
| + this.maximumBoundary = upperBound;
|
| + didChange = true;
|
| + }
|
| +
|
| + return didChange;
|
| + },
|
| +
|
| + formatValue: function(value)
|
| + {
|
| + return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
|
| + },
|
| +
|
| + _lowerBound: function(resource)
|
| + {
|
| + return 0;
|
| + },
|
| +
|
| + _upperBound: function(resource)
|
| + {
|
| + return 0;
|
| + },
|
| +}
|
| +
|
| +WebInspector.ResourceTimeCalculator.prototype.__proto__ = WebInspector.ResourceCalculator.prototype;
|
| +
|
| +WebInspector.ResourceTransferTimeCalculator = function()
|
| +{
|
| + WebInspector.ResourceTimeCalculator.call(this, false);
|
| +}
|
| +
|
| +WebInspector.ResourceTransferTimeCalculator.prototype = {
|
| + formatValue: function(value)
|
| + {
|
| + return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
|
| + },
|
| +
|
| + _lowerBound: function(resource)
|
| + {
|
| + return resource.startTime;
|
| + },
|
| +
|
| + _upperBound: function(resource)
|
| + {
|
| + return resource.endTime;
|
| + }
|
| +}
|
| +
|
| +WebInspector.ResourceTransferTimeCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
|
| +
|
| +WebInspector.ResourceTransferDurationCalculator = function()
|
| +{
|
| + WebInspector.ResourceTimeCalculator.call(this, true);
|
| +}
|
| +
|
| +WebInspector.ResourceTransferDurationCalculator.prototype = {
|
| + formatValue: function(value)
|
| + {
|
| + return Number.secondsToString(value, WebInspector.UIString.bind(WebInspector));
|
| + },
|
| +
|
| + _upperBound: function(resource)
|
| + {
|
| + return resource.duration;
|
| + }
|
| +}
|
| +
|
| +WebInspector.ResourceTransferDurationCalculator.prototype.__proto__ = WebInspector.ResourceTimeCalculator.prototype;
|
| +
|
| +WebInspector.ResourceTransferSizeCalculator = function()
|
| +{
|
| + WebInspector.ResourceCalculator.call(this);
|
| +}
|
| +
|
| +WebInspector.ResourceTransferSizeCalculator.prototype = {
|
| + _value: function(resource)
|
| + {
|
| + return resource.contentLength;
|
| + },
|
| +
|
| + formatValue: function(value)
|
| + {
|
| + return Number.bytesToString(value, WebInspector.UIString.bind(WebInspector));
|
| + }
|
| +}
|
| +
|
| +WebInspector.ResourceTransferSizeCalculator.prototype.__proto__ = WebInspector.ResourceCalculator.prototype;
|
| +
|
| +WebInspector.ResourceSidebarTreeElement = function(resource)
|
| +{
|
| + this.resource = resource;
|
| +
|
| + this.createIconElement();
|
| +
|
| + WebInspector.SidebarTreeElement.call(this, "resource-sidebar-tree-item", "", "", resource);
|
| +
|
| + this.refreshTitles();
|
| +}
|
| +
|
| +WebInspector.ResourceSidebarTreeElement.prototype = {
|
| + onattach: function()
|
| + {
|
| + WebInspector.SidebarTreeElement.prototype.onattach.call(this);
|
| +
|
| + var link = document.createElement("a");
|
| + link.href = this.resource.url;
|
| + link.className = "invisible";
|
| + while (this._listItemNode.firstChild)
|
| + link.appendChild(this._listItemNode.firstChild);
|
| + this._listItemNode.appendChild(link);
|
| + this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
|
| + },
|
| +
|
| + onselect: function()
|
| + {
|
| + WebInspector.panels.resources.showResource(this.resource);
|
| + },
|
| +
|
| + ondblclick: function(treeElement, event)
|
| + {
|
| + InjectedScriptAccess.openInInspectedWindow(this.resource.url);
|
| + },
|
| +
|
| + get mainTitle()
|
| + {
|
| + return this.resource.displayName;
|
| + },
|
| +
|
| + set mainTitle(x)
|
| + {
|
| + // Do nothing.
|
| + },
|
| +
|
| + get subtitle()
|
| + {
|
| + var subtitle = this.resource.displayDomain;
|
| +
|
| + if (this.resource.path && this.resource.lastPathComponent) {
|
| + var lastPathComponentIndex = this.resource.path.lastIndexOf("/" + this.resource.lastPathComponent);
|
| + if (lastPathComponentIndex != -1)
|
| + subtitle += this.resource.path.substring(0, lastPathComponentIndex);
|
| + }
|
| +
|
| + return subtitle;
|
| + },
|
| +
|
| + set subtitle(x)
|
| + {
|
| + // Do nothing.
|
| + },
|
| +
|
| + get selectable()
|
| + {
|
| + return WebInspector.panels.resources._filterCategory == "all" || WebInspector.panels.resources._filterCategory == this.resource.category.name;
|
| + },
|
| +
|
| + createIconElement: function()
|
| + {
|
| + var previousIconElement = this.iconElement;
|
| +
|
| + if (this.resource.category === WebInspector.resourceCategories.images) {
|
| + var previewImage = document.createElement("img");
|
| + previewImage.className = "image-resource-icon-preview";
|
| + previewImage.src = this.resource.url;
|
| +
|
| + this.iconElement = document.createElement("div");
|
| + this.iconElement.className = "icon";
|
| + this.iconElement.appendChild(previewImage);
|
| + } else {
|
| + this.iconElement = document.createElement("img");
|
| + this.iconElement.className = "icon";
|
| + }
|
| +
|
| + if (previousIconElement)
|
| + previousIconElement.parentNode.replaceChild(this.iconElement, previousIconElement);
|
| + },
|
| +
|
| + refresh: function()
|
| + {
|
| + this.refreshTitles();
|
| +
|
| + if (!this._listItemNode.hasStyleClass("resources-category-" + this.resource.category.name)) {
|
| + this._listItemNode.removeMatchingStyleClasses("resources-category-\\w+");
|
| + this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
|
| +
|
| + this.createIconElement();
|
| + }
|
| + },
|
| +
|
| + resetBubble: function()
|
| + {
|
| + this.bubbleText = "";
|
| + this.bubbleElement.removeStyleClass("search-matches");
|
| + this.bubbleElement.removeStyleClass("warning");
|
| + this.bubbleElement.removeStyleClass("error");
|
| + },
|
| +
|
| + set searchMatches(matches)
|
| + {
|
| + this.resetBubble();
|
| +
|
| + if (!matches)
|
| + return;
|
| +
|
| + this.bubbleText = matches;
|
| + this.bubbleElement.addStyleClass("search-matches");
|
| + },
|
| +
|
| + updateErrorsAndWarnings: function()
|
| + {
|
| + this.resetBubble();
|
| +
|
| + if (this.resource.warnings || this.resource.errors)
|
| + this.bubbleText = (this.resource.warnings + this.resource.errors);
|
| +
|
| + if (this.resource.warnings)
|
| + this.bubbleElement.addStyleClass("warning");
|
| +
|
| + if (this.resource.errors)
|
| + this.bubbleElement.addStyleClass("error");
|
| + }
|
| +}
|
| +
|
| +WebInspector.ResourceSidebarTreeElement.CompareByAscendingStartTime = function(a, b)
|
| +{
|
| + return WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
|
| + || WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
|
| + || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
|
| +}
|
| +
|
| +WebInspector.ResourceSidebarTreeElement.CompareByAscendingResponseReceivedTime = function(a, b)
|
| +{
|
| + return WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource)
|
| + || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
|
| + || WebInspector.Resource.CompareByEndTime(a.resource, b.resource);
|
| +}
|
| +
|
| +WebInspector.ResourceSidebarTreeElement.CompareByAscendingEndTime = function(a, b)
|
| +{
|
| + return WebInspector.Resource.CompareByEndTime(a.resource, b.resource)
|
| + || WebInspector.Resource.CompareByStartTime(a.resource, b.resource)
|
| + || WebInspector.Resource.CompareByResponseReceivedTime(a.resource, b.resource);
|
| +}
|
| +
|
| +WebInspector.ResourceSidebarTreeElement.CompareByDescendingDuration = function(a, b)
|
| +{
|
| + return -1 * WebInspector.Resource.CompareByDuration(a.resource, b.resource);
|
| +}
|
| +
|
| +WebInspector.ResourceSidebarTreeElement.CompareByDescendingLatency = function(a, b)
|
| +{
|
| + return -1 * WebInspector.Resource.CompareByLatency(a.resource, b.resource);
|
| +}
|
| +
|
| +WebInspector.ResourceSidebarTreeElement.CompareByDescendingSize = function(a, b)
|
| +{
|
| + return -1 * WebInspector.Resource.CompareBySize(a.resource, b.resource);
|
| +}
|
| +
|
| +WebInspector.ResourceSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
|
| +
|
| +WebInspector.ResourceGraph = function(resource)
|
| +{
|
| + this.resource = resource;
|
| +
|
| + this._graphElement = document.createElement("div");
|
| + this._graphElement.className = "resources-graph-side";
|
| + this._graphElement.addEventListener("mouseover", this.refreshLabelPositions.bind(this), false);
|
| +
|
| + if (resource.cached)
|
| + this._graphElement.addStyleClass("resource-cached");
|
| +
|
| + this._barAreaElement = document.createElement("div");
|
| + this._barAreaElement.className = "resources-graph-bar-area hidden";
|
| + this._graphElement.appendChild(this._barAreaElement);
|
| +
|
| + this._barLeftElement = document.createElement("div");
|
| + this._barLeftElement.className = "resources-graph-bar waiting";
|
| + this._barAreaElement.appendChild(this._barLeftElement);
|
| +
|
| + this._barRightElement = document.createElement("div");
|
| + this._barRightElement.className = "resources-graph-bar";
|
| + this._barAreaElement.appendChild(this._barRightElement);
|
| +
|
| + this._labelLeftElement = document.createElement("div");
|
| + this._labelLeftElement.className = "resources-graph-label waiting";
|
| + this._barAreaElement.appendChild(this._labelLeftElement);
|
| +
|
| + this._labelRightElement = document.createElement("div");
|
| + this._labelRightElement.className = "resources-graph-label";
|
| + this._barAreaElement.appendChild(this._labelRightElement);
|
| +
|
| + this._graphElement.addStyleClass("resources-category-" + resource.category.name);
|
| +}
|
| +
|
| +WebInspector.ResourceGraph.prototype = {
|
| + get graphElement()
|
| + {
|
| + return this._graphElement;
|
| + },
|
| +
|
| + refreshLabelPositions: function()
|
| + {
|
| + this._labelLeftElement.style.removeProperty("left");
|
| + this._labelLeftElement.style.removeProperty("right");
|
| + this._labelLeftElement.removeStyleClass("before");
|
| + this._labelLeftElement.removeStyleClass("hidden");
|
| +
|
| + this._labelRightElement.style.removeProperty("left");
|
| + this._labelRightElement.style.removeProperty("right");
|
| + this._labelRightElement.removeStyleClass("after");
|
| + this._labelRightElement.removeStyleClass("hidden");
|
| +
|
| + const labelPadding = 10;
|
| + const rightBarWidth = (this._barRightElement.offsetWidth - labelPadding);
|
| + const leftBarWidth = ((this._barLeftElement.offsetWidth - this._barRightElement.offsetWidth) - labelPadding);
|
| +
|
| + var labelBefore = (this._labelLeftElement.offsetWidth > leftBarWidth);
|
| + var labelAfter = (this._labelRightElement.offsetWidth > rightBarWidth);
|
| +
|
| + if (labelBefore) {
|
| + if ((this._graphElement.offsetWidth * (this._percentages.start / 100)) < (this._labelLeftElement.offsetWidth + 10))
|
| + this._labelLeftElement.addStyleClass("hidden");
|
| + this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");
|
| + this._labelLeftElement.addStyleClass("before");
|
| + } else {
|
| + this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");
|
| + this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");
|
| + }
|
| +
|
| + if (labelAfter) {
|
| + if ((this._graphElement.offsetWidth * ((100 - this._percentages.end) / 100)) < (this._labelRightElement.offsetWidth + 10))
|
| + this._labelRightElement.addStyleClass("hidden");
|
| + this._labelRightElement.style.setProperty("left", this._percentages.end + "%");
|
| + this._labelRightElement.addStyleClass("after");
|
| + } else {
|
| + this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");
|
| + this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");
|
| + }
|
| + },
|
| +
|
| + refresh: function(calculator)
|
| + {
|
| + var percentages = calculator.computeBarGraphPercentages(this.resource);
|
| + var labels = calculator.computeBarGraphLabels(this.resource);
|
| +
|
| + this._percentages = percentages;
|
| +
|
| + this._barAreaElement.removeStyleClass("hidden");
|
| +
|
| + if (!this._graphElement.hasStyleClass("resources-category-" + this.resource.category.name)) {
|
| + this._graphElement.removeMatchingStyleClasses("resources-category-\\w+");
|
| + this._graphElement.addStyleClass("resources-category-" + this.resource.category.name);
|
| + }
|
| +
|
| + this._barLeftElement.style.setProperty("left", percentages.start + "%");
|
| + this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");
|
| +
|
| + this._barRightElement.style.setProperty("left", percentages.middle + "%");
|
| + this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");
|
| +
|
| + this._labelLeftElement.textContent = labels.left;
|
| + this._labelRightElement.textContent = labels.right;
|
| +
|
| + var tooltip = (labels.tooltip || "");
|
| + this._barLeftElement.title = tooltip;
|
| + this._labelLeftElement.title = tooltip;
|
| + this._labelRightElement.title = tooltip;
|
| + this._barRightElement.title = tooltip;
|
| + }
|
| +}
|
|
|