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 = {};
432bde8e466a4451c7319e3a072d118917957d6554Steve Block    this._lastResourceGridNodeId = 0;
44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._mainResourceLoadTime = -1;
45bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._mainResourceDOMContentTime = -1;
46a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._hiddenCategories = {};
47a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
48a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._categories = WebInspector.resourceCategories;
49a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
50a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this.containerElement = document.createElement("div");
51a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this.containerElement.id = "network-container";
52a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this.sidebarElement.appendChild(this.containerElement);
53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._viewsContainerElement = document.createElement("div");
55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._viewsContainerElement.id = "network-views";
56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._viewsContainerElement.className = "hidden";
57bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this.element.appendChild(this._viewsContainerElement);
58bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._closeButtonElement = document.createElement("button");
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._closeButtonElement.id = "network-close-button";
6128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._closeButtonElement.addEventListener("click", this._toggleGridMode.bind(this), false);
6228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    this._viewsContainerElement.appendChild(this._closeButtonElement);
63e14391e94c850b8bd03680c23b38978db68687a8John Reck
64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._createSortingFunctions();
65bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._createTable();
66a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._createTimelineGrid();
67bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._createStatusbarButtons();
68a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._createFilterStatusBarItems();
69a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._createSummaryBar();
70bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!WebInspector.settings.resourcesLargeRows)
7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._setLargerResources(WebInspector.settings.resourcesLargeRows);
7328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
74bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this._popoverHelper = new WebInspector.PopoverHelper(this.element, this._getPopoverAnchor.bind(this), this._showPopover.bind(this), true);
754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    // Enable faster hint.
764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    this._popoverHelper.setTimeout(100);
77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
78bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this.calculator = new WebInspector.NetworkTransferTimeCalculator();
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._filter(this._filterAllElement, false);
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
81a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._toggleGridMode();
82ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
83ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceStarted, this._onResourceStarted, this);
84ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceUpdated, this._onResourceUpdated, this);
85ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceFinished, this._onResourceUpdated, this);
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.FrameCommittedLoad, this._onFrameCommitLoad, this);
87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
88bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkPanel.prototype = {
90bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get toolbarItemLabel()
91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return WebInspector.UIString("Network");
93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get statusBarItems()
96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
9728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return [this._largerResourcesButton.element, this._preserveLogToggle.element, this._clearButton.element, this._filterBarElement];
98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    isCategoryVisible: function(categoryName)
101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return true;
103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    elementsToRestoreScrollPositionsFor: function()
106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return [this.containerElement, this._dataGrid.scrollContainer];
108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    resize: function()
111bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
112bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        WebInspector.Panel.prototype.resize.call(this);
113bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.updateWidths();
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        this._updateOffscreenRows();
115a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
116a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
11728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    updateSidebarWidth: function(width)
118a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
119a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!this._viewingResourceMode)
120a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
12128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        WebInspector.Panel.prototype.updateSidebarWidth.call(this, width);
122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
123a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
124a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    updateMainViewWidth: function(width)
125a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
126a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._viewsContainerElement.style.left = width + "px";
127a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
128a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
129a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    handleShortcut: function(event)
130a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
131a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this._viewingResourceMode && event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code) {
132a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._toggleGridMode();
133a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            event.handled = true;
134a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
135a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
136a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
137bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createTimelineGrid: function()
138bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
139bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineGrid = new WebInspector.TimelineGrid();
140bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineGrid.element.addStyleClass("network-timeline-grid");
141a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.appendChild(this._timelineGrid.element);
142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
144bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createTable: function()
145bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
146a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var columns = {name: {}, method: {}, status: {}, type: {}, size: {}, time: {}, timeline: {}};
147a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.name.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Name"), WebInspector.UIString("Path"));
148a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.name.sortable = true;
149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.name.width = "20%";
150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.name.disclosure = true;
151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
152bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.method.title = WebInspector.UIString("Method");
153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.method.sortable = true;
154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.method.width = "7%";
155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.status.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Status"), WebInspector.UIString("Text"));
157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.status.sortable = true;
158bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.status.width = "8%";
159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.type.title = WebInspector.UIString("Type");
161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.type.sortable = true;
162e14391e94c850b8bd03680c23b38978db68687a8John Reck        columns.type.width = "10%";
163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
164a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.size.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Size"), WebInspector.UIString("Transfer"));
165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.size.sortable = true;
166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.size.width = "10%";
167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.size.aligned = "right";
168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
16928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        columns.time.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Time"), WebInspector.UIString("Latency"));
170bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.time.sortable = true;
171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.time.width = "10%";
172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.time.aligned = "right";
173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        columns.timeline.title = "";
175a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.timeline.sortable = false;
176e14391e94c850b8bd03680c23b38978db68687a8John Reck        columns.timeline.width = "37%";
177a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        columns.timeline.sort = "ascending";
178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid = new WebInspector.DataGrid(columns);
180f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        this._dataGrid.element.addEventListener("contextmenu", this._contextMenu.bind(this), true);
181a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.containerElement.appendChild(this._dataGrid.element);
182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.addEventListener("sorting changed", this._sortItems, this);
183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.addEventListener("width changed", this._updateDividersIfNeeded, this);
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._dataGrid.scrollContainer.addEventListener("scroll", this._updateOffscreenRows.bind(this));
185a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
186a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._patchTimelineHeader();
187a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
188a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
189a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _makeHeaderFragment: function(title, subtitle)
190a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
191a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var fragment = document.createDocumentFragment();
192a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        fragment.appendChild(document.createTextNode(title));
193a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var subtitleDiv = document.createElement("div");
194a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        subtitleDiv.className = "network-header-subtitle";
195a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        subtitleDiv.textContent = subtitle;
196a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        fragment.appendChild(subtitleDiv);
197a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return fragment;
198a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
199a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
200a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _patchTimelineHeader: function()
201a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
202a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var timelineSorting = document.createElement("select");
203a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
204a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var option = document.createElement("option");
205a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "startTime";
206a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Timeline");
207a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
208a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
209a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
210a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "startTime";
211a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Start Time");
212a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
213a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
214a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
215a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "responseTime";
216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Response Time");
217a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
218a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
219a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
220a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "endTime";
221a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("End Time");
222a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
223a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
224a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
225a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "duration";
226a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Duration");
227a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
228a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
229a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option = document.createElement("option");
230a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.value = "latency";
231a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        option.label = WebInspector.UIString("Latency");
232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.appendChild(option);
233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
234a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var header = this._dataGrid.headerTableHeader("timeline");
235e14391e94c850b8bd03680c23b38978db68687a8John Reck        header.replaceChild(timelineSorting, header.firstChild);
236a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
237a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.addEventListener("click", function(event) { event.stopPropagation() }, false);
238a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        timelineSorting.addEventListener("change", this._sortByTimeline.bind(this), false);
239a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._timelineSortSelector = timelineSorting;
240bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
241bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
242bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createSortingFunctions: function()
243bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
244bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._sortingFunctions = {};
245a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.name = WebInspector.NetworkDataGridNode.NameComparator;
246a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.method = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "method", false);
247a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.status = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "statusCode", false);
248a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.type = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "mimeType", false);
249a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.size = WebInspector.NetworkDataGridNode.SizeComparator;
250a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.time = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "duration", false);
251a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.timeline = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "startTime", false);
252a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.startTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "startTime", false);
253a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.endTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "endTime", false);
254a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.responseTime = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "responseReceivedTime", false);
255a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.duration = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "duration", true);
256a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sortingFunctions.latency = WebInspector.NetworkDataGridNode.ResourcePropertyComparator.bind(null, "latency", true);
257a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
258a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var timeCalculator = new WebInspector.NetworkTransferTimeCalculator();
259a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var durationCalculator = new WebInspector.NetworkTransferDurationCalculator();
260a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
261a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators = {};
262a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.timeline = timeCalculator;
263a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.startTime = timeCalculator;
264a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.endTime = timeCalculator;
265a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.responseTime = timeCalculator;
266a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.duration = durationCalculator;
267a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._calculators.latency = durationCalculator;
268bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
269bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
270a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _sortItems: function()
271bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
272a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var columnIdentifier = this._dataGrid.sortColumnIdentifier;
273a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (columnIdentifier === "timeline") {
274a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._sortByTimeline();
275a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
276a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
277a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var sortingFunction = this._sortingFunctions[columnIdentifier];
278a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!sortingFunction)
279a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
280a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
281a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.sortNodes(sortingFunction, this._dataGrid.sortOrder === "descending");
282a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._timelineSortSelector.selectedIndex = 0;
2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._updateOffscreenRows();
284a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
285a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
286a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _sortByTimeline: function()
287a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
288a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var selectedIndex = this._timelineSortSelector.selectedIndex;
289a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!selectedIndex)
290a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            selectedIndex = 1; // Sort by start time by default.
291a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var selectedOption = this._timelineSortSelector[selectedIndex];
292a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var value = selectedOption.value;
293a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
294a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var sortingFunction = this._sortingFunctions[value];
295a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.sortNodes(sortingFunction);
296a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.calculator = this._calculators[value];
297a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this.calculator.startAtZero)
298a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._timelineGrid.hideEventDividers();
299a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        else
300a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._timelineGrid.showEventDividers();
301a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.markColumnAsSortedBy("timeline", "ascending");
3022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._updateOffscreenRows();
303a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
304a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
305a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _createFilterStatusBarItems: function()
306a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
307a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var filterBarElement = document.createElement("div");
308a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        filterBarElement.className = "scope-bar status-bar-item";
309a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        filterBarElement.id = "network-filter";
310a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
311a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        function createFilterElement(category, label)
312a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        {
313a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var categoryElement = document.createElement("li");
314a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            categoryElement.category = category;
315a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            categoryElement.className = category;
316a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            categoryElement.appendChild(document.createTextNode(label));
317a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            categoryElement.addEventListener("click", this._updateFilter.bind(this), false);
318a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            filterBarElement.appendChild(categoryElement);
319a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
320a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return categoryElement;
321a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
322a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
323a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._filterAllElement = createFilterElement.call(this, "all", WebInspector.UIString("All"));
324a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
325a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // Add a divider
326a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var dividerElement = document.createElement("div");
327a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        dividerElement.addStyleClass("scope-bar-divider");
328a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        filterBarElement.appendChild(dividerElement);
329a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
330a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (var category in this._categories)
331a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            createFilterElement.call(this, category, this._categories[category].title);
332a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._filterBarElement = filterBarElement;
333a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
334a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
335a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _createSummaryBar: function()
336a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
33781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        var tbody = this._dataGrid.dataTableBody;
33881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        var tfoot = document.createElement("tfoot");
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        var tr = tfoot.createChild("tr", "revealed network-summary-bar");
34081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        var td = tr.createChild("td");
34181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        td.setAttribute("colspan", 7);
34281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        tbody.parentNode.insertBefore(tfoot, tbody);
34381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        this._summaryBarElement = td;
344a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
345a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
346a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _updateSummaryBar: function()
347a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
348a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var numRequests = this._resources.length;
349a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
350a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!numRequests) {
351a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (this._summaryBarElement._isDisplayingWarning)
352a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                return;
353a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement._isDisplayingWarning = true;
354a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
355a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var img = document.createElement("img");
356a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            img.src = "Images/warningIcon.png";
357a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.removeChildren();
358a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.appendChild(img);
359a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._summaryBarElement.appendChild(document.createTextNode(
360a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                WebInspector.UIString("No requests captured. Reload the page to see detailed information on the network activity.")));
361a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
362a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
363a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this._summaryBarElement._isDisplayingWarning;
364a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
365a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var transferSize = 0;
366a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var baseTime = -1;
367a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var maxTime = -1;
368a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (var i = 0; i < this._resources.length; ++i) {
369a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var resource = this._resources[i];
3706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            transferSize += (resource.cached || !resource.transferSize) ? 0 : resource.transferSize;
3712bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (resource === WebInspector.mainResource)
372a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                baseTime = resource.startTime;
373f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (resource.endTime > maxTime)
374a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                maxTime = resource.endTime;
375a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
376a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var text = String.sprintf(WebInspector.UIString("%d requests"), numRequests);
377a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        text += "  \u2758  " + String.sprintf(WebInspector.UIString("%s transferred"), Number.bytesToString(transferSize));
378a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (baseTime !== -1 && this._mainResourceLoadTime !== -1 && this._mainResourceDOMContentTime !== -1 && this._mainResourceDOMContentTime > baseTime) {
379a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            text += "  \u2758  " + String.sprintf(WebInspector.UIString("%s (onload: %s, DOMContentLoaded: %s)"),
380a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        Number.secondsToString(maxTime - baseTime),
381a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        Number.secondsToString(this._mainResourceLoadTime - baseTime),
382a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        Number.secondsToString(this._mainResourceDOMContentTime - baseTime));
383a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
384a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._summaryBarElement.textContent = text;
385a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
386a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
387a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _showCategory: function(category)
388a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
389a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.addStyleClass("filter-" + category);
390a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        delete this._hiddenCategories[category];
391a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
392a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
393a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _hideCategory: function(category)
394a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
395a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.removeStyleClass("filter-" + category);
396a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._hiddenCategories[category] = true;
397bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
398bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
399bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _updateFilter: function(e)
400bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
401bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var isMac = WebInspector.isMac();
402bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var selectMultiple = false;
403bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
404bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            selectMultiple = true;
405bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
406bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            selectMultiple = true;
407bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
408a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._filter(e.target, selectMultiple);
409bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
410bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
411a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _filter: function(target, selectMultiple)
412a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
413a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        function unselectAll()
414a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        {
415a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            for (var i = 0; i < this._filterBarElement.childNodes.length; ++i) {
416a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                var child = this._filterBarElement.childNodes[i];
417a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                if (!child.category)
418a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                    continue;
419a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
420a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                child.removeStyleClass("selected");
421a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._hideCategory(child.category);
422a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
423a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
424a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
425a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (target.category === this._filterAllElement) {
426a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (target.hasStyleClass("selected")) {
427a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                // We can't unselect All, so we break early here
428a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                return;
429a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
430a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
431a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // If All wasn't selected, and now is, unselect everything else.
432a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            unselectAll.call(this);
433a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        } else {
434a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // Something other than All is being selected, so we want to unselect All.
435a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (this._filterAllElement.hasStyleClass("selected")) {
436a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._filterAllElement.removeStyleClass("selected");
437a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._hideCategory("all");
438a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
439a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
440a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
441a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!selectMultiple) {
442a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // If multiple selection is off, we want to unselect everything else
443a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // and just select ourselves.
444a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            unselectAll.call(this);
445a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
446a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            target.addStyleClass("selected");
447a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._showCategory(target.category);
44881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            this._updateOffscreenRows();
449a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
450a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
451a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
452a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (target.hasStyleClass("selected")) {
453a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // If selectMultiple is turned on, and we were selected, we just
454a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // want to unselect ourselves.
455a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            target.removeStyleClass("selected");
456a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._hideCategory(target.category);
457a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        } else {
458a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // If selectMultiple is turned on, and we weren't selected, we just
459a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // want to select ourselves.
460a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            target.addStyleClass("selected");
461a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._showCategory(target.category);
462a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
4632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._updateOffscreenRows();
464a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
465a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
466bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _scheduleRefresh: function()
467bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
468bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._needsRefresh)
469bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
470bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
471bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._needsRefresh = true;
472bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
473bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this.visible && !("_refreshTimeout" in this))
474bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._refreshTimeout = setTimeout(this.refresh.bind(this), 500);
475bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
476bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
477bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _updateDividersIfNeeded: function(force)
478bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
479a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var timelineColumn = this._dataGrid.columns.timeline;
480a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        for (var i = 0; i < this._dataGrid.resizers.length; ++i) {
481a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (timelineColumn.ordinal === this._dataGrid.resizers[i].rightNeighboringColumnID) {
482a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                // Position timline grid location.
483a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._timelineGrid.element.style.left = this._dataGrid.resizers[i].style.left;
484a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                this._timelineGrid.element.style.right = "18px";
485a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            }
486a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
487bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
488bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var proceed = true;
489bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!this.visible) {
490bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._scheduleRefresh();
491bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            proceed = false;
492bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else
493bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            proceed = this._timelineGrid.updateDividers(force, this.calculator);
494f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
495bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!proceed)
496bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
497bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
498bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this.calculator.startAtZero || !this.calculator.computePercentageFromEventTime) {
499bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // If our current sorting method starts at zero, that means it shows all
500bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // resources starting at the same point, and so onLoad event and DOMContent
501bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // event lines really wouldn't make much sense here, so don't render them.
502bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // Additionally, if the calculator doesn't have the computePercentageFromEventTime
503bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // function defined, we are probably sorting by size, and event times aren't relevant
504bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // in this case.
505bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
506bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
507bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
508bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineGrid.removeEventDividers();
509bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._mainResourceLoadTime !== -1) {
510bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var percent = this.calculator.computePercentageFromEventTime(this._mainResourceLoadTime);
511bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
512bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var loadDivider = document.createElement("div");
513bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDivider.className = "network-event-divider network-red-divider";
514bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
515bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var loadDividerPadding = document.createElement("div");
516bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDividerPadding.className = "network-event-divider-padding";
517bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDividerPadding.title = WebInspector.UIString("Load event fired");
518bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDividerPadding.appendChild(loadDivider);
519bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            loadDividerPadding.style.left = percent + "%";
520bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timelineGrid.addEventDivider(loadDividerPadding);
521bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
522f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
523bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._mainResourceDOMContentTime !== -1) {
524bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var percent = this.calculator.computePercentageFromEventTime(this._mainResourceDOMContentTime);
525bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
526bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var domContentDivider = document.createElement("div");
527bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDivider.className = "network-event-divider network-blue-divider";
528f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
529bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var domContentDividerPadding = document.createElement("div");
530bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDividerPadding.className = "network-event-divider-padding";
531bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDividerPadding.title = WebInspector.UIString("DOMContent event fired");
532bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDividerPadding.appendChild(domContentDivider);
533bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            domContentDividerPadding.style.left = percent + "%";
534bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timelineGrid.addEventDivider(domContentDividerPadding);
535bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
536bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
537bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
538bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshIfNeeded: function()
539bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
540bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._needsRefresh)
541bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.refresh();
542bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
543bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
544bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _invalidateAllItems: function()
545bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
546bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._staleResources = this._resources.slice();
547bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
548bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
549bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get calculator()
550bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
551bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return this._calculator;
552bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
553bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
554bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    set calculator(x)
555bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
556bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!x || this._calculator === x)
557bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
558bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
559bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._calculator = x;
560bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._calculator.reset();
561bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
562bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._invalidateAllItems();
563bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this.refresh();
564bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
565bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
566bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _resourceGridNode: function(resource)
567bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
5682bde8e466a4451c7319e3a072d118917957d6554Steve Block        return this._resourceGridNodes[resource.__gridNodeId];
5692bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
5702bde8e466a4451c7319e3a072d118917957d6554Steve Block
5712bde8e466a4451c7319e3a072d118917957d6554Steve Block    _createResourceGridNode: function(resource)
5722bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
5732bde8e466a4451c7319e3a072d118917957d6554Steve Block        var node = new WebInspector.NetworkDataGridNode(this, resource);
5742bde8e466a4451c7319e3a072d118917957d6554Steve Block        resource.__gridNodeId = this._lastResourceGridNodeId++;
5752bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._resourceGridNodes[resource.__gridNodeId] = node;
5762bde8e466a4451c7319e3a072d118917957d6554Steve Block        return node;
577bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
578bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
579bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    revealAndSelectItem: function(resource)
580bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
581bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var node = this._resourceGridNode(resource);
582bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (node) {
583bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            node.reveal();
584bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            node.select(true);
585bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
586bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
587bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
588bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    addEventDivider: function(divider)
589bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
590bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineGrid.addEventDivider(divider);
591bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
592bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
593bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createStatusbarButtons: function()
594bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
59528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._preserveLogToggle = new WebInspector.StatusBarButton(WebInspector.UIString("Preserve Log upon Navigation"), "record-profile-status-bar-item");
59628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._preserveLogToggle.addEventListener("click", this._onPreserveLogClicked.bind(this), false);
59728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
598bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-status-bar-item");
599a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._clearButton.addEventListener("click", this._reset.bind(this), false);
600bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
601bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "network-larger-resources-status-bar-item");
60228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._largerResourcesButton.toggled = WebInspector.settings.resourcesLargeRows;
603e14391e94c850b8bd03680c23b38978db68687a8John Reck        this._largerResourcesButton.addEventListener("click", this._toggleLargerResources.bind(this), false);
604bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
605bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
606bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    set mainResourceLoadTime(x)
607bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
608bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._mainResourceLoadTime === x)
609bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
610f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
611bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._mainResourceLoadTime = x || -1;
612bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // Update the dividers to draw the new line
613bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._updateDividersIfNeeded(true);
614bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
615bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
616bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    set mainResourceDOMContentTime(x)
617bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
618bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._mainResourceDOMContentTime === x)
619bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
620bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
621bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._mainResourceDOMContentTime = x || -1;
622bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._updateDividersIfNeeded(true);
623bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
624bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
625bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    show: function()
626bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
627bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        WebInspector.Panel.prototype.show.call(this);
628bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._refreshIfNeeded();
629bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
6304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (this.visibleView)
631bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.visibleView.show(this._viewsContainerElement);
632bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
633bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.updateWidths();
634a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
635a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
636a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    hide: function()
637a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
638a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        WebInspector.Panel.prototype.hide.call(this);
639a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._popoverHelper.hidePopup();
640bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
641bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
642bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get searchableViews()
643bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
644bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var views = [];
645bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return views;
646bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
647bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
648bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    searchMatchFound: function(view, matches)
649bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
650bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._resourceGridNode(view.resource).searchMatches = matches;
651bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
652bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
653bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    searchCanceled: function(startingNewSearch)
654bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
655bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        WebInspector.Panel.prototype.searchCanceled.call(this, startingNewSearch);
656bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
657bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (startingNewSearch || !this._resources)
658bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
659bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
660bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
661bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    performSearch: function(query)
662bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
663bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        WebInspector.Panel.prototype.performSearch.call(this, query);
664bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
665bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
666bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    refresh: function()
667bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
668bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._needsRefresh = false;
669bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if ("_refreshTimeout" in this) {
670bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            clearTimeout(this._refreshTimeout);
671bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            delete this._refreshTimeout;
672bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
673bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
67428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        var wasScrolledToLastRow = this._dataGrid.isScrolledToLastRow();
675bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var staleItemsLength = this._staleResources.length;
676bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var boundariesChanged = false;
677bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
678bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var i = 0; i < staleItemsLength; ++i) {
679bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var resource = this._staleResources[i];
680bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var node = this._resourceGridNode(resource);
681bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (!node) {
682bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                // Create the timeline tree element and graph.
6832bde8e466a4451c7319e3a072d118917957d6554Steve Block                node = this._createResourceGridNode(resource);
684bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                this._dataGrid.appendChild(node);
685bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            }
686bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            node.refreshResource();
687bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
688bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (this.calculator.updateBoundaries(resource))
689bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                boundariesChanged = true;
690bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
691bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
692bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (boundariesChanged) {
693bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // The boundaries changed, so all item graphs are stale.
694bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._invalidateAllItems();
695bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            staleItemsLength = this._staleResources.length;
696bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
697bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
698bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var i = 0; i < staleItemsLength; ++i)
699bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._resourceGridNode(this._staleResources[i]).refreshGraph(this.calculator);
700bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
701bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._staleResources = [];
702bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._sortItems();
703a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._updateSummaryBar();
70481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        this._updateOffscreenRows();
705bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.updateWidths();
70628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
70728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (wasScrolledToLastRow)
70828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            this._dataGrid.scrollToLastRow();
70928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    },
71028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
71128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    _onPreserveLogClicked: function(e)
71228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    {
71328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._preserveLogToggle.toggled = !this._preserveLogToggle.toggled;
71428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    },
71528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
716a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _reset: function()
717bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
718bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._popoverHelper.hidePopup();
719a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._closeVisibleResource();
720bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
721a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._toggleGridMode();
722bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
723bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // Begin reset timeline
724bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._calculator)
725bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._calculator.reset();
726bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
727bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._resources = [];
728e14391e94c850b8bd03680c23b38978db68687a8John Reck        this._resourcesById = {};
72928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._resourcesByURL = {};
730bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._staleResources = [];
731bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._resourceGridNodes = {};
732bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
733bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._dataGrid.removeChildren();
734bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._updateDividersIfNeeded(true);
735bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // End reset timeline.
736a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
737bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._mainResourceLoadTime = -1;
738bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._mainResourceDOMContentTime = -1;
739f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
740bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._viewsContainerElement.removeChildren();
74128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._viewsContainerElement.appendChild(this._closeButtonElement);
74281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        this._updateSummaryBar();
74381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        WebInspector.extensionServer.resetResources();
744bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
745bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
746e14391e94c850b8bd03680c23b38978db68687a8John Reck    get resources()
747e14391e94c850b8bd03680c23b38978db68687a8John Reck    {
74865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return this._resources;
749e14391e94c850b8bd03680c23b38978db68687a8John Reck    },
750e14391e94c850b8bd03680c23b38978db68687a8John Reck
75165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    resourceById: function(id)
752bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
75365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return this._resourcesById[id];
75465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    },
755bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
756ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _onResourceStarted: function(event)
757ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
758ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        this._appendResource(event.data);
759ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    },
760ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
761ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _appendResource: function(resource)
76265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
76365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._resources.push(resource);
76465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._resourcesById[resource.identifier] = resource;
76565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._resourcesByURL[resource.url] = resource;
76628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
76765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Pull all the redirects of the main resource upon commit load.
76865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (resource.redirects) {
76965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            for (var i = 0; i < resource.redirects.length; ++i)
770ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                this._refreshResource(resource.redirects[i]);
77128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
77228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
773ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        this._refreshResource(resource);
774ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    },
775ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
776ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _onResourceUpdated: function(event)
777ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
778ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        this._refreshResource(event.data);
77965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    },
78065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
781ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _refreshResource: function(resource)
78265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
783bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._staleResources.push(resource);
784bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._scheduleRefresh();
785f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
786cad810f21b803229eb11403f9209855525a25d57Steve Block        var oldView = WebInspector.ResourceView.existingResourceViewForResource(resource);
7874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (!oldView)
788bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
789bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
790cad810f21b803229eb11403f9209855525a25d57Steve Block        if (WebInspector.ResourceView.resourceViewTypeMatchesResource(resource))
7914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return;
792bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
793cad810f21b803229eb11403f9209855525a25d57Steve Block        var newView = WebInspector.ResourceView.recreateResourceView(resource);
7944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (this.visibleView === oldView)
7954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this.visibleView = newView;
796bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
797bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
79865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    clear: function()
79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
80065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (this._preserveLogToggle.toggled)
80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
80265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._reset();
80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    },
80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8052bde8e466a4451c7319e3a072d118917957d6554Steve Block    _onFrameCommitLoad: function(event)
80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
8072bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (event.data.frame.parentId)
8082bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
8092bde8e466a4451c7319e3a072d118917957d6554Steve Block
8102bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Main frame committed load.
81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (this._preserveLogToggle.toggled)
81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8142bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Preserve provisional load resources.
8152bde8e466a4451c7319e3a072d118917957d6554Steve Block        var loaderId = event.data.loaderId;
8162bde8e466a4451c7319e3a072d118917957d6554Steve Block        var resourcesToPreserve = [];
8172bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (var i = 0; i < this._resources.length; ++i) {
8182bde8e466a4451c7319e3a072d118917957d6554Steve Block            var resource = this._resources[i];
8192bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (resource.loaderId === loaderId)
8202bde8e466a4451c7319e3a072d118917957d6554Steve Block                resourcesToPreserve.push(resource);
8212bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
8222bde8e466a4451c7319e3a072d118917957d6554Steve Block
82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        this._reset();
8242bde8e466a4451c7319e3a072d118917957d6554Steve Block
8252bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Restore preserved items.
8262bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (var i = 0; i < resourcesToPreserve.length; ++i)
8272bde8e466a4451c7319e3a072d118917957d6554Steve Block            this._appendResource(resourcesToPreserve[i]);
82865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    },
82965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    canShowAnchorLocation: function(anchor)
831bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
8322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return !!this._resourcesByURL[anchor.href];
833bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
834bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
8352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    showAnchorLocation: function(anchor)
836bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
8372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._showResource(this._resourcesByURL[anchor.href], anchor.getAttribute("line_number") - 1);
838bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
839bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
840a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _showResource: function(resource, line)
841bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
842bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!resource)
843bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return;
844bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
845bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._popoverHelper.hidePopup();
846bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
847a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._toggleViewingResourceMode();
848bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
8494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (this.visibleView) {
8504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this.visibleView.detach();
8514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            delete this.visibleView;
8524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
853bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
8544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        var view = new WebInspector.NetworkItemView(resource);
855bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        view.show(this._viewsContainerElement);
8564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        this.visibleView = view;
857bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
858bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this.updateSidebarWidth();
859bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
860bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
861a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _closeVisibleResource: function()
862bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
863a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.element.removeStyleClass("viewing-resource");
864bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
8654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (this.visibleView) {
8664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this.visibleView.detach();
8674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            delete this.visibleView;
8684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
869bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
870bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._lastSelectedGraphTreeElement)
871bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._lastSelectedGraphTreeElement.select(true);
872bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
873bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this.updateSidebarWidth();
874bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
875bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
876bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _toggleLargerResources: function()
877bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
87828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        WebInspector.settings.resourcesLargeRows = !WebInspector.settings.resourcesLargeRows;
87928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._setLargerResources(WebInspector.settings.resourcesLargeRows);
880bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
881bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
882bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _setLargerResources: function(enabled)
883bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
884bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._largerResourcesButton.toggled = enabled;
885bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!enabled) {
886bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._largerResourcesButton.title = WebInspector.UIString("Use large resource rows.");
887bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._dataGrid.element.addStyleClass("small");
888a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._timelineGrid.element.addStyleClass("small");
889e14391e94c850b8bd03680c23b38978db68687a8John Reck            this._viewsContainerElement.addStyleClass("small");
890bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
891bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._largerResourcesButton.title = WebInspector.UIString("Use small resource rows.");
892bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._dataGrid.element.removeStyleClass("small");
893a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._timelineGrid.element.removeStyleClass("small");
894e14391e94c850b8bd03680c23b38978db68687a8John Reck            this._viewsContainerElement.removeStyleClass("small");
895bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
89681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        this._updateOffscreenRows();
897bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
898bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
899bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _getPopoverAnchor: function(element)
900bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
901bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var anchor = element.enclosingNodeOrSelfWithClass("network-graph-bar") || element.enclosingNodeOrSelfWithClass("network-graph-label");
902bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!anchor)
903bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return null;
904bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resource = anchor.parentElement.resource;
905bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return resource && resource.timing ? anchor : null;
906bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
907bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
908bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _showPopover: function(anchor)
909bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
910bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resource = anchor.parentElement.resource;
9114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        var tableElement = WebInspector.ResourceTimingView.createTimingTable(resource);
912bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var popover = new WebInspector.Popover(tableElement);
913bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        popover.show(anchor);
914bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return popover;
915bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
916bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
917a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _toggleGridMode: function()
918bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
919a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this._viewingResourceMode) {
920a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._viewingResourceMode = false;
921a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this.element.removeStyleClass("viewing-resource");
922a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.removeStyleClass("viewing-resource-mode");
923a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._viewsContainerElement.addStyleClass("hidden");
924a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this.sidebarElement.style.right = 0;
925a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this.sidebarElement.style.removeProperty("width");
9264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (this._dataGrid.selectedNode)
9274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                this._dataGrid.selectedNode.selected = false;
928a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
929a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
930a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this._briefGrid) {
931a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.removeStyleClass("full-grid-mode");
932a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.addStyleClass("brief-grid-mode");
933a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
934a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("method");
935a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("status");
936a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("type");
937a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("size");
938a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.hideColumn("time");
939a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
940a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var widths = {};
941a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.name = 20;
942a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.timeline = 80;
943a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        } else {
944a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.addStyleClass("full-grid-mode");
945a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.element.removeStyleClass("brief-grid-mode");
946a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
947a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("method");
948a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("status");
949a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("type");
950a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("size");
951a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            this._dataGrid.showColumn("time");
952a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
953a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            var widths = {};
954a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.name = 20;
955a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.method = 7;
956a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.status = 8;
957e14391e94c850b8bd03680c23b38978db68687a8John Reck            widths.type = 10;
958a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.size = 10;
959a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            widths.time = 10;
960e14391e94c850b8bd03680c23b38978db68687a8John Reck            widths.timeline = 37;
961a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
962a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
963a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.showColumn("timeline");
964a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.applyColumnWidthsMap(widths);
965a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
966a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    },
967a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
968a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _toggleViewingResourceMode: function()
969a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
970a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (this._viewingResourceMode)
971a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
972a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._viewingResourceMode = true;
973a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._preservedColumnWidths = this._dataGrid.columnWidthsMap();
974a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
975a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.element.addStyleClass("viewing-resource");
976a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.addStyleClass("viewing-resource-mode");
977a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.removeStyleClass("full-grid-mode");
978a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.element.removeStyleClass("brief-grid-mode");
979a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
980a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("method");
981a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("status");
982a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("type");
983a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("size");
984a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("time");
985a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.hideColumn("timeline");
986a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
987a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._viewsContainerElement.removeStyleClass("hidden");
988a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this.updateSidebarWidth(200);
989a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
990a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        var widths = {};
991a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        widths.name = 100;
992a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._dataGrid.applyColumnWidthsMap(widths);
993f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
994f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
995f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _contextMenu: function(event)
996f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
997f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var contextMenu = new WebInspector.ContextMenu();
998f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var gridNode = this._dataGrid.dataGridNodeFromNode(event.target);
999f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var resource = gridNode && gridNode._resource;
1000f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (resource)
10012bde8e466a4451c7319e3a072d118917957d6554Steve Block            contextMenu.appendItem(WebInspector.UIString("Copy entry as HAR"), this._exportResource.bind(this, resource));
10022bde8e466a4451c7319e3a072d118917957d6554Steve Block        contextMenu.appendItem(WebInspector.UIString("Copy network log as HAR"), this._exportAll.bind(this));
1003f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        contextMenu.show(event);
1004f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
1005f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1006f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _exportAll: function()
1007f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
1008f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var harArchive = {
1009f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            log: (new WebInspector.HARLog()).build()
1010f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
10112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        InspectorFrontendHost.copyText(JSON.stringify(harArchive));
1012f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    },
1013f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1014f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _exportResource: function(resource)
1015f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
1016f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        var har = (new WebInspector.HAREntry(resource)).build();
10172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        InspectorFrontendHost.copyText(JSON.stringify(har));
10182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
10192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _updateOffscreenRows: function(e)
10212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
10222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var dataTableBody = this._dataGrid.dataTableBody;
10232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var rows = dataTableBody.children;
10242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var recordsCount = rows.length;
10252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (recordsCount < 2)
10262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;  // Filler row only.
10272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var visibleTop = this._dataGrid.scrollContainer.scrollTop;
10292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var visibleBottom = visibleTop + this._dataGrid.scrollContainer.offsetHeight;
10302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var rowHeight = 0;
10322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Filler is at recordsCount - 1.
10342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var unfilteredRowIndex = 0;
10352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (var i = 0; i < recordsCount - 1; ++i) {
10362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            var row = rows[i];
10372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            var dataGridNode = this._dataGrid.dataGridNodeFromNode(row);
10392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (dataGridNode.isFilteredOut()) {
10402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                row.removeStyleClass("offscreen");
10412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                continue;
10422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
10432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!rowHeight)
10452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                rowHeight = row.offsetHeight;
10462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            var rowIsVisible = unfilteredRowIndex * rowHeight < visibleBottom && (unfilteredRowIndex + 1) * rowHeight > visibleTop;
10482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (rowIsVisible !== row.rowIsVisible) {
10492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (rowIsVisible)
10502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    row.removeStyleClass("offscreen");
10512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                else
10522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    row.addStyleClass("offscreen");
10532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                row.rowIsVisible = rowIsVisible;
10542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            }
10552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            unfilteredRowIndex++;
10562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
1057bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1058bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1059bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1060bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkPanel.prototype.__proto__ = WebInspector.Panel.prototype;
1061bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1062bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkBaseCalculator = function()
1063bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1064bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1065bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1066bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkBaseCalculator.prototype = {
1067bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeSummaryValues: function(items)
1068bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1069bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var total = 0;
1070bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var categoryValues = {};
1071bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1072bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var itemsLength = items.length;
1073bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var i = 0; i < itemsLength; ++i) {
1074bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var item = items[i];
1075bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var value = this._value(item);
1076bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (typeof value === "undefined")
1077bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                continue;
1078bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (!(item.category.name in categoryValues))
1079bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                categoryValues[item.category.name] = 0;
1080bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            categoryValues[item.category.name] += value;
1081bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            total += value;
1082bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1083bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1084bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {categoryValues: categoryValues, total: total};
1085bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1086bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1087bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeBarGraphPercentages: function(item)
1088bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1089bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {start: 0, middle: 0, end: (this._value(item) / this.boundarySpan) * 100};
1090bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1091bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1092bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeBarGraphLabels: function(item)
1093bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1094bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const label = this.formatValue(this._value(item));
1095bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {left: label, right: label, tooltip: label};
1096bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1097bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1098bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    get boundarySpan()
1099bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return this.maximumBoundary - this.minimumBoundary;
1101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    updateBoundaries: function(item)
1104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this.minimumBoundary = 0;
1106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var value = this._value(item);
1108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (typeof this.maximumBoundary === "undefined" || value > this.maximumBoundary) {
1109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.maximumBoundary = value;
1110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return true;
1111bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1112bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
1113bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1114bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1115bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    reset: function()
1116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this.minimumBoundary;
1118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this.maximumBoundary;
1119bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1120bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1121bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _value: function(item)
1122bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1123bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1125bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1126bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    formatValue: function(value)
1127bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1128bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return value.toString();
1129bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1130bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1131bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1132bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTimeCalculator = function(startAtZero)
1133bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1134bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebInspector.NetworkBaseCalculator.call(this);
1135bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    this.startAtZero = startAtZero;
1136bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1137bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1138bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTimeCalculator.prototype = {
1139bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeSummaryValues: function(resources)
1140bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resourcesByCategory = {};
1142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resourcesLength = resources.length;
1143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var i = 0; i < resourcesLength; ++i) {
1144bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var resource = resources[i];
1145bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (!(resource.category.name in resourcesByCategory))
1146bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                resourcesByCategory[resource.category.name] = [];
1147bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            resourcesByCategory[resource.category.name].push(resource);
1148bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1149bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1150bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var earliestStart;
1151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var latestEnd;
1152bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var categoryValues = {};
1153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for (var category in resourcesByCategory) {
1154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            resourcesByCategory[category].sort(WebInspector.Resource.CompareByTime);
1155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            categoryValues[category] = 0;
1156bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var segment = {start: -1, end: -1};
1158bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var categoryResources = resourcesByCategory[category];
1160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var resourcesLength = categoryResources.length;
1161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            for (var i = 0; i < resourcesLength; ++i) {
1162bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                var resource = categoryResources[i];
1163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (resource.startTime === -1 || resource.endTime === -1)
1164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    continue;
1165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (typeof earliestStart === "undefined")
1167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    earliestStart = resource.startTime;
1168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                else
1169bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    earliestStart = Math.min(earliestStart, resource.startTime);
1170bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (typeof latestEnd === "undefined")
1172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    latestEnd = resource.endTime;
1173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                else
1174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    latestEnd = Math.max(latestEnd, resource.endTime);
1175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                if (resource.startTime <= segment.end) {
1177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    segment.end = Math.max(segment.end, resource.endTime);
1178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                    continue;
1179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                }
1180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1181bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                categoryValues[category] += segment.end - segment.start;
1182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                segment.start = resource.startTime;
1184bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                segment.end = resource.endTime;
1185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            }
1186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1187bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // Add the last segment
1188bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            categoryValues[category] += segment.end - segment.start;
1189bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1191bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {categoryValues: categoryValues, total: latestEnd - earliestStart};
1192bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1193bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1194bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeBarGraphPercentages: function(resource)
1195bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1196bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.startTime !== -1)
1197bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var start = ((resource.startTime - this.minimumBoundary) / this.boundarySpan) * 100;
1198bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var start = 0;
1200bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1201bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.responseReceivedTime !== -1)
1202bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var middle = ((resource.responseReceivedTime - this.minimumBoundary) / this.boundarySpan) * 100;
1203bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1204bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var middle = (this.startAtZero ? start : 100);
1205bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1206bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.endTime !== -1)
1207bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var end = ((resource.endTime - this.minimumBoundary) / this.boundarySpan) * 100;
1208bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1209bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var end = (this.startAtZero ? middle : 100);
1210bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1211bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this.startAtZero) {
1212bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            end -= start;
1213bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            middle -= start;
1214bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            start = 0;
1215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {start: start, middle: middle, end: end};
1218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1219f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1220bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computePercentageFromEventTime: function(eventTime)
1221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // This function computes a percentage in terms of the total loading time
1223bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // of a specific event. If startAtZero is set, then this is useless, and we
1224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // want to return 0.
1225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (eventTime !== -1 && !this.startAtZero)
1226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return ((eventTime - this.minimumBoundary) / this.boundarySpan) * 100;
1227bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1228bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1229bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1230bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1231bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    computeBarGraphLabels: function(resource)
1232bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1233bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var rightLabel = "";
1234bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.responseReceivedTime !== -1 && resource.endTime !== -1)
1235bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            rightLabel = this.formatValue(resource.endTime - resource.responseReceivedTime);
1236bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1237bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var hasLatency = resource.latency > 0;
1238bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (hasLatency)
1239bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftLabel = this.formatValue(resource.latency);
1240bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1241bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftLabel = rightLabel;
1242bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1243bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.timing)
1244bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            return {left: leftLabel, right: rightLabel};
1245bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1246bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (hasLatency && rightLabel) {
1247bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var total = this.formatValue(resource.duration);
1248bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);
1249bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else if (hasLatency)
1250bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var tooltip = WebInspector.UIString("%s latency", leftLabel);
1251bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else if (rightLabel)
1252bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var tooltip = WebInspector.UIString("%s download", rightLabel);
1253bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1254bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (resource.cached)
1255bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            tooltip = WebInspector.UIString("%s (from cache)", tooltip);
1256bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return {left: leftLabel, right: rightLabel, tooltip: tooltip};
1257bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1258bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1259bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    updateBoundaries: function(resource)
1260bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1261bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var didChange = false;
1262bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1263bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var lowerBound;
1264bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this.startAtZero)
1265bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            lowerBound = 0;
1266bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1267bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            lowerBound = this._lowerBound(resource);
1268bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1269bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (lowerBound !== -1 && (typeof this.minimumBoundary === "undefined" || lowerBound < this.minimumBoundary)) {
1270bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.minimumBoundary = lowerBound;
1271bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            didChange = true;
1272bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1273bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1274bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var upperBound = this._upperBound(resource);
1275bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (upperBound !== -1 && (typeof this.maximumBoundary === "undefined" || upperBound > this.maximumBoundary)) {
1276bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this.maximumBoundary = upperBound;
1277bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            didChange = true;
1278bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1279bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1280bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return didChange;
1281bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1282bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1283bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    formatValue: function(value)
1284bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
128565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return Number.secondsToString(value);
1286bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1287bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1288bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _lowerBound: function(resource)
1289bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1290bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1291bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1292bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1293bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _upperBound: function(resource)
1294bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1295bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1296bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1297bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1298bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1299bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTimeCalculator.prototype.__proto__ = WebInspector.NetworkBaseCalculator.prototype;
1300bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1301bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferTimeCalculator = function()
1302bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1303bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebInspector.NetworkTimeCalculator.call(this, false);
1304bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1305bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1306bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferTimeCalculator.prototype = {
1307bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    formatValue: function(value)
1308bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
130965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return Number.secondsToString(value);
1310bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1311bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1312bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _lowerBound: function(resource)
1313bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1314bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return resource.startTime;
1315bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1316bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1317bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _upperBound: function(resource)
1318bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1319bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return resource.endTime;
1320bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1321bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1322bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1323bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferTimeCalculator.prototype.__proto__ = WebInspector.NetworkTimeCalculator.prototype;
1324bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1325bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferDurationCalculator = function()
1326bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1327bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebInspector.NetworkTimeCalculator.call(this, true);
1328bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1329bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1330bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferDurationCalculator.prototype = {
1331bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    formatValue: function(value)
1332bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
133365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return Number.secondsToString(value);
1334bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1335bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1336bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _upperBound: function(resource)
1337bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1338bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return resource.duration;
1339bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1340bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1341bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1342bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkTransferDurationCalculator.prototype.__proto__ = WebInspector.NetworkTimeCalculator.prototype;
1343bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1344a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode = function(panel, resource)
1345bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1346a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WebInspector.DataGridNode.call(this, {});
1347a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._panel = panel;
1348a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    this._resource = resource;
1349bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1350bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1351a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode.prototype = {
1352a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    createCells: function()
1353bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1354a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell = this._createDivInTD("name");
1355a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._methodCell = this._createDivInTD("method");
1356a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._statusCell = this._createDivInTD("status");
1357a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._typeCell = this._createDivInTD("type");
1358a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._sizeCell = this._createDivInTD("size");
1359a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._timeCell = this._createDivInTD("time");
1360a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._createTimelineCell();
13614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        this._nameCell.addEventListener("click", this.select.bind(this), false);
13622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._nameCell.addEventListener("dblclick", this._openInNewTab.bind(this), false);
13632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
13642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    isFilteredOut: function()
13662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
13672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!this._panel._hiddenCategories.all)
13682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
13692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return this._resource.category.name in this._panel._hiddenCategories;
1370bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1371bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1372a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    select: function()
1373bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1374a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._panel._showResource(this._resource);
13754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        WebInspector.DataGridNode.prototype.select.apply(this, arguments);
1376bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1377bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
13782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _openInNewTab: function()
13792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
13802bde8e466a4451c7319e3a072d118917957d6554Steve Block        PageAgent.openInInspectedWindow(this._resource.url);
13812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
13822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1383a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    get selectable()
1384bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
13854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (!this._panel._viewingResourceMode)
13864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return false;
13872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return !this.isFilteredOut();
1388bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1389bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1390a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _createDivInTD: function(columnIdentifier)
1391bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1392bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var td = document.createElement("td");
1393a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        td.className = columnIdentifier + "-column";
1394bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var div = document.createElement("div");
1395bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        td.appendChild(div);
1396bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._element.appendChild(td);
1397bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return div;
1398bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1399bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1400bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _createTimelineCell: function()
1401bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1402bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._graphElement = document.createElement("div");
1403bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._graphElement.className = "network-graph-side";
1404bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1405bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement = document.createElement("div");
1406bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        //    this._barAreaElement.className = "network-graph-bar-area hidden";
1407bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.className = "network-graph-bar-area";
1408bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.resource = this._resource;
1409bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._graphElement.appendChild(this._barAreaElement);
1410bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1411bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement = document.createElement("div");
1412bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement.className = "network-graph-bar waiting";
1413bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.appendChild(this._barLeftElement);
1414bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1415bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement = document.createElement("div");
1416bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement.className = "network-graph-bar";
1417bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.appendChild(this._barRightElement);
1418bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
14194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1420bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement = document.createElement("div");
1421bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.className = "network-graph-label waiting";
1422bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.appendChild(this._labelLeftElement);
1423bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1424bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement = document.createElement("div");
1425bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.className = "network-graph-label";
1426bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.appendChild(this._labelRightElement);
1427bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
14284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        this._graphElement.addEventListener("mouseover", this._refreshLabelPositions.bind(this), false);
14294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1430bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineCell = document.createElement("td");
1431a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._timelineCell.className = "timeline-column";
1432bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._element.appendChild(this._timelineCell);
1433bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._timelineCell.appendChild(this._graphElement);
1434bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1435bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1436bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    refreshResource: function()
1437bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1438a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._refreshNameCell();
1439bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1440bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._methodCell.textContent = this._resource.requestMethod;
1441bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1442bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._refreshStatusCell();
1443bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1444bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.mimeType) {
1445bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._typeCell.removeStyleClass("network-dim-cell");
1446bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._typeCell.textContent = this._resource.mimeType;
1447bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1448bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._typeCell.addStyleClass("network-dim-cell");
1449bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._typeCell.textContent = WebInspector.UIString("Pending");
1450bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1451bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1452bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._refreshSizeCell();
1453bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._refreshTimeCell();
1454bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1455bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.cached)
1456bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._graphElement.addStyleClass("resource-cached");
1457bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1458f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        this._element.addStyleClass("network-item");
1459bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!this._element.hasStyleClass("network-category-" + this._resource.category.name)) {
1460bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._element.removeMatchingStyleClasses("network-category-\\w+");
1461bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._element.addStyleClass("network-category-" + this._resource.category.name);
1462bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1463bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1464bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1465a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    _refreshNameCell: function()
1466bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1467a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell.removeChildren();
1468bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1469bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.category === WebInspector.resourceCategories.images) {
1470bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var previewImage = document.createElement("img");
1471bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            previewImage.className = "image-network-icon-preview";
147265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            this._resource.populateImageSource(previewImage);
1473bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1474bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var iconElement = document.createElement("div");
1475bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            iconElement.className = "icon";
1476bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            iconElement.appendChild(previewImage);
1477bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1478bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var iconElement = document.createElement("img");
1479bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            iconElement.className = "icon";
1480bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1481a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell.appendChild(iconElement);
1482a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell.appendChild(document.createTextNode(this._fileName()));
1483bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1484bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1485bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var subtitle = this._resource.displayDomain;
1486bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1487bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.path && this._resource.lastPathComponent) {
1488bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var lastPathComponentIndex = this._resource.path.lastIndexOf("/" + this._resource.lastPathComponent);
1489bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (lastPathComponentIndex != -1)
1490bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                subtitle += this._resource.path.substring(0, lastPathComponentIndex);
1491bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1492bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1493a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._appendSubtitle(this._nameCell, subtitle);
1494a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        this._nameCell.title = this._resource.url;
1495bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1496bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1497bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _fileName: function()
1498bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1499bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var fileName = this._resource.displayName;
1500bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.queryString)
1501bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            fileName += "?" + this._resource.queryString;
1502bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return fileName;
1503bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1504bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1505bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshStatusCell: function()
1506bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1507bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._statusCell.removeChildren();
1508bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
15092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (this._resource.failed) {
15102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (this._resource.canceled)
15112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._statusCell.textContent = WebInspector.UIString("(canceled)");
15122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            else
15132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._statusCell.textContent = WebInspector.UIString("(failed)");
15142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._statusCell.addStyleClass("network-dim-cell");
15152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
15162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
15172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
15184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        var fromCache = this._resource.cached;
15194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (fromCache) {
15204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this._statusCell.textContent = WebInspector.UIString("(from cache)");
15214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            this._statusCell.addStyleClass("network-dim-cell");
15224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            return;
15234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
15244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
15254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        this._statusCell.removeStyleClass("network-dim-cell");
1526bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.statusCode) {
1527bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.appendChild(document.createTextNode(this._resource.statusCode));
1528bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.removeStyleClass("network-dim-cell");
1529bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._appendSubtitle(this._statusCell, this._resource.statusText);
1530bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.title = this._resource.statusCode + " " + this._resource.statusText;
1531bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
15322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (this._resource.isDataURL() && this._resource.finished)
15332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._statusCell.textContent = WebInspector.UIString("(data url)");
15342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            else
15352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._statusCell.textContent = WebInspector.UIString("Pending");
1536bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._statusCell.addStyleClass("network-dim-cell");
1537bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1538bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1539bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1540bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshSizeCell: function()
1541bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1542bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var resourceSize = typeof this._resource.resourceSize === "number" ? Number.bytesToString(this._resource.resourceSize) : "?";
1543bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var transferSize = typeof this._resource.transferSize === "number" ? Number.bytesToString(this._resource.transferSize) : "?";
1544bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var fromCache = this._resource.cached;
1545bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._sizeCell.textContent = !fromCache ? resourceSize : WebInspector.UIString("(from cache)");
1546bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (fromCache)
1547bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._sizeCell.addStyleClass("network-dim-cell");
1548bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
1549bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._sizeCell.removeStyleClass("network-dim-cell");
1550bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!fromCache)
1551bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._appendSubtitle(this._sizeCell, transferSize);
1552bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1553bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1554bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshTimeCell: function()
1555bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1556bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._resource.duration > 0) {
1557bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timeCell.removeStyleClass("network-dim-cell");
1558bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timeCell.textContent = Number.secondsToString(this._resource.duration);
1559bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._appendSubtitle(this._timeCell, Number.secondsToString(this._resource.latency));
1560bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1561bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timeCell.addStyleClass("network-dim-cell");
1562bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._timeCell.textContent = WebInspector.UIString("Pending");
1563bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1564bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1565bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1566bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _appendSubtitle: function(cellElement, subtitleText)
1567bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1568bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var subtitleElement = document.createElement("div");
1569a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        subtitleElement.className = "network-cell-subtitle";
1570bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        subtitleElement.textContent = subtitleText;
1571bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        cellElement.appendChild(subtitleElement);
1572bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1573bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1574bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    refreshGraph: function(calculator)
1575bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1576bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var percentages = calculator.computeBarGraphPercentages(this._resource);
1577bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._percentages = percentages;
1578bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1579bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barAreaElement.removeStyleClass("hidden");
1580bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1581bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!this._graphElement.hasStyleClass("network-category-" + this._resource.category.name)) {
1582bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._graphElement.removeMatchingStyleClasses("network-category-\\w+");
1583bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._graphElement.addStyleClass("network-category-" + this._resource.category.name);
1584bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1585bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1586bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement.style.setProperty("left", percentages.start + "%");
1587bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");
1588bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1589bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");
1590bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement.style.setProperty("left", percentages.middle + "%");
1591bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
15924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        var labels = calculator.computeBarGraphLabels(this._resource);
1593bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.textContent = labels.left;
1594bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.textContent = labels.right;
1595bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1596bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        var tooltip = (labels.tooltip || "");
1597bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barLeftElement.title = tooltip;
1598bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.title = tooltip;
1599bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.title = tooltip;
1600bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._barRightElement.title = tooltip;
1601bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    },
1602bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1603bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    _refreshLabelPositions: function()
1604bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
1605a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!this._percentages)
1606a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
1607bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.style.removeProperty("left");
1608bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.style.removeProperty("right");
1609bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.removeStyleClass("before");
1610bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelLeftElement.removeStyleClass("hidden");
1611bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1612bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.style.removeProperty("left");
1613bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.style.removeProperty("right");
1614bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.removeStyleClass("after");
1615bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        this._labelRightElement.removeStyleClass("hidden");
1616bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1617bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelPadding = 10;
1618bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const barRightElementOffsetWidth = this._barRightElement.offsetWidth;
1619bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const barLeftElementOffsetWidth = this._barLeftElement.offsetWidth;
1620bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1621bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (this._barLeftElement) {
1622bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftBarWidth = barLeftElementOffsetWidth - labelPadding;
1623bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var rightBarWidth = (barRightElementOffsetWidth - barLeftElementOffsetWidth) - labelPadding;
1624bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1625bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftBarWidth = (barLeftElementOffsetWidth - barRightElementOffsetWidth) - labelPadding;
1626bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var rightBarWidth = barRightElementOffsetWidth - labelPadding;
1627bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1628bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1629bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelLeftElementOffsetWidth = this._labelLeftElement.offsetWidth;
1630bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelRightElementOffsetWidth = this._labelRightElement.offsetWidth;
1631bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1632bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelBefore = (labelLeftElementOffsetWidth > leftBarWidth);
1633bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const labelAfter = (labelRightElementOffsetWidth > rightBarWidth);
1634bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        const graphElementOffsetWidth = this._graphElement.offsetWidth;
1635bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1636bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (labelBefore && (graphElementOffsetWidth * (this._percentages.start / 100)) < (labelLeftElementOffsetWidth + 10))
1637bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var leftHidden = true;
1638bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1639bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (labelAfter && (graphElementOffsetWidth * ((100 - this._percentages.end) / 100)) < (labelRightElementOffsetWidth + 10))
1640bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            var rightHidden = true;
1641bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1642bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (barLeftElementOffsetWidth == barRightElementOffsetWidth) {
1643bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            // The left/right label data are the same, so a before/after label can be replaced by an on-bar label.
1644bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (labelBefore && !labelAfter)
1645bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                leftHidden = true;
1646bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            else if (labelAfter && !labelBefore)
1647bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                rightHidden = true;
1648bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1649bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1650bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (labelBefore) {
1651bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (leftHidden)
1652bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                this._labelLeftElement.addStyleClass("hidden");
1653bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");
1654bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelLeftElement.addStyleClass("before");
1655bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1656bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");
1657bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");
1658bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1659bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1660bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (labelAfter) {
1661bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (rightHidden)
1662bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                this._labelRightElement.addStyleClass("hidden");
1663bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelRightElement.style.setProperty("left", this._percentages.end + "%");
1664bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelRightElement.addStyleClass("after");
1665bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else {
1666bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");
1667bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");
1668bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
1669bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
1670bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1671bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1672a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode.NameComparator = function(a, b)
1673bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1674bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    var aFileName = a._resource.displayName + (a._resource.queryString ? a._resource.queryString : "");
1675bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    var bFileName = b._resource.displayName + (b._resource.queryString ? b._resource.queryString : "");
1676bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (aFileName > bFileName)
1677bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 1;
1678bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (bFileName > aFileName)
1679bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return -1;
1680bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return 0;
1681bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1682bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1683a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode.SizeComparator = function(a, b)
1684a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
1685a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (b._resource.cached && !a._resource.cached)
1686a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return 1;
1687a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (a._resource.cached && !b._resource.cached)
1688a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return -1;
1689a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1690a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (a._resource.resourceSize === b._resource.resourceSize)
1691a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return 0;
1692a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1693a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return a._resource.resourceSize - b._resource.resourceSize;
1694a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
1695a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1696a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebInspector.NetworkDataGridNode.ResourcePropertyComparator = function(propertyName, revert, a, b)
1697bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1698bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    var aValue = a._resource[propertyName];
1699bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    var bValue = b._resource[propertyName];
1700bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (aValue > bValue)
1701a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return revert ? -1 : 1;
1702bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (bValue > aValue)
1703a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return revert ? 1 : -1;
1704bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return 0;
1705bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1706bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1707bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebInspector.NetworkDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
1708