| Index: third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
|
| index bb0df65e16a0eb40af2e5e2c7f33d5536cc555bb..45cc4b673569e2c8b45f410ba3b51d292dfeb62e 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
|
| @@ -27,25 +27,26 @@
|
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| */
|
| -
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.VBox}
|
| * @implements {WebInspector.Searchable}
|
| * @implements {WebInspector.TargetManager.Observer}
|
| - * @param {!WebInspector.FilterBar} filterBar
|
| - * @param {!Element} progressBarContainer
|
| - * @param {!WebInspector.Setting} networkLogLargeRowsSetting
|
| + * @unrestricted
|
| */
|
| -WebInspector.NetworkLogView = function(filterBar, progressBarContainer, networkLogLargeRowsSetting)
|
| -{
|
| - WebInspector.VBox.call(this);
|
| +WebInspector.NetworkLogView = class extends WebInspector.VBox {
|
| + /**
|
| + * @param {!WebInspector.FilterBar} filterBar
|
| + * @param {!Element} progressBarContainer
|
| + * @param {!WebInspector.Setting} networkLogLargeRowsSetting
|
| + */
|
| + constructor(filterBar, progressBarContainer, networkLogLargeRowsSetting) {
|
| + super();
|
| this.setMinimumSize(50, 64);
|
| - this.registerRequiredCSS("network/networkLogView.css");
|
| + this.registerRequiredCSS('network/networkLogView.css');
|
|
|
| - this._networkHideDataURLSetting = WebInspector.settings.createSetting("networkHideDataURL", false);
|
| - this._networkResourceTypeFiltersSetting = WebInspector.settings.createSetting("networkResourceTypeFilters", {});
|
| - this._networkShowPrimaryLoadWaterfallSetting = WebInspector.settings.createSetting("networkShowPrimaryLoadWaterfall", false);
|
| + this._networkHideDataURLSetting = WebInspector.settings.createSetting('networkHideDataURL', false);
|
| + this._networkResourceTypeFiltersSetting = WebInspector.settings.createSetting('networkResourceTypeFilters', {});
|
| + this._networkShowPrimaryLoadWaterfallSetting =
|
| + WebInspector.settings.createSetting('networkShowPrimaryLoadWaterfall', false);
|
|
|
| this._filterBar = filterBar;
|
| this._progressBarContainer = progressBarContainer;
|
| @@ -61,14 +62,14 @@ WebInspector.NetworkLogView = function(filterBar, progressBarContainer, networkL
|
| /**
|
| * @this {WebInspector.NetworkLogView}
|
| */
|
| - function updateRowHeight()
|
| - {
|
| - /** @type {number} */
|
| - this._rowHeight = !!this._networkLogLargeRowsSetting.get() ? 41 : 21;
|
| + function updateRowHeight() {
|
| + /** @type {number} */
|
| + this._rowHeight = !!this._networkLogLargeRowsSetting.get() ? 41 : 21;
|
| }
|
| updateRowHeight.call(this);
|
|
|
| - this._columns = new WebInspector.NetworkLogViewColumns(this, this._timeCalculator, this._durationCalculator, networkLogLargeRowsSetting);
|
| + this._columns = new WebInspector.NetworkLogViewColumns(
|
| + this, this._timeCalculator, this._durationCalculator, networkLogLargeRowsSetting);
|
|
|
| /** @type {!Map.<string, !WebInspector.NetworkDataGridNode>} */
|
| this._nodesByRequestId = new Map();
|
| @@ -101,1333 +102,1461 @@ WebInspector.NetworkLogView = function(filterBar, progressBarContainer, networkL
|
| this._resetSuggestionBuilder();
|
| this._initializeView();
|
|
|
| - WebInspector.moduleSetting("networkColorCodeResourceTypes").addChangeListener(this._invalidateAllItems, this);
|
| + WebInspector.moduleSetting('networkColorCodeResourceTypes').addChangeListener(this._invalidateAllItems, this);
|
|
|
| WebInspector.targetManager.observeTargets(this);
|
| - WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestStarted, this._onRequestStarted, this);
|
| - WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestUpdated, this._onRequestUpdated, this);
|
| - WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestFinished, this._onRequestUpdated, this);
|
| -};
|
| -
|
| -WebInspector.NetworkLogView._isFilteredOutSymbol = Symbol("isFilteredOut");
|
| -WebInspector.NetworkLogView._isMatchingSearchQuerySymbol = Symbol("isMatchingSearchQuery");
|
| -
|
| -WebInspector.NetworkLogView.HTTPSchemas = {"http": true, "https": true, "ws": true, "wss": true};
|
| -
|
| -WebInspector.NetworkLogView._waterfallMinOvertime = 1;
|
| -WebInspector.NetworkLogView._waterfallMaxOvertime = 3;
|
| -
|
| -/** @enum {symbol} */
|
| -WebInspector.NetworkLogView.Events = {
|
| - RequestSelected: Symbol("RequestSelected"),
|
| - SearchCountUpdated: Symbol("SearchCountUpdated"),
|
| - SearchIndexUpdated: Symbol("SearchIndexUpdated"),
|
| - UpdateRequest: Symbol("UpdateRequest")
|
| -};
|
| -
|
| -/** @enum {string} */
|
| -WebInspector.NetworkLogView.FilterType = {
|
| - Domain: "domain",
|
| - HasResponseHeader: "has-response-header",
|
| - Is: "is",
|
| - LargerThan: "larger-than",
|
| - Method: "method",
|
| - MimeType: "mime-type",
|
| - MixedContent: "mixed-content",
|
| - Scheme: "scheme",
|
| - SetCookieDomain: "set-cookie-domain",
|
| - SetCookieName: "set-cookie-name",
|
| - SetCookieValue: "set-cookie-value",
|
| - StatusCode: "status-code"
|
| -};
|
| -
|
| -/** @enum {string} */
|
| -WebInspector.NetworkLogView.MixedContentFilterValues = {
|
| - All: "all",
|
| - Displayed: "displayed",
|
| - Blocked: "blocked",
|
| - BlockOverridden: "block-overridden"
|
| -};
|
| -
|
| -/** @enum {string} */
|
| -WebInspector.NetworkLogView.IsFilterType = {
|
| - Running: "running"
|
| -};
|
| -
|
| -/** @type {!Array<string>} */
|
| -WebInspector.NetworkLogView._searchKeys = Object.keys(WebInspector.NetworkLogView.FilterType).map(key => WebInspector.NetworkLogView.FilterType[key]);
|
| -
|
| -WebInspector.NetworkLogView.prototype = {
|
| - /**
|
| - * @return {number}
|
| - */
|
| - headerHeight: function()
|
| - {
|
| - return this._headerHeight;
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} recording
|
| - */
|
| - setRecording: function(recording)
|
| - {
|
| - this._recording = recording;
|
| - this._updateSummaryBar();
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} preserveLog
|
| - */
|
| - setPreserveLog: function(preserveLog)
|
| - {
|
| - this._preserveLog = preserveLog;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.Target} target
|
| - */
|
| - targetAdded: function(target)
|
| - {
|
| - if (!target.parentTarget()) {
|
| - var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
|
| - if (resourceTreeModel) {
|
| - resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this);
|
| - resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.Load, this._loadEventFired, this);
|
| - resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this);
|
| - }
|
| - }
|
| - var networkLog = WebInspector.NetworkLog.fromTarget(target);
|
| - if (networkLog)
|
| - networkLog.requests().forEach(this._appendRequest.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.Target} target
|
| - */
|
| - targetRemoved: function(target)
|
| - {
|
| - if (!target.parentTarget()) {
|
| - var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
|
| - if (resourceTreeModel) {
|
| - resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this);
|
| - resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.Events.Load, this._loadEventFired, this);
|
| - resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this);
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {number} start
|
| - * @param {number} end
|
| - */
|
| - setWindow: function(start, end)
|
| - {
|
| - if (!start && !end) {
|
| - this._timeFilter = null;
|
| - this._timeCalculator.setWindow(null);
|
| - } else {
|
| - this._timeFilter = WebInspector.NetworkLogView._requestTimeFilter.bind(null, start, end);
|
| - this._timeCalculator.setWindow(new WebInspector.NetworkTimeBoundary(start, end));
|
| - }
|
| - this._columns.updateDividersIfNeeded();
|
| - this._filterRequests();
|
| - },
|
| -
|
| - clearSelection: function()
|
| - {
|
| - if (this._dataGrid.selectedNode)
|
| - this._dataGrid.selectedNode.deselect();
|
| - },
|
| -
|
| - _addFilters: function()
|
| - {
|
| - this._textFilterUI = new WebInspector.TextFilterUI(true);
|
| - this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, this._filterChanged, this);
|
| - this._filterBar.addFilter(this._textFilterUI);
|
| -
|
| - var dataURLSetting = this._networkHideDataURLSetting;
|
| - 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);
|
| -
|
| - var filterItems = [];
|
| - for (var categoryId in WebInspector.resourceCategories) {
|
| - var category = WebInspector.resourceCategories[categoryId];
|
| - filterItems.push({name: category.title, label: category.shortTitle, title: category.title});
|
| - }
|
| - this._resourceCategoryFilterUI = new WebInspector.NamedBitSetFilterUI(filterItems, this._networkResourceTypeFiltersSetting);
|
| - this._resourceCategoryFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, this._filterChanged.bind(this), this);
|
| - this._filterBar.addFilter(this._resourceCategoryFilterUI);
|
| - },
|
| -
|
| - _resetSuggestionBuilder: function()
|
| - {
|
| - this._suggestionBuilder = new WebInspector.FilterSuggestionBuilder(WebInspector.NetworkLogView._searchKeys);
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.Is, WebInspector.NetworkLogView.IsFilterType.Running);
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.LargerThan, "100");
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.LargerThan, "10k");
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.LargerThan, "1M");
|
| - this._textFilterUI.setSuggestionBuilder(this._suggestionBuilder);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _filterChanged: function(event)
|
| - {
|
| - this.removeAllNodeHighlights();
|
| - this._parseFilterQuery(this._textFilterUI.value());
|
| - this._filterRequests();
|
| - },
|
| -
|
| - _initializeView: function()
|
| - {
|
| - this.element.id = "network-container";
|
| - this._setupDataGrid();
|
| -
|
| - this._columns.show(this.element);
|
| -
|
| - this._summaryBarElement = this.element.createChild("div", "network-summary-bar");
|
| -
|
| - this._columns.sortByCurrentColumn();
|
| - },
|
| -
|
| - _showRecordingHint: function()
|
| - {
|
| - this._hideRecordingHint();
|
| - this._recordingHint = this.element.createChild("div", "network-status-pane fill");
|
| - var hintText = this._recordingHint.createChild("div", "recording-hint");
|
| - var reloadShortcutNode = this._recordingHint.createChild("b");
|
| - reloadShortcutNode.textContent = WebInspector.shortcutRegistry.shortcutDescriptorsForAction("main.reload")[0].name;
|
| -
|
| - if (this._recording) {
|
| - var recordingText = hintText.createChild("span");
|
| - recordingText.textContent = WebInspector.UIString("Recording network activity\u2026");
|
| - hintText.createChild("br");
|
| - hintText.appendChild(WebInspector.formatLocalized("Perform a request or hit %s to record the reload.", [reloadShortcutNode]));
|
| - } else {
|
| - var recordNode = hintText.createChild("b");
|
| - recordNode.textContent = WebInspector.shortcutRegistry.shortcutTitleForAction("network.toggle-recording");
|
| - hintText.appendChild(WebInspector.formatLocalized("Record (%s) or reload (%s) to display network activity.", [recordNode, reloadShortcutNode]));
|
| - }
|
| - },
|
| -
|
| - _hideRecordingHint: function()
|
| - {
|
| - if (this._recordingHint)
|
| - this._recordingHint.remove();
|
| - delete this._recordingHint;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array.<!Element>}
|
| - */
|
| - elementsToRestoreScrollPositionsFor: function()
|
| - {
|
| - if (!this._dataGrid) // Not initialized yet.
|
| - return [];
|
| - return [this._dataGrid.scrollContainer];
|
| - },
|
| -
|
| - _setupDataGrid: function()
|
| - {
|
| - this._dataGrid = this._columns.dataGrid();
|
| - this._dataGrid.setRowContextMenuCallback((contextMenu, node) => this.handleContextMenuForRequest(contextMenu, node.request()));
|
| - this._dataGrid.setStickToBottom(true);
|
| - this._dataGrid.setName("networkLog");
|
| - this._dataGrid.setResizeMethod(WebInspector.DataGrid.ResizeMethod.Last);
|
| - this._dataGrid.element.classList.add("network-log-grid");
|
| - this._dataGrid.element.addEventListener("mousedown", this._dataGridMouseDown.bind(this), true);
|
| - this._dataGrid.element.addEventListener("mousemove", this._dataGridMouseMove.bind(this), true);
|
| - this._dataGrid.element.addEventListener("mouseleave", this._dataGridMouseLeave.bind(this), true);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _dataGridMouseMove: function(event)
|
| - {
|
| - var node = this._dataGrid.dataGridNodeFromNode(event.target);
|
| - var highlightInitiatorChain = event.shiftKey;
|
| - this._setHoveredNode(node, highlightInitiatorChain);
|
| - this._highlightInitiatorChain((highlightInitiatorChain && node) ? node.request() : null);
|
| - },
|
| -
|
| - _dataGridMouseLeave: function()
|
| - {
|
| - this._setHoveredNode(null);
|
| - this._highlightInitiatorChain(null);
|
| - },
|
| -
|
| - /**
|
| - * @param {?WebInspector.NetworkRequest} request
|
| - * @param {boolean} highlightInitiatorChain
|
| - */
|
| - setHoveredRequest: function(request, highlightInitiatorChain)
|
| - {
|
| - this._setHoveredNode(request ? this._nodesByRequestId.get(request.requestId) : null, highlightInitiatorChain);
|
| - this._highlightInitiatorChain((request && highlightInitiatorChain) ? request : null);
|
| - },
|
| -
|
| - /**
|
| - * @param {?WebInspector.NetworkDataGridNode} node
|
| - * @param {boolean=} highlightInitiatorChain
|
| - */
|
| - _setHoveredNode: function(node, highlightInitiatorChain)
|
| - {
|
| - if (this._hoveredNode)
|
| - this._hoveredNode.element().classList.remove("hover");
|
| - this._hoveredNode = node;
|
| - if (this._hoveredNode)
|
| - this._hoveredNode.element().classList.add("hover");
|
| - this._columns.setHoveredRequest(this._hoveredNode ? this._hoveredNode.request() : null, !!highlightInitiatorChain);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _dataGridMouseDown: function(event)
|
| - {
|
| - if ((!this._dataGrid.selectedNode && event.button) || event.target.enclosingNodeOrSelfWithNodeName("a"))
|
| - event.consume();
|
| - },
|
| -
|
| - /**
|
| - * @param {?WebInspector.NetworkRequest} request
|
| - */
|
| - _highlightInitiatorChain: function(request)
|
| - {
|
| - if (this._requestWithHighlightedInitiators === request)
|
| - return;
|
| - this._requestWithHighlightedInitiators = request;
|
| -
|
| - if (!request) {
|
| - for (var node of this._nodesByRequestId.values()) {
|
| - if (!node.dataGrid)
|
| - continue;
|
| - node.element().classList.remove("network-node-on-initiator-path", "network-node-on-initiated-path");
|
| - }
|
| - return;
|
| - }
|
| -
|
| - var initiatorGraph = request.initiatorGraph();
|
| - for (var node of this._nodesByRequestId.values()) {
|
| - if (!node.dataGrid)
|
| - continue;
|
| - node.element().classList.toggle("network-node-on-initiator-path", node.request() !== request && initiatorGraph.initiators.has(node.request()));
|
| - node.element().classList.toggle("network-node-on-initiated-path", node.request() !== request && initiatorGraph.initiated.has(node.request()));
|
| - }
|
| - },
|
| -
|
| - _updateSummaryBar: function()
|
| - {
|
| - var requestsNumber = this._nodesByRequestId.size;
|
| -
|
| - if (!requestsNumber) {
|
| - this._showRecordingHint();
|
| - return;
|
| - }
|
| - this._hideRecordingHint();
|
| -
|
| - var transferSize = 0;
|
| - var selectedRequestsNumber = 0;
|
| - var selectedTransferSize = 0;
|
| - var baseTime = -1;
|
| - var maxTime = -1;
|
| - var nodes = this._nodesByRequestId.valuesArray();
|
| - for (var i = 0; i < nodes.length; ++i) {
|
| - var request = nodes[i].request();
|
| - var requestTransferSize = request.transferSize;
|
| - transferSize += requestTransferSize;
|
| - if (!nodes[i][WebInspector.NetworkLogView._isFilteredOutSymbol]) {
|
| - selectedRequestsNumber++;
|
| - selectedTransferSize += requestTransferSize;
|
| - }
|
| - if (request.url === request.target().inspectedURL() && request.resourceType() === WebInspector.resourceTypes.Document)
|
| - baseTime = request.startTime;
|
| - if (request.endTime > maxTime)
|
| - maxTime = request.endTime;
|
| - }
|
| -
|
| - var summaryBar = this._summaryBarElement;
|
| - summaryBar.removeChildren();
|
| - var separator = "\u2002\u2758\u2002";
|
| - var text = "";
|
| - /**
|
| - * @param {string} chunk
|
| - * @return {!Element}
|
| - */
|
| - function appendChunk(chunk)
|
| - {
|
| - var span = summaryBar.createChild("span");
|
| - span.textContent = chunk;
|
| - text += chunk;
|
| - return span;
|
| - }
|
| -
|
| - if (selectedRequestsNumber !== requestsNumber) {
|
| - appendChunk(WebInspector.UIString("%d / %d requests", selectedRequestsNumber, requestsNumber));
|
| - appendChunk(separator);
|
| - appendChunk(WebInspector.UIString("%s / %s transferred", Number.bytesToString(selectedTransferSize), Number.bytesToString(transferSize)));
|
| - } else {
|
| - appendChunk(WebInspector.UIString("%d requests", requestsNumber));
|
| - appendChunk(separator);
|
| - appendChunk(WebInspector.UIString("%s transferred", Number.bytesToString(transferSize)));
|
| - }
|
| - if (baseTime !== -1 && maxTime !== -1) {
|
| - appendChunk(separator);
|
| - appendChunk(WebInspector.UIString("Finish: %s", Number.secondsToString(maxTime - baseTime)));
|
| - if (this._mainRequestDOMContentLoadedTime !== -1 && this._mainRequestDOMContentLoadedTime > baseTime) {
|
| - appendChunk(separator);
|
| - var domContentLoadedText = WebInspector.UIString("DOMContentLoaded: %s", Number.secondsToString(this._mainRequestDOMContentLoadedTime - baseTime));
|
| - appendChunk(domContentLoadedText).classList.add("summary-blue");
|
| - }
|
| - if (this._mainRequestLoadTime !== -1) {
|
| - appendChunk(separator);
|
| - var loadText = WebInspector.UIString("Load: %s", Number.secondsToString(this._mainRequestLoadTime - baseTime));
|
| - appendChunk(loadText).classList.add("summary-red");
|
| - }
|
| - }
|
| - summaryBar.title = text;
|
| - },
|
| -
|
| - scheduleRefresh: function()
|
| - {
|
| - if (this._needsRefresh)
|
| - return;
|
| -
|
| - this._needsRefresh = true;
|
| -
|
| - if (this.isShowing() && !this._refreshRequestId)
|
| - this._refreshRequestId = this.element.window().requestAnimationFrame(this._refresh.bind(this));
|
| - },
|
| + WebInspector.targetManager.addModelListener(
|
| + WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestStarted, this._onRequestStarted, this);
|
| + WebInspector.targetManager.addModelListener(
|
| + WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestUpdated, this._onRequestUpdated, this);
|
| + WebInspector.targetManager.addModelListener(
|
| + WebInspector.NetworkManager, WebInspector.NetworkManager.Events.RequestFinished, this._onRequestUpdated, this);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkLogView.Filter} filter
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _negativeFilter(filter, request) {
|
| + return !filter(request);
|
| + }
|
| +
|
| + /**
|
| + * @param {?RegExp} regex
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestPathFilter(regex, request) {
|
| + if (!regex)
|
| + return false;
|
|
|
| - /**
|
| - * @param {!Array<number>} times
|
| - */
|
| - addFilmStripFrames: function(times)
|
| - {
|
| - this._columns.addEventDividers(times, "network-frame-divider");
|
| - },
|
| + return regex.test(request.path() + '/' + request.name());
|
| + }
|
|
|
| - /**
|
| - * @param {number} time
|
| - */
|
| - selectFilmStripFrame: function(time)
|
| - {
|
| - this._columns.selectFilmStripFrame(time);
|
| - },
|
| -
|
| - clearFilmStripFrame: function()
|
| - {
|
| - this._columns.clearFilmStripFrame();
|
| - },
|
| -
|
| - _refreshIfNeeded: function()
|
| - {
|
| - if (this._needsRefresh)
|
| - this._refresh();
|
| - },
|
| -
|
| - _invalidateAllItems: function()
|
| - {
|
| - var requestIds = this._nodesByRequestId.keysArray();
|
| - for (var i = 0; i < requestIds.length; ++i)
|
| - this._staleRequestIds[requestIds[i]] = true;
|
| - this._refresh();
|
| - },
|
| + /**
|
| + * @param {string} domain
|
| + * @return {!Array.<string>}
|
| + */
|
| + static _subdomains(domain) {
|
| + var result = [domain];
|
| + var indexOfPeriod = domain.indexOf('.');
|
| + while (indexOfPeriod !== -1) {
|
| + result.push('*' + domain.substring(indexOfPeriod));
|
| + indexOfPeriod = domain.indexOf('.', indexOfPeriod + 1);
|
| + }
|
| + return result;
|
| + }
|
|
|
| + /**
|
| + * @param {string} value
|
| + * @return {!WebInspector.NetworkLogView.Filter}
|
| + */
|
| + static _createRequestDomainFilter(value) {
|
| /**
|
| - * @return {!WebInspector.NetworkTimeCalculator}
|
| + * @param {string} string
|
| + * @return {string}
|
| */
|
| - timeCalculator: function()
|
| - {
|
| - return this._timeCalculator;
|
| - },
|
| + function escapeForRegExp(string) {
|
| + return string.escapeForRegExp();
|
| + }
|
| + var escapedPattern = value.split('*').map(escapeForRegExp).join('.*');
|
| + return WebInspector.NetworkLogView._requestDomainFilter.bind(null, new RegExp('^' + escapedPattern + '$', 'i'));
|
| + }
|
| +
|
| + /**
|
| + * @param {!RegExp} regex
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestDomainFilter(regex, request) {
|
| + return regex.test(request.domain);
|
| + }
|
|
|
| - /**
|
| - * @return {!WebInspector.NetworkTimeCalculator}
|
| - */
|
| - calculator: function()
|
| - {
|
| - return this._calculator;
|
| - },
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _runningRequestFilter(request) {
|
| + return !request.finished;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestResponseHeaderFilter(value, request) {
|
| + return request.responseHeaderValue(value) !== undefined;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestMethodFilter(value, request) {
|
| + return request.requestMethod === value;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestMimeTypeFilter(value, request) {
|
| + return request.mimeType === value;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkLogView.MixedContentFilterValues} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestMixedContentFilter(value, request) {
|
| + if (value === WebInspector.NetworkLogView.MixedContentFilterValues.Displayed) {
|
| + return request.mixedContentType === 'optionally-blockable';
|
| + } else if (value === WebInspector.NetworkLogView.MixedContentFilterValues.Blocked) {
|
| + return request.mixedContentType === 'blockable' && request.wasBlocked();
|
| + } else if (value === WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden) {
|
| + return request.mixedContentType === 'blockable' && !request.wasBlocked();
|
| + } else if (value === WebInspector.NetworkLogView.MixedContentFilterValues.All) {
|
| + return request.mixedContentType !== 'none';
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestSchemeFilter(value, request) {
|
| + return request.scheme === value;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestSetCookieDomainFilter(value, request) {
|
| + var cookies = request.responseCookies;
|
| + for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| + if (cookies[i].domain() === value)
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestSetCookieNameFilter(value, request) {
|
| + var cookies = request.responseCookies;
|
| + for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| + if (cookies[i].name() === value)
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestSetCookieValueFilter(value, request) {
|
| + var cookies = request.responseCookies;
|
| + for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| + if (cookies[i].value() === value)
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @param {number} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestSizeLargerThanFilter(value, request) {
|
| + return request.transferSize >= value;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _statusCodeFilter(value, request) {
|
| + return ('' + request.statusCode) === value;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static HTTPRequestsFilter(request) {
|
| + return request.parsedURL.isValid && (request.scheme in WebInspector.NetworkLogView.HTTPSchemas);
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkTimeCalculator} x
|
| - */
|
| - setCalculator: function(x)
|
| - {
|
| - if (!x || this._calculator === x)
|
| - return;
|
| -
|
| - if (this._calculator !== x) {
|
| - this._calculator = x;
|
| - this._columns.setCalculator(this._calculator);
|
| - }
|
| - this._calculator.reset();
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static FinishedRequestsFilter(request) {
|
| + return request.finished;
|
| + }
|
| +
|
| + /**
|
| + * @param {number} windowStart
|
| + * @param {number} windowEnd
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + static _requestTimeFilter(windowStart, windowEnd, request) {
|
| + if (request.issueTime() > windowEnd)
|
| + return false;
|
| + if (request.endTime !== -1 && request.endTime < windowStart)
|
| + return false;
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @return {number}
|
| + */
|
| + headerHeight() {
|
| + return this._headerHeight;
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} recording
|
| + */
|
| + setRecording(recording) {
|
| + this._recording = recording;
|
| + this._updateSummaryBar();
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} preserveLog
|
| + */
|
| + setPreserveLog(preserveLog) {
|
| + this._preserveLog = preserveLog;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.Target} target
|
| + */
|
| + targetAdded(target) {
|
| + if (!target.parentTarget()) {
|
| + var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
|
| + if (resourceTreeModel) {
|
| + resourceTreeModel.addEventListener(
|
| + WebInspector.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this);
|
| + resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.Events.Load, this._loadEventFired, this);
|
| + resourceTreeModel.addEventListener(
|
| + WebInspector.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this);
|
| + }
|
| + }
|
| + var networkLog = WebInspector.NetworkLog.fromTarget(target);
|
| + if (networkLog)
|
| + networkLog.requests().forEach(this._appendRequest.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.Target} target
|
| + */
|
| + targetRemoved(target) {
|
| + if (!target.parentTarget()) {
|
| + var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
|
| + if (resourceTreeModel) {
|
| + resourceTreeModel.removeEventListener(
|
| + WebInspector.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this);
|
| + resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.Events.Load, this._loadEventFired, this);
|
| + resourceTreeModel.removeEventListener(
|
| + WebInspector.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this);
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {number} start
|
| + * @param {number} end
|
| + */
|
| + setWindow(start, end) {
|
| + if (!start && !end) {
|
| + this._timeFilter = null;
|
| + this._timeCalculator.setWindow(null);
|
| + } else {
|
| + this._timeFilter = WebInspector.NetworkLogView._requestTimeFilter.bind(null, start, end);
|
| + this._timeCalculator.setWindow(new WebInspector.NetworkTimeBoundary(start, end));
|
| + }
|
| + this._columns.updateDividersIfNeeded();
|
| + this._filterRequests();
|
| + }
|
| +
|
| + clearSelection() {
|
| + if (this._dataGrid.selectedNode)
|
| + this._dataGrid.selectedNode.deselect();
|
| + }
|
| +
|
| + _addFilters() {
|
| + this._textFilterUI = new WebInspector.TextFilterUI(true);
|
| + this._textFilterUI.addEventListener(WebInspector.FilterUI.Events.FilterChanged, this._filterChanged, this);
|
| + this._filterBar.addFilter(this._textFilterUI);
|
| +
|
| + var dataURLSetting = this._networkHideDataURLSetting;
|
| + 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);
|
| +
|
| + var filterItems = [];
|
| + for (var categoryId in WebInspector.resourceCategories) {
|
| + var category = WebInspector.resourceCategories[categoryId];
|
| + filterItems.push({name: category.title, label: category.shortTitle, title: category.title});
|
| + }
|
| + this._resourceCategoryFilterUI =
|
| + new WebInspector.NamedBitSetFilterUI(filterItems, this._networkResourceTypeFiltersSetting);
|
| + this._resourceCategoryFilterUI.addEventListener(
|
| + WebInspector.FilterUI.Events.FilterChanged, this._filterChanged.bind(this), this);
|
| + this._filterBar.addFilter(this._resourceCategoryFilterUI);
|
| + }
|
| +
|
| + _resetSuggestionBuilder() {
|
| + this._suggestionBuilder = new WebInspector.FilterSuggestionBuilder(WebInspector.NetworkLogView._searchKeys);
|
| + this._suggestionBuilder.addItem(
|
| + WebInspector.NetworkLogView.FilterType.Is, WebInspector.NetworkLogView.IsFilterType.Running);
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.LargerThan, '100');
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.LargerThan, '10k');
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.LargerThan, '1M');
|
| + this._textFilterUI.setSuggestionBuilder(this._suggestionBuilder);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _filterChanged(event) {
|
| + this.removeAllNodeHighlights();
|
| + this._parseFilterQuery(this._textFilterUI.value());
|
| + this._filterRequests();
|
| + }
|
| +
|
| + _initializeView() {
|
| + this.element.id = 'network-container';
|
| + this._setupDataGrid();
|
| +
|
| + this._columns.show(this.element);
|
| +
|
| + this._summaryBarElement = this.element.createChild('div', 'network-summary-bar');
|
| +
|
| + this._columns.sortByCurrentColumn();
|
| + }
|
| +
|
| + _showRecordingHint() {
|
| + this._hideRecordingHint();
|
| + this._recordingHint = this.element.createChild('div', 'network-status-pane fill');
|
| + var hintText = this._recordingHint.createChild('div', 'recording-hint');
|
| + var reloadShortcutNode = this._recordingHint.createChild('b');
|
| + reloadShortcutNode.textContent = WebInspector.shortcutRegistry.shortcutDescriptorsForAction('main.reload')[0].name;
|
| +
|
| + if (this._recording) {
|
| + var recordingText = hintText.createChild('span');
|
| + recordingText.textContent = WebInspector.UIString('Recording network activity\u2026');
|
| + hintText.createChild('br');
|
| + hintText.appendChild(
|
| + WebInspector.formatLocalized('Perform a request or hit %s to record the reload.', [reloadShortcutNode]));
|
| + } else {
|
| + var recordNode = hintText.createChild('b');
|
| + recordNode.textContent = WebInspector.shortcutRegistry.shortcutTitleForAction('network.toggle-recording');
|
| + hintText.appendChild(WebInspector.formatLocalized(
|
| + 'Record (%s) or reload (%s) to display network activity.', [recordNode, reloadShortcutNode]));
|
| + }
|
| + }
|
| +
|
| + _hideRecordingHint() {
|
| + if (this._recordingHint)
|
| + this._recordingHint.remove();
|
| + delete this._recordingHint;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array.<!Element>}
|
| + */
|
| + elementsToRestoreScrollPositionsFor() {
|
| + if (!this._dataGrid) // Not initialized yet.
|
| + return [];
|
| + return [this._dataGrid.scrollContainer];
|
| + }
|
| +
|
| + _setupDataGrid() {
|
| + this._dataGrid = this._columns.dataGrid();
|
| + this._dataGrid.setRowContextMenuCallback(
|
| + (contextMenu, node) => this.handleContextMenuForRequest(contextMenu, node.request()));
|
| + this._dataGrid.setStickToBottom(true);
|
| + this._dataGrid.setName('networkLog');
|
| + this._dataGrid.setResizeMethod(WebInspector.DataGrid.ResizeMethod.Last);
|
| + this._dataGrid.element.classList.add('network-log-grid');
|
| + this._dataGrid.element.addEventListener('mousedown', this._dataGridMouseDown.bind(this), true);
|
| + this._dataGrid.element.addEventListener('mousemove', this._dataGridMouseMove.bind(this), true);
|
| + this._dataGrid.element.addEventListener('mouseleave', this._dataGridMouseLeave.bind(this), true);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _dataGridMouseMove(event) {
|
| + var node = this._dataGrid.dataGridNodeFromNode(event.target);
|
| + var highlightInitiatorChain = event.shiftKey;
|
| + this._setHoveredNode(node, highlightInitiatorChain);
|
| + this._highlightInitiatorChain((highlightInitiatorChain && node) ? node.request() : null);
|
| + }
|
| +
|
| + _dataGridMouseLeave() {
|
| + this._setHoveredNode(null);
|
| + this._highlightInitiatorChain(null);
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.NetworkRequest} request
|
| + * @param {boolean} highlightInitiatorChain
|
| + */
|
| + setHoveredRequest(request, highlightInitiatorChain) {
|
| + this._setHoveredNode(request ? this._nodesByRequestId.get(request.requestId) : null, highlightInitiatorChain);
|
| + this._highlightInitiatorChain((request && highlightInitiatorChain) ? request : null);
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.NetworkDataGridNode} node
|
| + * @param {boolean=} highlightInitiatorChain
|
| + */
|
| + _setHoveredNode(node, highlightInitiatorChain) {
|
| + if (this._hoveredNode)
|
| + this._hoveredNode.element().classList.remove('hover');
|
| + this._hoveredNode = node;
|
| + if (this._hoveredNode)
|
| + this._hoveredNode.element().classList.add('hover');
|
| + this._columns.setHoveredRequest(this._hoveredNode ? this._hoveredNode.request() : null, !!highlightInitiatorChain);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _dataGridMouseDown(event) {
|
| + if ((!this._dataGrid.selectedNode && event.button) || event.target.enclosingNodeOrSelfWithNodeName('a'))
|
| + event.consume();
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.NetworkRequest} request
|
| + */
|
| + _highlightInitiatorChain(request) {
|
| + if (this._requestWithHighlightedInitiators === request)
|
| + return;
|
| + this._requestWithHighlightedInitiators = request;
|
| +
|
| + if (!request) {
|
| + for (var node of this._nodesByRequestId.values()) {
|
| + if (!node.dataGrid)
|
| + continue;
|
| + node.element().classList.remove('network-node-on-initiator-path', 'network-node-on-initiated-path');
|
| + }
|
| + return;
|
| + }
|
|
|
| - if (this._calculator.startAtZero)
|
| - this._columns.hideEventDividers();
|
| - else
|
| - this._columns.showEventDividers();
|
| + var initiatorGraph = request.initiatorGraph();
|
| + for (var node of this._nodesByRequestId.values()) {
|
| + if (!node.dataGrid)
|
| + continue;
|
| + node.element().classList.toggle(
|
| + 'network-node-on-initiator-path',
|
| + node.request() !== request && initiatorGraph.initiators.has(node.request()));
|
| + node.element().classList.toggle(
|
| + 'network-node-on-initiated-path', node.request() !== request && initiatorGraph.initiated.has(node.request()));
|
| + }
|
| + }
|
|
|
| - this._invalidateAllItems();
|
| - },
|
| + _updateSummaryBar() {
|
| + var requestsNumber = this._nodesByRequestId.size;
|
|
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _loadEventFired: function(event)
|
| - {
|
| - if (!this._recording)
|
| - return;
|
| -
|
| - var data = /** @type {number} */ (event.data);
|
| - if (data) {
|
| - this._mainRequestLoadTime = data;
|
| - this._columns.addEventDividers([data], "network-red-divider");
|
| - }
|
| - },
|
| + if (!requestsNumber) {
|
| + this._showRecordingHint();
|
| + return;
|
| + }
|
| + this._hideRecordingHint();
|
| +
|
| + var transferSize = 0;
|
| + var selectedRequestsNumber = 0;
|
| + var selectedTransferSize = 0;
|
| + var baseTime = -1;
|
| + var maxTime = -1;
|
| + var nodes = this._nodesByRequestId.valuesArray();
|
| + for (var i = 0; i < nodes.length; ++i) {
|
| + var request = nodes[i].request();
|
| + var requestTransferSize = request.transferSize;
|
| + transferSize += requestTransferSize;
|
| + if (!nodes[i][WebInspector.NetworkLogView._isFilteredOutSymbol]) {
|
| + selectedRequestsNumber++;
|
| + selectedTransferSize += requestTransferSize;
|
| + }
|
| + if (request.url === request.target().inspectedURL() &&
|
| + request.resourceType() === WebInspector.resourceTypes.Document)
|
| + baseTime = request.startTime;
|
| + if (request.endTime > maxTime)
|
| + maxTime = request.endTime;
|
| + }
|
|
|
| + var summaryBar = this._summaryBarElement;
|
| + summaryBar.removeChildren();
|
| + var separator = '\u2002\u2758\u2002';
|
| + var text = '';
|
| /**
|
| - * @param {!WebInspector.Event} event
|
| + * @param {string} chunk
|
| + * @return {!Element}
|
| */
|
| - _domContentLoadedEventFired: function(event)
|
| - {
|
| - if (!this._recording)
|
| - return;
|
| - var data = /** @type {number} */ (event.data);
|
| - if (data) {
|
| - this._mainRequestDOMContentLoadedTime = data;
|
| - this._columns.addEventDividers([data], "network-blue-divider");
|
| - }
|
| - },
|
| -
|
| - wasShown: function()
|
| - {
|
| - this._refreshIfNeeded();
|
| - this._columns.wasShown();
|
| - },
|
| -
|
| - willHide: function()
|
| - {
|
| - this._columns.willHide();
|
| - },
|
| -
|
| - _refresh: function()
|
| - {
|
| - this._needsRefresh = false;
|
| -
|
| - if (this._refreshRequestId) {
|
| - this.element.window().cancelAnimationFrame(this._refreshRequestId);
|
| - delete this._refreshRequestId;
|
| - }
|
| -
|
| - this.removeAllNodeHighlights();
|
| -
|
| - var oldBoundary = this.calculator().boundary();
|
| - this._timeCalculator.updateBoundariesForEventTime(this._mainRequestLoadTime);
|
| - this._durationCalculator.updateBoundariesForEventTime(this._mainRequestLoadTime);
|
| - this._timeCalculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime);
|
| - this._durationCalculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime);
|
| -
|
| - var dataGrid = this._dataGrid;
|
| - var rootNode = dataGrid.rootNode();
|
| - /** @type {!Array<!WebInspector.NetworkDataGridNode> } */
|
| - var nodesToInsert = [];
|
| - /** @type {!Array<!WebInspector.NetworkDataGridNode> } */
|
| - var nodesToRefresh = [];
|
| - for (var requestId in this._staleRequestIds) {
|
| - var node = this._nodesByRequestId.get(requestId);
|
| - if (!node)
|
| - continue;
|
| - var isFilteredOut = !this._applyFilter(node);
|
| - if (isFilteredOut && node === this._hoveredNode)
|
| - this._setHoveredNode(null);
|
| - if (node[WebInspector.NetworkLogView._isFilteredOutSymbol] !== isFilteredOut) {
|
| - if (!node[WebInspector.NetworkLogView._isFilteredOutSymbol])
|
| - rootNode.removeChild(node);
|
| -
|
| - node[WebInspector.NetworkLogView._isFilteredOutSymbol] = isFilteredOut;
|
| -
|
| - if (!node[WebInspector.NetworkLogView._isFilteredOutSymbol])
|
| - nodesToInsert.push(node);
|
| - }
|
| - if (!isFilteredOut)
|
| - nodesToRefresh.push(node);
|
| - var request = node.request();
|
| - this._timeCalculator.updateBoundaries(request);
|
| - this._durationCalculator.updateBoundaries(request);
|
| - }
|
| -
|
| - for (var i = 0; i < nodesToInsert.length; ++i) {
|
| - var node = nodesToInsert[i];
|
| - var request = node.request();
|
| - dataGrid.insertChild(node);
|
| - node[WebInspector.NetworkLogView._isMatchingSearchQuerySymbol] = this._matchRequest(request);
|
| - }
|
| -
|
| - for (var node of nodesToRefresh)
|
| - node.refresh();
|
| -
|
| - this._highlightNthMatchedRequestForSearch(this._updateMatchCountAndFindMatchIndex(this._currentMatchedRequestNode), false);
|
| -
|
| - if (!this.calculator().boundary().equals(oldBoundary)) {
|
| - // The boundaries changed, so all item graphs are stale.
|
| - this._columns.updateDividersIfNeeded();
|
| - var nodes = this._nodesByRequestId.valuesArray();
|
| - for (var i = 0; i < nodes.length; ++i)
|
| - nodes[i].refreshGraph();
|
| - }
|
| -
|
| - this._staleRequestIds = {};
|
| - this._updateSummaryBar();
|
| -
|
| - this._columns.dataChanged();
|
| - },
|
| -
|
| - reset: function()
|
| - {
|
| - this._requestWithHighlightedInitiators = null;
|
| - this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.RequestSelected, null);
|
| + function appendChunk(chunk) {
|
| + var span = summaryBar.createChild('span');
|
| + span.textContent = chunk;
|
| + text += chunk;
|
| + return span;
|
| + }
|
|
|
| - this._clearSearchMatchedList();
|
| + if (selectedRequestsNumber !== requestsNumber) {
|
| + appendChunk(WebInspector.UIString('%d / %d requests', selectedRequestsNumber, requestsNumber));
|
| + appendChunk(separator);
|
| + appendChunk(WebInspector.UIString(
|
| + '%s / %s transferred', Number.bytesToString(selectedTransferSize), Number.bytesToString(transferSize)));
|
| + } else {
|
| + appendChunk(WebInspector.UIString('%d requests', requestsNumber));
|
| + appendChunk(separator);
|
| + appendChunk(WebInspector.UIString('%s transferred', Number.bytesToString(transferSize)));
|
| + }
|
| + if (baseTime !== -1 && maxTime !== -1) {
|
| + appendChunk(separator);
|
| + appendChunk(WebInspector.UIString('Finish: %s', Number.secondsToString(maxTime - baseTime)));
|
| + if (this._mainRequestDOMContentLoadedTime !== -1 && this._mainRequestDOMContentLoadedTime > baseTime) {
|
| + appendChunk(separator);
|
| + var domContentLoadedText = WebInspector.UIString(
|
| + 'DOMContentLoaded: %s', Number.secondsToString(this._mainRequestDOMContentLoadedTime - baseTime));
|
| + appendChunk(domContentLoadedText).classList.add('summary-blue');
|
| + }
|
| + if (this._mainRequestLoadTime !== -1) {
|
| + appendChunk(separator);
|
| + var loadText = WebInspector.UIString('Load: %s', Number.secondsToString(this._mainRequestLoadTime - baseTime));
|
| + appendChunk(loadText).classList.add('summary-red');
|
| + }
|
| + }
|
| + summaryBar.title = text;
|
| + }
|
| +
|
| + scheduleRefresh() {
|
| + if (this._needsRefresh)
|
| + return;
|
| +
|
| + this._needsRefresh = true;
|
| +
|
| + if (this.isShowing() && !this._refreshRequestId)
|
| + this._refreshRequestId = this.element.window().requestAnimationFrame(this._refresh.bind(this));
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<number>} times
|
| + */
|
| + addFilmStripFrames(times) {
|
| + this._columns.addEventDividers(times, 'network-frame-divider');
|
| + }
|
| +
|
| + /**
|
| + * @param {number} time
|
| + */
|
| + selectFilmStripFrame(time) {
|
| + this._columns.selectFilmStripFrame(time);
|
| + }
|
| +
|
| + clearFilmStripFrame() {
|
| + this._columns.clearFilmStripFrame();
|
| + }
|
| +
|
| + _refreshIfNeeded() {
|
| + if (this._needsRefresh)
|
| + this._refresh();
|
| + }
|
| +
|
| + _invalidateAllItems() {
|
| + var requestIds = this._nodesByRequestId.keysArray();
|
| + for (var i = 0; i < requestIds.length; ++i)
|
| + this._staleRequestIds[requestIds[i]] = true;
|
| + this._refresh();
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.NetworkTimeCalculator}
|
| + */
|
| + timeCalculator() {
|
| + return this._timeCalculator;
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.NetworkTimeCalculator}
|
| + */
|
| + calculator() {
|
| + return this._calculator;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkTimeCalculator} x
|
| + */
|
| + setCalculator(x) {
|
| + if (!x || this._calculator === x)
|
| + return;
|
| +
|
| + if (this._calculator !== x) {
|
| + this._calculator = x;
|
| + this._columns.setCalculator(this._calculator);
|
| + }
|
| + this._calculator.reset();
|
| +
|
| + if (this._calculator.startAtZero)
|
| + this._columns.hideEventDividers();
|
| + else
|
| + this._columns.showEventDividers();
|
| +
|
| + this._invalidateAllItems();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _loadEventFired(event) {
|
| + if (!this._recording)
|
| + return;
|
| +
|
| + var data = /** @type {number} */ (event.data);
|
| + if (data) {
|
| + this._mainRequestLoadTime = data;
|
| + this._columns.addEventDividers([data], 'network-red-divider');
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _domContentLoadedEventFired(event) {
|
| + if (!this._recording)
|
| + return;
|
| + var data = /** @type {number} */ (event.data);
|
| + if (data) {
|
| + this._mainRequestDOMContentLoadedTime = data;
|
| + this._columns.addEventDividers([data], 'network-blue-divider');
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + wasShown() {
|
| + this._refreshIfNeeded();
|
| + this._columns.wasShown();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + willHide() {
|
| + this._columns.willHide();
|
| + }
|
| +
|
| + _refresh() {
|
| + this._needsRefresh = false;
|
| +
|
| + if (this._refreshRequestId) {
|
| + this.element.window().cancelAnimationFrame(this._refreshRequestId);
|
| + delete this._refreshRequestId;
|
| + }
|
|
|
| + this.removeAllNodeHighlights();
|
| +
|
| + var oldBoundary = this.calculator().boundary();
|
| + this._timeCalculator.updateBoundariesForEventTime(this._mainRequestLoadTime);
|
| + this._durationCalculator.updateBoundariesForEventTime(this._mainRequestLoadTime);
|
| + this._timeCalculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime);
|
| + this._durationCalculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime);
|
| +
|
| + var dataGrid = this._dataGrid;
|
| + var rootNode = dataGrid.rootNode();
|
| + /** @type {!Array<!WebInspector.NetworkDataGridNode> } */
|
| + var nodesToInsert = [];
|
| + /** @type {!Array<!WebInspector.NetworkDataGridNode> } */
|
| + var nodesToRefresh = [];
|
| + for (var requestId in this._staleRequestIds) {
|
| + var node = this._nodesByRequestId.get(requestId);
|
| + if (!node)
|
| + continue;
|
| + var isFilteredOut = !this._applyFilter(node);
|
| + if (isFilteredOut && node === this._hoveredNode)
|
| this._setHoveredNode(null);
|
| - this._columns.reset();
|
| -
|
| - this._timeFilter = null;
|
| - this._calculator.reset();
|
| -
|
| - this._timeCalculator.setWindow(null);
|
| -
|
| - var nodes = this._nodesByRequestId.valuesArray();
|
| - for (var i = 0; i < nodes.length; ++i)
|
| - nodes[i].dispose();
|
| -
|
| - this._nodesByRequestId.clear();
|
| - this._staleRequestIds = {};
|
| - this._resetSuggestionBuilder();
|
| -
|
| - this._mainRequestLoadTime = -1;
|
| - this._mainRequestDOMContentLoadedTime = -1;
|
| + if (node[WebInspector.NetworkLogView._isFilteredOutSymbol] !== isFilteredOut) {
|
| + if (!node[WebInspector.NetworkLogView._isFilteredOutSymbol])
|
| + rootNode.removeChild(node);
|
| +
|
| + node[WebInspector.NetworkLogView._isFilteredOutSymbol] = isFilteredOut;
|
| +
|
| + if (!node[WebInspector.NetworkLogView._isFilteredOutSymbol])
|
| + nodesToInsert.push(node);
|
| + }
|
| + if (!isFilteredOut)
|
| + nodesToRefresh.push(node);
|
| + var request = node.request();
|
| + this._timeCalculator.updateBoundaries(request);
|
| + this._durationCalculator.updateBoundaries(request);
|
| + }
|
|
|
| - if (this._dataGrid) {
|
| - this._dataGrid.rootNode().removeChildren();
|
| - this._updateSummaryBar();
|
| - }
|
| - },
|
| + for (var i = 0; i < nodesToInsert.length; ++i) {
|
| + var node = nodesToInsert[i];
|
| + var request = node.request();
|
| + dataGrid.insertChild(node);
|
| + node[WebInspector.NetworkLogView._isMatchingSearchQuerySymbol] = this._matchRequest(request);
|
| + }
|
|
|
| - /**
|
| - * @param {string} filterString
|
| - */
|
| - setTextFilterValue: function(filterString)
|
| - {
|
| - this._textFilterUI.setValue(filterString);
|
| - this._textFilterUI.setRegexChecked(false);
|
| - this._dataURLFilterUI.setChecked(false);
|
| - this._resourceCategoryFilterUI.reset();
|
| - },
|
| + for (var node of nodesToRefresh)
|
| + node.refresh();
|
|
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _onRequestStarted: function(event)
|
| - {
|
| - if (!this._recording)
|
| - return;
|
| - var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
|
| - this._appendRequest(request);
|
| - },
|
| + this._highlightNthMatchedRequestForSearch(
|
| + this._updateMatchCountAndFindMatchIndex(this._currentMatchedRequestNode), false);
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - */
|
| - _appendRequest: function(request)
|
| - {
|
| - var node = new WebInspector.NetworkDataGridNode(this, request);
|
| - node[WebInspector.NetworkLogView._isFilteredOutSymbol] = true;
|
| - node[WebInspector.NetworkLogView._isMatchingSearchQuerySymbol] = false;
|
| -
|
| - // In case of redirect request id is reassigned to a redirected
|
| - // request and we need to update _nodesByRequestId and search results.
|
| - var originalRequestNode = this._nodesByRequestId.get(request.requestId);
|
| - if (originalRequestNode)
|
| - this._nodesByRequestId.set(originalRequestNode.request().requestId, originalRequestNode);
|
| - this._nodesByRequestId.set(request.requestId, node);
|
| -
|
| - // 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]);
|
| - }
|
| + if (!this.calculator().boundary().equals(oldBoundary)) {
|
| + // The boundaries changed, so all item graphs are stale.
|
| + this._columns.updateDividersIfNeeded();
|
| + var nodes = this._nodesByRequestId.valuesArray();
|
| + for (var i = 0; i < nodes.length; ++i)
|
| + nodes[i].refreshGraph();
|
| + }
|
|
|
| - this._refreshRequest(request);
|
| - },
|
| + this._staleRequestIds = {};
|
| + this._updateSummaryBar();
|
|
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _onRequestUpdated: function(event)
|
| - {
|
| - var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
|
| - this._refreshRequest(request);
|
| - },
|
| + this._columns.dataChanged();
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - */
|
| - _refreshRequest: function(request)
|
| - {
|
| - if (!this._nodesByRequestId.get(request.requestId))
|
| - return;
|
| -
|
| - WebInspector.NetworkLogView._subdomains(request.domain).forEach(this._suggestionBuilder.addItem.bind(this._suggestionBuilder, WebInspector.NetworkLogView.FilterType.Domain));
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.Method, request.requestMethod);
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.MimeType, request.mimeType);
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.Scheme, "" + request.scheme);
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.StatusCode, "" + request.statusCode);
|
| -
|
| - if (request.mixedContentType !== "none") {
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.MixedContent, WebInspector.NetworkLogView.MixedContentFilterValues.All);
|
| - }
|
| + reset() {
|
| + this._requestWithHighlightedInitiators = null;
|
| + this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.RequestSelected, null);
|
|
|
| - if (request.mixedContentType === "optionally-blockable") {
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.MixedContent, WebInspector.NetworkLogView.MixedContentFilterValues.Displayed);
|
| - }
|
| + this._clearSearchMatchedList();
|
|
|
| - if (request.mixedContentType === "blockable") {
|
| - var suggestion = request.wasBlocked() ? WebInspector.NetworkLogView.MixedContentFilterValues.Blocked : WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden;
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.MixedContent, suggestion);
|
| - }
|
| + this._setHoveredNode(null);
|
| + this._columns.reset();
|
|
|
| - var responseHeaders = request.responseHeaders;
|
| - for (var i = 0, l = responseHeaders.length; i < l; ++i)
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.HasResponseHeader, responseHeaders[i].name);
|
| - var cookies = request.responseCookies;
|
| - for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| - var cookie = cookies[i];
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.SetCookieDomain, cookie.domain());
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.SetCookieName, cookie.name());
|
| - this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.SetCookieValue, cookie.value());
|
| - }
|
| + this._timeFilter = null;
|
| + this._calculator.reset();
|
|
|
| - this._staleRequestIds[request.requestId] = true;
|
| - this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.UpdateRequest, request);
|
| - this.scheduleRefresh();
|
| - },
|
| + this._timeCalculator.setWindow(null);
|
|
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _mainFrameNavigated: function(event)
|
| - {
|
| - if (!this._recording)
|
| - return;
|
| -
|
| - var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data);
|
| - var loaderId = frame.loaderId;
|
| -
|
| - // Pick provisional load requests.
|
| - var requestsToPick = [];
|
| - var networkLog = WebInspector.NetworkLog.fromTarget(frame.target());
|
| - var requests = networkLog ? networkLog.requests() : [];
|
| - for (var i = 0; i < requests.length; ++i) {
|
| - var request = requests[i];
|
| - if (request.loaderId === loaderId)
|
| - requestsToPick.push(request);
|
| - }
|
| + var nodes = this._nodesByRequestId.valuesArray();
|
| + for (var i = 0; i < nodes.length; ++i)
|
| + nodes[i].dispose();
|
|
|
| - if (!this._preserveLog) {
|
| - this.reset();
|
| - for (var i = 0; i < requestsToPick.length; ++i)
|
| - this._appendRequest(requestsToPick[i]);
|
| - }
|
| - for (var i = 0; i < requestsToPick.length; ++i) {
|
| - var request = requestsToPick[i];
|
| - var node = this._nodesByRequestId.get(request.requestId);
|
| - if (node) {
|
| - node.markAsNavigationRequest();
|
| - break;
|
| - }
|
| - }
|
| - },
|
| + this._nodesByRequestId.clear();
|
| + this._staleRequestIds = {};
|
| + this._resetSuggestionBuilder();
|
|
|
| - /**
|
| - * @return {number}
|
| - */
|
| - rowHeight: function()
|
| - {
|
| - return this._rowHeight;
|
| - },
|
| + this._mainRequestLoadTime = -1;
|
| + this._mainRequestDOMContentLoadedTime = -1;
|
|
|
| - /**
|
| - * @param {boolean} gridMode
|
| - */
|
| - switchViewMode: function(gridMode)
|
| - {
|
| - this._columns.switchViewMode(gridMode);
|
| - },
|
| + if (this._dataGrid) {
|
| + this._dataGrid.rootNode().removeChildren();
|
| + this._updateSummaryBar();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {string} filterString
|
| + */
|
| + setTextFilterValue(filterString) {
|
| + this._textFilterUI.setValue(filterString);
|
| + this._textFilterUI.setRegexChecked(false);
|
| + this._dataURLFilterUI.setChecked(false);
|
| + this._resourceCategoryFilterUI.reset();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _onRequestStarted(event) {
|
| + if (!this._recording)
|
| + return;
|
| + var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
|
| + this._appendRequest(request);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + */
|
| + _appendRequest(request) {
|
| + var node = new WebInspector.NetworkDataGridNode(this, request);
|
| + node[WebInspector.NetworkLogView._isFilteredOutSymbol] = true;
|
| + node[WebInspector.NetworkLogView._isMatchingSearchQuerySymbol] = false;
|
| +
|
| + // In case of redirect request id is reassigned to a redirected
|
| + // request and we need to update _nodesByRequestId and search results.
|
| + var originalRequestNode = this._nodesByRequestId.get(request.requestId);
|
| + if (originalRequestNode)
|
| + this._nodesByRequestId.set(originalRequestNode.request().requestId, originalRequestNode);
|
| + this._nodesByRequestId.set(request.requestId, node);
|
| +
|
| + // 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]);
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.ContextMenu} contextMenu
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - */
|
| - handleContextMenuForRequest: function(contextMenu, request)
|
| - {
|
| - contextMenu.appendApplicableItems(request);
|
| - var copyMenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Copy"));
|
| - if (request) {
|
| - copyMenu.appendItem(WebInspector.copyLinkAddressLabel(), InspectorFrontendHost.copyText.bind(InspectorFrontendHost, request.contentURL()));
|
| - copyMenu.appendSeparator();
|
| -
|
| - if (request.requestHeadersText())
|
| - copyMenu.appendItem(WebInspector.UIString.capitalize("Copy ^request ^headers"), this._copyRequestHeaders.bind(this, request));
|
| - if (request.responseHeadersText)
|
| - copyMenu.appendItem(WebInspector.UIString.capitalize("Copy ^response ^headers"), this._copyResponseHeaders.bind(this, request));
|
| - if (request.finished)
|
| - copyMenu.appendItem(WebInspector.UIString.capitalize("Copy ^response"), this._copyResponse.bind(this, request));
|
| -
|
| - if (WebInspector.isWin()) {
|
| - copyMenu.appendItem(WebInspector.UIString("Copy as cURL (cmd)"), this._copyCurlCommand.bind(this, request, "win"));
|
| - copyMenu.appendItem(WebInspector.UIString("Copy as cURL (bash)"), this._copyCurlCommand.bind(this, request, "unix"));
|
| - copyMenu.appendItem(WebInspector.UIString("Copy All as cURL (cmd)"), this._copyAllCurlCommand.bind(this, "win"));
|
| - copyMenu.appendItem(WebInspector.UIString("Copy All as cURL (bash)"), this._copyAllCurlCommand.bind(this, "unix"));
|
| - } else {
|
| - copyMenu.appendItem(WebInspector.UIString("Copy as cURL"), this._copyCurlCommand.bind(this, request, "unix"));
|
| - copyMenu.appendItem(WebInspector.UIString("Copy All as cURL"), this._copyAllCurlCommand.bind(this, "unix"));
|
| - }
|
| - } else {
|
| - copyMenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Copy"));
|
| - }
|
| - copyMenu.appendItem(WebInspector.UIString.capitalize("Copy ^all as HAR"), this._copyAll.bind(this));
|
| -
|
| - contextMenu.appendSeparator();
|
| - contextMenu.appendItem(WebInspector.UIString.capitalize("Save as HAR with ^content"), this._exportAll.bind(this));
|
| -
|
| - contextMenu.appendSeparator();
|
| - contextMenu.appendItem(WebInspector.UIString.capitalize("Clear ^browser ^cache"), this._clearBrowserCache.bind(this));
|
| - contextMenu.appendItem(WebInspector.UIString.capitalize("Clear ^browser ^cookies"), this._clearBrowserCookies.bind(this));
|
| -
|
| - var blockedSetting = WebInspector.moduleSetting("blockedURLs");
|
| - if (request && Runtime.experiments.isEnabled("requestBlocking")) { // Disabled until ready.
|
| - contextMenu.appendSeparator();
|
| -
|
| - var urlWithoutScheme = request.parsedURL.urlWithoutScheme();
|
| - if (urlWithoutScheme && blockedSetting.get().indexOf(urlWithoutScheme) === -1)
|
| - contextMenu.appendItem(WebInspector.UIString.capitalize("Block ^request URL"), addBlockedURL.bind(null, urlWithoutScheme));
|
| -
|
| - var domain = request.parsedURL.domain();
|
| - if (domain && blockedSetting.get().indexOf(domain) === -1)
|
| - contextMenu.appendItem(WebInspector.UIString.capitalize("Block ^request ^domain"), addBlockedURL.bind(null, domain));
|
| -
|
| - function addBlockedURL(url)
|
| - {
|
| - var list = blockedSetting.get();
|
| - list.push(url);
|
| - blockedSetting.set(list);
|
| - WebInspector.viewManager.showView("network.blocked-urls");
|
| - }
|
| - }
|
| + this._refreshRequest(request);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _onRequestUpdated(event) {
|
| + var request = /** @type {!WebInspector.NetworkRequest} */ (event.data);
|
| + this._refreshRequest(request);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + */
|
| + _refreshRequest(request) {
|
| + if (!this._nodesByRequestId.get(request.requestId))
|
| + return;
|
| +
|
| + WebInspector.NetworkLogView._subdomains(request.domain)
|
| + .forEach(this._suggestionBuilder.addItem.bind(
|
| + this._suggestionBuilder, WebInspector.NetworkLogView.FilterType.Domain));
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.Method, request.requestMethod);
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.MimeType, request.mimeType);
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.Scheme, '' + request.scheme);
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.StatusCode, '' + request.statusCode);
|
| +
|
| + if (request.mixedContentType !== 'none') {
|
| + this._suggestionBuilder.addItem(
|
| + WebInspector.NetworkLogView.FilterType.MixedContent,
|
| + WebInspector.NetworkLogView.MixedContentFilterValues.All);
|
| + }
|
|
|
| - if (request && request.resourceType() === WebInspector.resourceTypes.XHR) {
|
| - contextMenu.appendSeparator();
|
| - contextMenu.appendItem(WebInspector.UIString("Replay XHR"), request.replayXHR.bind(request));
|
| - contextMenu.appendSeparator();
|
| - }
|
| - },
|
| -
|
| - _harRequests: function()
|
| - {
|
| - var requests = this._nodesByRequestId.valuesArray().map(function(node) { return node.request(); });
|
| - var httpRequests = requests.filter(WebInspector.NetworkLogView.HTTPRequestsFilter);
|
| - return httpRequests.filter(WebInspector.NetworkLogView.FinishedRequestsFilter);
|
| - },
|
| -
|
| - _copyAll: function()
|
| - {
|
| - var harArchive = {
|
| - log: (new WebInspector.HARLog(this._harRequests())).build()
|
| - };
|
| - InspectorFrontendHost.copyText(JSON.stringify(harArchive, null, 2));
|
| - },
|
| + if (request.mixedContentType === 'optionally-blockable') {
|
| + this._suggestionBuilder.addItem(
|
| + WebInspector.NetworkLogView.FilterType.MixedContent,
|
| + WebInspector.NetworkLogView.MixedContentFilterValues.Displayed);
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - */
|
| - _copyRequestHeaders: function(request)
|
| - {
|
| - InspectorFrontendHost.copyText(request.requestHeadersText());
|
| - },
|
| + if (request.mixedContentType === 'blockable') {
|
| + var suggestion = request.wasBlocked() ? WebInspector.NetworkLogView.MixedContentFilterValues.Blocked :
|
| + WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden;
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.MixedContent, suggestion);
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - */
|
| - _copyResponse: function(request)
|
| - {
|
| - /**
|
| - * @param {?string} content
|
| - */
|
| - function callback(content)
|
| - {
|
| - if (request.contentEncoded)
|
| - content = request.asDataURL();
|
| - InspectorFrontendHost.copyText(content || "");
|
| - }
|
| - request.requestContent().then(callback);
|
| - },
|
| + var responseHeaders = request.responseHeaders;
|
| + for (var i = 0, l = responseHeaders.length; i < l; ++i)
|
| + this._suggestionBuilder.addItem(
|
| + WebInspector.NetworkLogView.FilterType.HasResponseHeader, responseHeaders[i].name);
|
| + var cookies = request.responseCookies;
|
| + for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| + var cookie = cookies[i];
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.SetCookieDomain, cookie.domain());
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.SetCookieName, cookie.name());
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkLogView.FilterType.SetCookieValue, cookie.value());
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - */
|
| - _copyResponseHeaders: function(request)
|
| - {
|
| - InspectorFrontendHost.copyText(request.responseHeadersText);
|
| - },
|
| + this._staleRequestIds[request.requestId] = true;
|
| + this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.UpdateRequest, request);
|
| + this.scheduleRefresh();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Event} event
|
| + */
|
| + _mainFrameNavigated(event) {
|
| + if (!this._recording)
|
| + return;
|
| +
|
| + var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data);
|
| + var loaderId = frame.loaderId;
|
| +
|
| + // Pick provisional load requests.
|
| + var requestsToPick = [];
|
| + var networkLog = WebInspector.NetworkLog.fromTarget(frame.target());
|
| + var requests = networkLog ? networkLog.requests() : [];
|
| + for (var i = 0; i < requests.length; ++i) {
|
| + var request = requests[i];
|
| + if (request.loaderId === loaderId)
|
| + requestsToPick.push(request);
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @param {string} platform
|
| - */
|
| - _copyCurlCommand: function(request, platform)
|
| - {
|
| - InspectorFrontendHost.copyText(this._generateCurlCommand(request, platform));
|
| - },
|
| + if (!this._preserveLog) {
|
| + this.reset();
|
| + for (var i = 0; i < requestsToPick.length; ++i)
|
| + this._appendRequest(requestsToPick[i]);
|
| + }
|
| + for (var i = 0; i < requestsToPick.length; ++i) {
|
| + var request = requestsToPick[i];
|
| + var node = this._nodesByRequestId.get(request.requestId);
|
| + if (node) {
|
| + node.markAsNavigationRequest();
|
| + break;
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @return {number}
|
| + */
|
| + rowHeight() {
|
| + return this._rowHeight;
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} gridMode
|
| + */
|
| + switchViewMode(gridMode) {
|
| + this._columns.switchViewMode(gridMode);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.ContextMenu} contextMenu
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + */
|
| + handleContextMenuForRequest(contextMenu, request) {
|
| + contextMenu.appendApplicableItems(request);
|
| + var copyMenu = contextMenu.appendSubMenuItem(WebInspector.UIString('Copy'));
|
| + if (request) {
|
| + copyMenu.appendItem(
|
| + WebInspector.copyLinkAddressLabel(),
|
| + InspectorFrontendHost.copyText.bind(InspectorFrontendHost, request.contentURL()));
|
| + copyMenu.appendSeparator();
|
| +
|
| + if (request.requestHeadersText())
|
| + copyMenu.appendItem(
|
| + WebInspector.UIString.capitalize('Copy ^request ^headers'), this._copyRequestHeaders.bind(this, request));
|
| + if (request.responseHeadersText)
|
| + copyMenu.appendItem(
|
| + WebInspector.UIString.capitalize('Copy ^response ^headers'), this._copyResponseHeaders.bind(this, request));
|
| + if (request.finished)
|
| + copyMenu.appendItem(WebInspector.UIString.capitalize('Copy ^response'), this._copyResponse.bind(this, request));
|
| +
|
| + if (WebInspector.isWin()) {
|
| + copyMenu.appendItem(
|
| + WebInspector.UIString('Copy as cURL (cmd)'), this._copyCurlCommand.bind(this, request, 'win'));
|
| + copyMenu.appendItem(
|
| + WebInspector.UIString('Copy as cURL (bash)'), this._copyCurlCommand.bind(this, request, 'unix'));
|
| + copyMenu.appendItem(
|
| + WebInspector.UIString('Copy All as cURL (cmd)'), this._copyAllCurlCommand.bind(this, 'win'));
|
| + copyMenu.appendItem(
|
| + WebInspector.UIString('Copy All as cURL (bash)'), this._copyAllCurlCommand.bind(this, 'unix'));
|
| + } else {
|
| + copyMenu.appendItem(WebInspector.UIString('Copy as cURL'), this._copyCurlCommand.bind(this, request, 'unix'));
|
| + copyMenu.appendItem(WebInspector.UIString('Copy All as cURL'), this._copyAllCurlCommand.bind(this, 'unix'));
|
| + }
|
| + } else {
|
| + copyMenu = contextMenu.appendSubMenuItem(WebInspector.UIString('Copy'));
|
| + }
|
| + copyMenu.appendItem(WebInspector.UIString.capitalize('Copy ^all as HAR'), this._copyAll.bind(this));
|
| +
|
| + contextMenu.appendSeparator();
|
| + contextMenu.appendItem(WebInspector.UIString.capitalize('Save as HAR with ^content'), this._exportAll.bind(this));
|
| +
|
| + contextMenu.appendSeparator();
|
| + contextMenu.appendItem(
|
| + WebInspector.UIString.capitalize('Clear ^browser ^cache'), this._clearBrowserCache.bind(this));
|
| + contextMenu.appendItem(
|
| + WebInspector.UIString.capitalize('Clear ^browser ^cookies'), this._clearBrowserCookies.bind(this));
|
| +
|
| + var blockedSetting = WebInspector.moduleSetting('blockedURLs');
|
| + if (request && Runtime.experiments.isEnabled('requestBlocking')) { // Disabled until ready.
|
| + contextMenu.appendSeparator();
|
| +
|
| + var urlWithoutScheme = request.parsedURL.urlWithoutScheme();
|
| + if (urlWithoutScheme && blockedSetting.get().indexOf(urlWithoutScheme) === -1)
|
| + contextMenu.appendItem(
|
| + WebInspector.UIString.capitalize('Block ^request URL'), addBlockedURL.bind(null, urlWithoutScheme));
|
| +
|
| + var domain = request.parsedURL.domain();
|
| + if (domain && blockedSetting.get().indexOf(domain) === -1)
|
| + contextMenu.appendItem(
|
| + WebInspector.UIString.capitalize('Block ^request ^domain'), addBlockedURL.bind(null, domain));
|
| +
|
| + function addBlockedURL(url) {
|
| + var list = blockedSetting.get();
|
| + list.push(url);
|
| + blockedSetting.set(list);
|
| + WebInspector.viewManager.showView('network.blocked-urls');
|
| + }
|
| + }
|
|
|
| + if (request && request.resourceType() === WebInspector.resourceTypes.XHR) {
|
| + contextMenu.appendSeparator();
|
| + contextMenu.appendItem(WebInspector.UIString('Replay XHR'), request.replayXHR.bind(request));
|
| + contextMenu.appendSeparator();
|
| + }
|
| + }
|
| +
|
| + _harRequests() {
|
| + var requests = this._nodesByRequestId.valuesArray().map(function(node) {
|
| + return node.request();
|
| + });
|
| + var httpRequests = requests.filter(WebInspector.NetworkLogView.HTTPRequestsFilter);
|
| + return httpRequests.filter(WebInspector.NetworkLogView.FinishedRequestsFilter);
|
| + }
|
| +
|
| + _copyAll() {
|
| + var harArchive = {log: (new WebInspector.HARLog(this._harRequests())).build()};
|
| + InspectorFrontendHost.copyText(JSON.stringify(harArchive, null, 2));
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + */
|
| + _copyRequestHeaders(request) {
|
| + InspectorFrontendHost.copyText(request.requestHeadersText());
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + */
|
| + _copyResponse(request) {
|
| /**
|
| - * @param {string} platform
|
| + * @param {?string} content
|
| */
|
| - _copyAllCurlCommand: function(platform)
|
| - {
|
| - var requests = this._nodesByRequestId.valuesArray().map(node => node.request());
|
| - var commands = [];
|
| - for (var request of requests)
|
| - commands.push(this._generateCurlCommand(request, platform));
|
| - if (platform === "win")
|
| - InspectorFrontendHost.copyText(commands.join(" &\r\n"));
|
| - else
|
| - InspectorFrontendHost.copyText(commands.join(" ;\n"));
|
| - },
|
| -
|
| - _exportAll: function()
|
| - {
|
| - var url = WebInspector.targetManager.mainTarget().inspectedURL();
|
| - var parsedURL = url.asParsedURL();
|
| - var filename = parsedURL ? parsedURL.host : "network-log";
|
| - var stream = new WebInspector.FileOutputStream();
|
| - stream.open(filename + ".har", 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._harRequests(), progressIndicator);
|
| - }
|
| - },
|
| -
|
| - _clearBrowserCache: function()
|
| - {
|
| - if (confirm(WebInspector.UIString("Are you sure you want to clear browser cache?")))
|
| - WebInspector.multitargetNetworkManager.clearBrowserCache();
|
| - },
|
| -
|
| - _clearBrowserCookies: function()
|
| - {
|
| - if (confirm(WebInspector.UIString("Are you sure you want to clear browser cookies?")))
|
| - WebInspector.multitargetNetworkManager.clearBrowserCookies();
|
| - },
|
| + function callback(content) {
|
| + if (request.contentEncoded)
|
| + content = request.asDataURL();
|
| + InspectorFrontendHost.copyText(content || '');
|
| + }
|
| + request.requestContent().then(callback);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + */
|
| + _copyResponseHeaders(request) {
|
| + InspectorFrontendHost.copyText(request.responseHeadersText);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @param {string} platform
|
| + */
|
| + _copyCurlCommand(request, platform) {
|
| + InspectorFrontendHost.copyText(this._generateCurlCommand(request, platform));
|
| + }
|
| +
|
| + /**
|
| + * @param {string} platform
|
| + */
|
| + _copyAllCurlCommand(platform) {
|
| + var requests = this._nodesByRequestId.valuesArray().map(node => node.request());
|
| + var commands = [];
|
| + for (var request of requests)
|
| + commands.push(this._generateCurlCommand(request, platform));
|
| + if (platform === 'win')
|
| + InspectorFrontendHost.copyText(commands.join(' &\r\n'));
|
| + else
|
| + InspectorFrontendHost.copyText(commands.join(' ;\n'));
|
| + }
|
| +
|
| + _exportAll() {
|
| + var url = WebInspector.targetManager.mainTarget().inspectedURL();
|
| + var parsedURL = url.asParsedURL();
|
| + var filename = parsedURL ? parsedURL.host : 'network-log';
|
| + var stream = new WebInspector.FileOutputStream();
|
| + stream.open(filename + '.har', openCallback.bind(this));
|
|
|
| /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| + * @param {boolean} accepted
|
| + * @this {WebInspector.NetworkLogView}
|
| */
|
| - _matchRequest: function(request)
|
| - {
|
| - var re = this._searchRegex;
|
| - if (!re)
|
| - return false;
|
| -
|
| - var text = this._networkLogLargeRowsSetting.get() ? request.path() + "/" + request.name() : request.name();
|
| - return re.test(text);
|
| - },
|
| -
|
| - _clearSearchMatchedList: function()
|
| - {
|
| - this._matchedRequestCount = -1;
|
| - this._currentMatchedRequestNode = null;
|
| - this._removeAllHighlights();
|
| - },
|
| -
|
| - _removeAllHighlights: function()
|
| - {
|
| - this.removeAllNodeHighlights();
|
| - for (var i = 0; i < this._highlightedSubstringChanges.length; ++i)
|
| - WebInspector.revertDomChanges(this._highlightedSubstringChanges[i]);
|
| - this._highlightedSubstringChanges = [];
|
| - },
|
| -
|
| - dataGridSorted: function()
|
| - {
|
| - this._highlightNthMatchedRequestForSearch(this._updateMatchCountAndFindMatchIndex(this._currentMatchedRequestNode), false);
|
| - },
|
| + 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._harRequests(), progressIndicator);
|
| + }
|
| + }
|
| +
|
| + _clearBrowserCache() {
|
| + if (confirm(WebInspector.UIString('Are you sure you want to clear browser cache?')))
|
| + WebInspector.multitargetNetworkManager.clearBrowserCache();
|
| + }
|
| +
|
| + _clearBrowserCookies() {
|
| + if (confirm(WebInspector.UIString('Are you sure you want to clear browser cookies?')))
|
| + WebInspector.multitargetNetworkManager.clearBrowserCookies();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| + _matchRequest(request) {
|
| + var re = this._searchRegex;
|
| + if (!re)
|
| + return false;
|
| +
|
| + var text = this._networkLogLargeRowsSetting.get() ? request.path() + '/' + request.name() : request.name();
|
| + return re.test(text);
|
| + }
|
| +
|
| + _clearSearchMatchedList() {
|
| + this._matchedRequestCount = -1;
|
| + this._currentMatchedRequestNode = null;
|
| + this._removeAllHighlights();
|
| + }
|
|
|
| - /**
|
| - * @param {number} n
|
| - * @param {boolean} reveal
|
| - */
|
| - _highlightNthMatchedRequestForSearch: function(n, reveal)
|
| - {
|
| - this._removeAllHighlights();
|
| -
|
| - /** @type {!Array.<!WebInspector.NetworkDataGridNode>} */
|
| - var nodes = this._dataGrid.rootNode().children;
|
| - var matchCount = 0;
|
| - var node = null;
|
| - for (var i = 0; i < nodes.length; ++i) {
|
| - if (nodes[i][WebInspector.NetworkLogView._isMatchingSearchQuerySymbol]) {
|
| - if (matchCount === n) {
|
| - node = nodes[i];
|
| - break;
|
| - }
|
| - matchCount++;
|
| - }
|
| - }
|
| - if (!node) {
|
| - this._currentMatchedRequestNode = null;
|
| - return;
|
| + _removeAllHighlights() {
|
| + this.removeAllNodeHighlights();
|
| + for (var i = 0; i < this._highlightedSubstringChanges.length; ++i)
|
| + WebInspector.revertDomChanges(this._highlightedSubstringChanges[i]);
|
| + this._highlightedSubstringChanges = [];
|
| + }
|
| +
|
| + dataGridSorted() {
|
| + this._highlightNthMatchedRequestForSearch(
|
| + this._updateMatchCountAndFindMatchIndex(this._currentMatchedRequestNode), false);
|
| + }
|
| +
|
| + /**
|
| + * @param {number} n
|
| + * @param {boolean} reveal
|
| + */
|
| + _highlightNthMatchedRequestForSearch(n, reveal) {
|
| + this._removeAllHighlights();
|
| +
|
| + /** @type {!Array.<!WebInspector.NetworkDataGridNode>} */
|
| + var nodes = this._dataGrid.rootNode().children;
|
| + var matchCount = 0;
|
| + var node = null;
|
| + for (var i = 0; i < nodes.length; ++i) {
|
| + if (nodes[i][WebInspector.NetworkLogView._isMatchingSearchQuerySymbol]) {
|
| + if (matchCount === n) {
|
| + node = nodes[i];
|
| + break;
|
| }
|
| + matchCount++;
|
| + }
|
| + }
|
| + if (!node) {
|
| + this._currentMatchedRequestNode = null;
|
| + return;
|
| + }
|
|
|
| - var request = node.request();
|
| - if (reveal)
|
| - WebInspector.Revealer.reveal(request);
|
| - var highlightedSubstringChanges = node.highlightMatchedSubstring(this._searchRegex);
|
| - this._highlightedSubstringChanges.push(highlightedSubstringChanges);
|
| -
|
| - this._currentMatchedRequestNode = node;
|
| - this._currentMatchedRequestIndex = n;
|
| - this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.SearchIndexUpdated, n);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| - * @param {boolean} shouldJump
|
| - * @param {boolean=} jumpBackwards
|
| - */
|
| - performSearch: function(searchConfig, shouldJump, jumpBackwards)
|
| - {
|
| - var query = searchConfig.query;
|
| - var currentMatchedRequestNode = this._currentMatchedRequestNode;
|
| - this._clearSearchMatchedList();
|
| - this._searchRegex = createPlainTextSearchRegex(query, "i");
|
| -
|
| - /** @type {!Array.<!WebInspector.NetworkDataGridNode>} */
|
| - var nodes = this._dataGrid.rootNode().children;
|
| - for (var i = 0; i < nodes.length; ++i)
|
| - nodes[i][WebInspector.NetworkLogView._isMatchingSearchQuerySymbol] = this._matchRequest(nodes[i].request());
|
| - var newMatchedRequestIndex = this._updateMatchCountAndFindMatchIndex(currentMatchedRequestNode);
|
| - if (!newMatchedRequestIndex && jumpBackwards)
|
| - newMatchedRequestIndex = this._matchedRequestCount - 1;
|
| - this._highlightNthMatchedRequestForSearch(newMatchedRequestIndex, shouldJump);
|
| - },
|
| + var request = node.request();
|
| + if (reveal)
|
| + WebInspector.Revealer.reveal(request);
|
| + var highlightedSubstringChanges = node.highlightMatchedSubstring(this._searchRegex);
|
| + this._highlightedSubstringChanges.push(highlightedSubstringChanges);
|
| +
|
| + this._currentMatchedRequestNode = node;
|
| + this._currentMatchedRequestIndex = n;
|
| + this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.SearchIndexUpdated, n);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.SearchableView.SearchConfig} searchConfig
|
| + * @param {boolean} shouldJump
|
| + * @param {boolean=} jumpBackwards
|
| + */
|
| + performSearch(searchConfig, shouldJump, jumpBackwards) {
|
| + var query = searchConfig.query;
|
| + var currentMatchedRequestNode = this._currentMatchedRequestNode;
|
| + this._clearSearchMatchedList();
|
| + this._searchRegex = createPlainTextSearchRegex(query, 'i');
|
| +
|
| + /** @type {!Array.<!WebInspector.NetworkDataGridNode>} */
|
| + var nodes = this._dataGrid.rootNode().children;
|
| + for (var i = 0; i < nodes.length; ++i)
|
| + nodes[i][WebInspector.NetworkLogView._isMatchingSearchQuerySymbol] = this._matchRequest(nodes[i].request());
|
| + var newMatchedRequestIndex = this._updateMatchCountAndFindMatchIndex(currentMatchedRequestNode);
|
| + if (!newMatchedRequestIndex && jumpBackwards)
|
| + newMatchedRequestIndex = this._matchedRequestCount - 1;
|
| + this._highlightNthMatchedRequestForSearch(newMatchedRequestIndex, shouldJump);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + supportsCaseSensitiveSearch() {
|
| + return false;
|
| + }
|
|
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - supportsCaseSensitiveSearch: function()
|
| - {
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + supportsRegexSearch() {
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.NetworkDataGridNode} node
|
| + * @return {number}
|
| + */
|
| + _updateMatchCountAndFindMatchIndex(node) {
|
| + /** @type {!Array.<!WebInspector.NetworkDataGridNode>} */
|
| + var nodes = this._dataGrid.rootNode().children;
|
| + var matchCount = 0;
|
| + var matchIndex = 0;
|
| + for (var i = 0; i < nodes.length; ++i) {
|
| + if (!nodes[i][WebInspector.NetworkLogView._isMatchingSearchQuerySymbol])
|
| + continue;
|
| + if (node === nodes[i])
|
| + matchIndex = matchCount;
|
| + matchCount++;
|
| + }
|
| + if (this._matchedRequestCount !== matchCount) {
|
| + this._matchedRequestCount = matchCount;
|
| + this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.SearchCountUpdated, matchCount);
|
| + }
|
| + return matchIndex;
|
| + }
|
| +
|
| + /**
|
| + * @param {number} index
|
| + * @return {number}
|
| + */
|
| + _normalizeSearchResultIndex(index) {
|
| + return (index + this._matchedRequestCount) % this._matchedRequestCount;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkDataGridNode} node
|
| + * @return {boolean}
|
| + */
|
| + _applyFilter(node) {
|
| + var request = node.request();
|
| + if (this._timeFilter && !this._timeFilter(request))
|
| + return false;
|
| + var categoryName = request.resourceType().category().title;
|
| + if (!this._resourceCategoryFilterUI.accept(categoryName))
|
| + return false;
|
| + if (this._dataURLFilterUI.checked() && request.parsedURL.isDataURL())
|
| + return false;
|
| + if (request.statusText === 'Service Worker Fallback Required')
|
| + return false;
|
| + for (var i = 0; i < this._filters.length; ++i) {
|
| + if (!this._filters[i](request))
|
| return false;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - supportsRegexSearch: function()
|
| - {
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @param {?WebInspector.NetworkDataGridNode} node
|
| - * @return {number}
|
| - */
|
| - _updateMatchCountAndFindMatchIndex: function(node)
|
| - {
|
| - /** @type {!Array.<!WebInspector.NetworkDataGridNode>} */
|
| - var nodes = this._dataGrid.rootNode().children;
|
| - var matchCount = 0;
|
| - var matchIndex = 0;
|
| - for (var i = 0; i < nodes.length; ++i) {
|
| - if (!nodes[i][WebInspector.NetworkLogView._isMatchingSearchQuerySymbol])
|
| - continue;
|
| - if (node === nodes[i])
|
| - matchIndex = matchCount;
|
| - matchCount++;
|
| - }
|
| - if (this._matchedRequestCount !== matchCount) {
|
| - this._matchedRequestCount = matchCount;
|
| - this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.SearchCountUpdated, matchCount);
|
| - }
|
| - return matchIndex;
|
| - },
|
| -
|
| - /**
|
| - * @param {number} index
|
| - * @return {number}
|
| - */
|
| - _normalizeSearchResultIndex: function(index)
|
| - {
|
| - return (index + this._matchedRequestCount) % this._matchedRequestCount;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.NetworkDataGridNode} node
|
| - * @return {boolean}
|
| - */
|
| - _applyFilter: function(node)
|
| - {
|
| - var request = node.request();
|
| - if (this._timeFilter && !this._timeFilter(request))
|
| - return false;
|
| - var categoryName = request.resourceType().category().title;
|
| - if (!this._resourceCategoryFilterUI.accept(categoryName))
|
| - return false;
|
| - if (this._dataURLFilterUI.checked() && request.parsedURL.isDataURL())
|
| - return false;
|
| - if (request.statusText === "Service Worker Fallback Required")
|
| - return false;
|
| - for (var i = 0; i < this._filters.length; ++i) {
|
| - if (!this._filters[i](request))
|
| - return false;
|
| - }
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} query
|
| - */
|
| - _parseFilterQuery: function(query)
|
| - {
|
| - var parsedQuery;
|
| - if (this._textFilterUI.isRegexChecked() && query !== "")
|
| - parsedQuery = {text: [query], filters: []};
|
| - else
|
| - parsedQuery = this._suggestionBuilder.parseQuery(query);
|
| -
|
| - this._filters = parsedQuery.text.map(this._createTextFilter, this);
|
| -
|
| - var n = parsedQuery.filters.length;
|
| - for (var i = 0; i < n; ++i) {
|
| - var filter = parsedQuery.filters[i];
|
| - var filterType = /** @type {!WebInspector.NetworkLogView.FilterType} */ (filter.type.toLowerCase());
|
| - this._filters.push(this._createFilter(filterType, filter.data, filter.negative));
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {string} text
|
| - * @return {!WebInspector.NetworkLogView.Filter}
|
| - */
|
| - _createTextFilter: function(text)
|
| - {
|
| - var negative = false;
|
| - /** @type {?RegExp} */
|
| - var regex;
|
| - if (!this._textFilterUI.isRegexChecked() && text[0] === "-" && text.length > 1) {
|
| - negative = true;
|
| - text = text.substring(1);
|
| - regex = new RegExp(text.escapeForRegExp(), "i");
|
| - } else {
|
| - regex = this._textFilterUI.regex();
|
| - }
|
| -
|
| - var filter = WebInspector.NetworkLogView._requestPathFilter.bind(null, regex);
|
| - if (negative)
|
| - filter = WebInspector.NetworkLogView._negativeFilter.bind(null, filter);
|
| - return filter;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.NetworkLogView.FilterType} type
|
| - * @param {string} value
|
| - * @param {boolean} negative
|
| - * @return {!WebInspector.NetworkLogView.Filter}
|
| - */
|
| - _createFilter: function(type, value, negative)
|
| - {
|
| - var filter = this._createSpecialFilter(type, value);
|
| - if (!filter)
|
| - return this._createTextFilter((negative ? "-" : "") + type + ":" + value);
|
| - if (negative)
|
| - return WebInspector.NetworkLogView._negativeFilter.bind(null, filter);
|
| - return filter;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.NetworkLogView.FilterType} type
|
| - * @param {string} value
|
| - * @return {?WebInspector.NetworkLogView.Filter}
|
| - */
|
| - _createSpecialFilter: function(type, value)
|
| - {
|
| - switch (type) {
|
| - case WebInspector.NetworkLogView.FilterType.Domain:
|
| - return WebInspector.NetworkLogView._createRequestDomainFilter(value);
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.HasResponseHeader:
|
| - return WebInspector.NetworkLogView._requestResponseHeaderFilter.bind(null, value);
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.Is:
|
| - if (value.toLowerCase() === WebInspector.NetworkLogView.IsFilterType.Running)
|
| - return WebInspector.NetworkLogView._runningRequestFilter;
|
| - break;
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.LargerThan:
|
| - return this._createSizeFilter(value.toLowerCase());
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.Method:
|
| - return WebInspector.NetworkLogView._requestMethodFilter.bind(null, value);
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.MimeType:
|
| - return WebInspector.NetworkLogView._requestMimeTypeFilter.bind(null, value);
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.MixedContent:
|
| - return WebInspector.NetworkLogView._requestMixedContentFilter.bind(null, /** @type {!WebInspector.NetworkLogView.MixedContentFilterValues} */ (value));
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.Scheme:
|
| - return WebInspector.NetworkLogView._requestSchemeFilter.bind(null, value);
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.SetCookieDomain:
|
| - return WebInspector.NetworkLogView._requestSetCookieDomainFilter.bind(null, value);
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.SetCookieName:
|
| - return WebInspector.NetworkLogView._requestSetCookieNameFilter.bind(null, value);
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.SetCookieValue:
|
| - return WebInspector.NetworkLogView._requestSetCookieValueFilter.bind(null, value);
|
| -
|
| - case WebInspector.NetworkLogView.FilterType.StatusCode:
|
| - return WebInspector.NetworkLogView._statusCodeFilter.bind(null, value);
|
| - }
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} value
|
| - * @return {?WebInspector.NetworkLogView.Filter}
|
| - */
|
| - _createSizeFilter: function(value)
|
| - {
|
| - var multiplier = 1;
|
| - if (value.endsWith("k")) {
|
| - multiplier = 1024;
|
| - value = value.substring(0, value.length - 1);
|
| - } else if (value.endsWith("m")) {
|
| - multiplier = 1024 * 1024;
|
| - value = value.substring(0, value.length - 1);
|
| - }
|
| - var quantity = Number(value);
|
| - if (isNaN(quantity))
|
| - return null;
|
| - return WebInspector.NetworkLogView._requestSizeLargerThanFilter.bind(null, quantity * multiplier);
|
| - },
|
| -
|
| - _filterRequests: function()
|
| - {
|
| - this._removeAllHighlights();
|
| - this._invalidateAllItems();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - jumpToPreviousSearchResult: function()
|
| - {
|
| - if (!this._matchedRequestCount)
|
| - return;
|
| - var index = this._normalizeSearchResultIndex(this._currentMatchedRequestIndex - 1);
|
| - this._highlightNthMatchedRequestForSearch(index, true);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - jumpToNextSearchResult: function()
|
| - {
|
| - if (!this._matchedRequestCount)
|
| - return;
|
| - var index = this._normalizeSearchResultIndex(this._currentMatchedRequestIndex + 1);
|
| - this._highlightNthMatchedRequestForSearch(index, true);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - searchCanceled: function()
|
| - {
|
| - delete this._searchRegex;
|
| - this._clearSearchMatchedList();
|
| - this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.SearchCountUpdated, 0);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - */
|
| - revealAndHighlightRequest: function(request)
|
| - {
|
| - this.removeAllNodeHighlights();
|
| -
|
| - var node = this._nodesByRequestId.get(request.requestId);
|
| - if (node) {
|
| - node.reveal();
|
| - this._highlightNode(node);
|
| - }
|
| - },
|
| -
|
| - removeAllNodeHighlights: function()
|
| - {
|
| - if (this._highlightedNode) {
|
| - this._highlightedNode.element().classList.remove("highlighted-row");
|
| - delete this._highlightedNode;
|
| - }
|
| - },
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} query
|
| + */
|
| + _parseFilterQuery(query) {
|
| + var parsedQuery;
|
| + if (this._textFilterUI.isRegexChecked() && query !== '')
|
| + parsedQuery = {text: [query], filters: []};
|
| + else
|
| + parsedQuery = this._suggestionBuilder.parseQuery(query);
|
| +
|
| + this._filters = parsedQuery.text.map(this._createTextFilter, this);
|
| +
|
| + var n = parsedQuery.filters.length;
|
| + for (var i = 0; i < n; ++i) {
|
| + var filter = parsedQuery.filters[i];
|
| + var filterType = /** @type {!WebInspector.NetworkLogView.FilterType} */ (filter.type.toLowerCase());
|
| + this._filters.push(this._createFilter(filterType, filter.data, filter.negative));
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {string} text
|
| + * @return {!WebInspector.NetworkLogView.Filter}
|
| + */
|
| + _createTextFilter(text) {
|
| + var negative = false;
|
| + /** @type {?RegExp} */
|
| + var regex;
|
| + if (!this._textFilterUI.isRegexChecked() && text[0] === '-' && text.length > 1) {
|
| + negative = true;
|
| + text = text.substring(1);
|
| + regex = new RegExp(text.escapeForRegExp(), 'i');
|
| + } else {
|
| + regex = this._textFilterUI.regex();
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkDataGridNode} node
|
| - */
|
| - _highlightNode: function(node)
|
| - {
|
| - WebInspector.runCSSAnimationOnce(node.element(), "highlighted-row");
|
| - this._highlightedNode = node;
|
| - },
|
| + var filter = WebInspector.NetworkLogView._requestPathFilter.bind(null, regex);
|
| + if (negative)
|
| + filter = WebInspector.NetworkLogView._negativeFilter.bind(null, filter);
|
| + return filter;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkLogView.FilterType} type
|
| + * @param {string} value
|
| + * @param {boolean} negative
|
| + * @return {!WebInspector.NetworkLogView.Filter}
|
| + */
|
| + _createFilter(type, value, negative) {
|
| + var filter = this._createSpecialFilter(type, value);
|
| + if (!filter)
|
| + return this._createTextFilter((negative ? '-' : '') + type + ':' + value);
|
| + if (negative)
|
| + return WebInspector.NetworkLogView._negativeFilter.bind(null, filter);
|
| + return filter;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkLogView.FilterType} type
|
| + * @param {string} value
|
| + * @return {?WebInspector.NetworkLogView.Filter}
|
| + */
|
| + _createSpecialFilter(type, value) {
|
| + switch (type) {
|
| + case WebInspector.NetworkLogView.FilterType.Domain:
|
| + return WebInspector.NetworkLogView._createRequestDomainFilter(value);
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.HasResponseHeader:
|
| + return WebInspector.NetworkLogView._requestResponseHeaderFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.Is:
|
| + if (value.toLowerCase() === WebInspector.NetworkLogView.IsFilterType.Running)
|
| + return WebInspector.NetworkLogView._runningRequestFilter;
|
| + break;
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.LargerThan:
|
| + return this._createSizeFilter(value.toLowerCase());
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.Method:
|
| + return WebInspector.NetworkLogView._requestMethodFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.MimeType:
|
| + return WebInspector.NetworkLogView._requestMimeTypeFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.MixedContent:
|
| + return WebInspector.NetworkLogView._requestMixedContentFilter.bind(
|
| + null, /** @type {!WebInspector.NetworkLogView.MixedContentFilterValues} */ (value));
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.Scheme:
|
| + return WebInspector.NetworkLogView._requestSchemeFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.SetCookieDomain:
|
| + return WebInspector.NetworkLogView._requestSetCookieDomainFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.SetCookieName:
|
| + return WebInspector.NetworkLogView._requestSetCookieNameFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.SetCookieValue:
|
| + return WebInspector.NetworkLogView._requestSetCookieValueFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkLogView.FilterType.StatusCode:
|
| + return WebInspector.NetworkLogView._statusCodeFilter.bind(null, value);
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} value
|
| + * @return {?WebInspector.NetworkLogView.Filter}
|
| + */
|
| + _createSizeFilter(value) {
|
| + var multiplier = 1;
|
| + if (value.endsWith('k')) {
|
| + multiplier = 1024;
|
| + value = value.substring(0, value.length - 1);
|
| + } else if (value.endsWith('m')) {
|
| + multiplier = 1024 * 1024;
|
| + value = value.substring(0, value.length - 1);
|
| + }
|
| + var quantity = Number(value);
|
| + if (isNaN(quantity))
|
| + return null;
|
| + return WebInspector.NetworkLogView._requestSizeLargerThanFilter.bind(null, quantity * multiplier);
|
| + }
|
| +
|
| + _filterRequests() {
|
| + this._removeAllHighlights();
|
| + this._invalidateAllItems();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + jumpToPreviousSearchResult() {
|
| + if (!this._matchedRequestCount)
|
| + return;
|
| + var index = this._normalizeSearchResultIndex(this._currentMatchedRequestIndex - 1);
|
| + this._highlightNthMatchedRequestForSearch(index, true);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + jumpToNextSearchResult() {
|
| + if (!this._matchedRequestCount)
|
| + return;
|
| + var index = this._normalizeSearchResultIndex(this._currentMatchedRequestIndex + 1);
|
| + this._highlightNthMatchedRequestForSearch(index, true);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + searchCanceled() {
|
| + delete this._searchRegex;
|
| + this._clearSearchMatchedList();
|
| + this.dispatchEventToListeners(WebInspector.NetworkLogView.Events.SearchCountUpdated, 0);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + */
|
| + revealAndHighlightRequest(request) {
|
| + this.removeAllNodeHighlights();
|
| +
|
| + var node = this._nodesByRequestId.get(request.requestId);
|
| + if (node) {
|
| + node.reveal();
|
| + this._highlightNode(node);
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @param {string} platform
|
| - * @return {string}
|
| - */
|
| - _generateCurlCommand: function(request, platform)
|
| - {
|
| - 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)
|
| - {
|
| - /* If there are no new line characters do not escape the " characters
|
| + removeAllNodeHighlights() {
|
| + if (this._highlightedNode) {
|
| + this._highlightedNode.element().classList.remove('highlighted-row');
|
| + delete this._highlightedNode;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkDataGridNode} node
|
| + */
|
| + _highlightNode(node) {
|
| + WebInspector.runCSSAnimationOnce(node.element(), 'highlighted-row');
|
| + this._highlightedNode = node;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @param {string} platform
|
| + * @return {string}
|
| + */
|
| + _generateCurlCommand(request, platform) {
|
| + 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) {
|
| + /* If there are no new line characters do not escape the " characters
|
| since it only uglifies the command.
|
|
|
| Because cmd.exe parser and MS Crt arguments parsers use some of the
|
| @@ -1454,317 +1583,142 @@ WebInspector.NetworkLogView.prototype = {
|
| new line is there to enact the escape command the second is the character
|
| to escape (in this case new line).
|
| */
|
| - var encapsChars = /[\r\n]/.test(str) ? "^\"" : "\"";
|
| - return encapsChars + str.replace(/\\/g, "\\\\")
|
| - .replace(/"/g, "\\\"")
|
| - .replace(/[^a-zA-Z0-9\s_\-:=+~'\/.',?;()*`]/g, "^$&")
|
| - .replace(/%(?=[a-zA-Z0-9_])/g, "%^")
|
| - .replace(/\r\n|[\n\r]/g, "^\n\n") + encapsChars;
|
| - }
|
| -
|
| - 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 = platform === "win" ? 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 encapsChars = /[\r\n]/.test(str) ? '^"' : '"';
|
| + return encapsChars +
|
| + str.replace(/\\/g, '\\\\')
|
| + .replace(/"/g, '\\"')
|
| + .replace(/[^a-zA-Z0-9\s_\-:=+~'\/.',?;()*`]/g, '^$&')
|
| + .replace(/%(?=[a-zA-Z0-9_])/g, '%^')
|
| + .replace(/\r\n|[\n\r]/g, '^\n\n') +
|
| + encapsChars;
|
| + }
|
|
|
| - 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));
|
| + 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);
|
| }
|
| - command = command.concat(data);
|
| - command.push("--compressed");
|
| -
|
| - if (request.securityState() === SecurityAgent.SecurityState.Insecure)
|
| - command.push("--insecure");
|
| - return command.join(" ");
|
| - },
|
| -
|
| - __proto__: WebInspector.VBox.prototype
|
| -};
|
| -
|
| -/** @typedef {function(!WebInspector.NetworkRequest): boolean} */
|
| -WebInspector.NetworkLogView.Filter;
|
| -
|
| -/**
|
| - * @param {!WebInspector.NetworkLogView.Filter} filter
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._negativeFilter = function(filter, request)
|
| -{
|
| - return !filter(request);
|
| -};
|
| -
|
| -/**
|
| - * @param {?RegExp} regex
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestPathFilter = function(regex, request)
|
| -{
|
| - if (!regex)
|
| - return false;
|
| -
|
| - return regex.test(request.path() + "/" + request.name());
|
| -};
|
| -
|
| -/**
|
| - * @param {string} domain
|
| - * @return {!Array.<string>}
|
| - */
|
| -WebInspector.NetworkLogView._subdomains = function(domain)
|
| -{
|
| - var result = [domain];
|
| - var indexOfPeriod = domain.indexOf(".");
|
| - while (indexOfPeriod !== -1) {
|
| - result.push("*" + domain.substring(indexOfPeriod));
|
| - indexOfPeriod = domain.indexOf(".", indexOfPeriod + 1);
|
| + 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 + '\'';
|
| + }
|
| }
|
| - return result;
|
| -};
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @return {!WebInspector.NetworkLogView.Filter}
|
| - */
|
| -WebInspector.NetworkLogView._createRequestDomainFilter = function(value)
|
| -{
|
| - /**
|
| - * @param {string} string
|
| - * @return {string}
|
| - */
|
| - function escapeForRegExp(string)
|
| - {
|
| - return string.escapeForRegExp();
|
| + // cURL command expected to run on the same platform that DevTools run
|
| + // (it may be different from the inspected page platform).
|
| + var escapeString = platform === 'win' ? 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';
|
| }
|
| - var escapedPattern = value.split("*").map(escapeForRegExp).join(".*");
|
| - return WebInspector.NetworkLogView._requestDomainFilter.bind(null, new RegExp("^" + escapedPattern + "$", "i"));
|
| -};
|
| -
|
| -/**
|
| - * @param {!RegExp} regex
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestDomainFilter = function(regex, request)
|
| -{
|
| - return regex.test(request.domain);
|
| -};
|
|
|
| -/**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._runningRequestFilter = function(request)
|
| -{
|
| - return !request.finished;
|
| -};
|
| + if (request.requestMethod !== inferredMethod) {
|
| + command.push('-X');
|
| + command.push(request.requestMethod);
|
| + }
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestResponseHeaderFilter = function(value, request)
|
| -{
|
| - return request.responseHeaderValue(value) !== undefined;
|
| -};
|
| + 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');
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestMethodFilter = function(value, request)
|
| -{
|
| - return request.requestMethod === value;
|
| + if (request.securityState() === SecurityAgent.SecurityState.Insecure)
|
| + command.push('--insecure');
|
| + return command.join(' ');
|
| + }
|
| };
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestMimeTypeFilter = function(value, request)
|
| -{
|
| - return request.mimeType === value;
|
| -};
|
| +WebInspector.NetworkLogView._isFilteredOutSymbol = Symbol('isFilteredOut');
|
| +WebInspector.NetworkLogView._isMatchingSearchQuerySymbol = Symbol('isMatchingSearchQuery');
|
|
|
| -/**
|
| - * @param {!WebInspector.NetworkLogView.MixedContentFilterValues} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestMixedContentFilter = function(value, request)
|
| -{
|
| - if (value === WebInspector.NetworkLogView.MixedContentFilterValues.Displayed) {
|
| - return request.mixedContentType === "optionally-blockable";
|
| - } else if (value === WebInspector.NetworkLogView.MixedContentFilterValues.Blocked) {
|
| - return request.mixedContentType === "blockable" && request.wasBlocked();
|
| - } else if (value === WebInspector.NetworkLogView.MixedContentFilterValues.BlockOverridden) {
|
| - return request.mixedContentType === "blockable" && !request.wasBlocked();
|
| - } else if (value === WebInspector.NetworkLogView.MixedContentFilterValues.All) {
|
| - return request.mixedContentType !== "none";
|
| - }
|
| - return false;
|
| +WebInspector.NetworkLogView.HTTPSchemas = {
|
| + 'http': true,
|
| + 'https': true,
|
| + 'ws': true,
|
| + 'wss': true
|
| };
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestSchemeFilter = function(value, request)
|
| -{
|
| - return request.scheme === value;
|
| -};
|
| +WebInspector.NetworkLogView._waterfallMinOvertime = 1;
|
| +WebInspector.NetworkLogView._waterfallMaxOvertime = 3;
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestSetCookieDomainFilter = function(value, request)
|
| -{
|
| - var cookies = request.responseCookies;
|
| - for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| - if (cookies[i].domain() === value)
|
| - return true;
|
| - }
|
| - return false;
|
| +/** @enum {symbol} */
|
| +WebInspector.NetworkLogView.Events = {
|
| + RequestSelected: Symbol('RequestSelected'),
|
| + SearchCountUpdated: Symbol('SearchCountUpdated'),
|
| + SearchIndexUpdated: Symbol('SearchIndexUpdated'),
|
| + UpdateRequest: Symbol('UpdateRequest')
|
| };
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestSetCookieNameFilter = function(value, request)
|
| -{
|
| - var cookies = request.responseCookies;
|
| - for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| - if (cookies[i].name() === value)
|
| - return true;
|
| - }
|
| - return false;
|
| +/** @enum {string} */
|
| +WebInspector.NetworkLogView.FilterType = {
|
| + Domain: 'domain',
|
| + HasResponseHeader: 'has-response-header',
|
| + Is: 'is',
|
| + LargerThan: 'larger-than',
|
| + Method: 'method',
|
| + MimeType: 'mime-type',
|
| + MixedContent: 'mixed-content',
|
| + Scheme: 'scheme',
|
| + SetCookieDomain: 'set-cookie-domain',
|
| + SetCookieName: 'set-cookie-name',
|
| + SetCookieValue: 'set-cookie-value',
|
| + StatusCode: 'status-code'
|
| };
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestSetCookieValueFilter = function(value, request)
|
| -{
|
| - var cookies = request.responseCookies;
|
| - for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| - if (cookies[i].value() === value)
|
| - return true;
|
| - }
|
| - return false;
|
| +/** @enum {string} */
|
| +WebInspector.NetworkLogView.MixedContentFilterValues = {
|
| + All: 'all',
|
| + Displayed: 'displayed',
|
| + Blocked: 'blocked',
|
| + BlockOverridden: 'block-overridden'
|
| };
|
|
|
| -/**
|
| - * @param {number} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestSizeLargerThanFilter = function(value, request)
|
| -{
|
| - return request.transferSize >= value;
|
| +/** @enum {string} */
|
| +WebInspector.NetworkLogView.IsFilterType = {
|
| + Running: 'running'
|
| };
|
|
|
| -/**
|
| - * @param {string} value
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._statusCodeFilter = function(value, request)
|
| -{
|
| - return ("" + request.statusCode) === value;
|
| -};
|
| +/** @type {!Array<string>} */
|
| +WebInspector.NetworkLogView._searchKeys =
|
| + Object.keys(WebInspector.NetworkLogView.FilterType).map(key => WebInspector.NetworkLogView.FilterType[key]);
|
|
|
| -/**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView.HTTPRequestsFilter = function(request)
|
| -{
|
| - return request.parsedURL.isValid && (request.scheme in WebInspector.NetworkLogView.HTTPSchemas);
|
| -};
|
| +/** @typedef {function(!WebInspector.NetworkRequest): boolean} */
|
| +WebInspector.NetworkLogView.Filter;
|
|
|
| -/**
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView.FinishedRequestsFilter = function(request)
|
| -{
|
| - return request.finished;
|
| -};
|
|
|
| -/**
|
| - * @param {number} windowStart
|
| - * @param {number} windowEnd
|
| - * @param {!WebInspector.NetworkRequest} request
|
| - * @return {boolean}
|
| - */
|
| -WebInspector.NetworkLogView._requestTimeFilter = function(windowStart, windowEnd, request)
|
| -{
|
| - if (request.issueTime() > windowEnd)
|
| - return false;
|
| - if (request.endTime !== -1 && request.endTime < windowStart)
|
| - return false;
|
| - return true;
|
| -};
|
|
|