NetworkPanel.js revision 2fc2651226baac27029e38c9d6ef883fa32084db
1bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen/*
2bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
3bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org>
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2011 Google Inc. All rights reserved.
5bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *
6bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * Redistribution and use in source and binary forms, with or without
7bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * modification, are permitted provided that the following conditions
8bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * are met:
9bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *
10bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 1.  Redistributions of source code must retain the above copyright
11f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *     notice, this list of conditions and the following disclaimer.
12bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 2.  Redistributions in binary form must reproduce the above copyright
13bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *     notice, this list of conditions and the following disclaimer in the
14f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *     documentation and/or other materials provided with the distribution.
15bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
16bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *     its contributors may be used to endorse or promote products derived
17f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *     from this software without specific prior written permission.
18bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen *
19bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen */
30bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
31bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkPanel = function()
32bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
33bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebInspector.Panel.call(this, "network");
34bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
35a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this.createSidebar();
36a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this.sidebarElement.className = "network-sidebar";
37a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
38bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._resources = [];
39e14391e94c850b8bd03680c23b38978db68687a8John Reck    this._resourcesById = {};
4028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._resourcesByURL = {};
41bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._staleResources = [];
42bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._resourceGridNodes = {};
43bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._mainResourceLoadTime = -1;
44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._mainResourceDOMContentTime = -1;
45a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._hiddenCategories = {};
46a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
47a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._categories = WebInspector.resourceCategories;
48a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
49a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this.containerElement = document.createElement("div");
50a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this.containerElement.id = "network-container";
51a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this.sidebarElement.appendChild(this.containerElement);
52bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._viewsContainerElement = document.createElement("div");
54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._viewsContainerElement.id = "network-views";
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._viewsContainerElement.className = "hidden";
56bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this.element.appendChild(this._viewsContainerElement);
57bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._closeButtonElement = document.createElement("button");
5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._closeButtonElement.id = "network-close-button";
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._closeButtonElement.addEventListener("click", this._toggleGridMode.bind(this), false);
6128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._viewsContainerElement.appendChild(this._closeButtonElement);
62e14391e94c850b8bd03680c23b38978db68687a8John Reck
63bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._createSortingFunctions();
64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._createTable();
65a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._createTimelineGrid();
66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._createStatusbarButtons();
67a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._createFilterStatusBarItems();
68a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._createSummaryBar();
69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
7028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!WebInspector.settings.resourcesLargeRows)
7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._setLargerResources(WebInspector.settings.resourcesLargeRows);
7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._popoverHelper = new WebInspector.PopoverHelper(this.element, this._getPopoverAnchor.bind(this), this._showPopover.bind(this), true);
744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    // Enable faster hint.
754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    this._popoverHelper.setTimeout(100);
76bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this.calculator = new WebInspector.NetworkTransferTimeCalculator();
78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._filter(this._filterAllElement, false);
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._toggleGridMode();
81ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
82ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceStarted, this._onResourceStarted, this);
83ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceUpdated, this._onResourceUpdated, this);
84ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceFinished, this._onResourceUpdated, this);
85ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.MainResourceCommitLoad, this._onMainResourceCommitLoad, this);
86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
88bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkPanel.prototype = {
89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get toolbarItemLabel()
90bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return WebInspector.UIString("Network");
92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get statusBarItems()
95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
9628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return [this._largerResourcesButton.element, this._preserveLogToggle.element, this._clearButton.element, this._filterBarElement];
97bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    isCategoryVisible: function(categoryName)
100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return true;
102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    elementsToRestoreScrollPositionsFor: function()
105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return [this.containerElement, this._dataGrid.scrollContainer];
107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    resize: function()
110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
111bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        WebInspector.Panel.prototype.resize.call(this);
112bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.updateWidths();
113a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._positionSummaryBar();
114a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
115a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
11628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    updateSidebarWidth: function(width)
117a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
118a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!this._viewingResourceMode)
119a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
12028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        WebInspector.Panel.prototype.updateSidebarWidth.call(this, width);
121a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
123a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    updateMainViewWidth: function(width)
124a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
125a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._viewsContainerElement.style.left = width + "px";
126a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
127a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
128a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    handleShortcut: function(event)
129a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
130a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this._viewingResourceMode && event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code) {
131a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._toggleGridMode();
132a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            event.handled = true;
133a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
134a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
135a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
136a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _positionSummaryBar: function()
137a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
138a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // Position the total bar.
139a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
14028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        var fillerRow = this._dataGrid.dataTableBody.lastChild;
14128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (this._summaryBarElement.parentElement !== this.element && fillerRow.offsetHeight > 0) {
142a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // Glue status to bottom.
143a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (this._summaryBarRowNode) {
144a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._dataGrid.removeChild(this._summaryBarRowNode);
145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                delete this._summaryBarRowNode;
146a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
147a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.addStyleClass("network-summary-bar-bottom");
148a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this.element.appendChild(this._summaryBarElement);
149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.style.bottom = "20px";
150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
151a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
152a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
15328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (!this._summaryBarRowNode && !fillerRow.offsetHeight) {
154a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // Glue status to table.
155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarRowNode = new WebInspector.NetworkTotalGridNode(this._summaryBarElement);
156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.removeStyleClass("network-summary-bar-bottom");
157a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.appendChild(this._summaryBarRowNode);
158a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.style.bottom = 0;
159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._sortItems();
160a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._updateOffscreenRows();
162a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
163a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
164a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _resetSummaryBar: function()
165a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
166a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this._summaryBarRowNode;
167a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._summaryBarElement.parentElement.removeChild(this._summaryBarElement);
168a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._updateSummaryBar();
169bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
170bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createTimelineGrid: function()
172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineGrid = new WebInspector.TimelineGrid();
174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineGrid.element.addStyleClass("network-timeline-grid");
175a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.appendChild(this._timelineGrid.element);
176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createTable: function()
179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
180a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var columns = {name: {}, method: {}, status: {}, type: {}, size: {}, time: {}, timeline: {}};
181a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.name.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Name"), WebInspector.UIString("Path"));
182a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.name.sortable = true;
183a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.name.width = "20%";
184a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.name.disclosure = true;
185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.method.title = WebInspector.UIString("Method");
187bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.method.sortable = true;
188bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.method.width = "7%";
189bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
190a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.status.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Status"), WebInspector.UIString("Text"));
191bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.status.sortable = true;
192bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.status.width = "8%";
193bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
194bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.type.title = WebInspector.UIString("Type");
195bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.type.sortable = true;
196e14391e94c850b8bd03680c23b38978db68687a8John Reck        columns.type.width = "10%";
197bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
198a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.size.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Size"), WebInspector.UIString("Transfer"));
199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.size.sortable = true;
200bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.size.width = "10%";
201bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.size.aligned = "right";
202bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
20328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        columns.time.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Time"), WebInspector.UIString("Latency"));
204bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.time.sortable = true;
205bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.time.width = "10%";
206bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.time.aligned = "right";
207bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
208bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.timeline.title = "";
209a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.timeline.sortable = false;
210e14391e94c850b8bd03680c23b38978db68687a8John Reck        columns.timeline.width = "37%";
211a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.timeline.sort = "ascending";
212bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
213bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid = new WebInspector.DataGrid(columns);
214f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        this._dataGrid.element.addEventListener("contextmenu", this._contextMenu.bind(this), true);
215a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.containerElement.appendChild(this._dataGrid.element);
216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.addEventListener("sorting changed", this._sortItems, this);
217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.addEventListener("width changed", this._updateDividersIfNeeded, this);
2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._dataGrid.scrollContainer.addEventListener("scroll", this._updateOffscreenRows.bind(this));
219a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
220a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._patchTimelineHeader();
221a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
222a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
223a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _makeHeaderFragment: function(title, subtitle)
224a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
225a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var fragment = document.createDocumentFragment();
226a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        fragment.appendChild(document.createTextNode(title));
227a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var subtitleDiv = document.createElement("div");
228a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        subtitleDiv.className = "network-header-subtitle";
229a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        subtitleDiv.textContent = subtitle;
230a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        fragment.appendChild(subtitleDiv);
231a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return fragment;
232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
234a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _patchTimelineHeader: function()
235a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
236a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var timelineSorting = document.createElement("select");
237a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
238a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var option = document.createElement("option");
239a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "startTime";
240a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Timeline");
241a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
242a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
243a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
244a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "startTime";
245a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Start Time");
246a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
247a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
248a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
249a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "responseTime";
250a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Response Time");
251a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
252a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
253a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
254a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "endTime";
255a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("End Time");
256a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
257a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
258a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
259a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "duration";
260a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Duration");
261a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
262a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
263a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
264a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "latency";
265a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Latency");
266a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
267a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
268a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var header = this._dataGrid.headerTableHeader("timeline");
269e14391e94c850b8bd03680c23b38978db68687a8John Reck        header.replaceChild(timelineSorting, header.firstChild);
270a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
271a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.addEventListener("click", function(event) { event.stopPropagation() }, false);
272a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.addEventListener("change", this._sortByTimeline.bind(this), false);
273a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._timelineSortSelector = timelineSorting;
274bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
275bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
276bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createSortingFunctions: function()
277bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
278bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._sortingFunctions = {};
279a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.name = WebInspector.NetworkDataGridNode.NameComparator;
280a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.method = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "method", false);
281a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.status = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "statusCode", false);
282a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.type = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "mimeType", false);
283a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.size = WebInspector.NetworkDataGridNode.SizeComparator;
284a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.time = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "duration", false);
285a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.timeline = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "startTime", false);
286a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.startTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "startTime", false);
287a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.endTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "endTime", false);
288a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.responseTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "responseReceivedTime", false);
289a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.duration = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "duration", true);
290a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.latency = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "latency", true);
291a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
292a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var timeCalculator = new WebInspector.NetworkTransferTimeCalculator();
293a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var durationCalculator = new WebInspector.NetworkTransferDurationCalculator();
294a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
295a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators = {};
296a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.timeline = timeCalculator;
297a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.startTime = timeCalculator;
298a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.endTime = timeCalculator;
299a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.responseTime = timeCalculator;
300a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.duration = durationCalculator;
301a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.latency = durationCalculator;
302bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
303bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
304a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _sortItems: function()
305bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
306a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var columnIdentifier = this._dataGrid.sortColumnIdentifier;
307a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (columnIdentifier === "timeline") {
308a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._sortByTimeline();
309a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
310a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
311a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var sortingFunction = this._sortingFunctions[columnIdentifier];
312a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!sortingFunction)
313a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
314a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
315a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.sortNodes(sortingFunction, this._dataGrid.sortOrder === "descending");
316a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._timelineSortSelector.selectedIndex = 0;
3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._updateOffscreenRows();
318a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
319a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
320a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _sortByTimeline: function()
321a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
322a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var selectedIndex = this._timelineSortSelector.selectedIndex;
323a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!selectedIndex)
324a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            selectedIndex = 1; // Sort by start time by default.
325a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var selectedOption = this._timelineSortSelector[selectedIndex];
326a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var value = selectedOption.value;
327a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
328a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var sortingFunction = this._sortingFunctions[value];
329a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.sortNodes(sortingFunction);
330a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.calculator = this._calculators[value];
331a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this.calculator.startAtZero)
332a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._timelineGrid.hideEventDividers();
333a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        else
334a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._timelineGrid.showEventDividers();
335a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.markColumnAsSortedBy("timeline", "ascending");
3362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._updateOffscreenRows();
337a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
338a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
339a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _createFilterStatusBarItems: function()
340a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
341a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var filterBarElement = document.createElement("div");
342a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        filterBarElement.className = "scope-bar status-bar-item";
343a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        filterBarElement.id = "network-filter";
344a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
345a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        function createFilterElement(category, label)
346a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        {
347a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var categoryElement = document.createElement("li");
348a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            categoryElement.category = category;
349a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            categoryElement.className = category;
350a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            categoryElement.appendChild(document.createTextNode(label));
351a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            categoryElement.addEventListener("click", this._updateFilter.bind(this), false);
352a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            filterBarElement.appendChild(categoryElement);
353a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
354a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return categoryElement;
355a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
356a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
357a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._filterAllElement = createFilterElement.call(this, "all", WebInspector.UIString("All"));
358a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
359a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // Add a divider
360a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var dividerElement = document.createElement("div");
361a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        dividerElement.addStyleClass("scope-bar-divider");
362a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        filterBarElement.appendChild(dividerElement);
363a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
364a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (var category in this._categories)
365a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            createFilterElement.call(this, category, this._categories[category].title);
366a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._filterBarElement = filterBarElement;
367a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
368a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
369a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _createSummaryBar: function()
370a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
371a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._summaryBarElement = document.createElement("div");
372a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._summaryBarElement.className = "network-summary-bar";
373a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.containerElement.appendChild(this._summaryBarElement);
374a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
375a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
376a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _updateSummaryBar: function()
377a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
378a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._positionSummaryBar(); // Grid is growing.
379a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var numRequests = this._resources.length;
380a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
381a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!numRequests) {
382a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (this._summaryBarElement._isDisplayingWarning)
383a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                return;
384a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement._isDisplayingWarning = true;
385a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
386a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var img = document.createElement("img");
387a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            img.src = "Images/warningIcon.png";
388a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.removeChildren();
389a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.appendChild(img);
390a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.appendChild(document.createTextNode(" "));
391a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.appendChild(document.createTextNode(
392a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                WebInspector.UIString("No requests captured. Reload the page to see detailed information on the network activity.")));
393a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
394a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
395a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this._summaryBarElement._isDisplayingWarning;
396a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
397a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var transferSize = 0;
398a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var baseTime = -1;
399a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var maxTime = -1;
400a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (var i = 0; i < this._resources.length; ++i) {
401a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var resource = this._resources[i];
4026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            transferSize += (resource.cached || !resource.transferSize) ? 0 : resource.transferSize;
403a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (resource.isMainResource)
404a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                baseTime = resource.startTime;
405f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (resource.endTime > maxTime)
406a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                maxTime = resource.endTime;
407a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
408a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var text = String.sprintf(WebInspector.UIString("%d requests"), numRequests);
409a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        text += "  \u2758  " + String.sprintf(WebInspector.UIString("%s transferred"), Number.bytesToString(transferSize));
410a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (baseTime !== -1 && this._mainResourceLoadTime !== -1 && this._mainResourceDOMContentTime !== -1 && this._mainResourceDOMContentTime > baseTime) {
411a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text += "  \u2758  " + String.sprintf(WebInspector.UIString("%s (onload: %s, DOMContentLoaded: %s)"),
412a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        Number.secondsToString(maxTime - baseTime),
413a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        Number.secondsToString(this._mainResourceLoadTime - baseTime),
414a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        Number.secondsToString(this._mainResourceDOMContentTime - baseTime));
415a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
416a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._summaryBarElement.textContent = text;
417a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
418a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
419a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _showCategory: function(category)
420a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
421a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.addStyleClass("filter-" + category);
422a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this._hiddenCategories[category];
423a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
424a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
425a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _hideCategory: function(category)
426a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
427a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.removeStyleClass("filter-" + category);
428a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._hiddenCategories[category] = true;
429bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
430bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
431bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _updateFilter: function(e)
432bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
433bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var isMac = WebInspector.isMac();
434bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var selectMultiple = false;
435bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
436bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            selectMultiple = true;
437bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
438bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            selectMultiple = true;
439bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
440a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._filter(e.target, selectMultiple);
44128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._positionSummaryBar();
442bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
443bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
444a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _filter: function(target, selectMultiple)
445a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
446a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        function unselectAll()
447a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        {
448a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            for (var i = 0; i < this._filterBarElement.childNodes.length; ++i) {
449a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                var child = this._filterBarElement.childNodes[i];
450a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                if (!child.category)
451a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                    continue;
452a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
453a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                child.removeStyleClass("selected");
454a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._hideCategory(child.category);
455a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
456a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
457a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
458a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (target.category === this._filterAllElement) {
459a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (target.hasStyleClass("selected")) {
460a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                // We can't unselect All, so we break early here
461a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                return;
462a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
463a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
464a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // If All wasn't selected, and now is, unselect everything else.
465a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            unselectAll.call(this);
466a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        } else {
467a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // Something other than All is being selected, so we want to unselect All.
468a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (this._filterAllElement.hasStyleClass("selected")) {
469a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._filterAllElement.removeStyleClass("selected");
470a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._hideCategory("all");
471a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
472a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
473a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
474a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!selectMultiple) {
475a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // If multiple selection is off, we want to unselect everything else
476a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // and just select ourselves.
477a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            unselectAll.call(this);
478a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
479a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            target.addStyleClass("selected");
480a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._showCategory(target.category);
481a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
482a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
483a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
484a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (target.hasStyleClass("selected")) {
485a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // If selectMultiple is turned on, and we were selected, we just
486a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // want to unselect ourselves.
487a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            target.removeStyleClass("selected");
488a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._hideCategory(target.category);
489a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        } else {
490a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // If selectMultiple is turned on, and we weren't selected, we just
491a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // want to select ourselves.
492a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            target.addStyleClass("selected");
493a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._showCategory(target.category);
494a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
4952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._updateOffscreenRows();
496a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
497a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
498bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _scheduleRefresh: function()
499bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
500bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._needsRefresh)
501bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
502bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
503bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._needsRefresh = true;
504bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
505bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this.visible && !("_refreshTimeout" in this))
506bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._refreshTimeout = setTimeout(this.refresh.bind(this), 500);
507bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
508bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
509bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _updateDividersIfNeeded: function(force)
510bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
511a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var timelineColumn = this._dataGrid.columns.timeline;
512a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (var i = 0; i < this._dataGrid.resizers.length; ++i) {
513a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (timelineColumn.ordinal === this._dataGrid.resizers[i].rightNeighboringColumnID) {
514a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                // Position timline grid location.
515a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._timelineGrid.element.style.left = this._dataGrid.resizers[i].style.left;
516a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._timelineGrid.element.style.right = "18px";
517a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
518a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
519bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
520bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var proceed = true;
521bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!this.visible) {
522bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._scheduleRefresh();
523bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            proceed = false;
524bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else
525bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            proceed = this._timelineGrid.updateDividers(force, this.calculator);
526f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
527bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!proceed)
528bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
529bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
530bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this.calculator.startAtZero || !this.calculator.computePercentageFromEventTime) {
531bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // If our current sorting method starts at zero, that means it shows all
532bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // resources starting at the same point, and so onLoad event and DOMContent
533bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // event lines really wouldn't make much sense here, so don't render them.
534bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // Additionally, if the calculator doesn't have the computePercentageFromEventTime
535bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // function defined, we are probably sorting by size, and event times aren't relevant
536bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // in this case.
537bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
538bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
539bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
540bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineGrid.removeEventDividers();
541bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._mainResourceLoadTime !== -1) {
542bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var percent = this.calculator.computePercentageFromEventTime(this._mainResourceLoadTime);
543bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
544bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var loadDivider = document.createElement("div");
545bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDivider.className = "network-event-divider network-red-divider";
546bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
547bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var loadDividerPadding = document.createElement("div");
548bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDividerPadding.className = "network-event-divider-padding";
549bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDividerPadding.title = WebInspector.UIString("Load event fired");
550bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDividerPadding.appendChild(loadDivider);
551bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDividerPadding.style.left = percent + "%";
552bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timelineGrid.addEventDivider(loadDividerPadding);
553bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
554f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
555bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._mainResourceDOMContentTime !== -1) {
556bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var percent = this.calculator.computePercentageFromEventTime(this._mainResourceDOMContentTime);
557bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
558bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var domContentDivider = document.createElement("div");
559bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDivider.className = "network-event-divider network-blue-divider";
560f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
561bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var domContentDividerPadding = document.createElement("div");
562bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDividerPadding.className = "network-event-divider-padding";
563bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDividerPadding.title = WebInspector.UIString("DOMContent event fired");
564bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDividerPadding.appendChild(domContentDivider);
565bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDividerPadding.style.left = percent + "%";
566bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timelineGrid.addEventDivider(domContentDividerPadding);
567bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
568bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
569bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
570bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshIfNeeded: function()
571bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
572bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._needsRefresh)
573bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.refresh();
574bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
575bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
576bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _invalidateAllItems: function()
577bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
578bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._staleResources = this._resources.slice();
579bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
580bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
581bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get calculator()
582bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
583bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return this._calculator;
584bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
585bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
586bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    set calculator(x)
587bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
588bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!x || this._calculator === x)
589bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
590bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
591bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._calculator = x;
592bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._calculator.reset();
593bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
594bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._invalidateAllItems();
595bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this.refresh();
596bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
597bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
598bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _resourceGridNode: function(resource)
599bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
600bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return this._resourceGridNodes[resource.identifier];
601bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
602bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
603bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    revealAndSelectItem: function(resource)
604bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
605bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var node = this._resourceGridNode(resource);
606bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (node) {
607bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            node.reveal();
608bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            node.select(true);
609bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
610bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
611bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
612bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    addEventDivider: function(divider)
613bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
614bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineGrid.addEventDivider(divider);
615bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
616bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
617bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createStatusbarButtons: function()
618bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
61928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._preserveLogToggle = new WebInspector.StatusBarButton(WebInspector.UIString("Preserve Log upon Navigation"), "record-profile-status-bar-item");
62028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._preserveLogToggle.addEventListener("click", this._onPreserveLogClicked.bind(this), false);
62128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
622bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-status-bar-item");
623a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._clearButton.addEventListener("click", this._reset.bind(this), false);
624bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
625bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "network-larger-resources-status-bar-item");
62628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._largerResourcesButton.toggled = WebInspector.settings.resourcesLargeRows;
627e14391e94c850b8bd03680c23b38978db68687a8John Reck        this._largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);
628bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
629bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
630bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    set mainResourceLoadTime(x)
631bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
632bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._mainResourceLoadTime === x)
633bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
634f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
635bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._mainResourceLoadTime = x || -1;
636bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // Update the dividers to draw the new line
637bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._updateDividersIfNeeded(true);
638bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
639bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
640bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    set mainResourceDOMContentTime(x)
641bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
642bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._mainResourceDOMContentTime === x)
643bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
644bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
645bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._mainResourceDOMContentTime = x || -1;
646bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._updateDividersIfNeeded(true);
647bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
648bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
649bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    show: function()
650bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
651bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        WebInspector.Panel.prototype.show.call(this);
652bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._refreshIfNeeded();
653bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
6544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (this.visibleView)
655bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.visibleView.show(this._viewsContainerElement);
656bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
657bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.updateWidths();
658a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._positionSummaryBar();
659a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
660a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
661a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    hide: function()
662a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
663a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        WebInspector.Panel.prototype.hide.call(this);
664a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._popoverHelper.hidePopup();
665bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
666bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
667bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get searchableViews()
668bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
669bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var views = [];
670bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return views;
671bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
672bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
673bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    searchMatchFound: function(view, matches)
674bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
675bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._resourceGridNode(view.resource).searchMatches = matches;
676bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
677bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
678bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    searchCanceled: function(startingNewSearch)
679bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
680bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
681bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
682bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (startingNewSearch || !this._resources)
683bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
684bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
685bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
686bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    performSearch: function(query)
687bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
688bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        WebInspector.Panel.prototype.performSearch.call(this, query);
689bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
690bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
691bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    refresh: function()
692bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
693bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._needsRefresh = false;
694bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if ("_refreshTimeout" in this) {
695bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            clearTimeout(this._refreshTimeout);
696bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            delete this._refreshTimeout;
697bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
698bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
69928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        var wasScrolledToLastRow = this._dataGrid.isScrolledToLastRow();
700bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var staleItemsLength = this._staleResources.length;
701bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var boundariesChanged = false;
702bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
703bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var i = 0; i < staleItemsLength; ++i) {
704bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var resource = this._staleResources[i];
705bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var node = this._resourceGridNode(resource);
706bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (!node) {
707bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                // Create the timeline tree element and graph.
708a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                node = new WebInspector.NetworkDataGridNode(this, resource);
709bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                this._resourceGridNodes[resource.identifier] = node;
710bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                this._dataGrid.appendChild(node);
711bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            }
712bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            node.refreshResource();
713bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
714bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (this.calculator.updateBoundaries(resource))
715bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                boundariesChanged = true;
716bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
717bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
718bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (boundariesChanged) {
719bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // The boundaries changed, so all item graphs are stale.
720bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._invalidateAllItems();
721bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            staleItemsLength = this._staleResources.length;
722bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
723bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
724bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var i = 0; i < staleItemsLength; ++i)
725bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._resourceGridNode(this._staleResources[i]).refreshGraph(this.calculator);
726bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
727bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._staleResources = [];
728bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._sortItems();
729a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._updateSummaryBar();
730bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.updateWidths();
73128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
73228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (wasScrolledToLastRow)
73328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            this._dataGrid.scrollToLastRow();
73428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    },
73528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
73628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    _onPreserveLogClicked: function(e)
73728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    {
73828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._preserveLogToggle.toggled = !this._preserveLogToggle.toggled;
73928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    },
74028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
741a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _reset: function()
742bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
743bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._popoverHelper.hidePopup();
744a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._closeVisibleResource();
745bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
746a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._toggleGridMode();
747bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
748bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // Begin reset timeline
749bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._calculator)
750bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._calculator.reset();
751bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
752bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._resources = [];
753e14391e94c850b8bd03680c23b38978db68687a8John Reck        this._resourcesById = {};
75428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._resourcesByURL = {};
755bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._staleResources = [];
756bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._resourceGridNodes = {};
757bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
758bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.removeChildren();
759a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this._summaryBarRowNode;
760bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._updateDividersIfNeeded(true);
761bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // End reset timeline.
762a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
763bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._mainResourceLoadTime = -1;
764bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._mainResourceDOMContentTime = -1;
765f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
766bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._viewsContainerElement.removeChildren();
76728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._viewsContainerElement.appendChild(this._closeButtonElement);
768a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._resetSummaryBar();
769bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
770bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
771e14391e94c850b8bd03680c23b38978db68687a8John Reck    get resources()
772e14391e94c850b8bd03680c23b38978db68687a8John Reck    {
77365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return this._resources;
774e14391e94c850b8bd03680c23b38978db68687a8John Reck    },
775e14391e94c850b8bd03680c23b38978db68687a8John Reck
77665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    resourceById: function(id)
777bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
77865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return this._resourcesById[id];
77965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    },
780bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
781ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _onResourceStarted: function(event)
782ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
783ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        this._appendResource(event.data);
784ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    },
785ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
786ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _appendResource: function(resource)
78765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
78865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._resources.push(resource);
78965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._resourcesById[resource.identifier] = resource;
79065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._resourcesByURL[resource.url] = resource;
79128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Pull all the redirects of the main resource upon commit load.
79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (resource.redirects) {
79465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            for (var i = 0; i < resource.redirects.length; ++i)
795ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                this._refreshResource(resource.redirects[i]);
79628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
79728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
798ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        this._refreshResource(resource);
799ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    },
800ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
801ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _onResourceUpdated: function(event)
802ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
803ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        this._refreshResource(event.data);
80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    },
80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
806ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _refreshResource: function(resource)
80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
808bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._staleResources.push(resource);
809bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._scheduleRefresh();
810f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
811cad810f21b803229eb11403f9209855525a25d57Steve Block        var oldView = WebInspector.ResourceView.existingResourceViewForResource(resource);
8124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (!oldView)
813bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
814bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
815cad810f21b803229eb11403f9209855525a25d57Steve Block        if (WebInspector.ResourceView.resourceViewTypeMatchesResource(resource))
8164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return;
817bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
818cad810f21b803229eb11403f9209855525a25d57Steve Block        var newView = WebInspector.ResourceView.recreateResourceView(resource);
8194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (this.visibleView === oldView)
8204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this.visibleView = newView;
821bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
822bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    clear: function()
82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
82565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (this._preserveLogToggle.toggled)
82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
82765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._reset();
82865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    },
82965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
830ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _onMainResourceCommitLoad: function()
83165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
83265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (this._preserveLogToggle.toggled)
83365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
83465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._reset();
83665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Now resurrect the main resource along with all redirects that lead to it.
83765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        var resourcesToAppend = (WebInspector.mainResource.redirects || []).concat(WebInspector.mainResource);
838ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        resourcesToAppend.forEach(this._appendResource, this);
83965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    },
84065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
841bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    canShowSourceLine: function(url, line)
842bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
84328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return !!this._resourcesByURL[url];
844bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
845bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
846bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    showSourceLine: function(url, line)
847bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
84828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._showResource(this._resourcesByURL[url], line);
849bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
850bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
851a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _showResource: function(resource, line)
852bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
853bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!resource)
854bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
855bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
856bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._popoverHelper.hidePopup();
857bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
858a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._toggleViewingResourceMode();
859bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
8604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (this.visibleView) {
8614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this.visibleView.detach();
8624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            delete this.visibleView;
8634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
864bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
8654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        var view = new WebInspector.NetworkItemView(resource);
866bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        view.show(this._viewsContainerElement);
8674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        this.visibleView = view;
868bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
869bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this.updateSidebarWidth();
870bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
871bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
872a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _closeVisibleResource: function()
873bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
874a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.element.removeStyleClass("viewing-resource");
875bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
8764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (this.visibleView) {
8774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this.visibleView.detach();
8784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            delete this.visibleView;
8794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
880bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
881bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._lastSelectedGraphTreeElement)
882bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._lastSelectedGraphTreeElement.select(true);
883bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
884bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this.updateSidebarWidth();
885bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
886bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
887bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _toggleLargerResources: function()
888bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
88928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        WebInspector.settings.resourcesLargeRows = !WebInspector.settings.resourcesLargeRows;
89028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._setLargerResources(WebInspector.settings.resourcesLargeRows);
891bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
892bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
893bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _setLargerResources: function(enabled)
894bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
895bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._largerResourcesButton.toggled = enabled;
896bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!enabled) {
897bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._largerResourcesButton.title = WebInspector.UIString("Use large resource rows.");
898bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._dataGrid.element.addStyleClass("small");
899a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._timelineGrid.element.addStyleClass("small");
900e14391e94c850b8bd03680c23b38978db68687a8John Reck            this._viewsContainerElement.addStyleClass("small");
901bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
902bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
903bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._dataGrid.element.removeStyleClass("small");
904a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._timelineGrid.element.removeStyleClass("small");
905e14391e94c850b8bd03680c23b38978db68687a8John Reck            this._viewsContainerElement.removeStyleClass("small");
906bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
90728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._positionSummaryBar();
908bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
909bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
910bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _getPopoverAnchor: function(element)
911bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
912bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var anchor = element.enclosingNodeOrSelfWithClass("network-graph-bar") || element.enclosingNodeOrSelfWithClass("network-graph-label");
913bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!anchor)
914bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return null;
915bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resource = anchor.parentElement.resource;
916bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return resource && resource.timing ? anchor : null;
917bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
918bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
919bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _showPopover: function(anchor)
920bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
921bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resource = anchor.parentElement.resource;
9224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        var tableElement = WebInspector.ResourceTimingView.createTimingTable(resource);
923bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var popover = new WebInspector.Popover(tableElement);
924bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        popover.show(anchor);
925bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return popover;
926bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
927bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
928a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _toggleGridMode: function()
929bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
930a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this._viewingResourceMode) {
931a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._viewingResourceMode = false;
932a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this.element.removeStyleClass("viewing-resource");
933a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.removeStyleClass("viewing-resource-mode");
934a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._viewsContainerElement.addStyleClass("hidden");
935a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this.sidebarElement.style.right = 0;
936a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this.sidebarElement.style.removeProperty("width");
9374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (this._dataGrid.selectedNode)
9384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                this._dataGrid.selectedNode.selected = false;
939a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
940a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
941a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this._briefGrid) {
942a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.removeStyleClass("full-grid-mode");
943a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.addStyleClass("brief-grid-mode");
944a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
945a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("method");
946a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("status");
947a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("type");
948a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("size");
949a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("time");
950a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
951a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var widths = {};
952a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.name = 20;
953a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.timeline = 80;
954a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        } else {
955a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.addStyleClass("full-grid-mode");
956a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.removeStyleClass("brief-grid-mode");
957a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
958a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("method");
959a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("status");
960a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("type");
961a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("size");
962a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("time");
963a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
964a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var widths = {};
965a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.name = 20;
966a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.method = 7;
967a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.status = 8;
968e14391e94c850b8bd03680c23b38978db68687a8John Reck            widths.type = 10;
969a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.size = 10;
970a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.time = 10;
971e14391e94c850b8bd03680c23b38978db68687a8John Reck            widths.timeline = 37;
972a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
973a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
974a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.showColumn("timeline");
975a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.applyColumnWidthsMap(widths);
976a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
977a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
978a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
979a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _toggleViewingResourceMode: function()
980a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
981a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this._viewingResourceMode)
982a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
983a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._viewingResourceMode = true;
984a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._preservedColumnWidths = this._dataGrid.columnWidthsMap();
985a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
986a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.element.addStyleClass("viewing-resource");
987a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.addStyleClass("viewing-resource-mode");
988a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.removeStyleClass("full-grid-mode");
989a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.removeStyleClass("brief-grid-mode");
990a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
991a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("method");
992a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("status");
993a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("type");
994a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("size");
995a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("time");
996a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("timeline");
997a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
998a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._viewsContainerElement.removeStyleClass("hidden");
999a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.updateSidebarWidth(200);
1000a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1001a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var widths = {};
1002a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        widths.name = 100;
1003a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.applyColumnWidthsMap(widths);
1004f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
1005f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1006f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _contextMenu: function(event)
1007f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
1008f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        // createBlobURL is enabled conditionally, do not expose resource export if it's not available.
100965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (typeof window.webkitURL.createObjectURL !== "function" || !Preferences.resourceExportEnabled)
1010f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return;
1011f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1012f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var contextMenu = new WebInspector.ContextMenu();
1013f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var gridNode = this._dataGrid.dataGridNodeFromNode(event.target);
1014f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var resource = gridNode && gridNode._resource;
1015f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (resource)
1016f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            contextMenu.appendItem(WebInspector.UIString("Export to HAR"), this._exportResource.bind(this, resource));
1017f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        contextMenu.appendItem(WebInspector.UIString("Export all to HAR"), this._exportAll.bind(this));
1018f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        contextMenu.show(event);
1019f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
1020f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1021f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _exportAll: function()
1022f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
1023f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var harArchive = {
1024f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log: (new WebInspector.HARLog()).build()
1025f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
10262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        InspectorFrontendHost.copyText(JSON.stringify(harArchive));
1027f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
1028f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1029f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _exportResource: function(resource)
1030f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
1031f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var har = (new WebInspector.HAREntry(resource)).build();
10322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        InspectorFrontendHost.copyText(JSON.stringify(har));
10332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
10342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _updateOffscreenRows: function(e)
10362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
10372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var dataTableBody = this._dataGrid.dataTableBody;
10382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var rows = dataTableBody.children;
10392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var recordsCount = rows.length;
10402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (recordsCount < 2)
10412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;  // Filler row only.
10422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var visibleTop = this._dataGrid.scrollContainer.scrollTop;
10442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var visibleBottom = visibleTop + this._dataGrid.scrollContainer.offsetHeight;
10452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var rowHeight = 0;
10472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Filler is at recordsCount - 1.
10492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var unfilteredRowIndex = 0;
10502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (var i = 0; i < recordsCount - 1; ++i) {
10512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            var row = rows[i];
10522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            // Don't touch summaty - quit instead.
10532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (this._summaryBarRowNode && row === this._summaryBarRowNode.element)
10542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                break;
10552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            var dataGridNode = this._dataGrid.dataGridNodeFromNode(row);
10572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (dataGridNode.isFilteredOut()) {
10582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                row.removeStyleClass("offscreen");
10592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                continue;
10602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
10612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!rowHeight)
10632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                rowHeight = row.offsetHeight;
10642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            var rowIsVisible = unfilteredRowIndex * rowHeight < visibleBottom && (unfilteredRowIndex + 1) * rowHeight > visibleTop;
10662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (rowIsVisible !== row.rowIsVisible) {
10672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (rowIsVisible)
10682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    row.removeStyleClass("offscreen");
10692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                else
10702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    row.addStyleClass("offscreen");
10712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                row.rowIsVisible = rowIsVisible;
10722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
10732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            unfilteredRowIndex++;
10742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
1075bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1076bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1077bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1078bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkPanel.prototype.__proto__ = WebInspector.Panel.prototype;
1079bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1080bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkBaseCalculator = function()
1081bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1082bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1083bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1084bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkBaseCalculator.prototype = {
1085bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeSummaryValues: function(items)
1086bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1087bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var total = 0;
1088bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var categoryValues = {};
1089bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1090bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var itemsLength = items.length;
1091bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var i = 0; i < itemsLength; ++i) {
1092bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var item = items[i];
1093bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var value = this._value(item);
1094bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (typeof value === "undefined")
1095bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                continue;
1096bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (!(item.category.name in categoryValues))
1097bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                categoryValues[item.category.name] = 0;
1098bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            categoryValues[item.category.name] += value;
1099bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            total += value;
1100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {categoryValues: categoryValues, total: total};
1103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeBarGraphPercentages: function(item)
1106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {start: 0, middle: 0, end: (this._value(item) / this.boundarySpan) * 100};
1108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeBarGraphLabels: function(item)
1111bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1112bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const label = this.formatValue(this._value(item));
1113bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {left: label, right: label, tooltip: label};
1114bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1115bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get boundarySpan()
1117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return this.maximumBoundary - this.minimumBoundary;
1119bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1120bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1121bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    updateBoundaries: function(item)
1122bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1123bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this.minimumBoundary = 0;
1124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1125bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var value = this._value(item);
1126bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (typeof this.maximumBoundary === "undefined" || value > this.maximumBoundary) {
1127bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.maximumBoundary = value;
1128bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return true;
1129bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1130bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
1131bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1132bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1133bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    reset: function()
1134bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1135bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this.minimumBoundary;
1136bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this.maximumBoundary;
1137bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1138bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1139bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _value: function(item)
1140bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1144bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    formatValue: function(value)
1145bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1146bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return value.toString();
1147bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1148bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1149bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1150bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTimeCalculator = function(startAtZero)
1151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1152bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebInspector.NetworkBaseCalculator.call(this);
1153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this.startAtZero = startAtZero;
1154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1156bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTimeCalculator.prototype = {
1157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeSummaryValues: function(resources)
1158bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resourcesByCategory = {};
1160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resourcesLength = resources.length;
1161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var i = 0; i < resourcesLength; ++i) {
1162bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var resource = resources[i];
1163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (!(resource.category.name in resourcesByCategory))
1164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                resourcesByCategory[resource.category.name] = [];
1165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            resourcesByCategory[resource.category.name].push(resource);
1166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var earliestStart;
1169bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var latestEnd;
1170bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var categoryValues = {};
1171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var category in resourcesByCategory) {
1172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            resourcesByCategory[category].sort(WebInspector.Resource.CompareByTime);
1173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            categoryValues[category] = 0;
1174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var segment = {start: -1, end: -1};
1176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var categoryResources = resourcesByCategory[category];
1178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var resourcesLength = categoryResources.length;
1179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            for (var i = 0; i < resourcesLength; ++i) {
1180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                var resource = categoryResources[i];
1181bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (resource.startTime === -1 || resource.endTime === -1)
1182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    continue;
1183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1184bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (typeof earliestStart === "undefined")
1185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    earliestStart = resource.startTime;
1186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                else
1187bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    earliestStart = Math.min(earliestStart, resource.startTime);
1188bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1189bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (typeof latestEnd === "undefined")
1190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    latestEnd = resource.endTime;
1191bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                else
1192bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    latestEnd = Math.max(latestEnd, resource.endTime);
1193bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1194bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (resource.startTime <= segment.end) {
1195bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    segment.end = Math.max(segment.end, resource.endTime);
1196bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    continue;
1197bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                }
1198bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                categoryValues[category] += segment.end - segment.start;
1200bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1201bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                segment.start = resource.startTime;
1202bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                segment.end = resource.endTime;
1203bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            }
1204bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1205bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // Add the last segment
1206bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            categoryValues[category] += segment.end - segment.start;
1207bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1208bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1209bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {categoryValues: categoryValues, total: latestEnd - earliestStart};
1210bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1211bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1212bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeBarGraphPercentages: function(resource)
1213bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1214bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.startTime !== -1)
1215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var start = ((resource.startTime - this.minimumBoundary) / this.boundarySpan) * 100;
1216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var start = 0;
1218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.responseReceivedTime !== -1)
1220bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var middle = ((resource.responseReceivedTime - this.minimumBoundary) / this.boundarySpan) * 100;
1221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var middle = (this.startAtZero ? start : 100);
1223bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.endTime !== -1)
1225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var end = ((resource.endTime - this.minimumBoundary) / this.boundarySpan) * 100;
1226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1227bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var end = (this.startAtZero ? middle : 100);
1228bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1229bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this.startAtZero) {
1230bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            end -= start;
1231bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            middle -= start;
1232bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            start = 0;
1233bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1234bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1235bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {start: start, middle: middle, end: end};
1236bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1237f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1238bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computePercentageFromEventTime: function(eventTime)
1239bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1240bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // This function computes a percentage in terms of the total loading time
1241bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // of a specific event. If startAtZero is set, then this is useless, and we
1242bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // want to return 0.
1243bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (eventTime !== -1 && !this.startAtZero)
1244bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return ((eventTime - this.minimumBoundary) / this.boundarySpan) * 100;
1245bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1246bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1247bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1248bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1249bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeBarGraphLabels: function(resource)
1250bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1251bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var rightLabel = "";
1252bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.responseReceivedTime !== -1 && resource.endTime !== -1)
1253bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            rightLabel = this.formatValue(resource.endTime - resource.responseReceivedTime);
1254bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1255bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var hasLatency = resource.latency > 0;
1256bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (hasLatency)
1257bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftLabel = this.formatValue(resource.latency);
1258bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1259bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftLabel = rightLabel;
1260bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1261bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.timing)
1262bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return {left: leftLabel, right: rightLabel};
1263bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1264bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (hasLatency && rightLabel) {
1265bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var total = this.formatValue(resource.duration);
1266bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);
1267bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else if (hasLatency)
1268bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var tooltip = WebInspector.UIString("%s latency", leftLabel);
1269bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else if (rightLabel)
1270bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var tooltip = WebInspector.UIString("%s download", rightLabel);
1271bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1272bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.cached)
1273bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
1274bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {left: leftLabel, right: rightLabel, tooltip: tooltip};
1275bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1276bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1277bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    updateBoundaries: function(resource)
1278bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1279bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var didChange = false;
1280bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1281bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var lowerBound;
1282bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this.startAtZero)
1283bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            lowerBound = 0;
1284bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1285bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            lowerBound = this._lowerBound(resource);
1286bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1287bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (lowerBound !== -1 && (typeof this.minimumBoundary === "undefined" || lowerBound < this.minimumBoundary)) {
1288bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.minimumBoundary = lowerBound;
1289bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            didChange = true;
1290bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1291bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1292bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var upperBound = this._upperBound(resource);
1293bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (upperBound !== -1 && (typeof this.maximumBoundary === "undefined" || upperBound > this.maximumBoundary)) {
1294bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.maximumBoundary = upperBound;
1295bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            didChange = true;
1296bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1297bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1298bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return didChange;
1299bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1300bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1301bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    formatValue: function(value)
1302bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
130365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return Number.secondsToString(value);
1304bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1305bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1306bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _lowerBound: function(resource)
1307bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1308bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1309bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1310bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1311bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _upperBound: function(resource)
1312bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1313bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1314bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1315bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1316bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1317bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTimeCalculator.prototype.__proto__ = WebInspector.NetworkBaseCalculator.prototype;
1318bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1319bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferTimeCalculator = function()
1320bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1321bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebInspector.NetworkTimeCalculator.call(this, false);
1322bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1323bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1324bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferTimeCalculator.prototype = {
1325bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    formatValue: function(value)
1326bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
132765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return Number.secondsToString(value);
1328bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1329bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1330bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _lowerBound: function(resource)
1331bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1332bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return resource.startTime;
1333bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1334bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1335bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _upperBound: function(resource)
1336bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1337bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return resource.endTime;
1338bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1339bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1340bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1341bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferTimeCalculator.prototype.__proto__ = WebInspector.NetworkTimeCalculator.prototype;
1342bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1343bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferDurationCalculator = function()
1344bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1345bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebInspector.NetworkTimeCalculator.call(this, true);
1346bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1347bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1348bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferDurationCalculator.prototype = {
1349bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    formatValue: function(value)
1350bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
135165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return Number.secondsToString(value);
1352bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1353bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1354bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _upperBound: function(resource)
1355bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1356bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return resource.duration;
1357bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1358bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1359bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1360bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferDurationCalculator.prototype.__proto__ = WebInspector.NetworkTimeCalculator.prototype;
1361bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1362a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode = function(panel, resource)
1363bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1364a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WebInspector.DataGridNode.call(this, {});
1365a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._panel = panel;
1366a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._resource = resource;
1367bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1368bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1369a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode.prototype = {
1370a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    createCells: function()
1371bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1372a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell = this._createDivInTD("name");
1373a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._methodCell = this._createDivInTD("method");
1374a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._statusCell = this._createDivInTD("status");
1375a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._typeCell = this._createDivInTD("type");
1376a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sizeCell = this._createDivInTD("size");
1377a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._timeCell = this._createDivInTD("time");
1378a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._createTimelineCell();
13794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        this._nameCell.addEventListener("click", this.select.bind(this), false);
13802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._nameCell.addEventListener("dblclick", this._openInNewTab.bind(this), false);
13812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
13822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    isFilteredOut: function()
13842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
13852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!this._panel._hiddenCategories.all)
13862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
13872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return this._resource.category.name in this._panel._hiddenCategories;
1388bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1389bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1390a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    select: function()
1391bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1392a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._panel._showResource(this._resource);
13934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        WebInspector.DataGridNode.prototype.select.apply(this, arguments);
1394bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1395bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
13962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _openInNewTab: function()
13972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
13982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        InspectorBackend.openInInspectedWindow(this._resource.url);
13992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
14002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1401a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    get selectable()
1402bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
14034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (!this._panel._viewingResourceMode)
14044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return false;
14052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return !this.isFilteredOut();
1406bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1407bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1408a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _createDivInTD: function(columnIdentifier)
1409bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1410bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var td = document.createElement("td");
1411a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        td.className = columnIdentifier + "-column";
1412bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var div = document.createElement("div");
1413bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        td.appendChild(div);
1414bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._element.appendChild(td);
1415bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return div;
1416bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1417bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1418bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createTimelineCell: function()
1419bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1420bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._graphElement = document.createElement("div");
1421bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._graphElement.className = "network-graph-side";
1422bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1423bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement = document.createElement("div");
1424bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        //    this._barAreaElement.className = "network-graph-bar-area hidden";
1425bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.className = "network-graph-bar-area";
1426bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.resource = this._resource;
1427bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._graphElement.appendChild(this._barAreaElement);
1428bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1429bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement = document.createElement("div");
1430bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement.className = "network-graph-bar waiting";
1431bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.appendChild(this._barLeftElement);
1432bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1433bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement = document.createElement("div");
1434bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement.className = "network-graph-bar";
1435bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.appendChild(this._barRightElement);
1436bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
14374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1438bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement = document.createElement("div");
1439bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.className = "network-graph-label waiting";
1440bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.appendChild(this._labelLeftElement);
1441bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1442bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement = document.createElement("div");
1443bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.className = "network-graph-label";
1444bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.appendChild(this._labelRightElement);
1445bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
14464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        this._graphElement.addEventListener("mouseover", this._refreshLabelPositions.bind(this), false);
14474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1448bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineCell = document.createElement("td");
1449a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._timelineCell.className = "timeline-column";
1450bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._element.appendChild(this._timelineCell);
1451bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineCell.appendChild(this._graphElement);
1452bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1453bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1454bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    refreshResource: function()
1455bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1456a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._refreshNameCell();
1457bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1458bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._methodCell.textContent = this._resource.requestMethod;
1459bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1460bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._refreshStatusCell();
1461bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1462bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.mimeType) {
1463bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._typeCell.removeStyleClass("network-dim-cell");
1464bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._typeCell.textContent = this._resource.mimeType;
1465bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1466bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._typeCell.addStyleClass("network-dim-cell");
1467bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._typeCell.textContent = WebInspector.UIString("Pending");
1468bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1469bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1470bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._refreshSizeCell();
1471bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._refreshTimeCell();
1472bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1473bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.cached)
1474bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._graphElement.addStyleClass("resource-cached");
1475bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1476f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        this._element.addStyleClass("network-item");
1477bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!this._element.hasStyleClass("network-category-" + this._resource.category.name)) {
1478bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._element.removeMatchingStyleClasses("network-category-\\w+");
1479bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._element.addStyleClass("network-category-" + this._resource.category.name);
1480bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1481bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1482bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1483a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _refreshNameCell: function()
1484bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1485a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell.removeChildren();
1486bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1487bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.category === WebInspector.resourceCategories.images) {
1488bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var previewImage = document.createElement("img");
1489bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            previewImage.className = "image-network-icon-preview";
149065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            this._resource.populateImageSource(previewImage);
1491bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1492bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var iconElement = document.createElement("div");
1493bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            iconElement.className = "icon";
1494bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            iconElement.appendChild(previewImage);
1495bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1496bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var iconElement = document.createElement("img");
1497bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            iconElement.className = "icon";
1498bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1499a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell.appendChild(iconElement);
1500a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell.appendChild(document.createTextNode(this._fileName()));
1501bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1502bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1503bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var subtitle = this._resource.displayDomain;
1504bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1505bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.path && this._resource.lastPathComponent) {
1506bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var lastPathComponentIndex = this._resource.path.lastIndexOf("/" + this._resource.lastPathComponent);
1507bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (lastPathComponentIndex != -1)
1508bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                subtitle += this._resource.path.substring(0, lastPathComponentIndex);
1509bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1510bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1511a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._appendSubtitle(this._nameCell, subtitle);
1512a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell.title = this._resource.url;
1513bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1514bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1515bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _fileName: function()
1516bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1517bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var fileName = this._resource.displayName;
1518bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.queryString)
1519bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            fileName += "?" + this._resource.queryString;
1520bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return fileName;
1521bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1522bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1523bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshStatusCell: function()
1524bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1525bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._statusCell.removeChildren();
1526bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
15274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        var fromCache = this._resource.cached;
15284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (fromCache) {
15294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this._statusCell.textContent = WebInspector.UIString("(from cache)");
15304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this._statusCell.addStyleClass("network-dim-cell");
15314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return;
15324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
15334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
15344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        this._statusCell.removeStyleClass("network-dim-cell");
1535bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.statusCode) {
1536bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.appendChild(document.createTextNode(this._resource.statusCode));
1537bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.removeStyleClass("network-dim-cell");
1538bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._appendSubtitle(this._statusCell, this._resource.statusText);
1539bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.title = this._resource.statusCode + " " + this._resource.statusText;
1540bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1541bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.addStyleClass("network-dim-cell");
1542bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.textContent = WebInspector.UIString("Pending");
1543bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1544bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1545bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1546bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshSizeCell: function()
1547bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1548bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resourceSize = typeof this._resource.resourceSize === "number" ? Number.bytesToString(this._resource.resourceSize) : "?";
1549bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var transferSize = typeof this._resource.transferSize === "number" ? Number.bytesToString(this._resource.transferSize) : "?";
1550bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var fromCache = this._resource.cached;
1551bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._sizeCell.textContent = !fromCache ? resourceSize : WebInspector.UIString("(from cache)");
1552bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (fromCache)
1553bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._sizeCell.addStyleClass("network-dim-cell");
1554bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1555bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._sizeCell.removeStyleClass("network-dim-cell");
1556bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!fromCache)
1557bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._appendSubtitle(this._sizeCell, transferSize);
1558bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1559bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1560bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshTimeCell: function()
1561bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1562bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.duration > 0) {
1563bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timeCell.removeStyleClass("network-dim-cell");
1564bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timeCell.textContent = Number.secondsToString(this._resource.duration);
1565bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._appendSubtitle(this._timeCell, Number.secondsToString(this._resource.latency));
1566bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1567bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timeCell.addStyleClass("network-dim-cell");
1568bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timeCell.textContent = WebInspector.UIString("Pending");
1569bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1570bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1571bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1572bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _appendSubtitle: function(cellElement, subtitleText)
1573bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1574bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var subtitleElement = document.createElement("div");
1575a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        subtitleElement.className = "network-cell-subtitle";
1576bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        subtitleElement.textContent = subtitleText;
1577bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        cellElement.appendChild(subtitleElement);
1578bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1579bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1580bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    refreshGraph: function(calculator)
1581bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1582bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var percentages = calculator.computeBarGraphPercentages(this._resource);
1583bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._percentages = percentages;
1584bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1585bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.removeStyleClass("hidden");
1586bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1587bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!this._graphElement.hasStyleClass("network-category-" + this._resource.category.name)) {
1588bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._graphElement.removeMatchingStyleClasses("network-category-\\w+");
1589bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._graphElement.addStyleClass("network-category-" + this._resource.category.name);
1590bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1591bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1592bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement.style.setProperty("left", percentages.start + "%");
1593bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");
1594bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1595bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");
1596bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement.style.setProperty("left", percentages.middle + "%");
1597bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
15984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        var labels = calculator.computeBarGraphLabels(this._resource);
1599bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.textContent = labels.left;
1600bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.textContent = labels.right;
1601bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1602bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var tooltip = (labels.tooltip || "");
1603bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement.title = tooltip;
1604bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.title = tooltip;
1605bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.title = tooltip;
1606bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement.title = tooltip;
1607bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1608bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1609bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshLabelPositions: function()
1610bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1611a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!this._percentages)
1612a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
1613bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.style.removeProperty("left");
1614bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.style.removeProperty("right");
1615bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.removeStyleClass("before");
1616bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.removeStyleClass("hidden");
1617bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1618bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.style.removeProperty("left");
1619bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.style.removeProperty("right");
1620bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.removeStyleClass("after");
1621bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.removeStyleClass("hidden");
1622bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1623bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelPadding = 10;
1624bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const barRightElementOffsetWidth = this._barRightElement.offsetWidth;
1625bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const barLeftElementOffsetWidth = this._barLeftElement.offsetWidth;
1626bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1627bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._barLeftElement) {
1628bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftBarWidth = barLeftElementOffsetWidth - labelPadding;
1629bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var rightBarWidth = (barRightElementOffsetWidth - barLeftElementOffsetWidth) - labelPadding;
1630bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1631bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftBarWidth = (barLeftElementOffsetWidth - barRightElementOffsetWidth) - labelPadding;
1632bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var rightBarWidth = barRightElementOffsetWidth - labelPadding;
1633bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1634bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1635bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelLeftElementOffsetWidth = this._labelLeftElement.offsetWidth;
1636bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelRightElementOffsetWidth = this._labelRightElement.offsetWidth;
1637bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1638bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelBefore = (labelLeftElementOffsetWidth > leftBarWidth);
1639bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelAfter = (labelRightElementOffsetWidth > rightBarWidth);
1640bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const graphElementOffsetWidth = this._graphElement.offsetWidth;
1641bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1642bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (labelBefore && (graphElementOffsetWidth * (this._percentages.start / 100)) < (labelLeftElementOffsetWidth + 10))
1643bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftHidden = true;
1644bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1645bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (labelAfter && (graphElementOffsetWidth * ((100 - this._percentages.end) / 100)) < (labelRightElementOffsetWidth + 10))
1646bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var rightHidden = true;
1647bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1648bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (barLeftElementOffsetWidth == barRightElementOffsetWidth) {
1649bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // The left/right label data are the same, so a before/after label can be replaced by an on-bar label.
1650bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (labelBefore && !labelAfter)
1651bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                leftHidden = true;
1652bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            else if (labelAfter && !labelBefore)
1653bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                rightHidden = true;
1654bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1655bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1656bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (labelBefore) {
1657bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (leftHidden)
1658bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                this._labelLeftElement.addStyleClass("hidden");
1659bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");
1660bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelLeftElement.addStyleClass("before");
1661bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1662bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");
1663bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");
1664bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1665bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1666bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (labelAfter) {
1667bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (rightHidden)
1668bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                this._labelRightElement.addStyleClass("hidden");
1669bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelRightElement.style.setProperty("left", this._percentages.end + "%");
1670bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelRightElement.addStyleClass("after");
1671bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1672bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");
1673bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");
1674bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1675bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1676bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1677bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1678a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode.NameComparator = function(a, b)
1679bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1680bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    var aFileName = a._resource.displayName + (a._resource.queryString ? a._resource.queryString : "");
1681bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    var bFileName = b._resource.displayName + (b._resource.queryString ? b._resource.queryString : "");
1682bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (aFileName > bFileName)
1683bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 1;
1684bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (bFileName > aFileName)
1685bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return -1;
1686bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return 0;
1687bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1688bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1689a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode.SizeComparator = function(a, b)
1690a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
1691a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (b._resource.cached && !a._resource.cached)
1692a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return 1;
1693a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (a._resource.cached && !b._resource.cached)
1694a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return -1;
1695a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1696a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (a._resource.resourceSize === b._resource.resourceSize)
1697a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return 0;
1698a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1699a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return a._resource.resourceSize - b._resource.resourceSize;
1700a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
1701a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1702a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode.ResourcePropertyComparator = function(propertyName, revert, a, b)
1703bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1704bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    var aValue = a._resource[propertyName];
1705bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    var bValue = b._resource[propertyName];
1706bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (aValue > bValue)
1707a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return revert ? -1 : 1;
1708bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (bValue > aValue)
1709a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return revert ? 1 : -1;
1710bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return 0;
1711bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1712bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1713bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
1714a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1715a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkTotalGridNode = function(element)
1716a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
1717a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._summaryBarElement = element;
1718a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WebInspector.DataGridNode.call(this, {summaryRow: true});
1719a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
1720a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1721a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkTotalGridNode.prototype = {
17222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    isFilteredOut: function()
17232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
17242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
17252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
17262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
17272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    get selectable()
17282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
17292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
17302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
17312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1732a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    createCells: function()
1733a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
1734a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var td = document.createElement("td");
1735a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        td.setAttribute("colspan", 7);
1736a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        td.className = "network-summary";
1737a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        td.appendChild(this._summaryBarElement);
1738a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._element.appendChild(td);
1739a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
1740a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
1741a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1742a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkTotalGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
1743