| 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
 | 
| -}
 | 
| 
 |