| Index: third_party/WebKit/Source/devtools/front_end/network/NetworkLogViewColumns.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogViewColumns.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogViewColumns.js
|
| index 5963d876d3c3703f279eda259510a69cc6be62c3..98e82e1c61fbd59996c24a791a554865c4713603 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogViewColumns.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogViewColumns.js
|
| @@ -1,26 +1,28 @@
|
| // Copyright 2016 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| -
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.NetworkLogView} networkLogView
|
| - * @param {!WebInspector.NetworkTransferTimeCalculator} timeCalculator
|
| - * @param {!WebInspector.NetworkTransferDurationCalculator} durationCalculator
|
| - * @param {!WebInspector.Setting} networkLogLargeRowsSetting
|
| + * @unrestricted
|
| */
|
| -WebInspector.NetworkLogViewColumns = function(networkLogView, timeCalculator, durationCalculator, networkLogLargeRowsSetting)
|
| -{
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline")) {
|
| - var timelineColumn = WebInspector.NetworkLogViewColumns._defaultColumns.find(columnConfig => columnConfig.id === "timeline");
|
| - timelineColumn.visible = false;
|
| - timelineColumn.hideable = false;
|
| +WebInspector.NetworkLogViewColumns = class {
|
| + /**
|
| + * @param {!WebInspector.NetworkLogView} networkLogView
|
| + * @param {!WebInspector.NetworkTransferTimeCalculator} timeCalculator
|
| + * @param {!WebInspector.NetworkTransferDurationCalculator} durationCalculator
|
| + * @param {!WebInspector.Setting} networkLogLargeRowsSetting
|
| + */
|
| + constructor(networkLogView, timeCalculator, durationCalculator, networkLogLargeRowsSetting) {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline')) {
|
| + var timelineColumn =
|
| + WebInspector.NetworkLogViewColumns._defaultColumns.find(columnConfig => columnConfig.id === 'timeline');
|
| + timelineColumn.visible = false;
|
| + timelineColumn.hideable = false;
|
| }
|
|
|
| this._networkLogView = networkLogView;
|
|
|
| /** @type {!WebInspector.Setting} */
|
| - this._persistantSettings = WebInspector.settings.createSetting("networkLogColumns", {});
|
| + this._persistantSettings = WebInspector.settings.createSetting('networkLogColumns', {});
|
|
|
| /** @type {!Array<!Element>} */
|
| this._dropDownColumnSelectors = [];
|
| @@ -55,11 +57,748 @@ WebInspector.NetworkLogViewColumns = function(networkLogView, timeCalculator, du
|
| this._calculatorsMap.set(WebInspector.NetworkLogViewColumns._calculatorTypes.Duration, durationCalculator);
|
|
|
| this._setupDataGrid();
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - this._setupTimeline();
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + this._setupTimeline();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkLogViewColumns.Descriptor} columnConfig
|
| + * @return {!WebInspector.DataGrid.ColumnDescriptor}
|
| + */
|
| + static _convertToDataGridDescriptor(columnConfig) {
|
| + return /** @type {!WebInspector.DataGrid.ColumnDescriptor} */ ({
|
| + id: columnConfig.id,
|
| + title: columnConfig.title,
|
| + sortable: columnConfig.sortable,
|
| + align: columnConfig.align,
|
| + nonSelectable: columnConfig.nonSelectable,
|
| + weight: columnConfig.weight
|
| + });
|
| + }
|
| +
|
| + wasShown() {
|
| + this._updateRowsSize();
|
| + }
|
| +
|
| + willHide() {
|
| + this._popoverHelper.hidePopover();
|
| + }
|
| +
|
| + reset() {
|
| + if (this._popoverHelper)
|
| + this._popoverHelper.hidePopover();
|
| + this._timelineGrid.removeEventDividers();
|
| + this._shownEventDividers.clear();
|
| + this.updateDividersIfNeeded();
|
| + }
|
| +
|
| + _setupDataGrid() {
|
| + var defaultColumns = WebInspector.NetworkLogViewColumns._defaultColumns;
|
| + var defaultColumnConfig = WebInspector.NetworkLogViewColumns._defaultColumnConfig;
|
| +
|
| + this._columns = /** @type {!Array<!WebInspector.NetworkLogViewColumns.Descriptor>} */ ([]);
|
| + for (var currentConfigColumn of defaultColumns) {
|
| + var columnConfig = /** @type {!WebInspector.NetworkLogViewColumns.Descriptor} */ (
|
| + Object.assign(/** @type {!Object} */ ({}), defaultColumnConfig, currentConfigColumn));
|
| + columnConfig.id = columnConfig.id;
|
| + if (columnConfig.subtitle)
|
| + columnConfig.titleDOMFragment = this._makeHeaderFragment(columnConfig.title, columnConfig.subtitle);
|
| + this._columns.push(columnConfig);
|
| + }
|
| + this._loadColumns();
|
| +
|
| + this._popoverHelper = new WebInspector.PopoverHelper(this._networkLogView.element);
|
| + this._popoverHelper.initializeCallbacks(
|
| + this._getPopoverAnchor.bind(this), this._showPopover.bind(this), this._onHidePopover.bind(this));
|
| +
|
| + this._dataGrid = new WebInspector.SortableDataGrid(
|
| + this._columns.map(WebInspector.NetworkLogViewColumns._convertToDataGridDescriptor));
|
| + this._dataGrid.element.addEventListener('mousedown', event => {
|
| + if ((!this._dataGrid.selectedNode && event.button) || event.target.enclosingNodeOrSelfWithNodeName('a'))
|
| + event.consume();
|
| + }, true);
|
| +
|
| + this._dataGridScroller = this._dataGrid.scrollContainer;
|
| +
|
| + this._updateColumns();
|
| + this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged, this._sortHandler, this);
|
| + this._dataGrid.addEventListener(WebInspector.DataGrid.Events.ColumnsResized, this.updateDividersIfNeeded, this);
|
| + this._dataGrid.setHeaderContextMenuCallback(this._innerHeaderContextMenu.bind(this));
|
| +
|
| + this._timelineGrid = new WebInspector.TimelineGrid();
|
| + this._timelineGrid.element.classList.add('network-timeline-grid');
|
| + if (!Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + this._dataGrid.element.appendChild(this._timelineGrid.element);
|
| +
|
| + this._setupDropdownColumns();
|
| +
|
| + this._activeTimelineSortId = WebInspector.NetworkLogViewColumns.TimelineSortIds.StartTime;
|
| + this._dataGrid.markColumnAsSortedBy(
|
| + WebInspector.NetworkLogViewColumns._initialSortColumn, WebInspector.DataGrid.Order.Ascending);
|
| +
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline')) {
|
| + this._splitWidget = new WebInspector.SplitWidget(true, true, 'networkPanelSplitViewTimeline', 200);
|
| + this._splitWidget.setMainWidget(this._dataGrid.asWidget());
|
| + }
|
| + }
|
| +
|
| + _setupTimeline() {
|
| + this._timelineColumn =
|
| + new WebInspector.NetworkTimelineColumn(this._networkLogView.rowHeight(), this._networkLogView.calculator());
|
| +
|
| + this._timelineColumn.element.addEventListener('contextmenu', handleContextMenu.bind(this));
|
| + this._timelineColumn.element.addEventListener('mousewheel', this._onMouseWheel.bind(this, false), {passive: true});
|
| + this._dataGridScroller.addEventListener('mousewheel', this._onMouseWheel.bind(this, true), true);
|
| +
|
| + this._timelineColumn.element.addEventListener(
|
| + 'mousemove',
|
| + event => this._networkLogView.setHoveredRequest(
|
| + this._timelineColumn.getRequestFromPoint(event.offsetX, event.offsetY + event.target.offsetTop),
|
| + event.shiftKey),
|
| + true);
|
| + this._timelineColumn.element.addEventListener(
|
| + 'mouseleave', this._networkLogView.setHoveredRequest.bind(this._networkLogView, null, false), true);
|
| +
|
| + this._timelineScroller = this._timelineColumn.contentElement.createChild('div', 'network-timeline-v-scroll');
|
| + this._timelineScroller.addEventListener('scroll', this._syncScrollers.bind(this), {passive: true});
|
| + this._timelineScrollerContent = this._timelineScroller.createChild('div', 'network-timeline-v-scroll-content');
|
| +
|
| + this._dataGrid.addEventListener(WebInspector.DataGrid.Events.PaddingChanged, () => {
|
| + this._timelineScrollerWidthIsStale = true;
|
| + this._syncScrollers();
|
| + });
|
| + this._dataGrid.addEventListener(
|
| + WebInspector.ViewportDataGrid.Events.ViewportCalculated, this._redrawTimelineColumn.bind(this));
|
| +
|
| + this._createTimelineHeader();
|
| + this._timelineColumn.contentElement.classList.add('network-timeline-view');
|
| +
|
| + this._splitWidget.setSidebarWidget(this._timelineColumn);
|
| +
|
| + this.switchViewMode(false);
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + * @this {WebInspector.NetworkLogViewColumns}
|
| + */
|
| + function handleContextMenu(event) {
|
| + var request = this._timelineColumn.getRequestFromPoint(event.offsetX, event.offsetY);
|
| + if (!request)
|
| + return;
|
| + var contextMenu = new WebInspector.ContextMenu(event);
|
| + this._networkLogView.handleContextMenuForRequest(contextMenu, request);
|
| + contextMenu.show();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} shouldConsume
|
| + * @param {!Event} event
|
| + */
|
| + _onMouseWheel(shouldConsume, event) {
|
| + if (shouldConsume)
|
| + event.consume(true);
|
| + this._activeScroller.scrollTop -= event.wheelDeltaY;
|
| + this._syncScrollers();
|
| + this._networkLogView.setHoveredRequest(
|
| + this._timelineColumn.getRequestFromPoint(event.offsetX, event.offsetY), event.shiftKey);
|
| + }
|
| +
|
| + _syncScrollers() {
|
| + if (!this._timelineColumn.isShowing())
|
| + return;
|
| + this._timelineScrollerContent.style.height = this._dataGridScroller.scrollHeight + 'px';
|
| + this._updateScrollerWidthIfNeeded();
|
| + this._dataGridScroller.scrollTop = this._timelineScroller.scrollTop;
|
| + }
|
| +
|
| + _updateScrollerWidthIfNeeded() {
|
| + if (this._timelineScrollerWidthIsStale) {
|
| + this._timelineScrollerWidthIsStale = false;
|
| + this._timelineColumn.setRightPadding(
|
| + this._timelineScroller.offsetWidth - this._timelineScrollerContent.offsetWidth);
|
| + }
|
| + }
|
| +
|
| + _redrawTimelineColumn() {
|
| + if (!this._timelineRequestsAreStale) {
|
| + this._updateScrollerWidthIfNeeded();
|
| + this._timelineColumn.update(
|
| + this._activeScroller.scrollTop, this._eventDividersShown ? this._shownEventDividers : undefined);
|
| + return;
|
| + }
|
| + var currentNode = this._dataGrid.rootNode();
|
| + var requestData = {requests: [], navigationRequest: null};
|
| + while (currentNode = currentNode.traverseNextNode(true)) {
|
| + if (currentNode.isNavigationRequest())
|
| + requestData.navigationRequest = currentNode.request();
|
| + requestData.requests.push(currentNode.request());
|
| + }
|
| + this._timelineColumn.update(this._activeScroller.scrollTop, this._shownEventDividers, requestData);
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.NetworkRequest} request
|
| + * @param {boolean} highlightInitiatorChain
|
| + */
|
| + setHoveredRequest(request, highlightInitiatorChain) {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + this._timelineColumn.setHoveredRequest(request, highlightInitiatorChain);
|
| + }
|
| +
|
| + _createTimelineHeader() {
|
| + this._timelineHeaderElement = this._timelineColumn.contentElement.createChild('div', 'network-timeline-header');
|
| + this._timelineHeaderElement.addEventListener('click', timelineHeaderClicked.bind(this));
|
| + this._timelineHeaderElement.addEventListener(
|
| + 'contextmenu', event => this._innerHeaderContextMenu(new WebInspector.ContextMenu(event)));
|
| + var innerElement = this._timelineHeaderElement.createChild('div');
|
| + innerElement.textContent = WebInspector.UIString('Timeline');
|
| + this._timelineColumnSortIcon = this._timelineHeaderElement.createChild('div', 'sort-order-icon-container')
|
| + .createChild('div', 'sort-order-icon');
|
| +
|
| + /**
|
| + * @this {WebInspector.NetworkLogViewColumns}
|
| + */
|
| + function timelineHeaderClicked() {
|
| + var sortOrders = WebInspector.DataGrid.Order;
|
| + var sortOrder =
|
| + this._dataGrid.sortOrder() === sortOrders.Ascending ? sortOrders.Descending : sortOrders.Ascending;
|
| + this._dataGrid.markColumnAsSortedBy('timeline', sortOrder);
|
| + this._sortHandler();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkTimeCalculator} x
|
| + */
|
| + setCalculator(x) {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + this._timelineColumn.setCalculator(x);
|
| + }
|
| +
|
| + dataChanged() {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + this._timelineRequestsAreStale = true;
|
| + }
|
| +
|
| + _updateRowsSize() {
|
| + var largeRows = !!this._networkLogLargeRowsSetting.get();
|
| + this._dataGrid.element.classList.toggle('small', !largeRows);
|
| + this._dataGrid.scheduleUpdate();
|
| +
|
| + if (!Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + return;
|
| + this._timelineScrollerWidthIsStale = true;
|
| + this._timelineColumn.setRowHeight(this._networkLogView.rowHeight());
|
| + this._timelineScroller.classList.toggle('small', !largeRows);
|
| + this._timelineHeaderElement.classList.toggle('small', !largeRows);
|
| + this._timelineGrid.element.classList.toggle('small', !this._networkLogLargeRowsSetting.get());
|
| + this._timelineColumn.setHeaderHeight(this._timelineScroller.offsetTop);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} element
|
| + */
|
| + show(element) {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + this._splitWidget.show(element);
|
| + else
|
| + this._dataGrid.asWidget().show(element);
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.SortableDataGrid} dataGrid
|
| + */
|
| + dataGrid() {
|
| + return this._dataGrid;
|
| + }
|
| +
|
| + _setupDropdownColumns() {
|
| + for (var columnConfig of this._columns) {
|
| + if (!columnConfig.sortConfig || !columnConfig.sortConfig.entries)
|
| + continue;
|
| + var select = createElement('select');
|
| + var placeHolderOption = select.createChild('option');
|
| + placeHolderOption.classList.add('hidden');
|
| + for (var entry of columnConfig.sortConfig.entries) {
|
| + var option = select.createChild('option');
|
| + option.value = entry.id;
|
| + option.label = entry.title;
|
| + select.appendChild(option);
|
| + }
|
| + var header = this._dataGrid.headerTableHeader(columnConfig.id);
|
| + header.replaceChild(select, header.firstChild);
|
| + header.createChild('div', 'sort-order-icon-container').createChild('div', 'sort-order-icon');
|
| + columnConfig.selectBox = select;
|
| + select.addEventListener('change', this._sortByDropdownItem.bind(this, columnConfig), false);
|
| + this._dropDownColumnSelectors.push(select);
|
| + }
|
| + }
|
| +
|
| + sortByCurrentColumn() {
|
| + this._sortHandler();
|
| + }
|
| +
|
| + _sortHandler() {
|
| + var columnId = this._dataGrid.sortColumnId();
|
| + this._networkLogView.removeAllNodeHighlights();
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline') && columnId === 'timeline') {
|
| + this._timelineColumnSortIcon.classList.remove('sort-ascending', 'sort-descending');
|
| +
|
| + if (this._dataGrid.sortOrder() === WebInspector.DataGrid.Order.Ascending)
|
| + this._timelineColumnSortIcon.classList.add('sort-ascending');
|
| + else
|
| + this._timelineColumnSortIcon.classList.add('sort-descending');
|
| +
|
| + this._timelineRequestsAreStale = true;
|
| + var sortFunction =
|
| + WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, this._activeTimelineSortId);
|
| + this._dataGrid.sortNodes(sortFunction, !this._dataGrid.isSortOrderAscending());
|
| + return;
|
| + }
|
| +
|
| + var columnConfig = this._columns.find(columnConfig => columnConfig.id === columnId);
|
| + if (!columnConfig)
|
| + return;
|
| + if (columnConfig.sortConfig && columnConfig.sortConfig.entries) {
|
| + this._sortByDropdownItem(columnConfig);
|
| + return;
|
| + }
|
| + if (!columnConfig.sortConfig.sortingFunction)
|
| + return;
|
| +
|
| + this._dataGrid.sortNodes(columnConfig.sortConfig.sortingFunction, !this._dataGrid.isSortOrderAscending());
|
| + this._networkLogView.dataGridSorted();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkLogViewColumns.Descriptor} columnConfig
|
| + */
|
| + _sortByDropdownItem(columnConfig) {
|
| + this._networkLogView.removeAllNodeHighlights();
|
| + var selectedIndex = columnConfig.selectBox.selectedIndex;
|
| + if (!selectedIndex)
|
| + selectedIndex = 1; // Sort by first item by default.
|
| + var selectedItemConfig = columnConfig.sortConfig.entries[selectedIndex - 1]; // -1 because of placeholder.
|
| + var selectedOption = columnConfig.selectBox[selectedIndex];
|
| + var value = selectedOption.value;
|
| +
|
| + this._dataGrid.sortNodes(selectedItemConfig.sortingFunction);
|
| + this._dataGrid.markColumnAsSortedBy(
|
| + columnConfig.id, /** @type {!WebInspector.DataGrid.Order} */ (selectedItemConfig.sort));
|
| + if (selectedItemConfig.calculator)
|
| + this._networkLogView.setCalculator(this._calculatorsMap.get(selectedItemConfig.calculator));
|
| + columnConfig.selectBox.options[0].label = selectedItemConfig.title;
|
| + columnConfig.selectBox.selectedIndex = 0;
|
| + this._networkLogView.dataGridSorted();
|
| + }
|
| +
|
| + _updateColumns() {
|
| + if (!this._dataGrid)
|
| + return;
|
| + var visibleColumns = /** @type {!Object.<string, boolean>} */ ({});
|
| + if (this._gridMode) {
|
| + for (var columnConfig of this._columns)
|
| + visibleColumns[columnConfig.id] = columnConfig.visible;
|
| + } else {
|
| + visibleColumns.name = true;
|
| + }
|
| + this._dataGrid.setColumnsVisiblity(visibleColumns);
|
| + }
|
| +
|
| + /**
|
| + * @param {boolean} gridMode
|
| + */
|
| + switchViewMode(gridMode) {
|
| + if (this._gridMode === gridMode)
|
| + return;
|
| + this._gridMode = gridMode;
|
| +
|
| + if (gridMode) {
|
| + if (this._dataGrid.selectedNode)
|
| + this._dataGrid.selectedNode.selected = false;
|
| + } else {
|
| + this._networkLogView.removeAllNodeHighlights();
|
| + this._popoverHelper.hidePopover();
|
| + }
|
| +
|
| + this._networkLogView.element.classList.toggle('brief-mode', !gridMode);
|
| + this._updateColumns();
|
| +
|
| + if (!Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + return;
|
| + // TODO(allada) Move this code into the code above.
|
| + if (gridMode) {
|
| + this._splitWidget.showBoth();
|
| + this._activeScroller = this._timelineScroller;
|
| + this._timelineScroller.scrollTop = this._dataGridScroller.scrollTop;
|
| + this._dataGridScroller.style.overflow = 'hidden';
|
| + this._dataGrid.setScrollContainer(this._timelineScroller);
|
| + } else {
|
| + this._splitWidget.hideMain();
|
| + this._activeScroller = this._dataGridScroller;
|
| + this._dataGridScroller.style.overflow = 'overlay';
|
| + this._dataGrid.setScrollContainer(this._dataGridScroller);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkLogViewColumns.Descriptor} columnConfig
|
| + */
|
| + _toggleColumnVisibility(columnConfig) {
|
| + this._loadColumns();
|
| + columnConfig.visible = !columnConfig.visible;
|
| + this._saveColumns();
|
| + this._updateColumns();
|
| + }
|
| +
|
| + _saveColumns() {
|
| + var saveableSettings = {};
|
| + for (var columnConfig of this._columns) {
|
| + saveableSettings[columnConfig.id] = {visible: columnConfig.visible, title: columnConfig.title};
|
| + }
|
| + this._persistantSettings.set(saveableSettings);
|
| + }
|
| +
|
| + _loadColumns() {
|
| + var savedSettings = this._persistantSettings.get();
|
| + var columnIds = Object.keys(savedSettings);
|
| + for (var columnId of columnIds) {
|
| + var setting = savedSettings[columnId];
|
| + var columnConfig = this._columns.find(columnConfig => columnConfig.id === columnId);
|
| + if (!columnConfig)
|
| + columnConfig = this._addCustomHeader(setting.title, columnId);
|
| + if (columnConfig.hideable && typeof setting.visible === 'boolean')
|
| + columnConfig.visible = !!setting.visible;
|
| + if (typeof setting.title === 'string')
|
| + columnConfig.title = setting.title;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {string} title
|
| + * @param {string} subtitle
|
| + * @return {!DocumentFragment}
|
| + */
|
| + _makeHeaderFragment(title, subtitle) {
|
| + var fragment = createDocumentFragment();
|
| + fragment.createTextChild(title);
|
| + var subtitleDiv = fragment.createChild('div', 'network-header-subtitle');
|
| + subtitleDiv.createTextChild(subtitle);
|
| + return fragment;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.ContextMenu} contextMenu
|
| + */
|
| + _innerHeaderContextMenu(contextMenu) {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline')) {
|
| + var timelineSortIds = WebInspector.NetworkLogViewColumns.TimelineSortIds;
|
| + var timelineSubMenu = contextMenu.appendSubMenuItem(WebInspector.UIString('Timeline'));
|
| + timelineSubMenu.appendCheckboxItem(
|
| + WebInspector.UIString('Start Time'), setTimelineMode.bind(this, timelineSortIds.StartTime),
|
| + this._activeTimelineSortId === timelineSortIds.StartTime);
|
| + timelineSubMenu.appendCheckboxItem(
|
| + WebInspector.UIString('Response Time'), setTimelineMode.bind(this, timelineSortIds.ResponseTime),
|
| + this._activeTimelineSortId === timelineSortIds.ResponseTime);
|
| + timelineSubMenu.appendCheckboxItem(
|
| + WebInspector.UIString('End Time'), setTimelineMode.bind(this, timelineSortIds.EndTime),
|
| + this._activeTimelineSortId === timelineSortIds.EndTime);
|
| + timelineSubMenu.appendCheckboxItem(
|
| + WebInspector.UIString('Total Duration'), setTimelineMode.bind(this, timelineSortIds.Duration),
|
| + this._activeTimelineSortId === timelineSortIds.Duration);
|
| + timelineSubMenu.appendCheckboxItem(
|
| + WebInspector.UIString('Latency'), setTimelineMode.bind(this, timelineSortIds.Latency),
|
| + this._activeTimelineSortId === timelineSortIds.Latency);
|
| + contextMenu.appendSeparator();
|
| + }
|
| + var columnConfigs = this._columns.filter(columnConfig => columnConfig.hideable);
|
| + var nonResponseHeaders = columnConfigs.filter(columnConfig => !columnConfig.isResponseHeader);
|
| + for (var columnConfig of nonResponseHeaders)
|
| + contextMenu.appendCheckboxItem(
|
| + columnConfig.title, this._toggleColumnVisibility.bind(this, columnConfig), columnConfig.visible);
|
| +
|
| + contextMenu.appendSeparator();
|
| +
|
| + var responseSubMenu = contextMenu.appendSubMenuItem(WebInspector.UIString('Response Headers'));
|
| + var responseHeaders = columnConfigs.filter(columnConfig => columnConfig.isResponseHeader);
|
| + for (var columnConfig of responseHeaders)
|
| + responseSubMenu.appendCheckboxItem(
|
| + columnConfig.title, this._toggleColumnVisibility.bind(this, columnConfig), columnConfig.visible);
|
| +
|
| + responseSubMenu.appendSeparator();
|
| + responseSubMenu.appendItem(
|
| + WebInspector.UIString('Manage Header Columns\u2026'), this._manageCustomHeaderDialog.bind(this));
|
| +
|
| + contextMenu.show();
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkLogViewColumns.TimelineSortIds} sortId
|
| + * @this {WebInspector.NetworkLogViewColumns}
|
| + */
|
| + function setTimelineMode(sortId) {
|
| + var calculator = this._calculatorsMap.get(WebInspector.NetworkLogViewColumns._calculatorTypes.Time);
|
| + var timelineSortIds = WebInspector.NetworkLogViewColumns.TimelineSortIds;
|
| + if (sortId === timelineSortIds.Duration || sortId === timelineSortIds.Latency)
|
| + calculator = this._calculatorsMap.get(WebInspector.NetworkLogViewColumns._calculatorTypes.Duration);
|
| + this._networkLogView.setCalculator(calculator);
|
| +
|
| + this._activeTimelineSortId = sortId;
|
| + this._dataGrid.markColumnAsSortedBy('timeline', WebInspector.DataGrid.Order.Ascending);
|
| + this._sortHandler();
|
| + }
|
| + }
|
| +
|
| + _manageCustomHeaderDialog() {
|
| + var customHeaders = [];
|
| + for (var columnConfig of this._columns) {
|
| + if (columnConfig.isResponseHeader)
|
| + customHeaders.push({title: columnConfig.title, editable: columnConfig.isCustomHeader});
|
| + }
|
| + var manageCustomHeaders = new WebInspector.NetworkManageCustomHeadersView(
|
| + customHeaders, headerTitle => !!this._addCustomHeader(headerTitle), this._changeCustomHeader.bind(this),
|
| + this._removeCustomHeader.bind(this));
|
| + var dialog = new WebInspector.Dialog();
|
| + manageCustomHeaders.show(dialog.element);
|
| + dialog.setWrapsContent(true);
|
| + dialog.show();
|
| + }
|
| +
|
| + /**
|
| + * @param {string} headerId
|
| + * @return {boolean}
|
| + */
|
| + _removeCustomHeader(headerId) {
|
| + headerId = headerId.toLowerCase();
|
| + var index = this._columns.findIndex(columnConfig => columnConfig.id === headerId);
|
| + if (index === -1)
|
| + return false;
|
| + var columnConfig = this._columns.splice(index, 1);
|
| + this._dataGrid.removeColumn(headerId);
|
| + this._saveColumns();
|
| + this._updateColumns();
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} headerTitle
|
| + * @param {string=} headerId
|
| + * @param {number=} index
|
| + * @return {?WebInspector.NetworkLogViewColumns.Descriptor}
|
| + */
|
| + _addCustomHeader(headerTitle, headerId, index) {
|
| + if (!headerId)
|
| + headerId = headerTitle.toLowerCase();
|
| + if (index === undefined)
|
| + index = this._columns.length - 1;
|
| +
|
| + var currentColumnConfig = this._columns.find(columnConfig => columnConfig.id === headerId);
|
| + if (currentColumnConfig)
|
| + return null;
|
| +
|
| + var columnConfig = /** @type {!WebInspector.NetworkLogViewColumns.Descriptor} */ (
|
| + Object.assign(/** @type {!Object} */ ({}), WebInspector.NetworkLogViewColumns._defaultColumnConfig, {
|
| + id: headerId,
|
| + title: headerTitle,
|
| + isResponseHeader: true,
|
| + isCustomHeader: true,
|
| + visible: true,
|
| + sortConfig: {
|
| + sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, headerId)
|
| + }
|
| + }));
|
| + this._columns.splice(index, 0, columnConfig);
|
| + if (this._dataGrid)
|
| + this._dataGrid.addColumn(WebInspector.NetworkLogViewColumns._convertToDataGridDescriptor(columnConfig), index);
|
| + this._saveColumns();
|
| + this._updateColumns();
|
| + return columnConfig;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} oldHeaderId
|
| + * @param {string} newHeaderTitle
|
| + * @param {string=} newHeaderId
|
| + * @return {boolean}
|
| + */
|
| + _changeCustomHeader(oldHeaderId, newHeaderTitle, newHeaderId) {
|
| + if (!newHeaderId)
|
| + newHeaderId = newHeaderTitle.toLowerCase();
|
| + oldHeaderId = oldHeaderId.toLowerCase();
|
| +
|
| + var oldIndex = this._columns.findIndex(columnConfig => columnConfig.id === oldHeaderId);
|
| + var oldColumnConfig = this._columns[oldIndex];
|
| + var currentColumnConfig = this._columns.find(columnConfig => columnConfig.id === newHeaderId);
|
| + if (!oldColumnConfig || (currentColumnConfig && oldHeaderId !== newHeaderId))
|
| + return false;
|
| +
|
| + this._removeCustomHeader(oldHeaderId);
|
| + this._addCustomHeader(newHeaderTitle, newHeaderId, oldIndex);
|
| + return true;
|
| + }
|
| +
|
| + updateDividersIfNeeded() {
|
| + // TODO(allada) Remove this code out when timeline canvas experiment is over.
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + return;
|
| + if (!this._networkLogView.isShowing()) {
|
| + this._networkLogView.scheduleRefresh();
|
| + return;
|
| + }
|
| +
|
| + var timelineOffset = this._dataGrid.columnOffset('timeline');
|
| + // Position timline grid location.
|
| + if (timelineOffset)
|
| + this._timelineGrid.element.style.left = timelineOffset + 'px';
|
| +
|
| + var calculator = this._calculatorsMap.get(WebInspector.NetworkLogViewColumns._calculatorTypes.Time);
|
| + calculator.setDisplayWindow(this._timelineGrid.dividersElement.clientWidth);
|
| + this._timelineGrid.updateDividers(calculator, 75);
|
| +
|
| + if (calculator.startAtZero) {
|
| + // If our current sorting method starts at zero, that means it shows all
|
| + // requests starting at the same point, and so onLoad event and DOMContent
|
| + // event lines really wouldn't make much sense here, so don't render them.
|
| + return;
|
| + }
|
| +
|
| + this._updateEventDividers();
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} element
|
| + * @param {!Event} event
|
| + * @return {!Element|!AnchorBox|undefined}
|
| + */
|
| + _getPopoverAnchor(element, event) {
|
| + if (!this._gridMode)
|
| + return;
|
| + var anchor = element.enclosingNodeOrSelfWithClass('network-graph-bar') ||
|
| + element.enclosingNodeOrSelfWithClass('network-graph-label');
|
| + if (anchor && anchor.parentElement.request && anchor.parentElement.request.timing)
|
| + return anchor;
|
| + anchor = element.enclosingNodeOrSelfWithClass('network-script-initiated');
|
| + if (anchor && anchor.request) {
|
| + var initiator = /** @type {!WebInspector.NetworkRequest} */ (anchor.request).initiator();
|
| + if (initiator && initiator.stack)
|
| + return anchor;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} anchor
|
| + * @param {!WebInspector.Popover} popover
|
| + */
|
| + _showPopover(anchor, popover) {
|
| + var content;
|
| + if (anchor.classList.contains('network-script-initiated')) {
|
| + var request = /** @type {!WebInspector.NetworkRequest} */ (anchor.request);
|
| + var initiator = /** @type {!NetworkAgent.Initiator} */ (request.initiator());
|
| + content = WebInspector.DOMPresentationUtils.buildStackTracePreviewContents(
|
| + request.target(), this._popupLinkifier, initiator.stack);
|
| + popover.setCanShrink(true);
|
| + } else {
|
| + content = WebInspector.RequestTimingView.createTimingTable(
|
| + anchor.parentElement.request, this._networkLogView.timeCalculator().minimumBoundary());
|
| + popover.setCanShrink(false);
|
| + }
|
| + popover.showForAnchor(content, anchor);
|
| + }
|
| +
|
| + _onHidePopover() {
|
| + this._popupLinkifier.reset();
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<number>} times
|
| + * @param {string} className
|
| + */
|
| + addEventDividers(times, className) {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline')) {
|
| + // TODO(allada) When we remove old timeline remove this and pass in the color.
|
| + var color = 'transparent';
|
| + switch (className) {
|
| + case 'network-blue-divider':
|
| + color = 'hsla(240, 100%, 80%, 0.7)';
|
| + break;
|
| + case 'network-red-divider':
|
| + color = 'rgba(255, 0, 0, 0.5)';
|
| + break;
|
| + default:
|
| + return;
|
| + }
|
| + var currentTimes = this._shownEventDividers.get(color) || [];
|
| + this._shownEventDividers.set(color, currentTimes.concat(times));
|
| +
|
| + this._networkLogView.scheduleRefresh();
|
| + return;
|
| + }
|
| +
|
| + for (var i = 0; i < times.length; ++i) {
|
| + var element = createElementWithClass('div', 'network-event-divider ' + className);
|
| + this._timelineGrid.addEventDivider(element);
|
| + this._eventDividers.push({time: times[i], element: element});
|
| + }
|
| + // Update event dividers immediately
|
| + this._updateEventDividers();
|
| + // Schedule refresh in case dividers change the calculator span.
|
| + this._networkLogView.scheduleRefresh();
|
| + }
|
| +
|
| + _updateEventDividers() {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline'))
|
| + return;
|
| + var calculator = this._calculatorsMap.get(WebInspector.NetworkLogViewColumns._calculatorTypes.Time);
|
| + for (var divider of this._eventDividers) {
|
| + var timePercent = calculator.computePercentageFromEventTime(divider.time);
|
| + divider.element.classList.toggle('invisible', timePercent < 0);
|
| + divider.element.style.left = timePercent + '%';
|
| + }
|
| + }
|
| +
|
| + hideEventDividers() {
|
| + this._eventDividersShown = true;
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline')) {
|
| + this._redrawTimelineColumn();
|
| + return;
|
| + }
|
| + this._timelineGrid.hideEventDividers();
|
| + }
|
| +
|
| + showEventDividers() {
|
| + this._eventDividersShown = false;
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline')) {
|
| + this._redrawTimelineColumn();
|
| + return;
|
| + }
|
| + this._timelineGrid.showEventDividers();
|
| + }
|
| +
|
| + /**
|
| + * @param {number} time
|
| + */
|
| + selectFilmStripFrame(time) {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline')) {
|
| + this._shownEventDividers.set(WebInspector.NetworkLogViewColumns._filmStripDividerColor, [time]);
|
| + this._redrawTimelineColumn();
|
| + return;
|
| + }
|
| + for (var divider of this._eventDividers)
|
| + divider.element.classList.toggle('network-frame-divider-selected', divider.time === time);
|
| + }
|
| +
|
| + clearFilmStripFrame() {
|
| + if (Runtime.experiments.isEnabled('canvasNetworkTimeline')) {
|
| + this._shownEventDividers.delete(WebInspector.NetworkLogViewColumns._filmStripDividerColor);
|
| + this._redrawTimelineColumn();
|
| + return;
|
| + }
|
| + for (var divider of this._eventDividers)
|
| + divider.element.classList.toggle('network-frame-divider-selected', false);
|
| + }
|
| };
|
|
|
| -WebInspector.NetworkLogViewColumns._initialSortColumn = "timeline";
|
| +WebInspector.NetworkLogViewColumns._initialSortColumn = 'timeline';
|
|
|
| /**
|
| * @typedef {{
|
| @@ -90,1038 +829,252 @@ WebInspector.NetworkLogViewColumns.SortConfig;
|
|
|
| /** @enum {string} */
|
| WebInspector.NetworkLogViewColumns._calculatorTypes = {
|
| - Duration: "Duration",
|
| - Time: "Time"
|
| + Duration: 'Duration',
|
| + Time: 'Time'
|
| };
|
|
|
| /**
|
| * @type {!Object} column
|
| */
|
| WebInspector.NetworkLogViewColumns._defaultColumnConfig = {
|
| - subtitle: null,
|
| - visible: false,
|
| - weight: 6,
|
| - sortable: true,
|
| - hideable: true,
|
| - nonSelectable: true,
|
| - isResponseHeader: false,
|
| - alwaysVisible: false,
|
| - isCustomHeader: false
|
| + subtitle: null,
|
| + visible: false,
|
| + weight: 6,
|
| + sortable: true,
|
| + hideable: true,
|
| + nonSelectable: true,
|
| + isResponseHeader: false,
|
| + alwaysVisible: false,
|
| + isCustomHeader: false
|
| };
|
|
|
| /**
|
| * @type {!Array.<!WebInspector.NetworkLogViewColumns.Descriptor>} column
|
| */
|
| WebInspector.NetworkLogViewColumns._defaultColumns = [
|
| - {
|
| - id: "name",
|
| - title: WebInspector.UIString("Name"),
|
| - subtitle: WebInspector.UIString("Path"),
|
| - visible: true,
|
| - weight: 20,
|
| - hideable: false,
|
| - nonSelectable: false,
|
| - alwaysVisible: true,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.NameComparator
|
| - }
|
| - },
|
| - {
|
| - id: "method",
|
| - title: WebInspector.UIString("Method"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "requestMethod")
|
| - }
|
| - },
|
| - {
|
| - id: "status",
|
| - title: WebInspector.UIString("Status"),
|
| - visible: true,
|
| - subtitle: WebInspector.UIString("Text"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "statusCode")
|
| - }
|
| - },
|
| - {
|
| - id: "protocol",
|
| - title: WebInspector.UIString("Protocol"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "protocol")
|
| - }
|
| - },
|
| - {
|
| - id: "scheme",
|
| - title: WebInspector.UIString("Scheme"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "scheme")
|
| - }
|
| - },
|
| - {
|
| - id: "domain",
|
| - title: WebInspector.UIString("Domain"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "domain")
|
| - }
|
| - },
|
| - {
|
| - id: "remoteaddress",
|
| - title: WebInspector.UIString("Remote Address"),
|
| - weight: 10,
|
| - align: WebInspector.DataGrid.Align.Right,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RemoteAddressComparator
|
| - }
|
| - },
|
| - {
|
| - id: "type",
|
| - title: WebInspector.UIString("Type"),
|
| - visible: true,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.TypeComparator
|
| - }
|
| - },
|
| - {
|
| - id: "initiator",
|
| - title: WebInspector.UIString("Initiator"),
|
| - visible: true,
|
| - weight: 10,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.InitiatorComparator
|
| - }
|
| - },
|
| - {
|
| - id: "cookies",
|
| - title: WebInspector.UIString("Cookies"),
|
| - align: WebInspector.DataGrid.Align.Right,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestCookiesCountComparator
|
| - }
|
| - },
|
| - {
|
| - id: "setcookies",
|
| - title: WebInspector.UIString("Set Cookies"),
|
| - align: WebInspector.DataGrid.Align.Right,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseCookiesCountComparator
|
| - }
|
| - },
|
| - {
|
| - id: "size",
|
| - title: WebInspector.UIString("Size"),
|
| - visible: true,
|
| - subtitle: WebInspector.UIString("Content"),
|
| - align: WebInspector.DataGrid.Align.Right,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.SizeComparator
|
| - }
|
| - },
|
| - {
|
| - id: "time",
|
| - title: WebInspector.UIString("Time"),
|
| - visible: true,
|
| - subtitle: WebInspector.UIString("Latency"),
|
| - align: WebInspector.DataGrid.Align.Right,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "duration")
|
| - }
|
| - },
|
| - {
|
| - id: "priority",
|
| - title: WebInspector.UIString("Priority"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.InitialPriorityComparator
|
| - }
|
| - },
|
| - {
|
| - id: "connectionid",
|
| - title: WebInspector.UIString("Connection ID"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "connectionId")
|
| - }
|
| - },
|
| - {
|
| - id: "cache-control",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("Cache-Control"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, "cache-control")
|
| - }
|
| - },
|
| - {
|
| - id: "connection",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("Connection"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, "connection")
|
| - }
|
| - },
|
| - {
|
| - id: "content-encoding",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("Content-Encoding"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, "content-encoding")
|
| - }
|
| - },
|
| - {
|
| - id: "content-length",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("Content-Length"),
|
| - align: WebInspector.DataGrid.Align.Right,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderNumberComparator.bind(null, "content-length")
|
| - }
|
| - },
|
| - {
|
| - id: "etag",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("ETag"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, "etag")
|
| - }
|
| - },
|
| - {
|
| - id: "keep-alive",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("Keep-Alive"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, "keep-alive")
|
| - }
|
| - },
|
| - {
|
| - id: "last-modified",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("Last-Modified"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderDateComparator.bind(null, "last-modified")
|
| - }
|
| - },
|
| - {
|
| - id: "server",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("Server"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, "server")
|
| - }
|
| - },
|
| - {
|
| - id: "vary",
|
| - isResponseHeader: true,
|
| - title: WebInspector.UIString("Vary"),
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, "vary")
|
| - }
|
| - },
|
| - {
|
| - id: "timeline",
|
| - title: WebInspector.UIString("Timeline"),
|
| - visible: true,
|
| - weight: 40,
|
| - sortable: false,
|
| - hideable: false,
|
| - sortConfig: {
|
| - entries: [
|
| - {
|
| - id: "starttime",
|
| - title: WebInspector.UIString("Timeline \u2013 Start Time"),
|
| - sort: WebInspector.DataGrid.Order.Ascending,
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "startTime"),
|
| - calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Time
|
| - },
|
| - {
|
| - id: "responsetime",
|
| - title: WebInspector.UIString("Timeline \u2013 Response Time"),
|
| - sort: WebInspector.DataGrid.Order.Ascending,
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "responseReceivedTime"),
|
| - calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Time
|
| - },
|
| - {
|
| - id: "endtime",
|
| - title: WebInspector.UIString("Timeline \u2013 End Time"),
|
| - sort: WebInspector.DataGrid.Order.Ascending,
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "endTime"),
|
| - calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Time
|
| - },
|
| - {
|
| - id: "duration",
|
| - title: WebInspector.UIString("Timeline \u2013 Total Duration"),
|
| - sort: WebInspector.DataGrid.Order.Descending,
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "duration"),
|
| - calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Duration
|
| - },
|
| - {
|
| - id: "latency",
|
| - title: WebInspector.UIString("Timeline \u2013 Latency"),
|
| - sort: WebInspector.DataGrid.Order.Descending,
|
| - sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, "latency"),
|
| - calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Duration
|
| - }
|
| - ]
|
| + {
|
| + id: 'name',
|
| + title: WebInspector.UIString('Name'),
|
| + subtitle: WebInspector.UIString('Path'),
|
| + visible: true,
|
| + weight: 20,
|
| + hideable: false,
|
| + nonSelectable: false,
|
| + alwaysVisible: true,
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.NameComparator}
|
| + },
|
| + {
|
| + id: 'method',
|
| + title: WebInspector.UIString('Method'),
|
| + sortConfig:
|
| + {sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'requestMethod')}
|
| + },
|
| + {
|
| + id: 'status',
|
| + title: WebInspector.UIString('Status'),
|
| + visible: true,
|
| + subtitle: WebInspector.UIString('Text'),
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'statusCode')}
|
| + },
|
| + {
|
| + id: 'protocol',
|
| + title: WebInspector.UIString('Protocol'),
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'protocol')}
|
| + },
|
| + {
|
| + id: 'scheme',
|
| + title: WebInspector.UIString('Scheme'),
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'scheme')}
|
| + },
|
| + {
|
| + id: 'domain',
|
| + title: WebInspector.UIString('Domain'),
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'domain')}
|
| + },
|
| + {
|
| + id: 'remoteaddress',
|
| + title: WebInspector.UIString('Remote Address'),
|
| + weight: 10,
|
| + align: WebInspector.DataGrid.Align.Right,
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.RemoteAddressComparator}
|
| + },
|
| + {
|
| + id: 'type',
|
| + title: WebInspector.UIString('Type'),
|
| + visible: true,
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.TypeComparator}
|
| + },
|
| + {
|
| + id: 'initiator',
|
| + title: WebInspector.UIString('Initiator'),
|
| + visible: true,
|
| + weight: 10,
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.InitiatorComparator}
|
| + },
|
| + {
|
| + id: 'cookies',
|
| + title: WebInspector.UIString('Cookies'),
|
| + align: WebInspector.DataGrid.Align.Right,
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.RequestCookiesCountComparator}
|
| + },
|
| + {
|
| + id: 'setcookies',
|
| + title: WebInspector.UIString('Set Cookies'),
|
| + align: WebInspector.DataGrid.Align.Right,
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.ResponseCookiesCountComparator}
|
| + },
|
| + {
|
| + id: 'size',
|
| + title: WebInspector.UIString('Size'),
|
| + visible: true,
|
| + subtitle: WebInspector.UIString('Content'),
|
| + align: WebInspector.DataGrid.Align.Right,
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.SizeComparator}
|
| + },
|
| + {
|
| + id: 'time',
|
| + title: WebInspector.UIString('Time'),
|
| + visible: true,
|
| + subtitle: WebInspector.UIString('Latency'),
|
| + align: WebInspector.DataGrid.Align.Right,
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'duration')}
|
| + },
|
| + {
|
| + id: 'priority',
|
| + title: WebInspector.UIString('Priority'),
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.InitialPriorityComparator}
|
| + },
|
| + {
|
| + id: 'connectionid',
|
| + title: WebInspector.UIString('Connection ID'),
|
| + sortConfig:
|
| + {sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'connectionId')}
|
| + },
|
| + {
|
| + id: 'cache-control',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('Cache-Control'),
|
| + sortConfig:
|
| + {sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'cache-control')}
|
| + },
|
| + {
|
| + id: 'connection',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('Connection'),
|
| + sortConfig:
|
| + {sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'connection')}
|
| + },
|
| + {
|
| + id: 'content-encoding',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('Content-Encoding'),
|
| + sortConfig: {
|
| + sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'content-encoding')
|
| + }
|
| + },
|
| + {
|
| + id: 'content-length',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('Content-Length'),
|
| + align: WebInspector.DataGrid.Align.Right,
|
| + sortConfig: {
|
| + sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderNumberComparator.bind(null, 'content-length')
|
| + }
|
| + },
|
| + {
|
| + id: 'etag',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('ETag'),
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'etag')}
|
| + },
|
| + {
|
| + id: 'keep-alive',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('Keep-Alive'),
|
| + sortConfig:
|
| + {sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'keep-alive')}
|
| + },
|
| + {
|
| + id: 'last-modified',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('Last-Modified'),
|
| + sortConfig:
|
| + {sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderDateComparator.bind(null, 'last-modified')}
|
| + },
|
| + {
|
| + id: 'server',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('Server'),
|
| + sortConfig:
|
| + {sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'server')}
|
| + },
|
| + {
|
| + id: 'vary',
|
| + isResponseHeader: true,
|
| + title: WebInspector.UIString('Vary'),
|
| + sortConfig: {sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'vary')}
|
| + },
|
| + {
|
| + id: 'timeline',
|
| + title: WebInspector.UIString('Timeline'),
|
| + visible: true,
|
| + weight: 40,
|
| + sortable: false,
|
| + hideable: false,
|
| + sortConfig: {
|
| + entries: [
|
| + {
|
| + id: 'starttime',
|
| + title: WebInspector.UIString('Timeline \u2013 Start Time'),
|
| + sort: WebInspector.DataGrid.Order.Ascending,
|
| + sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'startTime'),
|
| + calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Time
|
| + },
|
| + {
|
| + id: 'responsetime',
|
| + title: WebInspector.UIString('Timeline \u2013 Response Time'),
|
| + sort: WebInspector.DataGrid.Order.Ascending,
|
| + sortingFunction:
|
| + WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'responseReceivedTime'),
|
| + calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Time
|
| + },
|
| + {
|
| + id: 'endtime',
|
| + title: WebInspector.UIString('Timeline \u2013 End Time'),
|
| + sort: WebInspector.DataGrid.Order.Ascending,
|
| + sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'endTime'),
|
| + calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Time
|
| + },
|
| + {
|
| + id: 'duration',
|
| + title: WebInspector.UIString('Timeline \u2013 Total Duration'),
|
| + sort: WebInspector.DataGrid.Order.Descending,
|
| + sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'duration'),
|
| + calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Duration
|
| + },
|
| + {
|
| + id: 'latency',
|
| + title: WebInspector.UIString('Timeline \u2013 Latency'),
|
| + sort: WebInspector.DataGrid.Order.Descending,
|
| + sortingFunction: WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'latency'),
|
| + calculator: WebInspector.NetworkLogViewColumns._calculatorTypes.Duration
|
| }
|
| + ]
|
| }
|
| + }
|
| ];
|
|
|
| -WebInspector.NetworkLogViewColumns._filmStripDividerColor = "#fccc49";
|
| +WebInspector.NetworkLogViewColumns._filmStripDividerColor = '#fccc49';
|
|
|
| /**
|
| * @enum {string}
|
| */
|
| WebInspector.NetworkLogViewColumns.TimelineSortIds = {
|
| - StartTime: "startTime",
|
| - ResponseTime: "responseReceivedTime",
|
| - EndTime: "endTime",
|
| - Duration: "duration",
|
| - Latency: "latency"
|
| -};
|
| -
|
| -/**
|
| - * @param {!WebInspector.NetworkLogViewColumns.Descriptor} columnConfig
|
| - * @return {!WebInspector.DataGrid.ColumnDescriptor}
|
| - */
|
| -WebInspector.NetworkLogViewColumns._convertToDataGridDescriptor = function(columnConfig)
|
| -{
|
| - return /** @type {!WebInspector.DataGrid.ColumnDescriptor} */ ({
|
| - id: columnConfig.id,
|
| - title: columnConfig.title,
|
| - sortable: columnConfig.sortable,
|
| - align: columnConfig.align,
|
| - nonSelectable: columnConfig.nonSelectable,
|
| - weight: columnConfig.weight
|
| - });
|
| + StartTime: 'startTime',
|
| + ResponseTime: 'responseReceivedTime',
|
| + EndTime: 'endTime',
|
| + Duration: 'duration',
|
| + Latency: 'latency'
|
| };
|
|
|
| -WebInspector.NetworkLogViewColumns.prototype = {
|
| - wasShown: function()
|
| - {
|
| - this._updateRowsSize();
|
| - },
|
| -
|
| - willHide: function()
|
| - {
|
| - this._popoverHelper.hidePopover();
|
| - },
|
| -
|
| - reset: function()
|
| - {
|
| - if (this._popoverHelper)
|
| - this._popoverHelper.hidePopover();
|
| - this._timelineGrid.removeEventDividers();
|
| - this._shownEventDividers.clear();
|
| - this.updateDividersIfNeeded();
|
| - },
|
| -
|
| - _setupDataGrid: function()
|
| - {
|
| - var defaultColumns = WebInspector.NetworkLogViewColumns._defaultColumns;
|
| - var defaultColumnConfig = WebInspector.NetworkLogViewColumns._defaultColumnConfig;
|
| -
|
| - this._columns = /** @type {!Array<!WebInspector.NetworkLogViewColumns.Descriptor>} */ ([]);
|
| - for (var currentConfigColumn of defaultColumns) {
|
| - var columnConfig = /** @type {!WebInspector.NetworkLogViewColumns.Descriptor} */ (Object.assign(/** @type {!Object} */ ({}), defaultColumnConfig, currentConfigColumn));
|
| - columnConfig.id = columnConfig.id;
|
| - if (columnConfig.subtitle)
|
| - columnConfig.titleDOMFragment = this._makeHeaderFragment(columnConfig.title, columnConfig.subtitle);
|
| - this._columns.push(columnConfig);
|
| - }
|
| - this._loadColumns();
|
| -
|
| - this._popoverHelper = new WebInspector.PopoverHelper(this._networkLogView.element);
|
| - this._popoverHelper.initializeCallbacks(this._getPopoverAnchor.bind(this), this._showPopover.bind(this), this._onHidePopover.bind(this));
|
| -
|
| - this._dataGrid = new WebInspector.SortableDataGrid(this._columns.map(WebInspector.NetworkLogViewColumns._convertToDataGridDescriptor));
|
| - this._dataGrid.element.addEventListener("mousedown", event => {
|
| - if ((!this._dataGrid.selectedNode && event.button) || event.target.enclosingNodeOrSelfWithNodeName("a"))
|
| - event.consume();
|
| - }, true);
|
| -
|
| - this._dataGridScroller = this._dataGrid.scrollContainer;
|
| -
|
| - this._updateColumns();
|
| - this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged, this._sortHandler, this);
|
| - this._dataGrid.addEventListener(WebInspector.DataGrid.Events.ColumnsResized, this.updateDividersIfNeeded, this);
|
| - this._dataGrid.setHeaderContextMenuCallback(this._innerHeaderContextMenu.bind(this));
|
| -
|
| - this._timelineGrid = new WebInspector.TimelineGrid();
|
| - this._timelineGrid.element.classList.add("network-timeline-grid");
|
| - if (!Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - this._dataGrid.element.appendChild(this._timelineGrid.element);
|
|
|
| - this._setupDropdownColumns();
|
| -
|
| - this._activeTimelineSortId = WebInspector.NetworkLogViewColumns.TimelineSortIds.StartTime;
|
| - this._dataGrid.markColumnAsSortedBy(WebInspector.NetworkLogViewColumns._initialSortColumn, WebInspector.DataGrid.Order.Ascending);
|
| -
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline")) {
|
| - this._splitWidget = new WebInspector.SplitWidget(true, true, "networkPanelSplitViewTimeline", 200);
|
| - this._splitWidget.setMainWidget(this._dataGrid.asWidget());
|
| - }
|
| - },
|
| -
|
| - _setupTimeline: function()
|
| - {
|
| - this._timelineColumn = new WebInspector.NetworkTimelineColumn(this._networkLogView.rowHeight(), this._networkLogView.calculator());
|
| -
|
| - this._timelineColumn.element.addEventListener("contextmenu", handleContextMenu.bind(this));
|
| - this._timelineColumn.element.addEventListener("mousewheel", this._onMouseWheel.bind(this, false), { passive: true });
|
| - this._dataGridScroller.addEventListener("mousewheel",this._onMouseWheel.bind(this, true), true);
|
| -
|
| - this._timelineColumn.element.addEventListener("mousemove", event => this._networkLogView.setHoveredRequest(this._timelineColumn.getRequestFromPoint(event.offsetX, event.offsetY + event.target.offsetTop), event.shiftKey), true);
|
| - this._timelineColumn.element.addEventListener("mouseleave", this._networkLogView.setHoveredRequest.bind(this._networkLogView, null, false), true);
|
| -
|
| - this._timelineScroller = this._timelineColumn.contentElement.createChild("div", "network-timeline-v-scroll");
|
| - this._timelineScroller.addEventListener("scroll", this._syncScrollers.bind(this), { passive: true });
|
| - this._timelineScrollerContent = this._timelineScroller.createChild("div", "network-timeline-v-scroll-content");
|
| -
|
| - this._dataGrid.addEventListener(WebInspector.DataGrid.Events.PaddingChanged, () => {
|
| - this._timelineScrollerWidthIsStale = true;
|
| - this._syncScrollers();
|
| - });
|
| - this._dataGrid.addEventListener(WebInspector.ViewportDataGrid.Events.ViewportCalculated, this._redrawTimelineColumn.bind(this));
|
| -
|
| -
|
| - this._createTimelineHeader();
|
| - this._timelineColumn.contentElement.classList.add("network-timeline-view");
|
| -
|
| - this._splitWidget.setSidebarWidget(this._timelineColumn);
|
| -
|
| - this.switchViewMode(false);
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - * @this {WebInspector.NetworkLogViewColumns}
|
| - */
|
| - function handleContextMenu(event)
|
| - {
|
| - var request = this._timelineColumn.getRequestFromPoint(event.offsetX, event.offsetY);
|
| - if (!request)
|
| - return;
|
| - var contextMenu = new WebInspector.ContextMenu(event);
|
| - this._networkLogView.handleContextMenuForRequest(contextMenu, request);
|
| - contextMenu.show();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} shouldConsume
|
| - * @param {!Event} event
|
| - */
|
| - _onMouseWheel: function(shouldConsume, event)
|
| - {
|
| - if (shouldConsume)
|
| - event.consume(true);
|
| - this._activeScroller.scrollTop -= event.wheelDeltaY;
|
| - this._syncScrollers();
|
| - this._networkLogView.setHoveredRequest(this._timelineColumn.getRequestFromPoint(event.offsetX, event.offsetY), event.shiftKey);
|
| - },
|
| -
|
| - _syncScrollers: function()
|
| - {
|
| - if (!this._timelineColumn.isShowing())
|
| - return;
|
| - this._timelineScrollerContent.style.height = this._dataGridScroller.scrollHeight + "px";
|
| - this._updateScrollerWidthIfNeeded();
|
| - this._dataGridScroller.scrollTop = this._timelineScroller.scrollTop;
|
| - },
|
| -
|
| - _updateScrollerWidthIfNeeded: function()
|
| - {
|
| - if (this._timelineScrollerWidthIsStale) {
|
| - this._timelineScrollerWidthIsStale = false;
|
| - this._timelineColumn.setRightPadding(this._timelineScroller.offsetWidth - this._timelineScrollerContent.offsetWidth);
|
| - }
|
| - },
|
| -
|
| - _redrawTimelineColumn: function()
|
| - {
|
| - if (!this._timelineRequestsAreStale) {
|
| - this._updateScrollerWidthIfNeeded();
|
| - this._timelineColumn.update(this._activeScroller.scrollTop, this._eventDividersShown ? this._shownEventDividers : undefined);
|
| - return;
|
| - }
|
| - var currentNode = this._dataGrid.rootNode();
|
| - var requestData = {
|
| - requests: [],
|
| - navigationRequest: null
|
| - };
|
| - while (currentNode = currentNode.traverseNextNode(true)) {
|
| - if (currentNode.isNavigationRequest())
|
| - requestData.navigationRequest = currentNode.request();
|
| - requestData.requests.push(currentNode.request());
|
| - }
|
| - this._timelineColumn.update(this._activeScroller.scrollTop, this._shownEventDividers, requestData);
|
| - },
|
| -
|
| - /**
|
| - * @param {?WebInspector.NetworkRequest} request
|
| - * @param {boolean} highlightInitiatorChain
|
| - */
|
| - setHoveredRequest: function(request, highlightInitiatorChain)
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - this._timelineColumn.setHoveredRequest(request, highlightInitiatorChain);
|
| - },
|
| -
|
| - _createTimelineHeader: function()
|
| - {
|
| - this._timelineHeaderElement = this._timelineColumn.contentElement.createChild("div", "network-timeline-header");
|
| - this._timelineHeaderElement.addEventListener("click", timelineHeaderClicked.bind(this));
|
| - this._timelineHeaderElement.addEventListener("contextmenu", event => this._innerHeaderContextMenu(new WebInspector.ContextMenu(event)));
|
| - var innerElement = this._timelineHeaderElement.createChild("div");
|
| - innerElement.textContent = WebInspector.UIString("Timeline");
|
| - this._timelineColumnSortIcon = this._timelineHeaderElement.createChild("div", "sort-order-icon-container").createChild("div", "sort-order-icon");
|
| -
|
| - /**
|
| - * @this {WebInspector.NetworkLogViewColumns}
|
| - */
|
| - function timelineHeaderClicked()
|
| - {
|
| - var sortOrders = WebInspector.DataGrid.Order;
|
| - var sortOrder = this._dataGrid.sortOrder() === sortOrders.Ascending ? sortOrders.Descending : sortOrders.Ascending;
|
| - this._dataGrid.markColumnAsSortedBy("timeline", sortOrder);
|
| - this._sortHandler();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.NetworkTimeCalculator} x
|
| - */
|
| - setCalculator: function(x)
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - this._timelineColumn.setCalculator(x);
|
| - },
|
| -
|
| - dataChanged: function()
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - this._timelineRequestsAreStale = true;
|
| - },
|
| -
|
| - _updateRowsSize: function()
|
| - {
|
| - var largeRows = !!this._networkLogLargeRowsSetting.get();
|
| - this._dataGrid.element.classList.toggle("small", !largeRows);
|
| - this._dataGrid.scheduleUpdate();
|
| -
|
| - if (!Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - return;
|
| - this._timelineScrollerWidthIsStale = true;
|
| - this._timelineColumn.setRowHeight(this._networkLogView.rowHeight());
|
| - this._timelineScroller.classList.toggle("small", !largeRows);
|
| - this._timelineHeaderElement.classList.toggle("small", !largeRows);
|
| - this._timelineGrid.element.classList.toggle("small", !this._networkLogLargeRowsSetting.get());
|
| - this._timelineColumn.setHeaderHeight(this._timelineScroller.offsetTop);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Element} element
|
| - */
|
| - show: function(element)
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - this._splitWidget.show(element);
|
| - else
|
| - this._dataGrid.asWidget().show(element);
|
| - },
|
| -
|
| - /**
|
| - * @return {!WebInspector.SortableDataGrid} dataGrid
|
| - */
|
| - dataGrid: function()
|
| - {
|
| - return this._dataGrid;
|
| - },
|
| -
|
| - _setupDropdownColumns: function()
|
| - {
|
| - for (var columnConfig of this._columns) {
|
| - if (!columnConfig.sortConfig || !columnConfig.sortConfig.entries)
|
| - continue;
|
| - var select = createElement("select");
|
| - var placeHolderOption = select.createChild("option");
|
| - placeHolderOption.classList.add("hidden");
|
| - for (var entry of columnConfig.sortConfig.entries) {
|
| - var option = select.createChild("option");
|
| - option.value = entry.id;
|
| - option.label = entry.title;
|
| - select.appendChild(option);
|
| - }
|
| - var header = this._dataGrid.headerTableHeader(columnConfig.id);
|
| - header.replaceChild(select, header.firstChild);
|
| - header.createChild("div", "sort-order-icon-container").createChild("div", "sort-order-icon");
|
| - columnConfig.selectBox = select;
|
| - select.addEventListener("change", this._sortByDropdownItem.bind(this, columnConfig), false);
|
| - this._dropDownColumnSelectors.push(select);
|
| - }
|
| - },
|
| -
|
| - sortByCurrentColumn: function()
|
| - {
|
| - this._sortHandler();
|
| - },
|
| -
|
| - _sortHandler: function()
|
| - {
|
| - var columnId = this._dataGrid.sortColumnId();
|
| - this._networkLogView.removeAllNodeHighlights();
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline") && columnId === "timeline") {
|
| - this._timelineColumnSortIcon.classList.remove("sort-ascending", "sort-descending");
|
| -
|
| - if (this._dataGrid.sortOrder() === WebInspector.DataGrid.Order.Ascending)
|
| - this._timelineColumnSortIcon.classList.add("sort-ascending");
|
| - else
|
| - this._timelineColumnSortIcon.classList.add("sort-descending");
|
| -
|
| - this._timelineRequestsAreStale = true;
|
| - var sortFunction = WebInspector.NetworkDataGridNode.RequestPropertyComparator.bind(null, this._activeTimelineSortId);
|
| - this._dataGrid.sortNodes(sortFunction, !this._dataGrid.isSortOrderAscending());
|
| - return;
|
| - }
|
| -
|
| - var columnConfig = this._columns.find(columnConfig => columnConfig.id === columnId);
|
| - if (!columnConfig)
|
| - return;
|
| - if (columnConfig.sortConfig && columnConfig.sortConfig.entries) {
|
| - this._sortByDropdownItem(columnConfig);
|
| - return;
|
| - }
|
| - if (!columnConfig.sortConfig.sortingFunction)
|
| - return;
|
| -
|
| - this._dataGrid.sortNodes(columnConfig.sortConfig.sortingFunction, !this._dataGrid.isSortOrderAscending());
|
| - this._networkLogView.dataGridSorted();
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.NetworkLogViewColumns.Descriptor} columnConfig
|
| - */
|
| - _sortByDropdownItem: function(columnConfig)
|
| - {
|
| - this._networkLogView.removeAllNodeHighlights();
|
| - var selectedIndex = columnConfig.selectBox.selectedIndex;
|
| - if (!selectedIndex)
|
| - selectedIndex = 1; // Sort by first item by default.
|
| - var selectedItemConfig = columnConfig.sortConfig.entries[selectedIndex - 1]; // -1 because of placeholder.
|
| - var selectedOption = columnConfig.selectBox[selectedIndex];
|
| - var value = selectedOption.value;
|
| -
|
| - this._dataGrid.sortNodes(selectedItemConfig.sortingFunction);
|
| - this._dataGrid.markColumnAsSortedBy(columnConfig.id, /** @type {!WebInspector.DataGrid.Order} */ (selectedItemConfig.sort));
|
| - if (selectedItemConfig.calculator)
|
| - this._networkLogView.setCalculator(this._calculatorsMap.get(selectedItemConfig.calculator));
|
| - columnConfig.selectBox.options[0].label = selectedItemConfig.title;
|
| - columnConfig.selectBox.selectedIndex = 0;
|
| - this._networkLogView.dataGridSorted();
|
| - },
|
| -
|
| - _updateColumns: function()
|
| - {
|
| - if (!this._dataGrid)
|
| - return;
|
| - var visibleColumns = /** @type {!Object.<string, boolean>} */ ({});
|
| - if (this._gridMode) {
|
| - for (var columnConfig of this._columns)
|
| - visibleColumns[columnConfig.id] = columnConfig.visible;
|
| - } else {
|
| - visibleColumns.name = true;
|
| - }
|
| - this._dataGrid.setColumnsVisiblity(visibleColumns);
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} gridMode
|
| - */
|
| - switchViewMode: function(gridMode)
|
| - {
|
| - if (this._gridMode === gridMode)
|
| - return;
|
| - this._gridMode = gridMode;
|
| -
|
| - if (gridMode) {
|
| - if (this._dataGrid.selectedNode)
|
| - this._dataGrid.selectedNode.selected = false;
|
| - } else {
|
| - this._networkLogView.removeAllNodeHighlights();
|
| - this._popoverHelper.hidePopover();
|
| - }
|
| -
|
| - this._networkLogView.element.classList.toggle("brief-mode", !gridMode);
|
| - this._updateColumns();
|
| -
|
| -
|
| - if (!Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - return;
|
| - // TODO(allada) Move this code into the code above.
|
| - if (gridMode) {
|
| - this._splitWidget.showBoth();
|
| - this._activeScroller = this._timelineScroller;
|
| - this._timelineScroller.scrollTop = this._dataGridScroller.scrollTop;
|
| - this._dataGridScroller.style.overflow = "hidden";
|
| - this._dataGrid.setScrollContainer(this._timelineScroller);
|
| - } else {
|
| - this._splitWidget.hideMain();
|
| - this._activeScroller = this._dataGridScroller;
|
| - this._dataGridScroller.style.overflow = "overlay";
|
| - this._dataGrid.setScrollContainer(this._dataGridScroller);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.NetworkLogViewColumns.Descriptor} columnConfig
|
| - */
|
| - _toggleColumnVisibility: function(columnConfig)
|
| - {
|
| - this._loadColumns();
|
| - columnConfig.visible = !columnConfig.visible;
|
| - this._saveColumns();
|
| - this._updateColumns();
|
| - },
|
| -
|
| - _saveColumns: function()
|
| - {
|
| - var saveableSettings = {};
|
| - for (var columnConfig of this._columns) {
|
| - saveableSettings[columnConfig.id] = {
|
| - visible: columnConfig.visible,
|
| - title: columnConfig.title
|
| - };
|
| - }
|
| - this._persistantSettings.set(saveableSettings);
|
| - },
|
| -
|
| - _loadColumns: function()
|
| - {
|
| - var savedSettings = this._persistantSettings.get();
|
| - var columnIds = Object.keys(savedSettings);
|
| - for (var columnId of columnIds) {
|
| - var setting = savedSettings[columnId];
|
| - var columnConfig = this._columns.find(columnConfig => columnConfig.id === columnId);
|
| - if (!columnConfig)
|
| - columnConfig = this._addCustomHeader(setting.title, columnId);
|
| - if (columnConfig.hideable && typeof setting.visible === "boolean")
|
| - columnConfig.visible = !!setting.visible;
|
| - if (typeof setting.title === "string")
|
| - columnConfig.title = setting.title;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {string} title
|
| - * @param {string} subtitle
|
| - * @return {!DocumentFragment}
|
| - */
|
| - _makeHeaderFragment: function(title, subtitle)
|
| - {
|
| - var fragment = createDocumentFragment();
|
| - fragment.createTextChild(title);
|
| - var subtitleDiv = fragment.createChild("div", "network-header-subtitle");
|
| - subtitleDiv.createTextChild(subtitle);
|
| - return fragment;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.ContextMenu} contextMenu
|
| - */
|
| - _innerHeaderContextMenu: function(contextMenu)
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline")) {
|
| - var timelineSortIds = WebInspector.NetworkLogViewColumns.TimelineSortIds;
|
| - var timelineSubMenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Timeline"));
|
| - timelineSubMenu.appendCheckboxItem(WebInspector.UIString("Start Time"), setTimelineMode.bind(this, timelineSortIds.StartTime), this._activeTimelineSortId === timelineSortIds.StartTime);
|
| - timelineSubMenu.appendCheckboxItem(WebInspector.UIString("Response Time"), setTimelineMode.bind(this, timelineSortIds.ResponseTime), this._activeTimelineSortId === timelineSortIds.ResponseTime);
|
| - timelineSubMenu.appendCheckboxItem(WebInspector.UIString("End Time"), setTimelineMode.bind(this, timelineSortIds.EndTime), this._activeTimelineSortId === timelineSortIds.EndTime);
|
| - timelineSubMenu.appendCheckboxItem(WebInspector.UIString("Total Duration"), setTimelineMode.bind(this, timelineSortIds.Duration), this._activeTimelineSortId === timelineSortIds.Duration);
|
| - timelineSubMenu.appendCheckboxItem(WebInspector.UIString("Latency"), setTimelineMode.bind(this, timelineSortIds.Latency), this._activeTimelineSortId === timelineSortIds.Latency);
|
| - contextMenu.appendSeparator();
|
| - }
|
| - var columnConfigs = this._columns.filter(columnConfig => columnConfig.hideable);
|
| - var nonResponseHeaders = columnConfigs.filter(columnConfig => !columnConfig.isResponseHeader);
|
| - for (var columnConfig of nonResponseHeaders)
|
| - contextMenu.appendCheckboxItem(columnConfig.title, this._toggleColumnVisibility.bind(this, columnConfig), columnConfig.visible);
|
| -
|
| - contextMenu.appendSeparator();
|
| -
|
| - var responseSubMenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Response Headers"));
|
| - var responseHeaders = columnConfigs.filter(columnConfig => columnConfig.isResponseHeader);
|
| - for (var columnConfig of responseHeaders)
|
| - responseSubMenu.appendCheckboxItem(columnConfig.title, this._toggleColumnVisibility.bind(this, columnConfig), columnConfig.visible);
|
| -
|
| - responseSubMenu.appendSeparator();
|
| - responseSubMenu.appendItem(WebInspector.UIString("Manage Header Columns\u2026"), this._manageCustomHeaderDialog.bind(this));
|
| -
|
| - contextMenu.show();
|
| -
|
| - /**
|
| - * @param {!WebInspector.NetworkLogViewColumns.TimelineSortIds} sortId
|
| - * @this {WebInspector.NetworkLogViewColumns}
|
| - */
|
| - function setTimelineMode(sortId)
|
| - {
|
| - var calculator = this._calculatorsMap.get(WebInspector.NetworkLogViewColumns._calculatorTypes.Time);
|
| - var timelineSortIds = WebInspector.NetworkLogViewColumns.TimelineSortIds;
|
| - if (sortId === timelineSortIds.Duration || sortId === timelineSortIds.Latency)
|
| - calculator = this._calculatorsMap.get(WebInspector.NetworkLogViewColumns._calculatorTypes.Duration);
|
| - this._networkLogView.setCalculator(calculator);
|
| -
|
| - this._activeTimelineSortId = sortId;
|
| - this._dataGrid.markColumnAsSortedBy("timeline", WebInspector.DataGrid.Order.Ascending);
|
| - this._sortHandler();
|
| - }
|
| - },
|
| -
|
| - _manageCustomHeaderDialog: function()
|
| - {
|
| - var customHeaders = [];
|
| - for (var columnConfig of this._columns) {
|
| - if (columnConfig.isResponseHeader)
|
| - customHeaders.push({title: columnConfig.title, editable: columnConfig.isCustomHeader});
|
| - }
|
| - var manageCustomHeaders = new WebInspector.NetworkManageCustomHeadersView(customHeaders, headerTitle => !!this._addCustomHeader(headerTitle), this._changeCustomHeader.bind(this), this._removeCustomHeader.bind(this));
|
| - var dialog = new WebInspector.Dialog();
|
| - manageCustomHeaders.show(dialog.element);
|
| - dialog.setWrapsContent(true);
|
| - dialog.show();
|
| - },
|
| -
|
| - /**
|
| - * @param {string} headerId
|
| - * @return {boolean}
|
| - */
|
| - _removeCustomHeader: function(headerId)
|
| - {
|
| - headerId = headerId.toLowerCase();
|
| - var index = this._columns.findIndex(columnConfig => columnConfig.id === headerId);
|
| - if (index === -1)
|
| - return false;
|
| - var columnConfig = this._columns.splice(index, 1);
|
| - this._dataGrid.removeColumn(headerId);
|
| - this._saveColumns();
|
| - this._updateColumns();
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} headerTitle
|
| - * @param {string=} headerId
|
| - * @param {number=} index
|
| - * @return {?WebInspector.NetworkLogViewColumns.Descriptor}
|
| - */
|
| - _addCustomHeader: function(headerTitle, headerId, index)
|
| - {
|
| - if (!headerId)
|
| - headerId = headerTitle.toLowerCase();
|
| - if (index === undefined)
|
| - index = this._columns.length - 1;
|
| -
|
| - var currentColumnConfig = this._columns.find(columnConfig => columnConfig.id === headerId);
|
| - if (currentColumnConfig)
|
| - return null;
|
| -
|
| - var columnConfig = /** @type {!WebInspector.NetworkLogViewColumns.Descriptor} */ (Object.assign(/** @type {!Object} */ ({}), WebInspector.NetworkLogViewColumns._defaultColumnConfig, {
|
| - id: headerId,
|
| - title: headerTitle,
|
| - isResponseHeader: true,
|
| - isCustomHeader: true,
|
| - visible: true,
|
| - sortConfig: {
|
| - sortingFunction: WebInspector.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, headerId)
|
| - }
|
| - }));
|
| - this._columns.splice(index, 0, columnConfig);
|
| - if (this._dataGrid)
|
| - this._dataGrid.addColumn(WebInspector.NetworkLogViewColumns._convertToDataGridDescriptor(columnConfig), index);
|
| - this._saveColumns();
|
| - this._updateColumns();
|
| - return columnConfig;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} oldHeaderId
|
| - * @param {string} newHeaderTitle
|
| - * @param {string=} newHeaderId
|
| - * @return {boolean}
|
| - */
|
| - _changeCustomHeader: function(oldHeaderId, newHeaderTitle, newHeaderId)
|
| - {
|
| - if (!newHeaderId)
|
| - newHeaderId = newHeaderTitle.toLowerCase();
|
| - oldHeaderId = oldHeaderId.toLowerCase();
|
| -
|
| - var oldIndex = this._columns.findIndex(columnConfig => columnConfig.id === oldHeaderId);
|
| - var oldColumnConfig = this._columns[oldIndex];
|
| - var currentColumnConfig = this._columns.find(columnConfig => columnConfig.id === newHeaderId);
|
| - if (!oldColumnConfig || (currentColumnConfig && oldHeaderId !== newHeaderId))
|
| - return false;
|
| -
|
| - this._removeCustomHeader(oldHeaderId);
|
| - this._addCustomHeader(newHeaderTitle, newHeaderId, oldIndex);
|
| - return true;
|
| - },
|
| -
|
| - updateDividersIfNeeded: function()
|
| - {
|
| - // TODO(allada) Remove this code out when timeline canvas experiment is over.
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - return;
|
| - if (!this._networkLogView.isShowing()) {
|
| - this._networkLogView.scheduleRefresh();
|
| - return;
|
| - }
|
| -
|
| - var timelineOffset = this._dataGrid.columnOffset("timeline");
|
| - // Position timline grid location.
|
| - if (timelineOffset)
|
| - this._timelineGrid.element.style.left = timelineOffset + "px";
|
| -
|
| - var calculator = this._calculatorsMap.get(WebInspector.NetworkLogViewColumns._calculatorTypes.Time);
|
| - calculator.setDisplayWindow(this._timelineGrid.dividersElement.clientWidth);
|
| - this._timelineGrid.updateDividers(calculator, 75);
|
| -
|
| - if (calculator.startAtZero) {
|
| - // If our current sorting method starts at zero, that means it shows all
|
| - // requests starting at the same point, and so onLoad event and DOMContent
|
| - // event lines really wouldn't make much sense here, so don't render them.
|
| - return;
|
| - }
|
| -
|
| - this._updateEventDividers();
|
| - },
|
| -
|
| - /**
|
| - * @param {!Element} element
|
| - * @param {!Event} event
|
| - * @return {!Element|!AnchorBox|undefined}
|
| - */
|
| - _getPopoverAnchor: function(element, event)
|
| - {
|
| - if (!this._gridMode)
|
| - return;
|
| - var anchor = element.enclosingNodeOrSelfWithClass("network-graph-bar") || element.enclosingNodeOrSelfWithClass("network-graph-label");
|
| - if (anchor && anchor.parentElement.request && anchor.parentElement.request.timing)
|
| - return anchor;
|
| - anchor = element.enclosingNodeOrSelfWithClass("network-script-initiated");
|
| - if (anchor && anchor.request) {
|
| - var initiator = /** @type {!WebInspector.NetworkRequest} */ (anchor.request).initiator();
|
| - if (initiator && initiator.stack)
|
| - return anchor;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!Element} anchor
|
| - * @param {!WebInspector.Popover} popover
|
| - */
|
| - _showPopover: function(anchor, popover)
|
| - {
|
| - var content;
|
| - if (anchor.classList.contains("network-script-initiated")) {
|
| - var request = /** @type {!WebInspector.NetworkRequest} */ (anchor.request);
|
| - var initiator = /** @type {!NetworkAgent.Initiator} */ (request.initiator());
|
| - content = WebInspector.DOMPresentationUtils.buildStackTracePreviewContents(request.target(), this._popupLinkifier, initiator.stack);
|
| - popover.setCanShrink(true);
|
| - } else {
|
| - content = WebInspector.RequestTimingView.createTimingTable(anchor.parentElement.request, this._networkLogView.timeCalculator().minimumBoundary());
|
| - popover.setCanShrink(false);
|
| - }
|
| - popover.showForAnchor(content, anchor);
|
| - },
|
| -
|
| - _onHidePopover: function()
|
| - {
|
| - this._popupLinkifier.reset();
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array<number>} times
|
| - * @param {string} className
|
| - */
|
| - addEventDividers: function(times, className)
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline")) {
|
| - // TODO(allada) When we remove old timeline remove this and pass in the color.
|
| - var color = "transparent";
|
| - switch (className) {
|
| - case "network-blue-divider":
|
| - color = "hsla(240, 100%, 80%, 0.7)";
|
| - break;
|
| - case "network-red-divider":
|
| - color = "rgba(255, 0, 0, 0.5)";
|
| - break;
|
| - default:
|
| - return;
|
| - }
|
| - var currentTimes = this._shownEventDividers.get(color) || [];
|
| - this._shownEventDividers.set(color, currentTimes.concat(times));
|
| -
|
| - this._networkLogView.scheduleRefresh();
|
| - return;
|
| - }
|
| -
|
| - for (var i = 0; i < times.length; ++i) {
|
| - var element = createElementWithClass("div", "network-event-divider " + className);
|
| - this._timelineGrid.addEventDivider(element);
|
| - this._eventDividers.push({time: times[i], element: element});
|
| - }
|
| - // Update event dividers immediately
|
| - this._updateEventDividers();
|
| - // Schedule refresh in case dividers change the calculator span.
|
| - this._networkLogView.scheduleRefresh();
|
| - },
|
| -
|
| - _updateEventDividers: function()
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline"))
|
| - return;
|
| - var calculator = this._calculatorsMap.get(WebInspector.NetworkLogViewColumns._calculatorTypes.Time);
|
| - for (var divider of this._eventDividers) {
|
| - var timePercent = calculator.computePercentageFromEventTime(divider.time);
|
| - divider.element.classList.toggle("invisible", timePercent < 0);
|
| - divider.element.style.left = timePercent + "%";
|
| - }
|
| - },
|
| -
|
| - hideEventDividers: function()
|
| - {
|
| - this._eventDividersShown = true;
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline")) {
|
| - this._redrawTimelineColumn();
|
| - return;
|
| - }
|
| - this._timelineGrid.hideEventDividers();
|
| - },
|
| -
|
| - showEventDividers: function()
|
| - {
|
| - this._eventDividersShown = false;
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline")) {
|
| - this._redrawTimelineColumn();
|
| - return;
|
| - }
|
| - this._timelineGrid.showEventDividers();
|
| - },
|
| -
|
| - /**
|
| - * @param {number} time
|
| - */
|
| - selectFilmStripFrame: function(time)
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline")) {
|
| - this._shownEventDividers.set(WebInspector.NetworkLogViewColumns._filmStripDividerColor, [time]);
|
| - this._redrawTimelineColumn();
|
| - return;
|
| - }
|
| - for (var divider of this._eventDividers)
|
| - divider.element.classList.toggle("network-frame-divider-selected", divider.time === time);
|
| - },
|
| -
|
| - clearFilmStripFrame: function()
|
| - {
|
| - if (Runtime.experiments.isEnabled("canvasNetworkTimeline")) {
|
| - this._shownEventDividers.delete(WebInspector.NetworkLogViewColumns._filmStripDividerColor);
|
| - this._redrawTimelineColumn();
|
| - return;
|
| - }
|
| - for (var divider of this._eventDividers)
|
| - divider.element.classList.toggle("network-frame-divider-selected", false);
|
| - }
|
| -};
|
|
|