| Index: Source/devtools/front_end/profiler/CanvasProfileView.js
|
| diff --git a/Source/devtools/front_end/profiler/CanvasProfileView.js b/Source/devtools/front_end/profiler/CanvasProfileView.js
|
| deleted file mode 100644
|
| index 7815098c964d5c69bdddfe1c21505689c7b51f92..0000000000000000000000000000000000000000
|
| --- a/Source/devtools/front_end/profiler/CanvasProfileView.js
|
| +++ /dev/null
|
| @@ -1,1331 +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.CanvasProfileHeader} profile
|
| - */
|
| -WebInspector.CanvasProfileView = function(profile)
|
| -{
|
| - WebInspector.VBox.call(this);
|
| - this.registerRequiredCSS("profiler/canvasProfiler.css");
|
| - this.element.classList.add("canvas-profile-view");
|
| -
|
| - this._profile = profile;
|
| - this._traceLogId = profile.traceLogId();
|
| - this._traceLogPlayer = /** @type {!WebInspector.CanvasTraceLogPlayerProxy} */ (profile.traceLogPlayer());
|
| - this._linkifier = new WebInspector.Linkifier();
|
| -
|
| - this._replayInfoSplitView = new WebInspector.SplitView(true, true, "canvasProfileViewReplaySplitViewState", 0.34);
|
| - this._replayInfoSplitView.show(this.element);
|
| -
|
| - this._imageSplitView = new WebInspector.SplitView(false, true, "canvasProfileViewSplitViewState", 300);
|
| - this._replayInfoSplitView.setMainView(this._imageSplitView);
|
| -
|
| - var replayImageContainerView = new WebInspector.VBoxWithResizeCallback(this._onReplayImageResize.bind(this));
|
| - replayImageContainerView.setMinimumSize(50, 28);
|
| - this._imageSplitView.setMainView(replayImageContainerView);
|
| -
|
| - var replayImageContainer = replayImageContainerView.element;
|
| - replayImageContainer.id = "canvas-replay-image-container";
|
| - var replayImageParent = replayImageContainer.createChild("div", "canvas-replay-image-parent");
|
| - replayImageParent.createChild("span"); // Helps to align the image vertically.
|
| - this._replayImageElement = replayImageParent.createChild("img");
|
| - this._debugInfoElement = replayImageContainer.createChild("div", "canvas-debug-info hidden");
|
| - this._spinnerIcon = replayImageContainer.createChild("div", "spinner-icon small hidden");
|
| -
|
| - var replayLogContainerView = new WebInspector.VBox();
|
| - replayLogContainerView.setMinimumSize(22, 22);
|
| - this._imageSplitView.setSidebarView(replayLogContainerView);
|
| -
|
| - var replayLogContainer = replayLogContainerView.element;
|
| - var controlsToolbar = new WebInspector.StatusBar(replayLogContainer);
|
| - var logGridContainer = replayLogContainer.createChild("div", "canvas-replay-log");
|
| -
|
| - this._createControlButton(controlsToolbar, "first-step-status-bar-item", WebInspector.UIString("First call."), this._onReplayFirstStepClick.bind(this));
|
| - this._createControlButton(controlsToolbar, "step-out-status-bar-item", WebInspector.UIString("Previous call."), this._onReplayStepClick.bind(this, false));
|
| - this._createControlButton(controlsToolbar, "step-in-status-bar-item", WebInspector.UIString("Next call."), this._onReplayStepClick.bind(this, true));
|
| - this._createControlButton(controlsToolbar, "step-backwards-status-bar-item", WebInspector.UIString("Previous drawing call."), this._onReplayDrawingCallClick.bind(this, false));
|
| - this._createControlButton(controlsToolbar, "step-over-status-bar-item", WebInspector.UIString("Next drawing call."), this._onReplayDrawingCallClick.bind(this, true));
|
| - this._createControlButton(controlsToolbar, "last-step-status-bar-item", WebInspector.UIString("Last call."), this._onReplayLastStepClick.bind(this));
|
| -
|
| - this._replayContextSelector = new WebInspector.StatusBarComboBox(this._onReplayContextChanged.bind(this));
|
| - this._replayContextSelector.createOption(WebInspector.UIString("<screenshot auto>"), WebInspector.UIString("Show screenshot of the last replayed resource."), "");
|
| - controlsToolbar.appendStatusBarItem(this._replayContextSelector);
|
| -
|
| - this._installReplayInfoSidebarWidgets(replayLogContainer);
|
| -
|
| - this._replayStateView = new WebInspector.CanvasReplayStateView(this._traceLogPlayer);
|
| - this._replayInfoSplitView.setSidebarView(this._replayStateView);
|
| -
|
| - /** @type {!Object.<string, boolean>} */
|
| - this._replayContexts = {};
|
| -
|
| - var columns = [
|
| - {title: "#", sortable: false, width: "5%"},
|
| - {title: WebInspector.UIString("Call"), sortable: false, width: "75%", disclosure: true},
|
| - {title: WebInspector.UIString("Location"), sortable: false, width: "20%"}
|
| - ];
|
| -
|
| - this._logGrid = new WebInspector.DataGrid(columns);
|
| - this._logGrid.element.classList.add("fill");
|
| - this._logGrid.show(logGridContainer);
|
| - this._logGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, this._replayTraceLog, this);
|
| -
|
| - this.element.addEventListener("mousedown", this._onMouseClick.bind(this), true);
|
| -
|
| - this._popoverHelper = new WebInspector.ObjectPopoverHelper(this.element, this._popoverAnchor.bind(this), this._resolveObjectForPopover.bind(this), this._onHidePopover.bind(this), true);
|
| - this._popoverHelper.setRemoteObjectFormatter(this._hexNumbersFormatter.bind(this));
|
| -
|
| - this._requestTraceLog(0);
|
| -}
|
| -
|
| -/**
|
| - * @const
|
| - * @type {number}
|
| - */
|
| -WebInspector.CanvasProfileView.TraceLogPollingInterval = 500;
|
| -
|
| -WebInspector.CanvasProfileView.prototype = {
|
| - dispose: function()
|
| - {
|
| - this._linkifier.reset();
|
| - },
|
| -
|
| - /**
|
| - * @return {!Array.<!WebInspector.StatusBarItem>}
|
| - */
|
| - statusBarItems: function()
|
| - {
|
| - return [];
|
| - },
|
| -
|
| - get profile()
|
| - {
|
| - return this._profile;
|
| - },
|
| -
|
| - _onReplayImageResize: function()
|
| - {
|
| - var parent = this._replayImageElement.parentElement;
|
| - this._replayImageElement.style.maxWidth = (parent.clientWidth - 1) + "px";
|
| - this._replayImageElement.style.maxHeight = (parent.clientHeight - 1) + "px";
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array.<!Element>}
|
| - */
|
| - elementsToRestoreScrollPositionsFor: function()
|
| - {
|
| - return [this._logGrid.scrollContainer];
|
| - },
|
| -
|
| - /**
|
| - * @param {!Element} replayLogElement
|
| - */
|
| - _installReplayInfoSidebarWidgets: function(replayLogElement)
|
| - {
|
| - this._replayInfoResizeWidgetElement = replayLogElement.createChild("div", "resizer-widget");
|
| - this._replayInfoSplitView.addEventListener(WebInspector.SplitView.Events.ShowModeChanged, this._updateReplayInfoResizeWidget, this);
|
| - this._updateReplayInfoResizeWidget();
|
| - this._replayInfoSplitView.installResizer(this._replayInfoResizeWidgetElement);
|
| - },
|
| -
|
| - _updateReplayInfoResizeWidget: function()
|
| - {
|
| - this._replayInfoResizeWidgetElement.classList.toggle("hidden", this._replayInfoSplitView.showMode() !== WebInspector.SplitView.ShowMode.Both);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - _onMouseClick: function(event)
|
| - {
|
| - var resourceLinkElement = event.target.enclosingNodeOrSelfWithClass("canvas-formatted-resource");
|
| - if (resourceLinkElement) {
|
| - this._replayInfoSplitView.showBoth();
|
| - this._replayStateView.selectResource(resourceLinkElement.__resourceId);
|
| - event.consume(true);
|
| - return;
|
| - }
|
| - if (event.target.enclosingNodeOrSelfWithClass("webkit-html-resource-link"))
|
| - event.consume(false);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.StatusBar} toolbar
|
| - * @param {string} className
|
| - * @param {string} title
|
| - * @param {function(this:WebInspector.CanvasProfileView)} clickCallback
|
| - */
|
| - _createControlButton: function(toolbar, className, title, clickCallback)
|
| - {
|
| - var button = new WebInspector.StatusBarButton(title, className + " canvas-replay-button");
|
| - toolbar.appendStatusBarItem(button);
|
| -
|
| - button.makeLongClickEnabled();
|
| - button.addEventListener("click", clickCallback, this);
|
| - button.addEventListener("longClickDown", clickCallback, this);
|
| - button.addEventListener("longClickPress", clickCallback, this);
|
| - },
|
| -
|
| - _onReplayContextChanged: function()
|
| - {
|
| - var selectedContextId = this._replayContextSelector.selectedOption().value;
|
| -
|
| - /**
|
| - * @param {?CanvasAgent.ResourceState} resourceState
|
| - * @this {WebInspector.CanvasProfileView}
|
| - */
|
| - function didReceiveResourceState(resourceState)
|
| - {
|
| - this._enableWaitIcon(false);
|
| - if (selectedContextId !== this._replayContextSelector.selectedOption().value)
|
| - return;
|
| - var imageURL = (resourceState && resourceState.imageURL) || "";
|
| - this._replayImageElement.src = imageURL;
|
| - this._replayImageElement.style.visibility = imageURL ? "" : "hidden";
|
| - }
|
| -
|
| - this._enableWaitIcon(true);
|
| - this._traceLogPlayer.getResourceState(selectedContextId, didReceiveResourceState.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} forward
|
| - */
|
| - _onReplayStepClick: function(forward)
|
| - {
|
| - var selectedNode = this._logGrid.selectedNode;
|
| - if (!selectedNode)
|
| - return;
|
| - var nextNode = selectedNode;
|
| - do {
|
| - nextNode = forward ? nextNode.traverseNextNode(false) : nextNode.traversePreviousNode(false);
|
| - } while (nextNode && typeof nextNode.index !== "number");
|
| - (nextNode || selectedNode).revealAndSelect();
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} forward
|
| - */
|
| - _onReplayDrawingCallClick: function(forward)
|
| - {
|
| - var selectedNode = this._logGrid.selectedNode;
|
| - if (!selectedNode)
|
| - return;
|
| - var nextNode = selectedNode;
|
| - while (nextNode) {
|
| - var sibling = forward ? nextNode.nextSibling : nextNode.previousSibling;
|
| - if (sibling) {
|
| - nextNode = sibling;
|
| - if (nextNode.hasChildren || nextNode.call.isDrawingCall)
|
| - break;
|
| - } else {
|
| - nextNode = nextNode.parent;
|
| - if (!forward)
|
| - break;
|
| - }
|
| - }
|
| - if (!nextNode && forward)
|
| - this._onReplayLastStepClick();
|
| - else
|
| - (nextNode || selectedNode).revealAndSelect();
|
| - },
|
| -
|
| - _onReplayFirstStepClick: function()
|
| - {
|
| - var firstNode = this._logGrid.rootNode().children[0];
|
| - if (firstNode)
|
| - firstNode.revealAndSelect();
|
| - },
|
| -
|
| - _onReplayLastStepClick: function()
|
| - {
|
| - var lastNode = this._logGrid.rootNode().children.peekLast();
|
| - if (!lastNode)
|
| - return;
|
| - while (lastNode.expanded) {
|
| - var lastChild = lastNode.children.peekLast();
|
| - if (!lastChild)
|
| - break;
|
| - lastNode = lastChild;
|
| - }
|
| - lastNode.revealAndSelect();
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} enable
|
| - */
|
| - _enableWaitIcon: function(enable)
|
| - {
|
| - this._spinnerIcon.classList.toggle("hidden", !enable);
|
| - this._debugInfoElement.classList.toggle("hidden", enable);
|
| - },
|
| -
|
| - _replayTraceLog: function()
|
| - {
|
| - if (this._pendingReplayTraceLogEvent)
|
| - return;
|
| - var index = this._selectedCallIndex();
|
| - if (index === -1 || index === this._lastReplayCallIndex)
|
| - return;
|
| - this._lastReplayCallIndex = index;
|
| - this._pendingReplayTraceLogEvent = true;
|
| -
|
| - /**
|
| - * @param {?CanvasAgent.ResourceState} resourceState
|
| - * @param {number} replayTime
|
| - * @this {WebInspector.CanvasProfileView}
|
| - */
|
| - function didReplayTraceLog(resourceState, replayTime)
|
| - {
|
| - delete this._pendingReplayTraceLogEvent;
|
| - this._enableWaitIcon(false);
|
| -
|
| - this._debugInfoElement.textContent = WebInspector.UIString("Replay time: %s", Number.secondsToString(replayTime / 1000, true));
|
| - this._onReplayContextChanged();
|
| -
|
| - if (index !== this._selectedCallIndex())
|
| - this._replayTraceLog();
|
| - }
|
| - this._enableWaitIcon(true);
|
| - this._traceLogPlayer.replayTraceLog(index, didReplayTraceLog.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @param {number} offset
|
| - */
|
| - _requestTraceLog: function(offset)
|
| - {
|
| - /**
|
| - * @param {?CanvasAgent.TraceLog} traceLog
|
| - * @this {WebInspector.CanvasProfileView}
|
| - */
|
| - function didReceiveTraceLog(traceLog)
|
| - {
|
| - this._enableWaitIcon(false);
|
| - if (!traceLog)
|
| - return;
|
| - var callNodes = [];
|
| - var calls = traceLog.calls;
|
| - var index = traceLog.startOffset;
|
| - for (var i = 0, n = calls.length; i < n; ++i)
|
| - callNodes.push(this._createCallNode(index++, calls[i]));
|
| - var contexts = traceLog.contexts;
|
| - for (var i = 0, n = contexts.length; i < n; ++i) {
|
| - var contextId = contexts[i].resourceId || "";
|
| - var description = contexts[i].description || "";
|
| - if (this._replayContexts[contextId])
|
| - continue;
|
| - this._replayContexts[contextId] = true;
|
| - this._replayContextSelector.createOption(description, WebInspector.UIString("Show screenshot of this context's canvas."), contextId);
|
| - }
|
| - this._appendCallNodes(callNodes);
|
| - if (traceLog.alive)
|
| - setTimeout(this._requestTraceLog.bind(this, index), WebInspector.CanvasProfileView.TraceLogPollingInterval);
|
| - else
|
| - this._flattenSingleFrameNode();
|
| - this._profile._updateCapturingStatus(traceLog);
|
| - this._onReplayLastStepClick(); // Automatically replay the last step.
|
| - }
|
| - this._enableWaitIcon(true);
|
| - this._traceLogPlayer.getTraceLog(offset, undefined, didReceiveTraceLog.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @return {number}
|
| - */
|
| - _selectedCallIndex: function()
|
| - {
|
| - var node = this._logGrid.selectedNode;
|
| - return node ? this._peekLastRecursively(node).index : -1;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.DataGridNode} node
|
| - * @return {!WebInspector.DataGridNode}
|
| - */
|
| - _peekLastRecursively: function(node)
|
| - {
|
| - var lastChild;
|
| - while ((lastChild = node.children.peekLast()))
|
| - node = lastChild;
|
| - return node;
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array.<!WebInspector.DataGridNode>} callNodes
|
| - */
|
| - _appendCallNodes: function(callNodes)
|
| - {
|
| - var rootNode = this._logGrid.rootNode();
|
| - var frameNode = rootNode.children.peekLast();
|
| - if (frameNode && this._peekLastRecursively(frameNode).call.isFrameEndCall)
|
| - frameNode = null;
|
| - for (var i = 0, n = callNodes.length; i < n; ++i) {
|
| - if (!frameNode) {
|
| - var index = rootNode.children.length;
|
| - var data = {};
|
| - data[0] = "";
|
| - data[1] = WebInspector.UIString("Frame #%d", index + 1);
|
| - data[2] = "";
|
| - frameNode = new WebInspector.DataGridNode(data);
|
| - frameNode.selectable = true;
|
| - rootNode.appendChild(frameNode);
|
| - }
|
| - var nextFrameCallIndex = i + 1;
|
| - while (nextFrameCallIndex < n && !callNodes[nextFrameCallIndex - 1].call.isFrameEndCall)
|
| - ++nextFrameCallIndex;
|
| - this._appendCallNodesToFrameNode(frameNode, callNodes, i, nextFrameCallIndex);
|
| - i = nextFrameCallIndex - 1;
|
| - frameNode = null;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.DataGridNode} frameNode
|
| - * @param {!Array.<!WebInspector.DataGridNode>} callNodes
|
| - * @param {number} fromIndex
|
| - * @param {number} toIndex not inclusive
|
| - */
|
| - _appendCallNodesToFrameNode: function(frameNode, callNodes, fromIndex, toIndex)
|
| - {
|
| - var self = this;
|
| - function appendDrawCallGroup()
|
| - {
|
| - var index = self._drawCallGroupsCount || 0;
|
| - var data = {};
|
| - data[0] = "";
|
| - data[1] = WebInspector.UIString("Draw call group #%d", index + 1);
|
| - data[2] = "";
|
| - var node = new WebInspector.DataGridNode(data);
|
| - node.selectable = true;
|
| - self._drawCallGroupsCount = index + 1;
|
| - frameNode.appendChild(node);
|
| - return node;
|
| - }
|
| -
|
| - function splitDrawCallGroup(drawCallGroup)
|
| - {
|
| - var splitIndex = 0;
|
| - var splitNode;
|
| - while ((splitNode = drawCallGroup.children[splitIndex])) {
|
| - if (splitNode.call.isDrawingCall)
|
| - break;
|
| - ++splitIndex;
|
| - }
|
| - var newDrawCallGroup = appendDrawCallGroup();
|
| - var lastNode;
|
| - while ((lastNode = drawCallGroup.children[splitIndex + 1]))
|
| - newDrawCallGroup.appendChild(lastNode);
|
| - return newDrawCallGroup;
|
| - }
|
| -
|
| - var drawCallGroup = frameNode.children.peekLast();
|
| - var groupHasDrawCall = false;
|
| - if (drawCallGroup) {
|
| - for (var i = 0, n = drawCallGroup.children.length; i < n; ++i) {
|
| - if (drawCallGroup.children[i].call.isDrawingCall) {
|
| - groupHasDrawCall = true;
|
| - break;
|
| - }
|
| - }
|
| - } else
|
| - drawCallGroup = appendDrawCallGroup();
|
| -
|
| - for (var i = fromIndex; i < toIndex; ++i) {
|
| - var node = callNodes[i];
|
| - drawCallGroup.appendChild(node);
|
| - if (node.call.isDrawingCall) {
|
| - if (groupHasDrawCall)
|
| - drawCallGroup = splitDrawCallGroup(drawCallGroup);
|
| - else
|
| - groupHasDrawCall = true;
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {number} index
|
| - * @param {!CanvasAgent.Call} call
|
| - * @return {!WebInspector.DataGridNode}
|
| - */
|
| - _createCallNode: function(index, call)
|
| - {
|
| - var callViewElement = createElement("div");
|
| -
|
| - var data = {};
|
| - data[0] = index + 1;
|
| - data[1] = callViewElement;
|
| - data[2] = "";
|
| - if (call.sourceURL) {
|
| - // FIXME(62725): stack trace line/column numbers are one-based.
|
| - var lineNumber = Math.max(0, call.lineNumber - 1) || 0;
|
| - var columnNumber = Math.max(0, call.columnNumber - 1) || 0;
|
| - data[2] = this._linkifier.linkifyScriptLocation(this._profile.target(), null, call.sourceURL, lineNumber, columnNumber);
|
| - }
|
| -
|
| - var node = new WebInspector.DataGridNode(data);
|
| - node.index = index;
|
| - node.selectable = true;
|
| - node.call = call;
|
| -
|
| - callViewElement.createChild("span", "canvas-function-name").textContent = call.functionName || "context." + call.property;
|
| - var target = this._profile.target();
|
| - if (!target)
|
| - return node;
|
| -
|
| - if (call.arguments) {
|
| - callViewElement.createTextChild("(");
|
| - for (var i = 0, n = call.arguments.length; i < n; ++i) {
|
| - var argument = /** @type {!CanvasAgent.CallArgument} */ (call.arguments[i]);
|
| - if (i)
|
| - callViewElement.createTextChild(", ");
|
| - var element = WebInspector.CanvasProfileDataGridHelper.createCallArgumentElement(target, argument);
|
| - element.__argumentIndex = i;
|
| - callViewElement.appendChild(element);
|
| - }
|
| - callViewElement.createTextChild(")");
|
| - } else if (call.value) {
|
| - callViewElement.createTextChild(" = ");
|
| - callViewElement.appendChild(WebInspector.CanvasProfileDataGridHelper.createCallArgumentElement(target, call.value));
|
| - }
|
| -
|
| - if (call.result) {
|
| - callViewElement.createTextChild(" => ");
|
| - callViewElement.appendChild(WebInspector.CanvasProfileDataGridHelper.createCallArgumentElement(target, call.result));
|
| - }
|
| -
|
| - return node;
|
| - },
|
| -
|
| - /**
|
| - * @param {!Element} element
|
| - * @param {!Event} event
|
| - * @return {!Element|!AnchorBox|undefined}
|
| - */
|
| - _popoverAnchor: function(element, event)
|
| - {
|
| - var argumentElement = element.enclosingNodeOrSelfWithClass("canvas-call-argument");
|
| - if (!argumentElement || argumentElement.__suppressPopover)
|
| - return;
|
| - return argumentElement;
|
| - },
|
| -
|
| - _resolveObjectForPopover: function(argumentElement, showCallback, objectGroupName)
|
| - {
|
| - /**
|
| - * @param {?Protocol.Error} error
|
| - * @param {!RuntimeAgent.RemoteObject=} result
|
| - * @param {!CanvasAgent.ResourceState=} resourceState
|
| - * @this {WebInspector.CanvasProfileView}
|
| - */
|
| - function showObjectPopover(error, result, resourceState)
|
| - {
|
| - if (error)
|
| - return;
|
| -
|
| - // FIXME: handle resourceState also
|
| - if (!result)
|
| - return;
|
| -
|
| - this._popoverAnchorElement = argumentElement.cloneNode(true);
|
| - this._popoverAnchorElement.classList.add("canvas-popover-anchor");
|
| - this._popoverAnchorElement.classList.add("source-frame-eval-expression");
|
| - argumentElement.parentElement.appendChild(this._popoverAnchorElement);
|
| -
|
| - var diffLeft = this._popoverAnchorElement.boxInWindow().x - argumentElement.boxInWindow().x;
|
| - this._popoverAnchorElement.style.left = this._popoverAnchorElement.offsetLeft - diffLeft + "px";
|
| -
|
| - showCallback(this._profile.target().runtimeModel.createRemoteObject(result), false, this._popoverAnchorElement);
|
| - }
|
| -
|
| - var evalResult = argumentElement.__evalResult;
|
| - if (evalResult)
|
| - showObjectPopover.call(this, null, evalResult);
|
| - else {
|
| - var dataGridNode = this._logGrid.dataGridNodeFromNode(argumentElement);
|
| - if (!dataGridNode || typeof dataGridNode.index !== "number") {
|
| - this._popoverHelper.hidePopover();
|
| - return;
|
| - }
|
| - var callIndex = dataGridNode.index;
|
| - var argumentIndex = argumentElement.__argumentIndex;
|
| - if (typeof argumentIndex !== "number")
|
| - argumentIndex = -1;
|
| - this._profile.target().canvasAgent().evaluateTraceLogCallArgument(this._traceLogId, callIndex, argumentIndex, objectGroupName, showObjectPopover.bind(this));
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} object
|
| - * @return {string}
|
| - */
|
| - _hexNumbersFormatter: function(object)
|
| - {
|
| - if (object.type === "number") {
|
| - // Show enum values in hex with min length of 4 (e.g. 0x0012).
|
| - var str = "0000" + Number(object.description).toString(16).toUpperCase();
|
| - str = str.replace(/^0+(.{4,})$/, "$1");
|
| - return "0x" + str;
|
| - }
|
| - return object.description || "";
|
| - },
|
| -
|
| - _onHidePopover: function()
|
| - {
|
| - if (this._popoverAnchorElement) {
|
| - this._popoverAnchorElement.remove();
|
| - delete this._popoverAnchorElement;
|
| - }
|
| - },
|
| -
|
| - _flattenSingleFrameNode: function()
|
| - {
|
| - var rootNode = this._logGrid.rootNode();
|
| - if (rootNode.children.length !== 1)
|
| - return;
|
| - var frameNode = rootNode.children[0];
|
| - while (frameNode.children[0])
|
| - rootNode.appendChild(frameNode.children[0]);
|
| - rootNode.removeChild(frameNode);
|
| - },
|
| -
|
| - __proto__: WebInspector.VBox.prototype
|
| -}
|
| -
|
| -/**
|
| - * @constructor
|
| - * @implements {WebInspector.TargetManager.Observer}
|
| - * @extends {WebInspector.ProfileType}
|
| - */
|
| -WebInspector.CanvasProfileType = function()
|
| -{
|
| - WebInspector.ProfileType.call(this, WebInspector.CanvasProfileType.TypeId, WebInspector.UIString("Capture Canvas Frame"));
|
| - this._recording = false;
|
| - this._lastProfileHeader = null;
|
| -
|
| - this._capturingModeSelector = new WebInspector.StatusBarComboBox(this._dispatchViewUpdatedEvent.bind(this));
|
| - this._capturingModeSelector.element.title = WebInspector.UIString("Canvas capture mode.");
|
| - this._capturingModeSelector.createOption(WebInspector.UIString("Single Frame"), WebInspector.UIString("Capture a single canvas frame."), "");
|
| - this._capturingModeSelector.createOption(WebInspector.UIString("Consecutive Frames"), WebInspector.UIString("Capture consecutive canvas frames."), "1");
|
| -
|
| - /** @type {!Object.<string, !Element>} */
|
| - this._frameOptions = {};
|
| -
|
| - /** @type {!Object.<string, boolean>} */
|
| - this._framesWithCanvases = {};
|
| -
|
| - this._frameSelector = new WebInspector.StatusBarComboBox(this._dispatchViewUpdatedEvent.bind(this));
|
| - this._frameSelector.element.title = WebInspector.UIString("Frame containing the canvases to capture.");
|
| - this._frameSelector.element.classList.add("hidden");
|
| -
|
| - this._target = null;
|
| - WebInspector.targetManager.observeTargets(this);
|
| -
|
| - this._canvasAgentEnabled = false;
|
| -
|
| - this._decorationElement = createElement("div");
|
| - this._decorationElement.className = "profile-canvas-decoration";
|
| - this._updateDecorationElement();
|
| -}
|
| -
|
| -WebInspector.CanvasProfileType.TypeId = "CANVAS_PROFILE";
|
| -
|
| -WebInspector.CanvasProfileType.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.Target} target
|
| - */
|
| - targetAdded: function(target)
|
| - {
|
| - if (this._target || target !== WebInspector.targetManager.mainTarget())
|
| - return;
|
| - this._target = target;
|
| - this._target.resourceTreeModel.frames().forEach(this._addFrame, this);
|
| - this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameAdded, this._frameAdded, this);
|
| - this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, this._frameRemoved, this);
|
| - new WebInspector.CanvasDispatcher(this._target, this);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.Target} target
|
| - */
|
| - targetRemoved: function(target)
|
| - {
|
| - if (this._target !== target)
|
| - return;
|
| - this._target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameAdded, this._frameAdded, this);
|
| - this._target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, this._frameRemoved, this);
|
| - this._target = null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array.<!WebInspector.StatusBarItem>}
|
| - */
|
| - statusBarItems: function()
|
| - {
|
| - return [this._capturingModeSelector, this._frameSelector];
|
| - },
|
| -
|
| - get buttonTooltip()
|
| - {
|
| - if (this._isSingleFrameMode())
|
| - return WebInspector.UIString("Capture next canvas frame.");
|
| - else
|
| - return this._recording ? WebInspector.UIString("Stop capturing canvas frames.") : WebInspector.UIString("Start capturing canvas frames.");
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - buttonClicked: function()
|
| - {
|
| - if (!this._canvasAgentEnabled)
|
| - return false;
|
| - if (this._recording) {
|
| - this._recording = false;
|
| - this._stopFrameCapturing();
|
| - } else if (this._isSingleFrameMode()) {
|
| - this._recording = false;
|
| - this._runSingleFrameCapturing();
|
| - } else {
|
| - this._recording = true;
|
| - this._startFrameCapturing();
|
| - }
|
| - return this._recording;
|
| - },
|
| -
|
| - _runSingleFrameCapturing: function()
|
| - {
|
| - var frameId = this._selectedFrameId();
|
| - WebInspector.targetManager.suspendAllTargets();
|
| - if (this._target)
|
| - this._target.canvasAgent().captureFrame(frameId, this._didStartCapturingFrame.bind(this, frameId));
|
| - WebInspector.targetManager.resumeAllTargets();
|
| - },
|
| -
|
| - _startFrameCapturing: function()
|
| - {
|
| - var frameId = this._selectedFrameId();
|
| - WebInspector.targetManager.suspendAllTargets();
|
| - this._target.canvasAgent().startCapturing(frameId, this._didStartCapturingFrame.bind(this, frameId));
|
| - },
|
| -
|
| - _stopFrameCapturing: function()
|
| - {
|
| - if (!this._lastProfileHeader) {
|
| - WebInspector.targetManager.resumeAllTargets();
|
| - return;
|
| - }
|
| - var profileHeader = this._lastProfileHeader;
|
| - var traceLogId = profileHeader.traceLogId();
|
| - this._lastProfileHeader = null;
|
| - function didStopCapturing()
|
| - {
|
| - profileHeader._updateCapturingStatus();
|
| - }
|
| - if (this._target)
|
| - this._target.canvasAgent().stopCapturing(traceLogId, didStopCapturing);
|
| - WebInspector.targetManager.resumeAllTargets();
|
| - },
|
| -
|
| - /**
|
| - * @param {string|undefined} frameId
|
| - * @param {?Protocol.Error} error
|
| - * @param {!CanvasAgent.TraceLogId} traceLogId
|
| - */
|
| - _didStartCapturingFrame: function(frameId, error, traceLogId)
|
| - {
|
| - if (error || this._lastProfileHeader && this._lastProfileHeader.traceLogId() === traceLogId || !this._target)
|
| - return;
|
| - var profileHeader = new WebInspector.CanvasProfileHeader(this._target, this, traceLogId, frameId);
|
| - this._lastProfileHeader = profileHeader;
|
| - this.addProfile(profileHeader);
|
| - profileHeader._updateCapturingStatus();
|
| - },
|
| -
|
| - get treeItemTitle()
|
| - {
|
| - return WebInspector.UIString("CANVAS PROFILE");
|
| - },
|
| -
|
| - get description()
|
| - {
|
| - return WebInspector.UIString("Canvas calls instrumentation");
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Element}
|
| - */
|
| - decorationElement: function()
|
| - {
|
| - return this._decorationElement;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ProfileHeader} profile
|
| - */
|
| - removeProfile: function(profile)
|
| - {
|
| - WebInspector.ProfileType.prototype.removeProfile.call(this, profile);
|
| - if (this._recording && profile === this._lastProfileHeader)
|
| - this._recording = false;
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean=} forcePageReload
|
| - */
|
| - _updateDecorationElement: function(forcePageReload)
|
| - {
|
| - this._decorationElement.removeChildren();
|
| - this._decorationElement.createChild("label", "", "dt-icon-label").type = "warning-icon";
|
| - this._decorationElement.createTextChild(this._canvasAgentEnabled ? WebInspector.UIString("Canvas Profiler is enabled.") : WebInspector.UIString("Canvas Profiler is disabled."));
|
| - var button = createTextButton(this._canvasAgentEnabled ? WebInspector.UIString("Disable") : WebInspector.UIString("Enable"), this._onProfilerEnableButtonClick.bind(this, !this._canvasAgentEnabled));
|
| - this._decorationElement.appendChild(button);
|
| -
|
| - var target = this._target;
|
| - if (!target)
|
| - return;
|
| -
|
| - /**
|
| - * @param {?Protocol.Error} error
|
| - * @param {boolean} result
|
| - */
|
| - function hasUninstrumentedCanvasesCallback(error, result)
|
| - {
|
| - if (error || result)
|
| - target.resourceTreeModel.reloadPage();
|
| - }
|
| -
|
| - if (forcePageReload) {
|
| - if (this._canvasAgentEnabled) {
|
| - target.canvasAgent().hasUninstrumentedCanvases(hasUninstrumentedCanvasesCallback);
|
| - } else {
|
| - for (var frameId in this._framesWithCanvases) {
|
| - if (this._framesWithCanvases.hasOwnProperty(frameId)) {
|
| - target.resourceTreeModel.reloadPage();
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {boolean} enable
|
| - */
|
| - _onProfilerEnableButtonClick: function(enable)
|
| - {
|
| - if (this._canvasAgentEnabled === enable || !this._target)
|
| - return;
|
| -
|
| - /**
|
| - * @param {?Protocol.Error} error
|
| - * @this {WebInspector.CanvasProfileType}
|
| - */
|
| - function callback(error)
|
| - {
|
| - if (error)
|
| - return;
|
| - this._canvasAgentEnabled = enable;
|
| - this._updateDecorationElement(true);
|
| - this._dispatchViewUpdatedEvent();
|
| - }
|
| - if (enable)
|
| - this._target.canvasAgent().enable(callback.bind(this));
|
| - else
|
| - this._target.canvasAgent().disable(callback.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - _isSingleFrameMode: function()
|
| - {
|
| - return !this._capturingModeSelector.selectedOption().value;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _frameAdded: function(event)
|
| - {
|
| - var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data);
|
| - this._addFrame(frame);
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.ResourceTreeFrame} frame
|
| - */
|
| - _addFrame: function(frame)
|
| - {
|
| - var frameId = frame.id;
|
| - var option = createElement("option");
|
| - option.text = frame.displayName();
|
| - option.title = frame.url;
|
| - option.value = frameId;
|
| -
|
| - this._frameOptions[frameId] = option;
|
| -
|
| - if (this._framesWithCanvases[frameId]) {
|
| - this._frameSelector.addOption(option);
|
| - this._dispatchViewUpdatedEvent();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Event} event
|
| - */
|
| - _frameRemoved: function(event)
|
| - {
|
| - var frame = /** @type {!WebInspector.ResourceTreeFrame} */ (event.data);
|
| - var frameId = frame.id;
|
| - var option = this._frameOptions[frameId];
|
| - if (option && this._framesWithCanvases[frameId]) {
|
| - this._frameSelector.removeOption(option);
|
| - this._dispatchViewUpdatedEvent();
|
| - }
|
| - delete this._frameOptions[frameId];
|
| - delete this._framesWithCanvases[frameId];
|
| - },
|
| -
|
| - /**
|
| - * @param {string} frameId
|
| - */
|
| - _contextCreated: function(frameId)
|
| - {
|
| - if (this._framesWithCanvases[frameId])
|
| - return;
|
| - this._framesWithCanvases[frameId] = true;
|
| - var option = this._frameOptions[frameId];
|
| - if (option) {
|
| - this._frameSelector.addOption(option);
|
| - this._dispatchViewUpdatedEvent();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!PageAgent.FrameId=} frameId
|
| - * @param {!CanvasAgent.TraceLogId=} traceLogId
|
| - */
|
| - _traceLogsRemoved: function(frameId, traceLogId)
|
| - {
|
| - var sidebarElementsToDelete = [];
|
| - var sidebarElements = /** @type {!Array.<!WebInspector.ProfileSidebarTreeElement>} */ (this.treeElement ? this.treeElement.children() : []);
|
| - for (var i = 0, n = sidebarElements.length; i < n; ++i) {
|
| - var header = /** @type {!WebInspector.CanvasProfileHeader} */ (sidebarElements[i].profile);
|
| - if (!header)
|
| - continue;
|
| - if (frameId && frameId !== header.frameId())
|
| - continue;
|
| - if (traceLogId && traceLogId !== header.traceLogId())
|
| - continue;
|
| - sidebarElementsToDelete.push(sidebarElements[i]);
|
| - }
|
| - for (var i = 0, n = sidebarElementsToDelete.length; i < n; ++i)
|
| - sidebarElementsToDelete[i].ondelete();
|
| - },
|
| -
|
| - /**
|
| - * @return {string|undefined}
|
| - */
|
| - _selectedFrameId: function()
|
| - {
|
| - var option = this._frameSelector.selectedOption();
|
| - return option ? option.value : undefined;
|
| - },
|
| -
|
| - _dispatchViewUpdatedEvent: function()
|
| - {
|
| - this._frameSelector.element.classList.toggle("hidden", this._frameSelector.size() <= 1);
|
| - this.dispatchEventToListeners(WebInspector.ProfileType.Events.ViewUpdated);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - isInstantProfile: function()
|
| - {
|
| - return this._isSingleFrameMode();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - isEnabled: function()
|
| - {
|
| - return this._canvasAgentEnabled;
|
| - },
|
| -
|
| - __proto__: WebInspector.ProfileType.prototype
|
| -}
|
| -
|
| -/**
|
| - * @constructor
|
| - * @implements {CanvasAgent.Dispatcher}
|
| - * @param {!WebInspector.Target} target
|
| - * @param {!WebInspector.CanvasProfileType} profileType
|
| - */
|
| -WebInspector.CanvasDispatcher = function(target, profileType)
|
| -{
|
| - this._profileType = profileType;
|
| - target.registerCanvasDispatcher(this);
|
| -}
|
| -
|
| -WebInspector.CanvasDispatcher.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {string} frameId
|
| - */
|
| - contextCreated: function(frameId)
|
| - {
|
| - this._profileType._contextCreated(frameId);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!PageAgent.FrameId=} frameId
|
| - * @param {!CanvasAgent.TraceLogId=} traceLogId
|
| - */
|
| - traceLogsRemoved: function(frameId, traceLogId)
|
| - {
|
| - this._profileType._traceLogsRemoved(frameId, traceLogId);
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * @constructor
|
| - * @extends {WebInspector.ProfileHeader}
|
| - * @param {!WebInspector.Target} target
|
| - * @param {!WebInspector.CanvasProfileType} type
|
| - * @param {!CanvasAgent.TraceLogId=} traceLogId
|
| - * @param {!PageAgent.FrameId=} frameId
|
| - */
|
| -WebInspector.CanvasProfileHeader = function(target, type, traceLogId, frameId)
|
| -{
|
| - WebInspector.ProfileHeader.call(this, target, type, WebInspector.UIString("Trace Log %d", type.nextProfileUid()));
|
| - /** @type {!CanvasAgent.TraceLogId} */
|
| - this._traceLogId = traceLogId || "";
|
| - this._frameId = frameId;
|
| - this._alive = true;
|
| - this._traceLogSize = 0;
|
| - this._traceLogPlayer = traceLogId ? new WebInspector.CanvasTraceLogPlayerProxy(target, traceLogId) : null;
|
| -}
|
| -
|
| -WebInspector.CanvasProfileHeader.prototype = {
|
| - /**
|
| - * @return {!CanvasAgent.TraceLogId}
|
| - */
|
| - traceLogId: function()
|
| - {
|
| - return this._traceLogId;
|
| - },
|
| -
|
| - /**
|
| - * @return {?WebInspector.CanvasTraceLogPlayerProxy}
|
| - */
|
| - traceLogPlayer: function()
|
| - {
|
| - return this._traceLogPlayer;
|
| - },
|
| -
|
| - /**
|
| - * @return {!PageAgent.FrameId|undefined}
|
| - */
|
| - frameId: function()
|
| - {
|
| - return this._frameId;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ProfileType.DataDisplayDelegate} panel
|
| - * @return {!WebInspector.ProfileSidebarTreeElement}
|
| - */
|
| - createSidebarTreeElement: function(panel)
|
| - {
|
| - return new WebInspector.ProfileSidebarTreeElement(panel, this, "profile-sidebar-tree-item");
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!WebInspector.CanvasProfileView}
|
| - */
|
| - createView: function()
|
| - {
|
| - return new WebInspector.CanvasProfileView(this);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - */
|
| - dispose: function()
|
| - {
|
| - if (this._traceLogPlayer)
|
| - this._traceLogPlayer.dispose();
|
| - clearTimeout(this._requestStatusTimer);
|
| - this._alive = false;
|
| - },
|
| -
|
| - /**
|
| - * @param {!CanvasAgent.TraceLog=} traceLog
|
| - */
|
| - _updateCapturingStatus: function(traceLog)
|
| - {
|
| - if (!this._traceLogId)
|
| - return;
|
| -
|
| - if (traceLog) {
|
| - this._alive = traceLog.alive;
|
| - this._traceLogSize = traceLog.totalAvailableCalls;
|
| - }
|
| -
|
| - var subtitle = this._alive ? WebInspector.UIString("Capturing\u2026 %d calls", this._traceLogSize) : WebInspector.UIString("Captured %d calls", this._traceLogSize);
|
| - this.updateStatus(subtitle, this._alive);
|
| -
|
| - if (this._alive) {
|
| - clearTimeout(this._requestStatusTimer);
|
| - this._requestStatusTimer = setTimeout(this._requestCapturingStatus.bind(this), WebInspector.CanvasProfileView.TraceLogPollingInterval);
|
| - }
|
| - },
|
| -
|
| - _requestCapturingStatus: function()
|
| - {
|
| - /**
|
| - * @param {?CanvasAgent.TraceLog} traceLog
|
| - * @this {WebInspector.CanvasProfileHeader}
|
| - */
|
| - function didReceiveTraceLog(traceLog)
|
| - {
|
| - if (!traceLog)
|
| - return;
|
| - this._alive = traceLog.alive;
|
| - this._traceLogSize = traceLog.totalAvailableCalls;
|
| - this._updateCapturingStatus();
|
| - }
|
| - this._traceLogPlayer.getTraceLog(0, 0, didReceiveTraceLog.bind(this));
|
| - },
|
| -
|
| - __proto__: WebInspector.ProfileHeader.prototype
|
| -}
|
| -
|
| -WebInspector.CanvasProfileDataGridHelper = {
|
| - /**
|
| - * @param {!WebInspector.Target} target
|
| - * @param {!CanvasAgent.CallArgument} callArgument
|
| - * @return {!Element}
|
| - */
|
| - createCallArgumentElement: function(target, callArgument)
|
| - {
|
| - if (callArgument.enumName)
|
| - return WebInspector.CanvasProfileDataGridHelper.createEnumValueElement(target, callArgument.enumName, +callArgument.description);
|
| - var element = createElement("span");
|
| - element.className = "canvas-call-argument";
|
| - var description = callArgument.description;
|
| - if (callArgument.type === "string") {
|
| - const maxStringLength = 150;
|
| - element.createTextChild("\"");
|
| - element.createChild("span", "canvas-formatted-string").textContent = description.trimMiddle(maxStringLength);
|
| - element.createTextChild("\"");
|
| - element.__suppressPopover = (description.length <= maxStringLength && !/[\r\n]/.test(description));
|
| - if (!element.__suppressPopover)
|
| - element.__evalResult = target.runtimeModel.createRemoteObjectFromPrimitiveValue(description);
|
| - } else {
|
| - var type = callArgument.subtype || callArgument.type;
|
| - if (type) {
|
| - element.classList.add("canvas-formatted-" + type);
|
| - if (["null", "undefined", "boolean", "number"].indexOf(type) >= 0)
|
| - element.__suppressPopover = true;
|
| - }
|
| - element.textContent = description;
|
| - if (callArgument.remoteObject)
|
| - element.__evalResult = target.runtimeModel.createRemoteObject(callArgument.remoteObject);
|
| - }
|
| - if (callArgument.resourceId) {
|
| - element.classList.add("canvas-formatted-resource");
|
| - element.__resourceId = callArgument.resourceId;
|
| - }
|
| - return element;
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Target} target
|
| - * @param {string} enumName
|
| - * @param {number} enumValue
|
| - * @return {!Element}
|
| - */
|
| - createEnumValueElement: function(target, enumName, enumValue)
|
| - {
|
| - var element = createElement("span");
|
| - element.className = "canvas-call-argument canvas-formatted-number";
|
| - element.textContent = enumName;
|
| - element.__evalResult = target.runtimeModel.createRemoteObjectFromPrimitiveValue(enumValue);
|
| - return element;
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * @extends {WebInspector.SDKObject}
|
| - * @constructor
|
| - * @param {!WebInspector.Target} target
|
| - * @param {!CanvasAgent.TraceLogId} traceLogId
|
| - */
|
| -WebInspector.CanvasTraceLogPlayerProxy = function(target, traceLogId)
|
| -{
|
| - WebInspector.SDKObject.call(this, target);
|
| - this._traceLogId = traceLogId;
|
| - /** @type {!Object.<string, !CanvasAgent.ResourceState>} */
|
| - this._currentResourceStates = {};
|
| - /** @type {?CanvasAgent.ResourceId} */
|
| - this._defaultResourceId = null;
|
| -}
|
| -
|
| -/** @enum {string} */
|
| -WebInspector.CanvasTraceLogPlayerProxy.Events = {
|
| - CanvasTraceLogReceived: "CanvasTraceLogReceived",
|
| - CanvasReplayStateChanged: "CanvasReplayStateChanged",
|
| - CanvasResourceStateReceived: "CanvasResourceStateReceived",
|
| -}
|
| -
|
| -WebInspector.CanvasTraceLogPlayerProxy.prototype = {
|
| - /**
|
| - * @param {number|undefined} startOffset
|
| - * @param {number|undefined} maxLength
|
| - * @param {function(?CanvasAgent.TraceLog):void} userCallback
|
| - */
|
| - getTraceLog: function(startOffset, maxLength, userCallback)
|
| - {
|
| - /**
|
| - * @param {?Protocol.Error} error
|
| - * @param {!CanvasAgent.TraceLog} traceLog
|
| - * @this {WebInspector.CanvasTraceLogPlayerProxy}
|
| - */
|
| - function callback(error, traceLog)
|
| - {
|
| - if (error || !traceLog) {
|
| - userCallback(null);
|
| - return;
|
| - }
|
| - userCallback(traceLog);
|
| - this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasTraceLogReceived, traceLog);
|
| - }
|
| - this.target().canvasAgent().getTraceLog(this._traceLogId, startOffset, maxLength, callback.bind(this));
|
| - },
|
| -
|
| - dispose: function()
|
| - {
|
| - this._currentResourceStates = {};
|
| - CanvasAgent.dropTraceLog(this._traceLogId);
|
| - this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasReplayStateChanged);
|
| - },
|
| -
|
| - /**
|
| - * @param {?CanvasAgent.ResourceId} resourceId
|
| - * @param {function(?CanvasAgent.ResourceState):void} userCallback
|
| - */
|
| - getResourceState: function(resourceId, userCallback)
|
| - {
|
| - resourceId = resourceId || this._defaultResourceId;
|
| - if (!resourceId) {
|
| - userCallback(null); // Has not been replayed yet.
|
| - return;
|
| - }
|
| - var effectiveResourceId = /** @type {!CanvasAgent.ResourceId} */ (resourceId);
|
| - if (this._currentResourceStates[effectiveResourceId]) {
|
| - userCallback(this._currentResourceStates[effectiveResourceId]);
|
| - return;
|
| - }
|
| -
|
| - /**
|
| - * @param {?Protocol.Error} error
|
| - * @param {!CanvasAgent.ResourceState} resourceState
|
| - * @this {WebInspector.CanvasTraceLogPlayerProxy}
|
| - */
|
| - function callback(error, resourceState)
|
| - {
|
| - if (error || !resourceState) {
|
| - userCallback(null);
|
| - return;
|
| - }
|
| - this._currentResourceStates[effectiveResourceId] = resourceState;
|
| - userCallback(resourceState);
|
| - this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasResourceStateReceived, resourceState);
|
| - }
|
| - this.target().canvasAgent().getResourceState(this._traceLogId, effectiveResourceId, callback.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * @param {number} index
|
| - * @param {function(?CanvasAgent.ResourceState, number):void} userCallback
|
| - */
|
| - replayTraceLog: function(index, userCallback)
|
| - {
|
| - /**
|
| - * @param {?Protocol.Error} error
|
| - * @param {!CanvasAgent.ResourceState} resourceState
|
| - * @param {number} replayTime
|
| - * @this {WebInspector.CanvasTraceLogPlayerProxy}
|
| - */
|
| - function callback(error, resourceState, replayTime)
|
| - {
|
| - this._currentResourceStates = {};
|
| - if (error) {
|
| - userCallback(null, replayTime);
|
| - } else {
|
| - this._defaultResourceId = resourceState.id;
|
| - this._currentResourceStates[resourceState.id] = resourceState;
|
| - userCallback(resourceState, replayTime);
|
| - }
|
| - this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasReplayStateChanged);
|
| - if (!error)
|
| - this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasResourceStateReceived, resourceState);
|
| - }
|
| - this.target().canvasAgent().replayTraceLog(this._traceLogId, index, callback.bind(this));
|
| - },
|
| -
|
| - clearResourceStates: function()
|
| - {
|
| - this._currentResourceStates = {};
|
| - this.dispatchEventToListeners(WebInspector.CanvasTraceLogPlayerProxy.Events.CanvasReplayStateChanged);
|
| - },
|
| -
|
| - __proto__: WebInspector.SDKObject.prototype
|
| -}
|
|
|