| Index: chrome/resources/Inspector/ResourcesPanel.js
 | 
| ===================================================================
 | 
| --- chrome/resources/Inspector/ResourcesPanel.js	(revision 29943)
 | 
| +++ chrome/resources/Inspector/ResourcesPanel.js	(working copy)
 | 
| @@ -1,1649 +0,0 @@
 | 
| -/*
 | 
| - * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
 | 
| - * Copyright (C) 2008 Anthony Ricaud (rik24d@gmail.com)
 | 
| - *
 | 
| - * 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.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.summaryElement = document.createElement("div");
 | 
| -    this.summaryElement.id = "resources-summary";
 | 
| -    this.containerContentElement.appendChild(this.summaryElement);
 | 
| -
 | 
| -    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.summaryGraphElement = document.createElement("canvas");
 | 
| -    this.summaryGraphElement.setAttribute("width", "450");
 | 
| -    this.summaryGraphElement.setAttribute("height", "38");
 | 
| -    this.summaryGraphElement.id = "resources-summary-graph";
 | 
| -    this.summaryElement.appendChild(this.summaryGraphElement);
 | 
| -
 | 
| -    this.legendElement = document.createElement("div");
 | 
| -    this.legendElement.id = "resources-graph-legend";
 | 
| -    this.summaryElement.appendChild(this.legendElement);
 | 
| -
 | 
| -    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();
 | 
| -
 | 
| -    this.largerResourcesButton = document.createElement("button");
 | 
| -    this.largerResourcesButton.id = "resources-larger-resources-status-bar-item";
 | 
| -    this.largerResourcesButton.className = "status-bar-item toggled-on";
 | 
| -    this.largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
 | 
| -    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);
 | 
| -
 | 
| -    this.reset();
 | 
| -
 | 
| -    timeGraphItem.select();
 | 
| -}
 | 
| -
 | 
| -WebInspector.ResourcesPanel.prototype = {
 | 
| -    toolbarItemClass: "resources",
 | 
| -
 | 
| -    get toolbarItemLabel()
 | 
| -    {
 | 
| -        return WebInspector.UIString("Resources");
 | 
| -    },
 | 
| -
 | 
| -    get statusBarItems()
 | 
| -    {
 | 
| -        return [this.largerResourcesButton, 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();
 | 
| -    },
 | 
| -
 | 
| -    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.legendElement.removeChildren();
 | 
| -
 | 
| -        this._updateGraphDividersIfNeeded(true);
 | 
| -
 | 
| -        this._drawSummaryGraph(); // draws an empty graph
 | 
| -    },
 | 
| -
 | 
| -    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);
 | 
| -    },
 | 
| -
 | 
| -    _makeLegendElement: function(label, value, color)
 | 
| -    {
 | 
| -        var legendElement = document.createElement("label");
 | 
| -        legendElement.className = "resources-graph-legend-item";
 | 
| -
 | 
| -        if (color) {
 | 
| -            var swatch = document.createElement("canvas");
 | 
| -            swatch.className = "resources-graph-legend-swatch";
 | 
| -            swatch.setAttribute("width", "13");
 | 
| -            swatch.setAttribute("height", "24");
 | 
| -
 | 
| -            legendElement.appendChild(swatch);
 | 
| -
 | 
| -            this._drawSwatch(swatch, color);
 | 
| -        }
 | 
| -
 | 
| -        var labelElement = document.createElement("div");
 | 
| -        labelElement.className = "resources-graph-legend-label";
 | 
| -        legendElement.appendChild(labelElement);
 | 
| -
 | 
| -        var headerElement = document.createElement("div");
 | 
| -        var headerElement = document.createElement("div");
 | 
| -        headerElement.className = "resources-graph-legend-header";
 | 
| -        headerElement.textContent = label;
 | 
| -        labelElement.appendChild(headerElement);
 | 
| -
 | 
| -        var valueElement = document.createElement("div");
 | 
| -        valueElement.className = "resources-graph-legend-value";
 | 
| -        valueElement.textContent = value;
 | 
| -        labelElement.appendChild(valueElement);
 | 
| -
 | 
| -        return legendElement;
 | 
| -    },
 | 
| -
 | 
| -    _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);
 | 
| -        }
 | 
| -    },
 | 
| -
 | 
| -    _fadeOutRect: function(ctx, x, y, w, h, a1, a2)
 | 
| -    {
 | 
| -        ctx.save();
 | 
| -
 | 
| -        var gradient = ctx.createLinearGradient(x, y, x, y + h);
 | 
| -        gradient.addColorStop(0.0, "rgba(0, 0, 0, " + (1.0 - a1) + ")");
 | 
| -        gradient.addColorStop(0.8, "rgba(0, 0, 0, " + (1.0 - a2) + ")");
 | 
| -        gradient.addColorStop(1.0, "rgba(0, 0, 0, 1.0)");
 | 
| -
 | 
| -        ctx.globalCompositeOperation = "destination-out";
 | 
| -
 | 
| -        ctx.fillStyle = gradient;
 | 
| -        ctx.fillRect(x, y, w, h);
 | 
| -
 | 
| -        ctx.restore();
 | 
| -    },
 | 
| -
 | 
| -    _drawSwatch: function(canvas, color)
 | 
| -    {
 | 
| -        var ctx = canvas.getContext("2d");
 | 
| -
 | 
| -        function drawSwatchSquare() {
 | 
| -            ctx.fillStyle = color;
 | 
| -            ctx.fillRect(0, 0, 13, 13);
 | 
| -
 | 
| -            var gradient = ctx.createLinearGradient(0, 0, 13, 13);
 | 
| -            gradient.addColorStop(0.0, "rgba(255, 255, 255, 0.2)");
 | 
| -            gradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
 | 
| -
 | 
| -            ctx.fillStyle = gradient;
 | 
| -            ctx.fillRect(0, 0, 13, 13);
 | 
| -
 | 
| -            gradient = ctx.createLinearGradient(13, 13, 0, 0);
 | 
| -            gradient.addColorStop(0.0, "rgba(0, 0, 0, 0.2)");
 | 
| -            gradient.addColorStop(1.0, "rgba(0, 0, 0, 0.0)");
 | 
| -
 | 
| -            ctx.fillStyle = gradient;
 | 
| -            ctx.fillRect(0, 0, 13, 13);
 | 
| -
 | 
| -            ctx.strokeStyle = "rgba(0, 0, 0, 0.6)";
 | 
| -            ctx.strokeRect(0.5, 0.5, 12, 12);
 | 
| -        }
 | 
| -
 | 
| -        ctx.clearRect(0, 0, 13, 24);
 | 
| -
 | 
| -        drawSwatchSquare();
 | 
| -
 | 
| -        ctx.save();
 | 
| -
 | 
| -        ctx.translate(0, 25);
 | 
| -        ctx.scale(1, -1);
 | 
| -
 | 
| -        drawSwatchSquare();
 | 
| -
 | 
| -        ctx.restore();
 | 
| -
 | 
| -        this._fadeOutRect(ctx, 0, 13, 13, 13, 0.5, 0.0);
 | 
| -    },
 | 
| -
 | 
| -    _drawSummaryGraph: function(segments)
 | 
| -    {
 | 
| -        if (!this.summaryGraphElement)
 | 
| -            return;
 | 
| -
 | 
| -        if (!segments || !segments.length) {
 | 
| -            segments = [{color: "white", value: 1}];
 | 
| -            this._showingEmptySummaryGraph = true;
 | 
| -        } else
 | 
| -            delete this._showingEmptySummaryGraph;
 | 
| -
 | 
| -        // Calculate the total of all segments.
 | 
| -        var total = 0;
 | 
| -        for (var i = 0; i < segments.length; ++i)
 | 
| -            total += segments[i].value;
 | 
| -
 | 
| -        // Calculate the percentage of each segment, rounded to the nearest percent.
 | 
| -        var percents = segments.map(function(s) { return Math.max(Math.round(100 * s.value / total), 1) });
 | 
| -
 | 
| -        // Calculate the total percentage.
 | 
| -        var percentTotal = 0;
 | 
| -        for (var i = 0; i < percents.length; ++i)
 | 
| -            percentTotal += percents[i];
 | 
| -
 | 
| -        // Make sure our percentage total is not greater-than 100, it can be greater
 | 
| -        // if we rounded up for a few segments.
 | 
| -        while (percentTotal > 100) {
 | 
| -            for (var i = 0; i < percents.length && percentTotal > 100; ++i) {
 | 
| -                if (percents[i] > 1) {
 | 
| -                    --percents[i];
 | 
| -                    --percentTotal;
 | 
| -                }
 | 
| -            }
 | 
| -        }
 | 
| -
 | 
| -        // Make sure our percentage total is not less-than 100, it can be less
 | 
| -        // if we rounded down for a few segments.
 | 
| -        while (percentTotal < 100) {
 | 
| -            for (var i = 0; i < percents.length && percentTotal < 100; ++i) {
 | 
| -                ++percents[i];
 | 
| -                ++percentTotal;
 | 
| -            }
 | 
| -        }
 | 
| -
 | 
| -        var ctx = this.summaryGraphElement.getContext("2d");
 | 
| -
 | 
| -        var x = 0;
 | 
| -        var y = 0;
 | 
| -        var w = 450;
 | 
| -        var h = 19;
 | 
| -        var r = (h / 2);
 | 
| -
 | 
| -        function drawPillShadow()
 | 
| -        {
 | 
| -            // This draws a line with a shadow that is offset away from the line. The line is stroked
 | 
| -            // twice with different X shadow offsets to give more feathered edges. Later we erase the
 | 
| -            // line with destination-out 100% transparent black, leaving only the shadow. This only
 | 
| -            // works if nothing has been drawn into the canvas yet.
 | 
| -
 | 
| -            ctx.beginPath();
 | 
| -            ctx.moveTo(x + 4, y + h - 3 - 0.5);
 | 
| -            ctx.lineTo(x + w - 4, y + h - 3 - 0.5);
 | 
| -            ctx.closePath();
 | 
| -
 | 
| -            ctx.save();
 | 
| -
 | 
| -            ctx.shadowBlur = 2;
 | 
| -            ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
 | 
| -            ctx.shadowOffsetX = 3;
 | 
| -            ctx.shadowOffsetY = 5;
 | 
| -
 | 
| -            ctx.strokeStyle = "white";
 | 
| -            ctx.lineWidth = 1;
 | 
| -
 | 
| -            ctx.stroke();
 | 
| -
 | 
| -            ctx.shadowOffsetX = -3;
 | 
| -
 | 
| -            ctx.stroke();
 | 
| -
 | 
| -            ctx.restore();
 | 
| -
 | 
| -            ctx.save();
 | 
| -
 | 
| -            ctx.globalCompositeOperation = "destination-out";
 | 
| -            ctx.strokeStyle = "rgba(0, 0, 0, 1)";
 | 
| -            ctx.lineWidth = 1;
 | 
| -
 | 
| -            ctx.stroke();
 | 
| -
 | 
| -            ctx.restore();
 | 
| -        }
 | 
| -
 | 
| -        function drawPill()
 | 
| -        {
 | 
| -            // Make a rounded rect path.
 | 
| -            ctx.beginPath();
 | 
| -            ctx.moveTo(x, y + r);
 | 
| -            ctx.lineTo(x, y + h - r);
 | 
| -            ctx.quadraticCurveTo(x, y + h, x + r, y + h);
 | 
| -            ctx.lineTo(x + w - r, y + h);
 | 
| -            ctx.quadraticCurveTo(x + w, y + h, x + w, y + h - r);
 | 
| -            ctx.lineTo(x + w, y + r);
 | 
| -            ctx.quadraticCurveTo(x + w, y, x + w - r, y);
 | 
| -            ctx.lineTo(x + r, y);
 | 
| -            ctx.quadraticCurveTo(x, y, x, y + r);
 | 
| -            ctx.closePath();
 | 
| -
 | 
| -            // Clip to the rounded rect path.
 | 
| -            ctx.save();
 | 
| -            ctx.clip();
 | 
| -
 | 
| -            // Fill the segments with the associated color.
 | 
| -            var previousSegmentsWidth = 0;
 | 
| -            for (var i = 0; i < segments.length; ++i) {
 | 
| -                var segmentWidth = Math.round(w * percents[i] / 100);
 | 
| -                ctx.fillStyle = segments[i].color;
 | 
| -                ctx.fillRect(x + previousSegmentsWidth, y, segmentWidth, h);
 | 
| -                previousSegmentsWidth += segmentWidth;
 | 
| -            }
 | 
| -
 | 
| -            // Draw the segment divider lines.
 | 
| -            ctx.lineWidth = 1;
 | 
| -            for (var i = 1; i < 20; ++i) {
 | 
| -                ctx.beginPath();
 | 
| -                ctx.moveTo(x + (i * Math.round(w / 20)) + 0.5, y);
 | 
| -                ctx.lineTo(x + (i * Math.round(w / 20)) + 0.5, y + h);
 | 
| -                ctx.closePath();
 | 
| -
 | 
| -                ctx.strokeStyle = "rgba(0, 0, 0, 0.2)";
 | 
| -                ctx.stroke();
 | 
| -
 | 
| -                ctx.beginPath();
 | 
| -                ctx.moveTo(x + (i * Math.round(w / 20)) + 1.5, y);
 | 
| -                ctx.lineTo(x + (i * Math.round(w / 20)) + 1.5, y + h);
 | 
| -                ctx.closePath();
 | 
| -
 | 
| -                ctx.strokeStyle = "rgba(255, 255, 255, 0.2)";
 | 
| -                ctx.stroke();
 | 
| -            }
 | 
| -
 | 
| -            // Draw the pill shading.
 | 
| -            var lightGradient = ctx.createLinearGradient(x, y, x, y + (h / 1.5));
 | 
| -            lightGradient.addColorStop(0.0, "rgba(220, 220, 220, 0.6)");
 | 
| -            lightGradient.addColorStop(0.4, "rgba(220, 220, 220, 0.2)");
 | 
| -            lightGradient.addColorStop(1.0, "rgba(255, 255, 255, 0.0)");
 | 
| -
 | 
| -            var darkGradient = ctx.createLinearGradient(x, y + (h / 3), x, y + h);
 | 
| -            darkGradient.addColorStop(0.0, "rgba(0, 0, 0, 0.0)");
 | 
| -            darkGradient.addColorStop(0.8, "rgba(0, 0, 0, 0.2)");
 | 
| -            darkGradient.addColorStop(1.0, "rgba(0, 0, 0, 0.5)");
 | 
| -
 | 
| -            ctx.fillStyle = darkGradient;
 | 
| -            ctx.fillRect(x, y, w, h);
 | 
| -
 | 
| -            ctx.fillStyle = lightGradient;
 | 
| -            ctx.fillRect(x, y, w, h);
 | 
| -
 | 
| -            ctx.restore();
 | 
| -        }
 | 
| -
 | 
| -        ctx.clearRect(x, y, w, (h * 2));
 | 
| -
 | 
| -        drawPillShadow();
 | 
| -        drawPill();
 | 
| -
 | 
| -        ctx.save();
 | 
| -
 | 
| -        ctx.translate(0, (h * 2) + 1);
 | 
| -        ctx.scale(1, -1);
 | 
| -
 | 
| -        drawPill();
 | 
| -
 | 
| -        ctx.restore();
 | 
| -
 | 
| -        this._fadeOutRect(ctx, x, y + h + 1, w, h, 0.5, 0.0);
 | 
| -    },
 | 
| -
 | 
| -    _updateSummaryGraph: function()
 | 
| -    {
 | 
| -        var graphInfo = this.calculator.computeSummaryValues(this._resources);
 | 
| -
 | 
| -        var categoryOrder = ["documents", "stylesheets", "images", "scripts", "xhr", "fonts", "other"];
 | 
| -        var categoryColors = {documents: {r: 47, g: 102, b: 236}, stylesheets: {r: 157, g: 231, b: 119}, images: {r: 164, g: 60, b: 255}, scripts: {r: 255, g: 121, b: 0}, xhr: {r: 231, g: 231, b: 10}, fonts: {r: 255, g: 82, b: 62}, other: {r: 186, g: 186, b: 186}};
 | 
| -        var fillSegments = [];
 | 
| -
 | 
| -        this.legendElement.removeChildren();
 | 
| -
 | 
| -        for (var i = 0; i < categoryOrder.length; ++i) {
 | 
| -            var category = categoryOrder[i];
 | 
| -            var size = graphInfo.categoryValues[category];
 | 
| -            if (!size)
 | 
| -                continue;
 | 
| -
 | 
| -            var color = categoryColors[category];
 | 
| -            var colorString = "rgb(" + color.r + ", " + color.g + ", " + color.b + ")";
 | 
| -
 | 
| -            var fillSegment = {color: colorString, value: size};
 | 
| -            fillSegments.push(fillSegment);
 | 
| -
 | 
| -            var legendLabel = this._makeLegendElement(WebInspector.resourceCategories[category].title, this.calculator.formatValue(size), colorString);
 | 
| -            this.legendElement.appendChild(legendLabel);
 | 
| -        }
 | 
| -
 | 
| -        if (graphInfo.total) {
 | 
| -            var totalLegendLabel = this._makeLegendElement(WebInspector.UIString("Total"), this.calculator.formatValue(graphInfo.total));
 | 
| -            totalLegendLabel.addStyleClass("total");
 | 
| -            this.legendElement.appendChild(totalLegendLabel);
 | 
| -        }
 | 
| -
 | 
| -        this._drawSummaryGraph(fillSegments);
 | 
| -    },
 | 
| -
 | 
| -    _updateDividersLabelBarPosition: function()
 | 
| -    {
 | 
| -        var scrollTop = this.containerElement.scrollTop;
 | 
| -        var dividersTop = (scrollTop < this.summaryElement.offsetHeight ? this.summaryElement.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.removeStyleClass("toggled-on");
 | 
| -            this._adjustScrollPosition();
 | 
| -        } else {
 | 
| -            this.resourcesGraphsElement.removeStyleClass("small");
 | 
| -            this.largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
 | 
| -            this.largerResourcesButton.addStyleClass("toggled-on");
 | 
| -        }
 | 
| -    },
 | 
| -
 | 
| -    _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 = 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();
 | 
| -    }
 | 
| -}
 | 
| -
 | 
| -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);
 | 
| -
 | 
| -        this._listItemNode.addStyleClass("resources-category-" + this.resource.category.name);
 | 
| -    },
 | 
| -
 | 
| -    onselect: function()
 | 
| -    {
 | 
| -        WebInspector.panels.resources.showResource(this.resource);
 | 
| -    },
 | 
| -
 | 
| -    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.
 | 
| -    },
 | 
| -
 | 
| -    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;
 | 
| -    }
 | 
| -}
 | 
| 
 |