| Index: Source/devtools/front_end/profiler/CanvasReplayStateView.js
|
| diff --git a/Source/devtools/front_end/profiler/CanvasReplayStateView.js b/Source/devtools/front_end/profiler/CanvasReplayStateView.js
|
| deleted file mode 100644
|
| index 5283dcae886c567921883964aefd1388d96a4cd2..0000000000000000000000000000000000000000
|
| --- a/Source/devtools/front_end/profiler/CanvasReplayStateView.js
|
| +++ /dev/null
|
| @@ -1,530 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2013 Google Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are
|
| - * met:
|
| - *
|
| - * * Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * * Redistributions in binary form must reproduce the above
|
| - * copyright notice, this list of conditions and the following disclaimer
|
| - * in the documentation and/or other materials provided with the
|
| - * distribution.
|
| - * * Neither the name of Google Inc. nor the names of its
|
| - * contributors may be used to endorse or promote products derived from
|
| - * this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -/**
|
| - * @constructor
|
| - * @extends {WebInspector.VBox}
|
| - * @param {!WebInspector.CanvasTraceLogPlayerProxy} traceLogPlayer
|
| - */
|
| -WebInspector.CanvasReplayStateView = function(traceLogPlayer)
|
| -{
|
| - WebInspector.VBox.call(this);
|
| - this.registerRequiredCSS("profiler/canvasProfiler.css");
|
| - this.element.classList.add("canvas-replay-state-view");
|
| - this._traceLogPlayer = traceLogPlayer;
|
| -
|
| - var controlsToolbar = new WebInspector.StatusBar(this.element);
|
| - this._prevButton = this._createControlButton(controlsToolbar, "play-backwards-status-bar-item", WebInspector.UIString("Previous resource."), this._onResourceNavigationClick.bind(this, false));
|
| - this._nextButton = this._createControlButton(controlsToolbar, "play-status-bar-item", WebInspector.UIString("Next resource."), this._onResourceNavigationClick.bind(this, true));
|
| - this._createControlButton(controlsToolbar, "refresh-status-bar-item", WebInspector.UIString("Refresh."), this._onStateRefreshClick.bind(this));
|
| -
|
| - this._resourceSelector = new WebInspector.StatusBarComboBox(this._onReplayResourceChanged.bind(this));
|
| - this._currentOption = this._resourceSelector.createOption(WebInspector.UIString("<auto>"), WebInspector.UIString("Show state of the last replayed resource."), "");
|
| - controlsToolbar.appendStatusBarItem(this._resourceSelector);
|
| -
|
| - /** @type {!Object.<string, string>} */
|
| - this._resourceIdToDescription = {};
|
| -
|
| - /** @type {!Object.<string, !Object.<string, boolean>>} */
|
| - this._gridNodesExpandedState = {};
|
| - /** @type {!Object.<string, !{scrollTop: number, scrollLeft: number}>} */
|
| - this._gridScrollPositions = {};
|
| -
|
| - /** @type {?CanvasAgent.ResourceId} */
|
| - this._currentResourceId = null;
|
| - /** @type {!Array.<!Element>} */
|
| - this._prevOptionsStack = [];
|
| - /** @type {!Array.<!Element>} */
|
| - this._nextOptionsStack = [];
|
| -
|
| - /** @type {!Array.<!WebInspector.DataGridNode>} */
|
| - this._highlightedGridNodes = [];
|
| -
|
| - var columns = [
|
| - {title: WebInspector.UIString("Name"), sortable: false, width: "50%", disclosure: true},
|
| - {title: WebInspector.UIString("Value"), sortable: false, width: "50%"}
|
| - ];
|
| -
|
| - this._stateGrid = new WebInspector.DataGrid(columns);
|
| - this._stateGrid.element.classList.add("fill");
|
| - this._stateGrid.show(this.element);
|
| -
|
| - this._traceLogPlayer.addEventListener(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasReplayStateChanged, this._onReplayResourceChanged, this);
|
| - this._traceLogPlayer.addEventListener(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasTraceLogReceived, this._onCanvasTraceLogReceived, this);
|
| - this._traceLogPlayer.addEventListener(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasResourceStateReceived, this._onCanvasResourceStateReceived, this);
|
| -
|
| - this._updateButtonsEnabledState();
|
| -}
|
| -
|
| -WebInspector.CanvasReplayStateView.prototype = {
|
| - /**
|
| - * @param {string} resourceId
|
| - */
|
| - selectResource: function(resourceId)
|
| - {
|
| - if (resourceId === this._resourceSelector.selectedOption().value)
|
| - return;
|
| - var option = this._resourceSelector.selectElement().firstChild;
|
| - for (var index = 0; option; ++index, option = option.nextSibling) {
|
| - if (resourceId === option.value) {
|
| - this._resourceSelector.setSelectedIndex(index);
|
| - this._onReplayResourceChanged();
|
| - break;
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.StatusBar} toolbar
|
| - * @param {string} className
|
| - * @param {string} title
|
| - * @param {function(this:WebInspector.CanvasProfileView)} clickCallback
|
| - * @return {!WebInspector.StatusBarButton}
|
| - */
|
| - _createControlButton: function(toolbar, className, title, clickCallback)
|
| - {
|
| - var button = new WebInspector.StatusBarButton(title, className);
|
| - toolbar.appendStatusBarItem(button);
|
| -
|
| - button.makeLongClickEnabled();
|
| - button.addEventListener("click", clickCallback, this);
|
| - button.addEventListener("longClickDown", clickCallback, this);
|
| - button.addEventListener("longClickPress", clickCallback, this);
|
| - return button;
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} forward
|
| - */
|
| - _onResourceNavigationClick: function(forward)
|
| - {
|
| - var newOption = forward ? this._nextOptionsStack.pop() : this._prevOptionsStack.pop();
|
| - if (!newOption)
|
| - return;
|
| - (forward ? this._prevOptionsStack : this._nextOptionsStack).push(this._currentOption);
|
| - this._isNavigationButton = true;
|
| - this.selectResource(newOption.value);
|
| - delete this._isNavigationButton;
|
| - this._updateButtonsEnabledState();
|
| - },
|
| -
|
| - _onStateRefreshClick: function()
|
| - {
|
| - this._traceLogPlayer.clearResourceStates();
|
| - },
|
| -
|
| - _updateButtonsEnabledState: function()
|
| - {
|
| - this._prevButton.setEnabled(this._prevOptionsStack.length > 0);
|
| - this._nextButton.setEnabled(this._nextOptionsStack.length > 0);
|
| - },
|
| -
|
| - _updateCurrentOption: function()
|
| - {
|
| - const maxStackSize = 256;
|
| - var selectedOption = this._resourceSelector.selectedOption();
|
| - if (this._currentOption === selectedOption)
|
| - return;
|
| - if (!this._isNavigationButton) {
|
| - this._prevOptionsStack.push(this._currentOption);
|
| - this._nextOptionsStack = [];
|
| - if (this._prevOptionsStack.length > maxStackSize)
|
| - this._prevOptionsStack.shift();
|
| - this._updateButtonsEnabledState();
|
| - }
|
| - this._currentOption = selectedOption;
|
| - },
|
| -
|
| - /**
|
| - * @param {!CanvasAgent.TraceLog} traceLog
|
| - */
|
| - _collectResourcesFromTraceLog: function(traceLog)
|
| - {
|
| - /** @type {!Array.<!CanvasAgent.CallArgument>} */
|
| - var collectedResources = [];
|
| - var calls = traceLog.calls;
|
| - for (var i = 0, n = calls.length; i < n; ++i) {
|
| - var call = calls[i];
|
| - var args = call.arguments || [];
|
| - for (var j = 0; j < args.length; ++j)
|
| - this._collectResourceFromCallArgument(args[j], collectedResources);
|
| - this._collectResourceFromCallArgument(call.result, collectedResources);
|
| - this._collectResourceFromCallArgument(call.value, collectedResources);
|
| - }
|
| - var contexts = traceLog.contexts;
|
| - for (var i = 0, n = contexts.length; i < n; ++i)
|
| - this._collectResourceFromCallArgument(contexts[i], collectedResources);
|
| - this._addCollectedResourcesToSelector(collectedResources);
|
| - },
|
| -
|
| - /**
|
| - * @param {!CanvasAgent.ResourceState} resourceState
|
| - */
|
| - _collectResourcesFromResourceState: function(resourceState)
|
| - {
|
| - /** @type {!Array.<!CanvasAgent.CallArgument>} */
|
| - var collectedResources = [];
|
| - this._collectResourceFromResourceStateDescriptors(resourceState.descriptors, collectedResources);
|
| - this._addCollectedResourcesToSelector(collectedResources);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array.<!CanvasAgent.ResourceStateDescriptor>|undefined} descriptors
|
| - * @param {!Array.<!CanvasAgent.CallArgument>} output
|
| - */
|
| - _collectResourceFromResourceStateDescriptors: function(descriptors, output)
|
| - {
|
| - if (!descriptors)
|
| - return;
|
| - for (var i = 0, n = descriptors.length; i < n; ++i) {
|
| - var descriptor = descriptors[i];
|
| - this._collectResourceFromCallArgument(descriptor.value, output);
|
| - this._collectResourceFromResourceStateDescriptors(descriptor.values, output);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!CanvasAgent.CallArgument|undefined} argument
|
| - * @param {!Array.<!CanvasAgent.CallArgument>} output
|
| - */
|
| - _collectResourceFromCallArgument: function(argument, output)
|
| - {
|
| - if (!argument)
|
| - return;
|
| - var resourceId = argument.resourceId;
|
| - if (!resourceId || this._resourceIdToDescription[resourceId])
|
| - return;
|
| - this._resourceIdToDescription[resourceId] = argument.description;
|
| - output.push(argument);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array.<!CanvasAgent.CallArgument>} collectedResources
|
| - */
|
| - _addCollectedResourcesToSelector: function(collectedResources)
|
| - {
|
| - if (!collectedResources.length)
|
| - return;
|
| - /**
|
| - * @param {!CanvasAgent.CallArgument} arg1
|
| - * @param {!CanvasAgent.CallArgument} arg2
|
| - * @return {number}
|
| - */
|
| - function comparator(arg1, arg2)
|
| - {
|
| - var a = arg1.description;
|
| - var b = arg2.description;
|
| - return String.naturalOrderComparator(a, b);
|
| - }
|
| - collectedResources.sort(comparator);
|
| -
|
| - var selectElement = this._resourceSelector.selectElement();
|
| - var currentOption = selectElement.firstChild;
|
| - currentOption = currentOption.nextSibling; // Skip the "<auto>" option.
|
| - for (var i = 0, n = collectedResources.length; i < n; ++i) {
|
| - var argument = collectedResources[i];
|
| - while (currentOption && String.naturalOrderComparator(currentOption.text, argument.description) < 0)
|
| - currentOption = currentOption.nextSibling;
|
| - var option = this._resourceSelector.createOption(argument.description, WebInspector.UIString("Show state of this resource."), argument.resourceId);
|
| - if (currentOption)
|
| - selectElement.insertBefore(option, currentOption);
|
| - }
|
| - },
|
| -
|
| - _onReplayResourceChanged: function()
|
| - {
|
| - this._updateCurrentOption();
|
| - var selectedResourceId = this._resourceSelector.selectedOption().value;
|
| -
|
| - /**
|
| - * @param {?CanvasAgent.ResourceState} resourceState
|
| - * @this {WebInspector.CanvasReplayStateView}
|
| - */
|
| - function didReceiveResourceState(resourceState)
|
| - {
|
| - if (selectedResourceId !== this._resourceSelector.selectedOption().value)
|
| - return;
|
| - this._showResourceState(resourceState);
|
| - }
|
| - this._traceLogPlayer.getResourceState(selectedResourceId, didReceiveResourceState.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _onCanvasTraceLogReceived: function(event)
|
| - {
|
| - var traceLog = /** @type {!CanvasAgent.TraceLog} */ (event.data);
|
| - console.assert(traceLog);
|
| - this._collectResourcesFromTraceLog(traceLog);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _onCanvasResourceStateReceived: function(event)
|
| - {
|
| - var resourceState = /** @type {!CanvasAgent.ResourceState} */ (event.data);
|
| - console.assert(resourceState);
|
| - this._collectResourcesFromResourceState(resourceState);
|
| - },
|
| -
|
| - /**
|
| - * @param {?CanvasAgent.ResourceState} resourceState
|
| - */
|
| - _showResourceState: function(resourceState)
|
| - {
|
| - this._saveExpandedState();
|
| - this._saveScrollState();
|
| -
|
| - var rootNode = this._stateGrid.rootNode();
|
| - if (!resourceState) {
|
| - this._currentResourceId = null;
|
| - this._updateDataGridHighlights([]);
|
| - rootNode.removeChildren();
|
| - return;
|
| - }
|
| -
|
| - var nodesToHighlight = [];
|
| - var nameToOldGridNodes = {};
|
| -
|
| - /**
|
| - * @param {!Object} map
|
| - * @param {!WebInspector.DataGridNode=} node
|
| - */
|
| - function populateNameToNodesMap(map, node)
|
| - {
|
| - if (!node)
|
| - return;
|
| - for (var i = 0, child; child = node.children[i]; ++i) {
|
| - var item = {
|
| - node: child,
|
| - children: {}
|
| - };
|
| - map[child.name] = item;
|
| - populateNameToNodesMap(item.children, child);
|
| - }
|
| - }
|
| - populateNameToNodesMap(nameToOldGridNodes, rootNode);
|
| - rootNode.removeChildren();
|
| -
|
| - /**
|
| - * @param {!CanvasAgent.ResourceStateDescriptor} d1
|
| - * @param {!CanvasAgent.ResourceStateDescriptor} d2
|
| - * @return {number}
|
| - */
|
| - function comparator(d1, d2)
|
| - {
|
| - var hasChildren1 = !!d1.values;
|
| - var hasChildren2 = !!d2.values;
|
| - if (hasChildren1 !== hasChildren2)
|
| - return hasChildren1 ? 1 : -1;
|
| - return String.naturalOrderComparator(d1.name, d2.name);
|
| - }
|
| - /**
|
| - * @param {!Array.<!CanvasAgent.ResourceStateDescriptor>|undefined} descriptors
|
| - * @param {!WebInspector.DataGridNode} parent
|
| - * @param {!Object=} nameToOldChildren
|
| - * @this {WebInspector.CanvasReplayStateView}
|
| - */
|
| - function appendResourceStateDescriptors(descriptors, parent, nameToOldChildren)
|
| - {
|
| - descriptors = descriptors || [];
|
| - descriptors.sort(comparator);
|
| - var oldChildren = nameToOldChildren || {};
|
| - for (var i = 0, n = descriptors.length; i < n; ++i) {
|
| - var descriptor = descriptors[i];
|
| - var childNode = this._createDataGridNode(descriptor);
|
| - parent.appendChild(childNode);
|
| - var oldChildrenItem = oldChildren[childNode.name] || {};
|
| - var oldChildNode = oldChildrenItem.node;
|
| - if (!oldChildNode || oldChildNode.element().textContent !== childNode.element().textContent)
|
| - nodesToHighlight.push(childNode);
|
| - appendResourceStateDescriptors.call(this, descriptor.values, childNode, oldChildrenItem.children);
|
| - }
|
| - }
|
| - appendResourceStateDescriptors.call(this, resourceState.descriptors, rootNode, nameToOldGridNodes);
|
| -
|
| - var shouldHighlightChanges = (this._resourceKindId(this._currentResourceId) === this._resourceKindId(resourceState.id));
|
| - this._currentResourceId = resourceState.id;
|
| - this._restoreExpandedState();
|
| - this._updateDataGridHighlights(shouldHighlightChanges ? nodesToHighlight : []);
|
| - this._restoreScrollState();
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array.<!WebInspector.DataGridNode>} nodes
|
| - */
|
| - _updateDataGridHighlights: function(nodes)
|
| - {
|
| - for (var i = 0, n = this._highlightedGridNodes.length; i < n; ++i)
|
| - this._highlightedGridNodes[i].element().classList.remove("canvas-grid-node-highlighted");
|
| -
|
| - this._highlightedGridNodes = nodes;
|
| -
|
| - for (var i = 0, n = this._highlightedGridNodes.length; i < n; ++i) {
|
| - var node = this._highlightedGridNodes[i];
|
| - WebInspector.runCSSAnimationOnce(node.element(), "canvas-grid-node-highlighted");
|
| - node.reveal();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {?CanvasAgent.ResourceId} resourceId
|
| - * @return {string}
|
| - */
|
| - _resourceKindId: function(resourceId)
|
| - {
|
| - var description = (resourceId && this._resourceIdToDescription[resourceId]) || "";
|
| - return description.replace(/\d+/g, "");
|
| - },
|
| -
|
| - /**
|
| - * @param {function(!WebInspector.DataGridNode, string):void} callback
|
| - */
|
| - _forEachGridNode: function(callback)
|
| - {
|
| - /**
|
| - * @param {!WebInspector.DataGridNode} node
|
| - * @param {string} key
|
| - */
|
| - function processRecursively(node, key)
|
| - {
|
| - for (var i = 0, child; child = node.children[i]; ++i) {
|
| - var childKey = key + "#" + child.name;
|
| - callback(child, childKey);
|
| - processRecursively(child, childKey);
|
| - }
|
| - }
|
| - processRecursively(this._stateGrid.rootNode(), "");
|
| - },
|
| -
|
| - _saveExpandedState: function()
|
| - {
|
| - if (!this._currentResourceId)
|
| - return;
|
| - var expandedState = {};
|
| - var key = this._resourceKindId(this._currentResourceId);
|
| - this._gridNodesExpandedState[key] = expandedState;
|
| - /**
|
| - * @param {!WebInspector.DataGridNode} node
|
| - * @param {string} key
|
| - */
|
| - function callback(node, key)
|
| - {
|
| - if (node.expanded)
|
| - expandedState[key] = true;
|
| - }
|
| - this._forEachGridNode(callback);
|
| - },
|
| -
|
| - _restoreExpandedState: function()
|
| - {
|
| - if (!this._currentResourceId)
|
| - return;
|
| - var key = this._resourceKindId(this._currentResourceId);
|
| - var expandedState = this._gridNodesExpandedState[key];
|
| - if (!expandedState)
|
| - return;
|
| - /**
|
| - * @param {!WebInspector.DataGridNode} node
|
| - * @param {string} key
|
| - */
|
| - function callback(node, key)
|
| - {
|
| - if (expandedState[key])
|
| - node.expand();
|
| - }
|
| - this._forEachGridNode(callback);
|
| - },
|
| -
|
| - _saveScrollState: function()
|
| - {
|
| - if (!this._currentResourceId)
|
| - return;
|
| - var key = this._resourceKindId(this._currentResourceId);
|
| - this._gridScrollPositions[key] = {
|
| - scrollTop: this._stateGrid.scrollContainer.scrollTop,
|
| - scrollLeft: this._stateGrid.scrollContainer.scrollLeft
|
| - };
|
| - },
|
| -
|
| - _restoreScrollState: function()
|
| - {
|
| - if (!this._currentResourceId)
|
| - return;
|
| - var key = this._resourceKindId(this._currentResourceId);
|
| - var scrollState = this._gridScrollPositions[key];
|
| - if (!scrollState)
|
| - return;
|
| - this._stateGrid.scrollContainer.scrollTop = scrollState.scrollTop;
|
| - this._stateGrid.scrollContainer.scrollLeft = scrollState.scrollLeft;
|
| - },
|
| -
|
| - /**
|
| - * @param {!CanvasAgent.ResourceStateDescriptor} descriptor
|
| - * @return {!WebInspector.DataGridNode}
|
| - */
|
| - _createDataGridNode: function(descriptor)
|
| - {
|
| - var name = descriptor.name;
|
| - var callArgument = descriptor.value;
|
| - var target = this._traceLogPlayer.target();
|
| -
|
| - /** @type {!Element|string} */
|
| - var valueElement = callArgument ? WebInspector.CanvasProfileDataGridHelper.createCallArgumentElement(target, callArgument) : "";
|
| -
|
| - /** @type {!Element|string} */
|
| - var nameElement = name;
|
| - if (target && typeof descriptor.enumValueForName !== "undefined")
|
| - nameElement = WebInspector.CanvasProfileDataGridHelper.createEnumValueElement(target, name, +descriptor.enumValueForName);
|
| -
|
| - if (descriptor.isArray && descriptor.values) {
|
| - if (typeof nameElement === "string")
|
| - nameElement += "[" + descriptor.values.length + "]";
|
| - else {
|
| - var element = createElement("span");
|
| - element.appendChild(nameElement);
|
| - element.createTextChild("[" + descriptor.values.length + "]");
|
| - nameElement = element;
|
| - }
|
| - }
|
| -
|
| - var data = {};
|
| - data[0] = nameElement;
|
| - data[1] = valueElement;
|
| - var node = new WebInspector.DataGridNode(data);
|
| - node.selectable = false;
|
| - node.name = name;
|
| - return node;
|
| - },
|
| -
|
| - __proto__: WebInspector.VBox.prototype
|
| -}
|
|
|