summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/devtools/front_end/NetworkPanel.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/NetworkPanel.js')
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/NetworkPanel.js2568
1 files changed, 0 insertions, 2568 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/NetworkPanel.js b/chromium/third_party/WebKit/Source/devtools/front_end/NetworkPanel.js
deleted file mode 100644
index ad816ec1f8a..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/NetworkPanel.js
+++ /dev/null
@@ -1,2568 +0,0 @@
-/*
- * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org>
- * Copyright (C) 2011 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-importScript("RequestView.js");
-importScript("NetworkItemView.js");
-importScript("RequestCookiesView.js");
-importScript("RequestHeadersView.js");
-importScript("RequestHTMLView.js");
-importScript("RequestJSONView.js");
-importScript("RequestPreviewView.js");
-importScript("RequestResponseView.js");
-importScript("RequestTimingView.js");
-importScript("ResourceWebSocketFrameView.js");
-
-/**
- * @constructor
- * @implements {WebInspector.Searchable}
- * @extends {WebInspector.View}
- * @param {!WebInspector.FilterBar} filterBar
- * @param {!WebInspector.Setting} coulmnsVisibilitySetting
- */
-WebInspector.NetworkLogView = function(filterBar, coulmnsVisibilitySetting)
-{
- WebInspector.View.call(this);
- this.element.classList.add("vbox", "fill");
- this.registerRequiredCSS("networkLogView.css");
- this.registerRequiredCSS("filter.css");
-
- this._filterBar = filterBar;
- this._coulmnsVisibilitySetting = coulmnsVisibilitySetting;
- this._allowRequestSelection = false;
- this._requests = [];
- this._requestsById = {};
- this._requestsByURL = {};
- this._staleRequests = {};
- this._requestGridNodes = {};
- this._lastRequestGridNodeId = 0;
- this._mainRequestLoadTime = -1;
- this._mainRequestDOMContentLoadedTime = -1;
- this._matchedRequests = [];
- this._highlightedSubstringChanges = [];
- this._filteredOutRequests = new Map();
-
- this._matchedRequestsMap = {};
- this._currentMatchedRequestIndex = -1;
-
- this._createStatusbarButtons();
- this._createStatusBarItems();
- this._linkifier = new WebInspector.Linkifier();
-
- WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestStarted, this._onRequestStarted, this);
- WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestUpdated, this._onRequestUpdated, this);
- WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished, this._onRequestUpdated, this);
-
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage, this._willReloadPage, this);
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNavigated, this);
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load, this._loadEventFired, this);
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded, this._domContentLoadedEventFired, this);
-
- this._addFilters();
- this._initializeView();
- this._recordButton.toggled = true;
- WebInspector.networkLog.requests.forEach(this._appendRequest.bind(this));
-}
-
-WebInspector.NetworkLogView.HTTPSchemas = {"http": true, "https": true, "ws": true, "wss": true};
-WebInspector.NetworkLogView._responseHeaderColumns = ["Cache-Control", "Connection", "Content-Encoding", "Content-Length", "ETag", "Keep-Alive", "Last-Modified", "Server", "Vary"];
-WebInspector.NetworkLogView._defaultColumnsVisibility = {
- method: true, status: true, scheme: false, domain: false, type: true, initiator: true, cookies: false, setCookies: false, size: true, time: true,
- "Cache-Control": false, "Connection": false, "Content-Encoding": false, "Content-Length": false, "ETag": false, "Keep-Alive": false, "Last-Modified": false, "Server": false, "Vary": false
-};
-WebInspector.NetworkLogView._defaultRefreshDelay = 500;
-
-WebInspector.NetworkLogView.prototype = {
- _addFilters: function()
- {
- this._textFilterUI = new WebInspector.TextFilterUI();
- this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, this._filterChanged, this);
- this._filterBar.addFilter(this._textFilterUI);
-
- this._resourceTypeFilterUI = new WebInspector.NamedBitSetFilterUI();
- for (var typeId in WebInspector.resourceTypes) {
- var resourceType = WebInspector.resourceTypes[typeId];
- this._resourceTypeFilterUI.addBit(resourceType.name(), resourceType.categoryTitle());
- }
- this._resourceTypeFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, this._filterChanged.bind(this), this);
- this._filterBar.addFilter(this._resourceTypeFilterUI);
-
- var dataURLSetting = WebInspector.settings.networkHideDataURL;
- this._dataURLFilterUI = new WebInspector.CheckboxFilterUI("hide-data-url", WebInspector.UIString("Hide data URLs"), true, dataURLSetting);
- this._dataURLFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, this._filterChanged.bind(this), this);
- this._filterBar.addFilter(this._dataURLFilterUI);
- },
-
- _filterChanged: function(event)
- {
- this._removeAllNodeHighlights();
- this.searchCanceled();
- this._filterRequests();
- },
-
- _initializeView: function()
- {
- this.element.id = "network-container";
-
- this._createSortingFunctions();
- this._createTable();
- this._createTimelineGrid();
- this._summaryBarElement = this.element.createChild("div", "network-summary-bar");
-
- if (!this.useLargeRows)
- this._setLargerRequests(this.useLargeRows);
-
- this._allowPopover = true;
- this._popoverHelper = new WebInspector.PopoverHelper(this.element, this._getPopoverAnchor.bind(this), this._showPopover.bind(this), this._onHidePopover.bind(this));
- // Enable faster hint.
- this._popoverHelper.setTimeout(100);
-
- this.calculator = new WebInspector.NetworkTransferTimeCalculator();
-
- this.switchToDetailedView();
- },
-
- get statusBarItems()
- {
- return [this._recordButton.element, this._clearButton.element, this._filterBar.filterButton().element, this._largerRequestsButton.element, this._preserveLogCheckbox.element, this._progressBarContainer];
- },
-
- get useLargeRows()
- {
- return WebInspector.settings.resourcesLargeRows.get();
- },
-
- set allowPopover(flag)
- {
- this._allowPopover = flag;
- },
-
- elementsToRestoreScrollPositionsFor: function()
- {
- if (!this._dataGrid) // Not initialized yet.
- return [];
- return [this._dataGrid.scrollContainer];
- },
-
- onResize: function()
- {
- this._updateOffscreenRows();
- },
-
- _createTimelineGrid: function()
- {
- this._timelineGrid = new WebInspector.TimelineGrid();
- this._timelineGrid.element.classList.add("network-timeline-grid");
- this._dataGrid.element.appendChild(this._timelineGrid.element);
- },
-
- _createTable: function()
- {
- var columns = [];
- columns.push({
- id: "name",
- titleDOMFragment: this._makeHeaderFragment(WebInspector.UIString("Name"), WebInspector.UIString("Path")),
- title: WebInspector.UIString("Name"),
- sortable: true,
- weight: 20,
- disclosure: true
- });
-
- columns.push({
- id: "method",
- title: WebInspector.UIString("Method"),
- sortable: true,
- weight: 6
- });
-
- columns.push({
- id: "status",
- titleDOMFragment: this._makeHeaderFragment(WebInspector.UIString("Status"), WebInspector.UIString("Text")),
- title: WebInspector.UIString("Status"),
- sortable: true,
- weight: 6
- });
-
- columns.push({
- id: "scheme",
- title: WebInspector.UIString("Scheme"),
- sortable: true,
- weight: 6
- });
-
- columns.push({
- id: "domain",
- title: WebInspector.UIString("Domain"),
- sortable: true,
- weight: 6
- });
-
- columns.push({
- id: "type",
- title: WebInspector.UIString("Type"),
- sortable: true,
- weight: 6
- });
-
- columns.push({
- id: "initiator",
- title: WebInspector.UIString("Initiator"),
- sortable: true,
- weight: 10
- });
-
- columns.push({
- id: "cookies",
- title: WebInspector.UIString("Cookies"),
- sortable: true,
- weight: 6,
- align: WebInspector.DataGrid.Align.Right
- });
-
- columns.push({
- id: "setCookies",
- title: WebInspector.UIString("Set-Cookies"),
- sortable: true,
- weight: 6,
- align: WebInspector.DataGrid.Align.Right
- });
-
- columns.push({
- id: "size",
- titleDOMFragment: this._makeHeaderFragment(WebInspector.UIString("Size"), WebInspector.UIString("Content")),
- title: WebInspector.UIString("Size"),
- sortable: true,
- weight: 6,
- align: WebInspector.DataGrid.Align.Right
- });
-
- columns.push({
- id: "time",
- titleDOMFragment: this._makeHeaderFragment(WebInspector.UIString("Time"), WebInspector.UIString("Latency")),
- title: WebInspector.UIString("Time"),
- sortable: true,
- weight: 6,
- align: WebInspector.DataGrid.Align.Right
- });
-
- var responseHeaderColumns = WebInspector.NetworkLogView._responseHeaderColumns;
- for (var i = 0; i < responseHeaderColumns.length; ++i) {
- var headerName = responseHeaderColumns[i];
- var descriptor = {
- id: headerName,
- title: WebInspector.UIString(headerName),
- weight: 6
- }
- if (headerName === "Content-Length")
- descriptor.align = WebInspector.DataGrid.Align.Right;
- columns.push(descriptor);
- }
-
- columns.push({
- id: "timeline",
- titleDOMFragment: document.createDocumentFragment(),
- title: WebInspector.UIString("Timeline"),
- sortable: false,
- weight: 40,
- sort: WebInspector.DataGrid.Order.Ascending
- });
-
- this._dataGrid = new WebInspector.DataGrid(columns);
- this._dataGrid.setName("networkLog");
- this._dataGrid.resizeMethod = WebInspector.DataGrid.ResizeMethod.Last;
- this._dataGrid.element.classList.add("network-log-grid");
- this._dataGrid.element.addEventListener("contextmenu", this._contextMenu.bind(this), true);
- this._dataGrid.show(this.element);
-
- // Event listeners need to be added _after_ we attach to the document, so that owner document is properly update.
- this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged, this._sortItems, this);
- this._dataGrid.addEventListener(WebInspector.DataGrid.Events.ColumnsResized, this._updateDividersIfNeeded, this);
- this._dataGrid.scrollContainer.addEventListener("scroll", this._updateOffscreenRows.bind(this));
-
- this._patchTimelineHeader();
- },
-
- _makeHeaderFragment: function(title, subtitle)
- {
- var fragment = document.createDocumentFragment();
- fragment.createTextChild(title);
- var subtitleDiv = fragment.createChild("div", "network-header-subtitle");
- subtitleDiv.createTextChild(subtitle);
- return fragment;
- },
-
- _patchTimelineHeader: function()
- {
- var timelineSorting = document.createElement("select");
-
- var option = document.createElement("option");
- option.value = "startTime";
- option.label = WebInspector.UIString("Timeline");
- timelineSorting.appendChild(option);
-
- option = document.createElement("option");
- option.value = "startTime";
- option.label = WebInspector.UIString("Start Time");
- timelineSorting.appendChild(option);
-
- option = document.createElement("option");
- option.value = "responseTime";
- option.label = WebInspector.UIString("Response Time");
- timelineSorting.appendChild(option);
-
- option = document.createElement("option");
- option.value = "endTime";
- option.label = WebInspector.UIString("End Time");
- timelineSorting.appendChild(option);
-
- option = document.createElement("option");
- option.value = "duration";
- option.label = WebInspector.UIString("Duration");
- timelineSorting.appendChild(option);
-
- option = document.createElement("option");
- option.value = "latency";
- option.label = WebInspector.UIString("Latency");
- timelineSorting.appendChild(option);
-
- var header = this._dataGrid.headerTableHeader("timeline");
- header.replaceChild(timelineSorting, header.firstChild);
-
- timelineSorting.addEventListener("click", function(event) { event.consume() }, false);
- timelineSorting.addEventListener("change", this._sortByTimeline.bind(this), false);
- this._timelineSortSelector = timelineSorting;
- },
-
- _createSortingFunctions: function()
- {
- this._sortingFunctions = {};
- this._sortingFunctions.name = WebInspector.NetworkDataGridNode.NameComparator;
- this._sortingFunctions.method = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "method", false);
- this._sortingFunctions.status = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "statusCode", false);
- this._sortingFunctions.scheme = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "scheme", false);
- this._sortingFunctions.domain = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "domain", false);
- this._sortingFunctions.type = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "mimeType", false);
- this._sortingFunctions.initiator = WebInspector.NetworkDataGridNode.InitiatorComparator;
- this._sortingFunctions.cookies = WebInspector.NetworkDataGridNode.RequestCookiesCountComparator;
- this._sortingFunctions.setCookies = WebInspector.NetworkDataGridNode.ResponseCookiesCountComparator;
- this._sortingFunctions.size = WebInspector.NetworkDataGridNode.SizeComparator;
- this._sortingFunctions.time = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "duration", false);
- this._sortingFunctions.timeline = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "startTime", false);
- this._sortingFunctions.startTime = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "startTime", false);
- this._sortingFunctions.endTime = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "endTime", false);
- this._sortingFunctions.responseTime = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "responseReceivedTime", false);
- this._sortingFunctions.duration = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "duration", true);
- this._sortingFunctions.latency = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "latency", true);
-
- var timeCalculator = new WebInspector.NetworkTransferTimeCalculator();
- var durationCalculator = new WebInspector.NetworkTransferDurationCalculator();
-
- this._calculators = {};
- this._calculators.timeline = timeCalculator;
- this._calculators.startTime = timeCalculator;
- this._calculators.endTime = timeCalculator;
- this._calculators.responseTime = timeCalculator;
- this._calculators.duration = durationCalculator;
- this._calculators.latency = durationCalculator;
- },
-
- _sortItems: function()
- {
- this._removeAllNodeHighlights();
- var columnIdentifier = this._dataGrid.sortColumnIdentifier();
- if (columnIdentifier === "timeline") {
- this._sortByTimeline();
- return;
- }
- var sortingFunction = this._sortingFunctions[columnIdentifier];
- if (!sortingFunction)
- return;
-
- this._dataGrid.sortNodes(sortingFunction, !this._dataGrid.isSortOrderAscending());
- this._timelineSortSelector.selectedIndex = 0;
- this._updateOffscreenRows();
-
- this.searchCanceled();
-
- WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, {
- action: WebInspector.UserMetrics.UserActionNames.NetworkSort,
- column: columnIdentifier,
- sortOrder: this._dataGrid.sortOrder()
- });
- },
-
- _sortByTimeline: function()
- {
- this._removeAllNodeHighlights();
- var selectedIndex = this._timelineSortSelector.selectedIndex;
- if (!selectedIndex)
- selectedIndex = 1; // Sort by start time by default.
- var selectedOption = this._timelineSortSelector[selectedIndex];
- var value = selectedOption.value;
-
- var sortingFunction = this._sortingFunctions[value];
- this._dataGrid.sortNodes(sortingFunction);
- this.calculator = this._calculators[value];
- if (this.calculator.startAtZero)
- this._timelineGrid.hideEventDividers();
- else
- this._timelineGrid.showEventDividers();
- this._dataGrid.markColumnAsSortedBy("timeline", WebInspector.DataGrid.Order.Ascending);
- this._updateOffscreenRows();
- },
-
- _createStatusBarItems: function()
- {
- this._progressBarContainer = document.createElement("div");
- this._progressBarContainer.className = "status-bar-item";
- },
-
- _updateSummaryBar: function()
- {
- var requestsNumber = this._requests.length;
-
- if (!requestsNumber) {
- if (this._summaryBarElement._isDisplayingWarning)
- return;
- this._summaryBarElement._isDisplayingWarning = true;
- this._summaryBarElement.removeChildren();
- this._summaryBarElement.createChild("div", "warning-icon-small");
- var text = WebInspector.UIString("No requests captured. Reload the page to see detailed information on the network activity.");
- this._summaryBarElement.appendChild(document.createTextNode(text));
- this._summaryBarElement.title = text;
- return;
- }
- delete this._summaryBarElement._isDisplayingWarning;
-
- var transferSize = 0;
- var selectedRequestsNumber = 0;
- var selectedTransferSize = 0;
- var baseTime = -1;
- var maxTime = -1;
- for (var i = 0; i < this._requests.length; ++i) {
- var request = this._requests[i];
- var requestTransferSize = request.transferSize;
- transferSize += requestTransferSize;
- if (!this._filteredOutRequests.get(request)) {
- selectedRequestsNumber++;
- selectedTransferSize += requestTransferSize;
- }
- if (request.url === WebInspector.inspectedPageURL)
- baseTime = request.startTime;
- if (request.endTime > maxTime)
- maxTime = request.endTime;
- }
- var text = "";
- if (selectedRequestsNumber !== requestsNumber) {
- text += String.sprintf(WebInspector.UIString("%d / %d requests"), selectedRequestsNumber, requestsNumber);
- text += " \u2758 " + String.sprintf(WebInspector.UIString("%s / %s transferred"), Number.bytesToString(selectedTransferSize), Number.bytesToString(transferSize));
- } else {
- text += String.sprintf(WebInspector.UIString("%d requests"), requestsNumber);
- text += " \u2758 " + String.sprintf(WebInspector.UIString("%s transferred"), Number.bytesToString(transferSize));
- }
- if (baseTime !== -1 && this._mainRequestLoadTime !== -1 && this._mainRequestDOMContentLoadedTime !== -1 && this._mainRequestDOMContentLoadedTime > baseTime) {
- text += " \u2758 " + String.sprintf(WebInspector.UIString("%s (load: %s, DOMContentLoaded: %s)"),
- Number.secondsToString(maxTime - baseTime),
- Number.secondsToString(this._mainRequestLoadTime - baseTime),
- Number.secondsToString(this._mainRequestDOMContentLoadedTime - baseTime));
- }
- this._summaryBarElement.textContent = text;
- this._summaryBarElement.title = text;
- },
-
- _scheduleRefresh: function()
- {
- if (this._needsRefresh)
- return;
-
- this._needsRefresh = true;
-
- if (this.isShowing() && !this._refreshTimeout)
- this._refreshTimeout = setTimeout(this.refresh.bind(this), WebInspector.NetworkLogView._defaultRefreshDelay);
- },
-
- _updateDividersIfNeeded: function()
- {
- if (!this._dataGrid)
- return;
- var timelineColumn = this._dataGrid.columns.timeline;
- for (var i = 0; i < this._dataGrid.resizers.length; ++i) {
- if (timelineColumn.ordinal === this._dataGrid.resizers[i].rightNeighboringColumnIndex) {
- // Position timline grid location.
- this._timelineGrid.element.style.left = this._dataGrid.resizers[i].style.left;
- }
- }
-
- var proceed = true;
- if (!this.isShowing()) {
- this._scheduleRefresh();
- proceed = false;
- } else {
- this.calculator.setDisplayWindow(this._timelineGrid.dividersElement.clientWidth);
- proceed = this._timelineGrid.updateDividers(this.calculator);
- }
- if (!proceed)
- return;
-
- if (this.calculator.startAtZero || !this.calculator.computePercentageFromEventTime) {
- // If our current sorting method starts at zero, that means it shows all
- // requests starting at the same point, and so onLoad event and DOMContent
- // event lines really wouldn't make much sense here, so don't render them.
- // Additionally, if the calculator doesn't have the computePercentageFromEventTime
- // function defined, we are probably sorting by size, and event times aren't relevant
- // in this case.
- return;
- }
-
- this._timelineGrid.removeEventDividers();
- if (this._mainRequestLoadTime !== -1) {
- var percent = this.calculator.computePercentageFromEventTime(this._mainRequestLoadTime);
-
- var loadDivider = document.createElement("div");
- loadDivider.className = "network-event-divider network-red-divider";
-
- var loadDividerPadding = document.createElement("div");
- loadDividerPadding.className = "network-event-divider-padding";
- loadDividerPadding.title = WebInspector.UIString("Load event fired");
- loadDividerPadding.appendChild(loadDivider);
- loadDividerPadding.style.left = percent + "%";
- this._timelineGrid.addEventDivider(loadDividerPadding);
- }
-
- if (this._mainRequestDOMContentLoadedTime !== -1) {
- var percent = this.calculator.computePercentageFromEventTime(this._mainRequestDOMContentLoadedTime);
-
- var domContentLoadedDivider = document.createElement("div");
- domContentLoadedDivider.className = "network-event-divider network-blue-divider";
-
- var domContentLoadedDividerPadding = document.createElement("div");
- domContentLoadedDividerPadding.className = "network-event-divider-padding";
- domContentLoadedDividerPadding.title = WebInspector.UIString("DOMContentLoaded event fired");
- domContentLoadedDividerPadding.appendChild(domContentLoadedDivider);
- domContentLoadedDividerPadding.style.left = percent + "%";
- this._timelineGrid.addEventDivider(domContentLoadedDividerPadding);
- }
- },
-
- _refreshIfNeeded: function()
- {
- if (this._needsRefresh)
- this.refresh();
- },
-
- _invalidateAllItems: function()
- {
- for (var i = 0; i < this._requests.length; ++i) {
- var request = this._requests[i];
- this._staleRequests[request.requestId] = request;
- }
- },
-
- get calculator()
- {
- return this._calculator;
- },
-
- set calculator(x)
- {
- if (!x || this._calculator === x)
- return;
-
- this._calculator = x;
- this._calculator.reset();
-
- this._invalidateAllItems();
- this.refresh();
- },
-
- _requestGridNode: function(request)
- {
- return this._requestGridNodes[request.__gridNodeId];
- },
-
- _createRequestGridNode: function(request)
- {
- var node = new WebInspector.NetworkDataGridNode(this, request);
- request.__gridNodeId = this._lastRequestGridNodeId++;
- this._requestGridNodes[request.__gridNodeId] = node;
- return node;
- },
-
- _createStatusbarButtons: function()
- {
- this._recordButton = new WebInspector.StatusBarButton(WebInspector.UIString("Record Network Log"), "record-profile-status-bar-item");
- this._recordButton.addEventListener("click", this._onRecordButtonClicked, this);
-
- this._clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-status-bar-item");
- this._clearButton.addEventListener("click", this._reset, this);
-
- this._largerRequestsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "network-larger-resources-status-bar-item");
- this._largerRequestsButton.toggled = WebInspector.settings.resourcesLargeRows.get();
- this._largerRequestsButton.addEventListener("click", this._toggleLargerRequests, this);
-
- this._preserveLogCheckbox = new WebInspector.StatusBarCheckbox(WebInspector.UIString("Preserve log"));
- },
-
- _loadEventFired: function(event)
- {
- if (!this._recordButton.toggled)
- return;
-
- this._mainRequestLoadTime = event.data || -1;
- // Schedule refresh to update boundaries and draw the new line.
- this._scheduleRefresh();
- },
-
- _domContentLoadedEventFired: function(event)
- {
- if (!this._recordButton.toggled)
- return;
- this._mainRequestDOMContentLoadedTime = event.data || -1;
- // Schedule refresh to update boundaries and draw the new line.
- this._scheduleRefresh();
- },
-
- wasShown: function()
- {
- this._refreshIfNeeded();
- },
-
- willHide: function()
- {
- this._popoverHelper.hidePopover();
- },
-
- refresh: function()
- {
- this._needsRefresh = false;
- if (this._refreshTimeout) {
- clearTimeout(this._refreshTimeout);
- delete this._refreshTimeout;
- }
-
- this._removeAllNodeHighlights();
- var wasScrolledToLastRow = this._dataGrid.isScrolledToLastRow();
- var boundariesChanged = false;
- if (this.calculator.updateBoundariesForEventTime) {
- boundariesChanged = this.calculator.updateBoundariesForEventTime(this._mainRequestLoadTime) || boundariesChanged;
- boundariesChanged = this.calculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime) || boundariesChanged;
- }
-
- for (var requestId in this._staleRequests) {
- var request = this._staleRequests[requestId];
- var node = this._requestGridNode(request);
- if (!node) {
- // Create the timeline tree element and graph.
- node = this._createRequestGridNode(request);
- this._dataGrid.rootNode().appendChild(node);
- }
- node.refreshRequest();
- this._applyFilter(node);
-
- if (this.calculator.updateBoundaries(request))
- boundariesChanged = true;
-
- if (!node.isFilteredOut())
- this._updateHighlightIfMatched(request);
- }
-
- if (boundariesChanged) {
- // The boundaries changed, so all item graphs are stale.
- this._invalidateAllItems();
- }
-
- for (var requestId in this._staleRequests)
- this._requestGridNode(this._staleRequests[requestId]).refreshGraph(this.calculator);
-
- this._staleRequests = {};
- this._sortItems();
- this._updateSummaryBar();
- this._dataGrid.updateWidths();
- // FIXME: evaluate performance impact of moving this before a call to sortItems()
- if (wasScrolledToLastRow)
- this._dataGrid.scrollToLastRow();
- },
-
- _onRecordButtonClicked: function(e)
- {
- if (!this._recordButton.toggled)
- this._reset();
- this._recordButton.toggled = !this._recordButton.toggled;
- },
-
- _reset: function()
- {
- this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.ViewCleared);
-
- this._clearSearchMatchedList();
- if (this._popoverHelper)
- this._popoverHelper.hidePopover();
-
- if (this._calculator)
- this._calculator.reset();
-
- this._requests = [];
- this._requestsById = {};
- this._requestsByURL = {};
- this._staleRequests = {};
- this._requestGridNodes = {};
-
- if (this._dataGrid) {
- this._dataGrid.rootNode().removeChildren();
- this._updateDividersIfNeeded();
- this._updateSummaryBar();
- }
-
- this._mainRequestLoadTime = -1;
- this._mainRequestDOMContentLoadedTime = -1;
- },
-
- get requests()
- {
- return this._requests;
- },
-
- requestById: function(id)
- {
- return this._requestsById[id];
- },
-
- _onRequestStarted: function(event)
- {
- if (this._recordButton.toggled)
- this._appendRequest(event.data);
- },
-
- _appendRequest: function(request)
- {
- this._requests.push(request);
-
- // In case of redirect request id is reassigned to a redirected
- // request and we need to update _requestsById and search results.
- if (this._requestsById[request.requestId]) {
- var oldRequest = request.redirects[request.redirects.length - 1];
- this._requestsById[oldRequest.requestId] = oldRequest;
-
- this._updateSearchMatchedListAfterRequestIdChanged(request.requestId, oldRequest.requestId);
- }
- this._requestsById[request.requestId] = request;
-
- this._requestsByURL[request.url] = request;
-
- // Pull all the redirects of the main request upon commit load.
- if (request.redirects) {
- for (var i = 0; i < request.redirects.length; ++i)
- this._refreshRequest(request.redirects[i]);
- }
-
- this._refreshRequest(request);
- },
-
- /**
- * @param {!WebInspector.Event} event
- */
- _onRequestUpdated: function(event)
- {
- var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
- this._refreshRequest(request);
- },
-
- /**
- * @param {!WebInspector.NetworkRequest} request
- */
- _refreshRequest: function(request)
- {
- if (!this._requestsById[request.requestId])
- return;
- this._staleRequests[request.requestId] = request;
- this._scheduleRefresh();
- },
-
- _willReloadPage: function(event)
- {
- this._recordButton.toggled = true;
- if (!this._preserveLogCheckbox.checked())
- this._reset();
- },
-
- /**
- * @param {!WebInspector.Event} event
- */
- _mainFrameNavigated: function(event)
- {
- if (!this._recordButton.toggled || this._preserveLogCheckbox.checked())
- return;
-
- var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data);
- var loaderId = frame.loaderId;
-
- // Pick provisional load requests.
- var requestsToPick = [];
- var requests = WebInspector.networkLog.requests;
- for (var i = 0; i < requests.length; ++i) {
- var request = requests[i];
- if (request.loaderId === loaderId)
- requestsToPick.push(request);
- }
-
- this._reset();
-
- for (var i = 0; i < requestsToPick.length; ++i)
- this._appendRequest(requestsToPick[i]);
- },
-
- switchToDetailedView: function()
- {
- if (!this._dataGrid)
- return;
- if (this._dataGrid.selectedNode)
- this._dataGrid.selectedNode.selected = false;
-
- this.element.classList.remove("brief-mode");
- this._detailedMode = true;
- this._updateColumns();
- },
-
- switchToBriefView: function()
- {
- this.element.classList.add("brief-mode");
- this._removeAllNodeHighlights();
- this._detailedMode = false;
- this._updateColumns();
- this._popoverHelper.hidePopover();
- },
-
- _toggleLargerRequests: function()
- {
- WebInspector.settings.resourcesLargeRows.set(!WebInspector.settings.resourcesLargeRows.get());
- this._setLargerRequests(WebInspector.settings.resourcesLargeRows.get());
- },
-
- _setLargerRequests: function(enabled)
- {
- this._largerRequestsButton.toggled = enabled;
- if (!enabled) {
- this._largerRequestsButton.title = WebInspector.UIString("Use large resource rows.");
- this._dataGrid.element.classList.add("small");
- this._timelineGrid.element.classList.add("small");
- } else {
- this._largerRequestsButton.title = WebInspector.UIString("Use small resource rows.");
- this._dataGrid.element.classList.remove("small");
- this._timelineGrid.element.classList.remove("small");
- }
- this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.RowSizeChanged, { largeRows: enabled });
- this._updateOffscreenRows();
- },
-
- _getPopoverAnchor: function(element)
- {
- if (!this._allowPopover)
- return;
- var anchor = element.enclosingNodeOrSelfWithClass("network-graph-bar") || element.enclosingNodeOrSelfWithClass("network-graph-label");
- if (anchor && anchor.parentElement.request && anchor.parentElement.request.timing)
- return anchor;
- anchor = element.enclosingNodeOrSelfWithClass("network-script-initiated");
- if (anchor && anchor.request && anchor.request.initiator)
- return anchor;
-
- return null;
- },
-
- /**
- * @param {!Element} anchor
- * @param {!WebInspector.Popover} popover
- */
- _showPopover: function(anchor, popover)
- {
- var content;
- if (anchor.classList.contains("network-script-initiated"))
- content = this._generateScriptInitiatedPopoverContent(anchor.request);
- else
- content = WebInspector.RequestTimingView.createTimingTable(anchor.parentElement.request);
- popover.show(content, anchor);
- },
-
- _onHidePopover: function()
- {
- this._linkifier.reset();
- },
-
- /**
- * @param {!WebInspector.NetworkRequest} request
- * @return {!Element}
- */
- _generateScriptInitiatedPopoverContent: function(request)
- {
- var stackTrace = request.initiator.stackTrace;
- var framesTable = document.createElement("table");
- for (var i = 0; i < stackTrace.length; ++i) {
- var stackFrame = stackTrace[i];
- var row = document.createElement("tr");
- row.createChild("td").textContent = stackFrame.functionName || WebInspector.UIString("(anonymous function)");
- row.createChild("td").textContent = " @ ";
- row.createChild("td").appendChild(this._linkifier.linkifyLocation(stackFrame.url, stackFrame.lineNumber - 1, stackFrame.columnNumber - 1));
- framesTable.appendChild(row);
- }
- return framesTable;
- },
-
- _updateColumns: function()
- {
- var columnsVisibility = this._coulmnsVisibilitySetting.get();
- var detailedMode = !!this._detailedMode;
- for (var columnIdentifier in columnsVisibility) {
- var visible = detailedMode && columnsVisibility[columnIdentifier];
- this._dataGrid.setColumnVisible(columnIdentifier, visible);
- }
- this._dataGrid.setColumnVisible("timeline", detailedMode);
- this._dataGrid.applyColumnWeights();
- },
-
- /**
- * @param {string} columnIdentifier
- */
- _toggleColumnVisibility: function(columnIdentifier)
- {
- var columnsVisibility = this._coulmnsVisibilitySetting.get();
- columnsVisibility[columnIdentifier] = !columnsVisibility[columnIdentifier];
- this._coulmnsVisibilitySetting.set(columnsVisibility);
-
- this._updateColumns();
- },
-
- /**
- * @return {!Array.<string>}
- */
- _getConfigurableColumnIDs: function()
- {
- if (this._configurableColumnIDs)
- return this._configurableColumnIDs;
-
- var columns = this._dataGrid.columns;
- function compare(id1, id2)
- {
- return columns[id1].title.compareTo(columns[id2].title);
- }
-
- var columnIDs = Object.keys(this._coulmnsVisibilitySetting.get());
- this._configurableColumnIDs = columnIDs.sort(compare);
- return this._configurableColumnIDs;
- },
-
- _contextMenu: function(event)
- {
- var contextMenu = new WebInspector.ContextMenu(event);
-
- if (this._detailedMode && event.target.isSelfOrDescendant(this._dataGrid.headerTableBody)) {
- var columnsVisibility = this._coulmnsVisibilitySetting.get();
- var columnIDs = this._getConfigurableColumnIDs();
- for (var i = 0; i < columnIDs.length; ++i) {
- var columnIdentifier = columnIDs[i];
- var column = this._dataGrid.columns[columnIdentifier];
- contextMenu.appendCheckboxItem(column.title, this._toggleColumnVisibility.bind(this, columnIdentifier), !!columnsVisibility[columnIdentifier]);
- }
- contextMenu.show();
- return;
- }
-
- var gridNode = this._dataGrid.dataGridNodeFromNode(event.target);
- var request = gridNode && gridNode._request;
-
- if (request) {
- contextMenu.appendItem(WebInspector.openLinkExternallyLabel(), WebInspector.openResource.bind(WebInspector, request.url, false));
- contextMenu.appendSeparator();
- contextMenu.appendItem(WebInspector.copyLinkAddressLabel(), this._copyLocation.bind(this, request));
- if (request.requestHeadersText())
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Copy request headers" : "Copy Request Headers"), this._copyRequestHeaders.bind(this, request));
- if (request.responseHeadersText)
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Copy response headers" : "Copy Response Headers"), this._copyResponseHeaders.bind(this, request));
- contextMenu.appendItem(WebInspector.UIString("Copy as cURL"), this._copyCurlCommand.bind(this, request));
- }
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Copy all as HAR" : "Copy All as HAR"), this._copyAll.bind(this));
-
- contextMenu.appendSeparator();
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Save as HAR with content" : "Save as HAR with Content"), this._exportAll.bind(this));
-
- contextMenu.appendSeparator();
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Clear browser cache" : "Clear Browser Cache"), this._clearBrowserCache.bind(this));
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Clear browser cookies" : "Clear Browser Cookies"), this._clearBrowserCookies.bind(this));
-
- if (request && request.type === WebInspector.resourceTypes.XHR) {
- contextMenu.appendSeparator();
- contextMenu.appendItem(WebInspector.UIString("Replay XHR"), this._replayXHR.bind(this, request.requestId));
- contextMenu.appendSeparator();
- }
-
- contextMenu.show();
- },
-
- _replayXHR: function(requestId)
- {
- NetworkAgent.replayXHR(requestId);
- },
-
- _copyAll: function()
- {
- var harArchive = {
- log: (new WebInspector.HARLog(this._requests.filter(WebInspector.NetworkLogView.HTTPRequestsFilter))).build()
- };
- InspectorFrontendHost.copyText(JSON.stringify(harArchive, null, 2));
- },
-
- _copyLocation: function(request)
- {
- InspectorFrontendHost.copyText(request.url);
- },
-
- _copyRequestHeaders: function(request)
- {
- InspectorFrontendHost.copyText(request.requestHeadersText());
- },
-
- _copyResponseHeaders: function(request)
- {
- InspectorFrontendHost.copyText(request.responseHeadersText);
- },
-
- /**
- * @param {!WebInspector.NetworkRequest} request
- */
- _copyCurlCommand: function(request)
- {
- InspectorFrontendHost.copyText(this._generateCurlCommand(request));
- },
-
- _exportAll: function()
- {
- var filename = WebInspector.inspectedPageDomain + ".har";
- var stream = new WebInspector.FileOutputStream();
- stream.open(filename, openCallback.bind(this));
-
- /**
- * @param {boolean} accepted
- * @this {WebInspector.NetworkLogView}
- */
- function openCallback(accepted)
- {
- if (!accepted)
- return;
- var progressIndicator = new WebInspector.ProgressIndicator();
- this._progressBarContainer.appendChild(progressIndicator.element);
- var harWriter = new WebInspector.HARWriter();
- harWriter.write(stream, this._requests.filter(WebInspector.NetworkLogView.HTTPRequestsFilter), progressIndicator);
- }
- },
-
- _clearBrowserCache: function()
- {
- if (confirm(WebInspector.UIString("Are you sure you want to clear browser cache?")))
- NetworkAgent.clearBrowserCache();
- },
-
- _clearBrowserCookies: function()
- {
- if (confirm(WebInspector.UIString("Are you sure you want to clear browser cookies?")))
- NetworkAgent.clearBrowserCookies();
- },
-
- _updateOffscreenRows: function()
- {
- var dataTableBody = this._dataGrid.dataTableBody;
- var rows = dataTableBody.children;
- var recordsCount = rows.length;
- if (recordsCount < 2)
- return; // Filler row only.
-
- var visibleTop = this._dataGrid.scrollContainer.scrollTop;
- var visibleBottom = visibleTop + this._dataGrid.scrollContainer.offsetHeight;
-
- var rowHeight = 0;
-
- // Filler is at recordsCount - 1.
- var unfilteredRowIndex = 0;
- for (var i = 0; i < recordsCount - 1; ++i) {
- var row = rows[i];
-
- var dataGridNode = this._dataGrid.dataGridNodeFromNode(row);
- if (dataGridNode.isFilteredOut()) {
- row.classList.remove("offscreen");
- continue;
- }
-
- if (!rowHeight)
- rowHeight = row.offsetHeight;
-
- var rowIsVisible = unfilteredRowIndex * rowHeight < visibleBottom && (unfilteredRowIndex + 1) * rowHeight > visibleTop;
- if (rowIsVisible !== row.rowIsVisible) {
- row.enableStyleClass("offscreen", !rowIsVisible);
- row.rowIsVisible = rowIsVisible;
- }
- unfilteredRowIndex++;
- }
- },
-
- _matchRequest: function(request)
- {
- if (!this._searchRegExp)
- return -1;
-
- if (!request.name().match(this._searchRegExp) && !request.path().match(this._searchRegExp))
- return -1;
-
- if (request.requestId in this._matchedRequestsMap)
- return this._matchedRequestsMap[request.requestId];
-
- var matchedRequestIndex = this._matchedRequests.length;
- this._matchedRequestsMap[request.requestId] = matchedRequestIndex;
- this._matchedRequests.push(request.requestId);
-
- return matchedRequestIndex;
- },
-
- _clearSearchMatchedList: function()
- {
- delete this._searchRegExp;
- this._matchedRequests = [];
- this._matchedRequestsMap = {};
- this._removeAllHighlights();
- },
-
- _updateSearchMatchedListAfterRequestIdChanged: function(oldRequestId, newRequestId)
- {
- var requestIndex = this._matchedRequestsMap[oldRequestId];
- if (requestIndex) {
- delete this._matchedRequestsMap[oldRequestId];
- this._matchedRequestsMap[newRequestId] = requestIndex;
- this._matchedRequests[requestIndex] = newRequestId;
- }
- },
-
- _updateHighlightIfMatched: function(request)
- {
- var matchedRequestIndex = this._matchRequest(request);
- if (matchedRequestIndex === -1)
- return;
-
- this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.SearchCountUpdated, this._matchedRequests.length);
-
- if (this._currentMatchedRequestIndex !== -1 && this._currentMatchedRequestIndex !== matchedRequestIndex)
- return;
-
- this._highlightNthMatchedRequestForSearch(matchedRequestIndex, false);
- },
-
- _removeAllHighlights: function()
- {
- this._removeAllNodeHighlights();
- for (var i = 0; i < this._highlightedSubstringChanges.length; ++i)
- WebInspector.revertDomChanges(this._highlightedSubstringChanges[i]);
- this._highlightedSubstringChanges = [];
- },
-
- /**
- * @param {!WebInspector.NetworkRequest} request
- * @param {boolean} reveal
- * @param {!RegExp=} regExp
- */
- _highlightMatchedRequest: function(request, reveal, regExp)
- {
- var node = this._requestGridNode(request);
- if (!node)
- return;
-
- var nameMatched = request.name().match(regExp);
- var pathMatched = request.path().match(regExp);
- if (!nameMatched && pathMatched && !this._largerRequestsButton.toggled)
- this._toggleLargerRequests();
- var highlightedSubstringChanges = node._highlightMatchedSubstring(regExp);
- this._highlightedSubstringChanges.push(highlightedSubstringChanges);
- if (reveal) {
- node.reveal();
- this._highlightNode(node);
- }
- },
-
- /**
- * @param {number} matchedRequestIndex
- * @param {boolean} reveal
- */
- _highlightNthMatchedRequestForSearch: function(matchedRequestIndex, reveal)
- {
- var request = this.requestById(this._matchedRequests[matchedRequestIndex]);
- if (!request)
- return;
- this._removeAllHighlights();
- this._highlightMatchedRequest(request, reveal, this._searchRegExp);
- var node = this._requestGridNode(request);
- if (node)
- this._currentMatchedRequestIndex = matchedRequestIndex;
-
- this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.SearchIndexUpdated, this._currentMatchedRequestIndex);
- },
-
- /**
- * @param {string} query
- * @param {boolean} shouldJump
- */
- performSearch: function(query, shouldJump)
- {
- var newMatchedRequestIndex = 0;
- var currentMatchedRequestId;
- if (this._currentMatchedRequestIndex !== -1)
- currentMatchedRequestId = this._matchedRequests[this._currentMatchedRequestIndex];
-
- this._clearSearchMatchedList();
- this._searchRegExp = createPlainTextSearchRegex(query, "i");
-
- var childNodes = this._dataGrid.dataTableBody.childNodes;
- var requestNodes = Array.prototype.slice.call(childNodes, 0, childNodes.length - 1); // drop the filler row.
-
- for (var i = 0; i < requestNodes.length; ++i) {
- var dataGridNode = this._dataGrid.dataGridNodeFromNode(requestNodes[i]);
- if (dataGridNode.isFilteredOut())
- continue;
- if (this._matchRequest(dataGridNode._request) !== -1 && dataGridNode._request.requestId === currentMatchedRequestId)
- newMatchedRequestIndex = this._matchedRequests.length - 1;
- }
-
- this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.SearchCountUpdated, this._matchedRequests.length);
- if (shouldJump)
- this._highlightNthMatchedRequestForSearch(newMatchedRequestIndex, true);
- },
-
- /**
- * @param {!WebInspector.NetworkDataGridNode} node
- */
- _applyFilter: function(node)
- {
- var filter = this._textFilterUI.regex();
- var request = node._request;
-
- var matches = true;
- if (this._dataURLFilterUI.checked() && request.parsedURL.isDataURL())
- matches = false;
- if (matches && !this._resourceTypeFilterUI.accept(request.type.name()))
- matches = false;
-
- if (matches && filter) {
- matches = filter.test(request.name()) || filter.test(request.path());
- if (matches)
- this._highlightMatchedRequest(request, false, filter);
- }
-
- node.element.enableStyleClass("filtered-out", !matches);
- if (matches)
- this._filteredOutRequests.remove(request);
- else
- this._filteredOutRequests.put(request, true);
- },
-
- _filterRequests: function()
- {
- this._removeAllHighlights();
- this._filteredOutRequests.clear();
-
- var nodes = this._dataGrid.rootNode().children;
- for (var i = 0; i < nodes.length; ++i)
- this._applyFilter(nodes[i]);
- this._updateSummaryBar();
- this._updateOffscreenRows();
- },
-
- jumpToPreviousSearchResult: function()
- {
- if (!this._matchedRequests.length)
- return;
- this._highlightNthMatchedRequestForSearch((this._currentMatchedRequestIndex + this._matchedRequests.length - 1) % this._matchedRequests.length, true);
- },
-
- jumpToNextSearchResult: function()
- {
- if (!this._matchedRequests.length)
- return;
- this._highlightNthMatchedRequestForSearch((this._currentMatchedRequestIndex + 1) % this._matchedRequests.length, true);
- },
-
- searchCanceled: function()
- {
- this._clearSearchMatchedList();
- this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.SearchCountUpdated, 0);
- },
-
- revealAndHighlightRequest: function(request)
- {
- this._removeAllNodeHighlights();
-
- var node = this._requestGridNode(request);
- if (node) {
- this._dataGrid.element.focus();
- node.reveal();
- this._highlightNode(node);
- }
- },
-
- _removeAllNodeHighlights: function()
- {
- if (this._highlightedNode) {
- this._highlightedNode.element.classList.remove("highlighted-row");
- delete this._highlightedNode;
- }
- },
-
- _highlightNode: function(node)
- {
- node.element.classList.add("highlighted-row");
- this._highlightedNode = node;
- },
-
- /**
- * @param {!WebInspector.NetworkRequest} request
- * @return {string}
- */
- _generateCurlCommand: function(request)
- {
- var command = ["curl"];
- // These headers are derived from URL (except "version") and would be added by cURL anyway.
- var ignoredHeaders = {"host": 1, "method": 1, "path": 1, "scheme": 1, "version": 1};
-
- function escapeStringWin(str)
- {
- /* Replace quote by double quote (but not by \") because it is
- recognized by both cmd.exe and MS Crt arguments parser.
-
- Replace % by "%" because it could be expanded to an environment
- variable value. So %% becomes "%""%". Even if an env variable ""
- (2 doublequotes) is declared, the cmd.exe will not
- substitute it with its value.
-
- Replace each backslash with double backslash to make sure
- MS Crt arguments parser won't collapse them.
-
- Replace new line outside of quotes since cmd.exe doesn't let
- to do it inside.
- */
- return "\"" + str.replace(/"/g, "\"\"")
- .replace(/%/g, "\"%\"")
- .replace(/\\/g, "\\\\")
- .replace(/[\r\n]+/g, "\"^$&\"") + "\"";
- }
-
- function escapeStringPosix(str)
- {
- function escapeCharacter(x)
- {
- var code = x.charCodeAt(0);
- if (code < 256) {
- // Add leading zero when needed to not care about the next character.
- return code < 16 ? "\\x0" + code.toString(16) : "\\x" + code.toString(16);
- }
- code = code.toString(16);
- return "\\u" + ("0000" + code).substr(code.length, 4);
- }
-
- if (/[^\x20-\x7E]|\'/.test(str)) {
- // Use ANSI-C quoting syntax.
- return "$\'" + str.replace(/\\/g, "\\\\")
- .replace(/\'/g, "\\\'")
- .replace(/\n/g, "\\n")
- .replace(/\r/g, "\\r")
- .replace(/[^\x20-\x7E]/g, escapeCharacter) + "'";
- } else {
- // Use single quote syntax.
- return "'" + str + "'";
- }
- }
-
- // cURL command expected to run on the same platform that DevTools run
- // (it may be different from the inspected page platform).
- var escapeString = WebInspector.isWin() ? escapeStringWin : escapeStringPosix;
-
- command.push(escapeString(request.url).replace(/[[{}\]]/g, "\\$&"));
-
- var inferredMethod = "GET";
- var data = [];
- var requestContentType = request.requestContentType();
- if (requestContentType && requestContentType.startsWith("application/x-www-form-urlencoded") && request.requestFormData) {
- data.push("--data");
- data.push(escapeString(request.requestFormData));
- ignoredHeaders["content-length"] = true;
- inferredMethod = "POST";
- } else if (request.requestFormData) {
- data.push("--data-binary");
- data.push(escapeString(request.requestFormData));
- ignoredHeaders["content-length"] = true;
- inferredMethod = "POST";
- }
-
- if (request.requestMethod !== inferredMethod) {
- command.push("-X");
- command.push(request.requestMethod);
- }
-
- var requestHeaders = request.requestHeaders();
- for (var i = 0; i < requestHeaders.length; i++) {
- var header = requestHeaders[i];
- var name = header.name.replace(/^:/, ""); // Translate SPDY v3 headers to HTTP headers.
- if (name.toLowerCase() in ignoredHeaders)
- continue;
- command.push("-H");
- command.push(escapeString(name + ": " + header.value));
- }
- command = command.concat(data);
- command.push("--compressed");
- return command.join(" ");
- },
-
- __proto__: WebInspector.View.prototype
-}
-
-/**
- * @param {!WebInspector.NetworkRequest} request
- * @return {boolean}
- */
-WebInspector.NetworkLogView.HTTPRequestsFilter = function(request)
-{
- return request.parsedURL.isValid && (request.scheme in WebInspector.NetworkLogView.HTTPSchemas);
-}
-
-
-WebInspector.NetworkLogView.EventTypes = {
- ViewCleared: "ViewCleared",
- RowSizeChanged: "RowSizeChanged",
- RequestSelected: "RequestSelected",
- SearchCountUpdated: "SearchCountUpdated",
- SearchIndexUpdated: "SearchIndexUpdated"
-};
-
-/**
- * @constructor
- * @implements {WebInspector.ContextMenu.Provider}
- * @implements {WebInspector.Searchable}
- * @extends {WebInspector.Panel}
- */
-WebInspector.NetworkPanel = function()
-{
- WebInspector.Panel.call(this, "network");
- this.registerRequiredCSS("networkPanel.css");
- this._injectStyles();
-
- this.element.classList.add("vbox");
-
- this._panelStatusBarElement = this.element.createChild("div", "panel-status-bar");
- this._filterBar = new WebInspector.FilterBar();
- this._filtersContainer = this.element.createChild("div", "network-filters-header hidden");
- this._filtersContainer.appendChild(this._filterBar.filtersElement());
- this._filterBar.addEventListener(WebInspector.FilterBar.Events.FiltersToggled, this._onFiltersToggled, this);
-
- this._searchableView = new WebInspector.SearchableView(this);
- this._searchableView.show(this.element);
- this._contentsElement = this._searchableView.element;
-
- this.createSidebarView(this._contentsElement);
- this.splitView.element.classList.remove("fill");
- this.splitView.hideMainElement();
-
- var defaultColumnsVisibility = WebInspector.NetworkLogView._defaultColumnsVisibility;
- var networkLogColumnsVisibilitySetting = WebInspector.settings.createSetting("networkLogColumnsVisibility", defaultColumnsVisibility);
- var savedColumnsVisibility = networkLogColumnsVisibilitySetting.get();
- var columnsVisibility = {};
- for (var columnId in defaultColumnsVisibility)
- columnsVisibility[columnId] = savedColumnsVisibility.hasOwnProperty(columnId) ? savedColumnsVisibility[columnId] : defaultColumnsVisibility[columnId];
- networkLogColumnsVisibilitySetting.set(columnsVisibility);
-
- this._networkLogView = new WebInspector.NetworkLogView(this._filterBar, networkLogColumnsVisibilitySetting);
- this._networkLogView.show(this.sidebarElement);
-
- this._viewsContainerElement = this.splitView.mainElement;
- this._viewsContainerElement.id = "network-views";
- this._viewsContainerElement.classList.add("hidden");
- if (!this._networkLogView.useLargeRows)
- this._viewsContainerElement.classList.add("small");
-
- this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.ViewCleared, this._onViewCleared, this);
- this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.RowSizeChanged, this._onRowSizeChanged, this);
- this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.RequestSelected, this._onRequestSelected, this);
- this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.SearchCountUpdated, this._onSearchCountUpdated, this);
- this._networkLogView.addEventListener(WebInspector.NetworkLogView.EventTypes.SearchIndexUpdated, this._onSearchIndexUpdated, this);
-
- this._closeButtonElement = this._viewsContainerElement.createChild("div", "close-button");
- this._closeButtonElement.id = "network-close-button";
- this._closeButtonElement.addEventListener("click", this._toggleGridMode.bind(this), false);
- this._viewsContainerElement.appendChild(this._closeButtonElement);
-
- for (var i = 0; i < this._networkLogView.statusBarItems.length; ++i)
- this._panelStatusBarElement.appendChild(this._networkLogView.statusBarItems[i]);
-
- /**
- * @this {WebInspector.NetworkPanel}
- */
- function viewGetter()
- {
- return this.visibleView;
- }
- WebInspector.GoToLineDialog.install(this, viewGetter.bind(this));
-}
-
-WebInspector.NetworkPanel.prototype = {
- _onFiltersToggled: function(event)
- {
- var toggled = /** @type {boolean} */ (event.data);
- this._filtersContainer.enableStyleClass("hidden", !toggled);
- this.element.enableStyleClass("filters-toggled", toggled);
- },
-
- elementsToRestoreScrollPositionsFor: function()
- {
- return this._networkLogView.elementsToRestoreScrollPositionsFor();
- },
-
- /**
- * @return {!WebInspector.SearchableView}
- */
- searchableView: function()
- {
- return this._searchableView;
- },
-
- // FIXME: only used by the layout tests, should not be exposed.
- _reset: function()
- {
- this._networkLogView._reset();
- },
-
- handleShortcut: function(event)
- {
- if (this._viewingRequestMode && event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code) {
- this._toggleGridMode();
- event.handled = true;
- return;
- }
-
- WebInspector.Panel.prototype.handleShortcut.call(this, event);
- },
-
- wasShown: function()
- {
- WebInspector.Panel.prototype.wasShown.call(this);
- },
-
- get requests()
- {
- return this._networkLogView.requests;
- },
-
- requestById: function(id)
- {
- return this._networkLogView.requestById(id);
- },
-
- _requestByAnchor: function(anchor)
- {
- return anchor.requestId ? this.requestById(anchor.requestId) : this._networkLogView._requestsByURL[anchor.href];
- },
-
- /**
- * @param {!Element} anchor
- * @return {boolean}
- */
- showAnchorLocation: function(anchor)
- {
- var request = this._requestByAnchor(anchor);
- if (!request)
- return false;
- this.revealAndHighlightRequest(request)
- WebInspector.inspectorView.setCurrentPanel(this);
- return true;
- },
-
- revealAndHighlightRequest: function(request)
- {
- this._toggleGridMode();
- if (request)
- this._networkLogView.revealAndHighlightRequest(request);
- },
-
- _onViewCleared: function(event)
- {
- this._closeVisibleRequest();
- this._toggleGridMode();
- this._viewsContainerElement.removeChildren();
- this._viewsContainerElement.appendChild(this._closeButtonElement);
- },
-
- _onRowSizeChanged: function(event)
- {
- this._viewsContainerElement.enableStyleClass("small", !event.data.largeRows);
- },
-
- _onSearchCountUpdated: function(event)
- {
- this._searchableView.updateSearchMatchesCount(event.data);
- },
-
- _onSearchIndexUpdated: function(event)
- {
- this._searchableView.updateCurrentMatchIndex(event.data);
- },
-
- _onRequestSelected: function(event)
- {
- this._showRequest(event.data);
- },
-
- _showRequest: function(request)
- {
- if (!request)
- return;
-
- this._toggleViewingRequestMode();
-
- if (this.visibleView) {
- this.visibleView.detach();
- delete this.visibleView;
- }
-
- var view = new WebInspector.NetworkItemView(request);
- view.show(this._viewsContainerElement);
- this.visibleView = view;
- },
-
- _closeVisibleRequest: function()
- {
- this.element.classList.remove("viewing-resource");
-
- if (this.visibleView) {
- this.visibleView.detach();
- delete this.visibleView;
- }
- },
-
- _toggleGridMode: function()
- {
- if (this._viewingRequestMode) {
- this._viewingRequestMode = false;
- this.element.classList.remove("viewing-resource");
- this.splitView.hideMainElement();
- }
-
- this._networkLogView.switchToDetailedView();
- this._networkLogView.allowPopover = true;
- this._networkLogView._allowRequestSelection = false;
- },
-
- _toggleViewingRequestMode: function()
- {
- if (this._viewingRequestMode)
- return;
- this._viewingRequestMode = true;
-
- this.element.classList.add("viewing-resource");
- this.splitView.showMainElement();
- this._networkLogView.allowPopover = false;
- this._networkLogView._allowRequestSelection = true;
- this._networkLogView.switchToBriefView();
- },
-
- /**
- * @param {string} query
- * @param {boolean} shouldJump
- */
- performSearch: function(query, shouldJump)
- {
- this._networkLogView.performSearch(query, shouldJump);
- },
-
- jumpToPreviousSearchResult: function()
- {
- this._networkLogView.jumpToPreviousSearchResult();
- },
-
- jumpToNextSearchResult: function()
- {
- this._networkLogView.jumpToNextSearchResult();
- },
-
- searchCanceled: function()
- {
- this._networkLogView.searchCanceled();
- },
-
- /**
- * @param {!WebInspector.ContextMenu} contextMenu
- * @param {!Object} target
- * @this {WebInspector.NetworkPanel}
- */
- appendApplicableItems: function(event, contextMenu, target)
- {
- /**
- * @this {WebInspector.NetworkPanel}
- */
- function reveal(request)
- {
- WebInspector.inspectorView.setCurrentPanel(this);
- this.revealAndHighlightRequest(request);
- }
-
- /**
- * @this {WebInspector.NetworkPanel}
- */
- function appendRevealItem(request)
- {
- var revealText = WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Reveal in Network panel" : "Reveal in Network Panel");
- contextMenu.appendItem(revealText, reveal.bind(this, request));
- }
-
- if (target instanceof WebInspector.Resource) {
- var resource = /** @type {!WebInspector.Resource} */ (target);
- if (resource.request)
- appendRevealItem.call(this, resource.request);
- return;
- }
- if (target instanceof WebInspector.UISourceCode) {
- var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (target);
- var resource = WebInspector.resourceForURL(uiSourceCode.url);
- if (resource && resource.request)
- appendRevealItem.call(this, resource.request);
- return;
- }
-
- if (!(target instanceof WebInspector.NetworkRequest))
- return;
- var request = /** @type {!WebInspector.NetworkRequest} */ (target);
- if (this.visibleView && this.visibleView.isShowing() && this.visibleView.request() === request)
- return;
-
- appendRevealItem.call(this, request);
- },
-
- _injectStyles: function()
- {
- var style = document.createElement("style");
- var rules = [];
-
- var columns = WebInspector.NetworkLogView._defaultColumnsVisibility;
-
- var hideSelectors = [];
- var bgSelectors = [];
- for (var columnId in columns) {
- hideSelectors.push("#network-container .hide-" + columnId + "-column ." + columnId + "-column");
- bgSelectors.push(".network-log-grid.data-grid td." + columnId + "-column");
- }
- rules.push(hideSelectors.join(", ") + "{border-left: 0 none transparent;}");
- rules.push(bgSelectors.join(", ") + "{background-color: rgba(0, 0, 0, 0.07);}");
-
- style.textContent = rules.join("\n");
- document.head.appendChild(style);
- },
-
- __proto__: WebInspector.Panel.prototype
-}
-
-/**
- * @constructor
- * @implements {WebInspector.TimelineGrid.Calculator}
- */
-WebInspector.NetworkBaseCalculator = function()
-{
-}
-
-WebInspector.NetworkBaseCalculator.prototype = {
- computePosition: function(time)
- {
- return (time - this._minimumBoundary) / this.boundarySpan() * this._workingArea;
- },
-
- computeBarGraphPercentages: function(item)
- {
- return {start: 0, middle: 0, end: (this._value(item) / this.boundarySpan()) * 100};
- },
-
- computeBarGraphLabels: function(item)
- {
- const label = this.formatTime(this._value(item));
- return {left: label, right: label, tooltip: label};
- },
-
- boundarySpan: function()
- {
- return this._maximumBoundary - this._minimumBoundary;
- },
-
- updateBoundaries: function(item)
- {
- this._minimumBoundary = 0;
-
- var value = this._value(item);
- if (typeof this._maximumBoundary === "undefined" || value > this._maximumBoundary) {
- this._maximumBoundary = value;
- return true;
- }
- return false;
- },
-
- reset: function()
- {
- delete this._minimumBoundary;
- delete this._maximumBoundary;
- },
-
- maximumBoundary: function()
- {
- return this._maximumBoundary;
- },
-
- minimumBoundary: function()
- {
- return this._minimumBoundary;
- },
-
- zeroTime: function()
- {
- return this._minimumBoundary;
- },
-
- _value: function(item)
- {
- return 0;
- },
-
- /**
- * @param {number} value
- * @param {boolean=} hires
- * @return {string}
- */
- formatTime: function(value, hires)
- {
- return value.toString();
- },
-
- setDisplayWindow: function(clientWidth)
- {
- this._workingArea = clientWidth;
- this.paddingLeft = 0;
- }
-}
-
-/**
- * @constructor
- * @extends {WebInspector.NetworkBaseCalculator}
- */
-WebInspector.NetworkTimeCalculator = function(startAtZero)
-{
- WebInspector.NetworkBaseCalculator.call(this);
- this.startAtZero = startAtZero;
-}
-
-WebInspector.NetworkTimeCalculator.prototype = {
- computeBarGraphPercentages: function(request)
- {
- if (request.startTime !== -1)
- var start = ((request.startTime - this._minimumBoundary) / this.boundarySpan()) * 100;
- else
- var start = 0;
-
- if (request.responseReceivedTime !== -1)
- var middle = ((request.responseReceivedTime - this._minimumBoundary) / this.boundarySpan()) * 100;
- else
- var middle = (this.startAtZero ? start : 100);
-
- if (request.endTime !== -1)
- var end = ((request.endTime - this._minimumBoundary) / this.boundarySpan()) * 100;
- else
- var end = (this.startAtZero ? middle : 100);
-
- if (this.startAtZero) {
- end -= start;
- middle -= start;
- start = 0;
- }
-
- return {start: start, middle: middle, end: end};
- },
-
- computePercentageFromEventTime: function(eventTime)
- {
- // This function computes a percentage in terms of the total loading time
- // of a specific event. If startAtZero is set, then this is useless, and we
- // want to return 0.
- if (eventTime !== -1 && !this.startAtZero)
- return ((eventTime - this._minimumBoundary) / this.boundarySpan()) * 100;
-
- return 0;
- },
-
- updateBoundariesForEventTime: function(eventTime)
- {
- if (eventTime === -1 || this.startAtZero)
- return false;
-
- if (typeof this._maximumBoundary === "undefined" || eventTime > this._maximumBoundary) {
- this._maximumBoundary = eventTime;
- return true;
- }
- return false;
- },
-
- computeBarGraphLabels: function(request)
- {
- var rightLabel = "";
- if (request.responseReceivedTime !== -1 && request.endTime !== -1)
- rightLabel = this.formatTime(request.endTime - request.responseReceivedTime);
-
- var hasLatency = request.latency > 0;
- if (hasLatency)
- var leftLabel = this.formatTime(request.latency);
- else
- var leftLabel = rightLabel;
-
- if (request.timing)
- return {left: leftLabel, right: rightLabel};
-
- if (hasLatency && rightLabel) {
- var total = this.formatTime(request.duration);
- var tooltip = WebInspector.UIString("%s latency, %s download (%s total)", leftLabel, rightLabel, total);
- } else if (hasLatency)
- var tooltip = WebInspector.UIString("%s latency", leftLabel);
- else if (rightLabel)
- var tooltip = WebInspector.UIString("%s download", rightLabel);
-
- if (request.cached)
- tooltip = WebInspector.UIString("%s (from cache)", tooltip);
- return {left: leftLabel, right: rightLabel, tooltip: tooltip};
- },
-
- updateBoundaries: function(request)
- {
- var didChange = false;
-
- var lowerBound;
- if (this.startAtZero)
- lowerBound = 0;
- else
- lowerBound = this._lowerBound(request);
-
- if (lowerBound !== -1 && (typeof this._minimumBoundary === "undefined" || lowerBound < this._minimumBoundary)) {
- this._minimumBoundary = lowerBound;
- didChange = true;
- }
-
- var upperBound = this._upperBound(request);
- if (upperBound !== -1 && (typeof this._maximumBoundary === "undefined" || upperBound > this._maximumBoundary)) {
- this._maximumBoundary = upperBound;
- didChange = true;
- }
-
- return didChange;
- },
-
- formatTime: function(value)
- {
- return Number.secondsToString(value);
- },
-
- _lowerBound: function(request)
- {
- return 0;
- },
-
- _upperBound: function(request)
- {
- return 0;
- },
-
- __proto__: WebInspector.NetworkBaseCalculator.prototype
-}
-
-/**
- * @constructor
- * @extends {WebInspector.NetworkTimeCalculator}
- */
-WebInspector.NetworkTransferTimeCalculator = function()
-{
- WebInspector.NetworkTimeCalculator.call(this, false);
-}
-
-WebInspector.NetworkTransferTimeCalculator.prototype = {
- formatTime: function(value)
- {
- return Number.secondsToString(value);
- },
-
- _lowerBound: function(request)
- {
- return request.startTime;
- },
-
- _upperBound: function(request)
- {
- return request.endTime;
- },
-
- __proto__: WebInspector.NetworkTimeCalculator.prototype
-}
-
-/**
- * @constructor
- * @extends {WebInspector.NetworkTimeCalculator}
- */
-WebInspector.NetworkTransferDurationCalculator = function()
-{
- WebInspector.NetworkTimeCalculator.call(this, true);
-}
-
-WebInspector.NetworkTransferDurationCalculator.prototype = {
- formatTime: function(value)
- {
- return Number.secondsToString(value);
- },
-
- _upperBound: function(request)
- {
- return request.duration;
- },
-
- __proto__: WebInspector.NetworkTimeCalculator.prototype
-}
-
-/**
- * @constructor
- * @extends {WebInspector.DataGridNode}
- * @param {!WebInspector.NetworkLogView} parentView
- * @param {!WebInspector.NetworkRequest} request
- */
-WebInspector.NetworkDataGridNode = function(parentView, request)
-{
- WebInspector.DataGridNode.call(this, {});
- this._parentView = parentView;
- this._request = request;
- this._linkifier = new WebInspector.Linkifier();
-}
-
-WebInspector.NetworkDataGridNode.prototype = {
- /** override */
- createCells: function()
- {
- // Out of sight, out of mind: create nodes offscreen to save on render tree update times when running updateOffscreenRows()
- this._element.classList.add("offscreen");
- this._nameCell = this._createDivInTD("name");
- this._methodCell = this._createDivInTD("method");
- this._statusCell = this._createDivInTD("status");
- this._schemeCell = this._createDivInTD("scheme");
- this._domainCell = this._createDivInTD("domain");
- this._typeCell = this._createDivInTD("type");
- this._initiatorCell = this._createDivInTD("initiator");
- this._cookiesCell = this._createDivInTD("cookies");
- this._setCookiesCell = this._createDivInTD("setCookies");
- this._sizeCell = this._createDivInTD("size");
- this._timeCell = this._createDivInTD("time");
-
- this._responseHeaderCells = {};
- var responseHeaderColumns = WebInspector.NetworkLogView._responseHeaderColumns;
- for (var i = 0; i < responseHeaderColumns.length; ++i)
- this._responseHeaderCells[responseHeaderColumns[i]] = this._createDivInTD(responseHeaderColumns[i]);
-
- this._timelineCell = this._createDivInTD("timeline");
- this._createTimelineBar(this._timelineCell);
- this._nameCell.addEventListener("click", this._onClick.bind(this), false);
- this._nameCell.addEventListener("dblclick", this._openInNewTab.bind(this), false);
- },
-
- wasDetached: function()
- {
- this._linkifier.reset();
- },
-
- isFilteredOut: function()
- {
- return !!this._parentView._filteredOutRequests.get(this._request);
- },
-
- _onClick: function()
- {
- if (!this._parentView._allowRequestSelection)
- this.select();
- },
-
- select: function()
- {
- this._parentView.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.RequestSelected, this._request);
- WebInspector.DataGridNode.prototype.select.apply(this, arguments);
-
- WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMetrics.UserAction, {
- action: WebInspector.UserMetrics.UserActionNames.NetworkRequestSelected,
- url: this._request.url
- });
- },
-
- _highlightMatchedSubstring: function(regexp)
- {
- var domChanges = [];
- var matchInfo = this._element.textContent.match(regexp);
- if (matchInfo)
- WebInspector.highlightSearchResult(this._nameCell, matchInfo.index, matchInfo[0].length, domChanges);
- return domChanges;
- },
-
- _openInNewTab: function()
- {
- InspectorFrontendHost.openInNewTab(this._request.url);
- },
-
- get selectable()
- {
- return this._parentView._allowRequestSelection && !this.isFilteredOut();
- },
-
- _createDivInTD: function(columnIdentifier)
- {
- var td = this.createTD(columnIdentifier);
- var div = td.createChild("div");
- this._element.appendChild(td);
- return div;
- },
-
- /**
- * @param {!Element} cell
- */
- _createTimelineBar: function(cell)
- {
- cell.className = "network-graph-side";
-
- this._barAreaElement = document.createElement("div");
- // this._barAreaElement.className = "network-graph-bar-area hidden";
- this._barAreaElement.className = "network-graph-bar-area";
- this._barAreaElement.request = this._request;
- cell.appendChild(this._barAreaElement);
-
- this._barLeftElement = document.createElement("div");
- this._barLeftElement.className = "network-graph-bar waiting";
- this._barAreaElement.appendChild(this._barLeftElement);
-
- this._barRightElement = document.createElement("div");
- this._barRightElement.className = "network-graph-bar";
- this._barAreaElement.appendChild(this._barRightElement);
-
-
- this._labelLeftElement = document.createElement("div");
- this._labelLeftElement.className = "network-graph-label waiting";
- this._barAreaElement.appendChild(this._labelLeftElement);
-
- this._labelRightElement = document.createElement("div");
- this._labelRightElement.className = "network-graph-label";
- this._barAreaElement.appendChild(this._labelRightElement);
-
- cell.addEventListener("mouseover", this._refreshLabelPositions.bind(this), false);
- },
-
- refreshRequest: function()
- {
- this._refreshNameCell();
- this._refreshMethodCell();
- this._refreshStatusCell();
- this._refreshSchemeCell();
- this._refreshDomainCell();
- this._refreshTypeCell();
- this._refreshInitiatorCell();
- this._refreshCookiesCell();
- this._refreshSetCookiesCell();
- this._refreshSizeCell();
- this._refreshTimeCell();
-
- var responseHeaderColumns = WebInspector.NetworkLogView._responseHeaderColumns;
- for (var i = 0; i < responseHeaderColumns.length; ++i)
- this._refreshResponseHeaderCell(responseHeaderColumns[i]);
-
- if (this._request.cached)
- this._timelineCell.classList.add("resource-cached");
-
- this._element.classList.add("network-item");
- this._element.enableStyleClass("network-error-row", this._request.failed || (this._request.statusCode >= 400));
- this._updateElementStyleClasses(this._element);
- },
-
- /**
- * @param {!Element} element
- */
- _updateElementStyleClasses: function(element)
- {
- var typeClassName = "network-type-" + this._request.type.name();
- if (!element.classList.contains(typeClassName)) {
- element.removeMatchingStyleClasses("network-type-\\w+");
- element.classList.add(typeClassName);
- }
- },
-
- _refreshResponseHeaderCell: function(headerName)
- {
- var cell = this._responseHeaderCells[headerName];
- var value = this._request.responseHeaderValue(headerName);
- cell.setTextAndTitle(value ? value : "");
- },
-
- _refreshNameCell: function()
- {
- this._nameCell.removeChildren();
-
- if (this._request.type === WebInspector.resourceTypes.Image) {
- var previewImage = document.createElement("img");
- previewImage.className = "image-network-icon-preview";
- this._request.populateImageSource(previewImage);
-
- var iconElement = document.createElement("div");
- iconElement.className = "icon";
- iconElement.appendChild(previewImage);
- } else {
- var iconElement = document.createElement("img");
- iconElement.className = "icon";
- }
- this._nameCell.appendChild(iconElement);
- this._nameCell.appendChild(document.createTextNode(this._request.name()));
- this._appendSubtitle(this._nameCell, this._request.path());
- this._nameCell.title = this._request.url;
- },
-
- _refreshMethodCell: function()
- {
- this._methodCell.setTextAndTitle(this._request.requestMethod);
- },
-
- _refreshStatusCell: function()
- {
- this._statusCell.removeChildren();
-
- if (this._request.failed) {
- var failText = this._request.canceled ? WebInspector.UIString("(canceled)") : WebInspector.UIString("(failed)");
- if (this._request.localizedFailDescription) {
- this._statusCell.appendChild(document.createTextNode(failText));
- this._appendSubtitle(this._statusCell, this._request.localizedFailDescription);
- this._statusCell.title = failText + " " + this._request.localizedFailDescription;
- } else
- this._statusCell.setTextAndTitle(failText);
- this._statusCell.classList.add("network-dim-cell");
- return;
- }
-
- this._statusCell.classList.remove("network-dim-cell");
-
- if (this._request.statusCode) {
- this._statusCell.appendChild(document.createTextNode("" + this._request.statusCode));
- this._appendSubtitle(this._statusCell, this._request.statusText);
- this._statusCell.title = this._request.statusCode + " " + this._request.statusText;
- if (this._request.cached)
- this._statusCell.classList.add("network-dim-cell");
- } else {
- if (this._request.parsedURL.isDataURL())
- this._statusCell.setTextAndTitle(WebInspector.UIString("(data)"));
- else if (this._request.isPingRequest())
- this._statusCell.setTextAndTitle(WebInspector.UIString("(ping)"));
- else if (this._request.finished)
- this._statusCell.setTextAndTitle(WebInspector.UIString("Finished"));
- else
- this._statusCell.setTextAndTitle(WebInspector.UIString("(pending)"));
- this._statusCell.classList.add("network-dim-cell");
- }
- },
-
- _refreshSchemeCell: function()
- {
- this._schemeCell.setTextAndTitle(this._request.scheme);
- },
-
- _refreshDomainCell: function()
- {
- this._domainCell.setTextAndTitle(this._request.domain);
- },
-
- _refreshTypeCell: function()
- {
- if (this._request.mimeType) {
- this._typeCell.classList.remove("network-dim-cell");
- this._typeCell.setTextAndTitle(this._request.mimeType);
- } else {
- this._typeCell.enableStyleClass("network-dim-cell", !this._request.isPingRequest());
- this._typeCell.setTextAndTitle(this._request.requestContentType() || "");
- }
- },
-
- _refreshInitiatorCell: function()
- {
- this._initiatorCell.removeChildren();
- this._initiatorCell.classList.remove("network-dim-cell");
- this._initiatorCell.classList.remove("network-script-initiated");
- delete this._initiatorCell.request;
-
- var request = this._request;
- var initiator = request.initiatorInfo();
-
- switch (initiator.type) {
- case WebInspector.NetworkRequest.InitiatorType.Parser:
- this._initiatorCell.title = initiator.url + ":" + initiator.lineNumber;
- this._initiatorCell.appendChild(WebInspector.linkifyResourceAsNode(initiator.url, initiator.lineNumber - 1));
- this._appendSubtitle(this._initiatorCell, WebInspector.UIString("Parser"));
- break;
-
- case WebInspector.NetworkRequest.InitiatorType.Redirect:
- this._initiatorCell.title = initiator.url;
- console.assert(request.redirectSource);
- var redirectSource = /** @type {!WebInspector.NetworkRequest} */ (request.redirectSource);
- this._initiatorCell.appendChild(WebInspector.linkifyRequestAsNode(redirectSource));
- this._appendSubtitle(this._initiatorCell, WebInspector.UIString("Redirect"));
- break;
-
- case WebInspector.NetworkRequest.InitiatorType.Script:
- var urlElement = this._linkifier.linkifyLocation(initiator.url, initiator.lineNumber - 1, initiator.columnNumber - 1);
- urlElement.title = "";
- this._initiatorCell.appendChild(urlElement);
- this._appendSubtitle(this._initiatorCell, WebInspector.UIString("Script"));
- this._initiatorCell.classList.add("network-script-initiated");
- this._initiatorCell.request = request;
- break;
-
- default:
- this._initiatorCell.title = "";
- this._initiatorCell.classList.add("network-dim-cell");
- this._initiatorCell.setTextAndTitle(WebInspector.UIString("Other"));
- }
- },
-
- _refreshCookiesCell: function()
- {
- var requestCookies = this._request.requestCookies;
- this._cookiesCell.setTextAndTitle(requestCookies ? "" + requestCookies.length : "");
- },
-
- _refreshSetCookiesCell: function()
- {
- var responseCookies = this._request.responseCookies;
- this._setCookiesCell.setTextAndTitle(responseCookies ? "" + responseCookies.length : "");
- },
-
- _refreshSizeCell: function()
- {
- if (this._request.cached) {
- this._sizeCell.setTextAndTitle(WebInspector.UIString("(from cache)"));
- this._sizeCell.classList.add("network-dim-cell");
- } else {
- var resourceSize = Number.bytesToString(this._request.resourceSize);
- var transferSize = Number.bytesToString(this._request.transferSize);
- this._sizeCell.setTextAndTitle(transferSize);
- this._sizeCell.classList.remove("network-dim-cell");
- this._appendSubtitle(this._sizeCell, resourceSize);
- }
- },
-
- _refreshTimeCell: function()
- {
- if (this._request.duration > 0) {
- this._timeCell.classList.remove("network-dim-cell");
- this._timeCell.setTextAndTitle(Number.secondsToString(this._request.duration));
- this._appendSubtitle(this._timeCell, Number.secondsToString(this._request.latency));
- } else {
- this._timeCell.classList.add("network-dim-cell");
- this._timeCell.setTextAndTitle(WebInspector.UIString("Pending"));
- }
- },
-
- _appendSubtitle: function(cellElement, subtitleText)
- {
- var subtitleElement = document.createElement("div");
- subtitleElement.className = "network-cell-subtitle";
- subtitleElement.textContent = subtitleText;
- cellElement.appendChild(subtitleElement);
- },
-
- refreshGraph: function(calculator)
- {
- var percentages = calculator.computeBarGraphPercentages(this._request);
- this._percentages = percentages;
-
- this._barAreaElement.classList.remove("hidden");
- this._updateElementStyleClasses(this._timelineCell);
-
- this._barLeftElement.style.setProperty("left", percentages.start + "%");
- this._barRightElement.style.setProperty("right", (100 - percentages.end) + "%");
-
- this._barLeftElement.style.setProperty("right", (100 - percentages.end) + "%");
- this._barRightElement.style.setProperty("left", percentages.middle + "%");
-
- var labels = calculator.computeBarGraphLabels(this._request);
- this._labelLeftElement.textContent = labels.left;
- this._labelRightElement.textContent = labels.right;
-
- var tooltip = (labels.tooltip || "");
- this._barLeftElement.title = tooltip;
- this._labelLeftElement.title = tooltip;
- this._labelRightElement.title = tooltip;
- this._barRightElement.title = tooltip;
- },
-
- _refreshLabelPositions: function()
- {
- if (!this._percentages)
- return;
- this._labelLeftElement.style.removeProperty("left");
- this._labelLeftElement.style.removeProperty("right");
- this._labelLeftElement.classList.remove("before");
- this._labelLeftElement.classList.remove("hidden");
-
- this._labelRightElement.style.removeProperty("left");
- this._labelRightElement.style.removeProperty("right");
- this._labelRightElement.classList.remove("after");
- this._labelRightElement.classList.remove("hidden");
-
- const labelPadding = 10;
- const barRightElementOffsetWidth = this._barRightElement.offsetWidth;
- const barLeftElementOffsetWidth = this._barLeftElement.offsetWidth;
-
- if (this._barLeftElement) {
- var leftBarWidth = barLeftElementOffsetWidth - labelPadding;
- var rightBarWidth = (barRightElementOffsetWidth - barLeftElementOffsetWidth) - labelPadding;
- } else {
- var leftBarWidth = (barLeftElementOffsetWidth - barRightElementOffsetWidth) - labelPadding;
- var rightBarWidth = barRightElementOffsetWidth - labelPadding;
- }
-
- const labelLeftElementOffsetWidth = this._labelLeftElement.offsetWidth;
- const labelRightElementOffsetWidth = this._labelRightElement.offsetWidth;
-
- const labelBefore = (labelLeftElementOffsetWidth > leftBarWidth);
- const labelAfter = (labelRightElementOffsetWidth > rightBarWidth);
- const graphElementOffsetWidth = this._timelineCell.offsetWidth;
-
- if (labelBefore && (graphElementOffsetWidth * (this._percentages.start / 100)) < (labelLeftElementOffsetWidth + 10))
- var leftHidden = true;
-
- if (labelAfter && (graphElementOffsetWidth * ((100 - this._percentages.end) / 100)) < (labelRightElementOffsetWidth + 10))
- var rightHidden = true;
-
- if (barLeftElementOffsetWidth == barRightElementOffsetWidth) {
- // The left/right label data are the same, so a before/after label can be replaced by an on-bar label.
- if (labelBefore && !labelAfter)
- leftHidden = true;
- else if (labelAfter && !labelBefore)
- rightHidden = true;
- }
-
- if (labelBefore) {
- if (leftHidden)
- this._labelLeftElement.classList.add("hidden");
- this._labelLeftElement.style.setProperty("right", (100 - this._percentages.start) + "%");
- this._labelLeftElement.classList.add("before");
- } else {
- this._labelLeftElement.style.setProperty("left", this._percentages.start + "%");
- this._labelLeftElement.style.setProperty("right", (100 - this._percentages.middle) + "%");
- }
-
- if (labelAfter) {
- if (rightHidden)
- this._labelRightElement.classList.add("hidden");
- this._labelRightElement.style.setProperty("left", this._percentages.end + "%");
- this._labelRightElement.classList.add("after");
- } else {
- this._labelRightElement.style.setProperty("left", this._percentages.middle + "%");
- this._labelRightElement.style.setProperty("right", (100 - this._percentages.end) + "%");
- }
- },
-
- __proto__: WebInspector.DataGridNode.prototype
-}
-
-WebInspector.NetworkDataGridNode.NameComparator = function(a, b)
-{
- var aFileName = a._request.name();
- var bFileName = b._request.name();
- if (aFileName > bFileName)
- return 1;
- if (bFileName > aFileName)
- return -1;
- return 0;
-}
-
-WebInspector.NetworkDataGridNode.SizeComparator = function(a, b)
-{
- if (b._request.cached && !a._request.cached)
- return 1;
- if (a._request.cached && !b._request.cached)
- return -1;
-
- return a._request.transferSize - b._request.transferSize;
-}
-
-WebInspector.NetworkDataGridNode.InitiatorComparator = function(a, b)
-{
- var aInitiator = a._request.initiatorInfo();
- var bInitiator = b._request.initiatorInfo();
-
- if (aInitiator.type < bInitiator.type)
- return -1;
- if (aInitiator.type > bInitiator.type)
- return 1;
-
- if (aInitiator.source < bInitiator.source)
- return -1;
- if (aInitiator.source > bInitiator.source)
- return 1;
-
- if (aInitiator.lineNumber < bInitiator.lineNumber)
- return -1;
- if (aInitiator.lineNumber > bInitiator.lineNumber)
- return 1;
-
- if (aInitiator.columnNumber < bInitiator.columnNumber)
- return -1;
- if (aInitiator.columnNumber > bInitiator.columnNumber)
- return 1;
-
- return 0;
-}
-
-WebInspector.NetworkDataGridNode.RequestCookiesCountComparator = function(a, b)
-{
- var aScore = a._request.requestCookies ? a._request.requestCookies.length : 0;
- var bScore = b._request.requestCookies ? b._request.requestCookies.length : 0;
- return aScore - bScore;
-}
-
-WebInspector.NetworkDataGridNode.ResponseCookiesCountComparator = function(a, b)
-{
- var aScore = a._request.responseCookies ? a._request.responseCookies.length : 0;
- var bScore = b._request.responseCookies ? b._request.responseCookies.length : 0;
- return aScore - bScore;
-}
-
-WebInspector.NetworkDataGridNode.RequestPropertyComparator = function(propertyName, revert, a, b)
-{
- var aValue = a._request[propertyName];
- var bValue = b._request[propertyName];
- if (aValue > bValue)
- return revert ? -1 : 1;
- if (bValue > aValue)
- return revert ? 1 : -1;
- return 0;
-}