1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions are
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * in the documentation and/or other materials provided with the
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * distribution.
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * this software without specific prior written permission.
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
30926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
31926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
32926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
33926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.MemoryStatistics}
34926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {WebInspector.TimelinePanel} timelinePanel
35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {WebInspector.TimelineModel} model
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {number} sidebarWidth
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DOMCountersGraph = function(timelinePanel, model, sidebarWidth)
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.MemoryStatistics.call(this, timelinePanel, model, sidebarWidth);
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.CounterUIBase}
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {WebInspector.DOMCountersGraph} memoryCountersPane
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {string} title
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {string} currentValueLabel
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {Array.<number>} rgb
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {function(WebInspector.DOMCountersGraph.Counter):number} valueGetter
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DOMCounterUI = function(memoryCountersPane, title, currentValueLabel, rgb, valueGetter)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    var swatchColor = "rgb(" + rgb.join(",") + ")";
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.CounterUIBase.call(this, memoryCountersPane, title, swatchColor, valueGetter)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._range = this._swatch.element.createChild("span");
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._value = memoryCountersPane._currentValuesBar.createChild("span", "memory-counter-value");
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._value.style.color = swatchColor;
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._currentValueLabel = currentValueLabel;
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.graphColor = "rgba(" + rgb.join(",") + ",0.8)";
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.graphYValues = [];
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.MemoryStatistics.Counter}
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {number} time
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {number} documentCount
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {number} nodeCount
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {number} listenerCount
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DOMCountersGraph.Counter = function(time, documentCount, nodeCount, listenerCount)
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.MemoryStatistics.Counter.call(this, time);
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.documentCount = documentCount;
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.nodeCount = nodeCount;
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.listenerCount = listenerCount;
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DOMCounterUI.prototype = {
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} minValue
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} maxValue
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setRange: function(minValue, maxValue)
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._range.textContent = WebInspector.UIString("[ %d - %d ]", minValue, maxValue);
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    updateCurrentValue: function(countersEntry)
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._value.textContent =  WebInspector.UIString(this._currentValueLabel, this.valueGetter(countersEntry));
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    clearCurrentValueAndMarker: function(ctx)
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._value.textContent = "";
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.restoreImageUnderMarker(ctx);
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {CanvasRenderingContext2D} ctx
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} x
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} y
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} radius
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    saveImageUnderMarker: function(ctx, x, y, radius)
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const w = radius + 1;
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var imageData = ctx.getImageData(x - w, y - w, 2 * w, 2 * w);
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._imageUnderMarker = {
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            x: x - w,
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            y: y - w,
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            imageData: imageData
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        };
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {CanvasRenderingContext2D} ctx
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    restoreImageUnderMarker: function(ctx)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!this.visible)
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._imageUnderMarker)
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.putImageData(this._imageUnderMarker.imageData, this._imageUnderMarker.x, this._imageUnderMarker.y);
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.discardImageUnderMarker();
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    discardImageUnderMarker: function()
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        delete this._imageUnderMarker;
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.CounterUIBase.prototype
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DOMCountersGraph.prototype = {
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _createCurrentValuesBar: function()
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._currentValuesBar = this._canvasContainer.createChild("div");
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._currentValuesBar.id = "counter-values-bar";
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._canvasContainer.addStyleClass("dom-counters");
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {Array.<WebInspector.DOMCounterUI>}
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _createCounterUIList: function()
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function getDocumentCount(entry)
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return entry.documentCount;
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function getNodeCount(entry)
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return entry.nodeCount;
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function getListenerCount(entry)
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return entry.listenerCount;
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return [
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            new WebInspector.DOMCounterUI(this, "Document Count", "Documents: %d", [100, 0, 0], getDocumentCount),
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            new WebInspector.DOMCounterUI(this, "DOM Node Count", "Nodes: %d", [0, 100, 0], getNodeCount),
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            new WebInspector.DOMCounterUI(this, "Event Listener Count", "Listeners: %d", [0, 0, 100], getListenerCount)
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ];
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _canvasHeight: function()
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._canvasContainer.offsetHeight - this._currentValuesBar.offsetHeight;
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {WebInspector.Event} event
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _onRecordAdded: function(event)
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function addStatistics(record)
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var counters = record["counters"];
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!counters)
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return;
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._counters.push(new WebInspector.DOMCountersGraph.Counter(
189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                record.endTime || record.startTime,
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                counters["documents"],
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                counters["nodes"],
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                counters["jsEventListeners"]
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ));
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.TimelinePresentationModel.forAllRecords([event.data], null, addStatistics.bind(this));
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _draw: function()
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.MemoryStatistics.prototype._draw.call(this);
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < this._counterUI.length; i++)
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._drawGraph(this._counterUI[i]);
203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {CanvasRenderingContext2D} ctx
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _restoreImageUnderMarker: function(ctx)
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < this._counterUI.length; i++) {
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var counterUI = this._counterUI[i];
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!counterUI.visible)
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            counterUI.restoreImageUnderMarker(ctx);
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {CanvasRenderingContext2D} ctx
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} x
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} index
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _saveImageUnderMarker: function(ctx, x, index)
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const radius = 2;
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < this._counterUI.length; i++) {
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var counterUI = this._counterUI[i];
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!counterUI.visible)
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var y = counterUI.graphYValues[index];
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            counterUI.saveImageUnderMarker(ctx, x, y, radius);
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {CanvasRenderingContext2D} ctx
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} x
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} index
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _drawMarker: function(ctx, x, index)
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._saveImageUnderMarker(ctx, x, index);
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const radius = 2;
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < this._counterUI.length; i++) {
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var counterUI = this._counterUI[i];
246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!counterUI.visible)
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                continue;
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var y = counterUI.graphYValues[index];
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.beginPath();
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.arc(x, y, radius, 0, Math.PI * 2, true);
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.lineWidth = 1;
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.fillStyle = counterUI.graphColor;
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.strokeStyle = counterUI.graphColor;
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.fill();
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.stroke();
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            ctx.closePath();
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {WebInspector.CounterUIBase} counterUI
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _drawGraph: function(counterUI)
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var canvas = this._canvas;
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var ctx = canvas.getContext("2d");
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var width = canvas.width;
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var height = this._clippedHeight;
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var originY = this._originY;
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var valueGetter = counterUI.valueGetter;
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!this._counters.length)
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var maxValue;
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var minValue;
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = this._minimumIndex; i <= this._maximumIndex; i++) {
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var value = valueGetter(this._counters[i]);
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (minValue === undefined || value < minValue)
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                minValue = value;
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (maxValue === undefined || value > maxValue)
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                maxValue = value;
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        counterUI.setRange(minValue, maxValue);
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!counterUI.visible)
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var yValues = counterUI.graphYValues;
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        yValues.length = this._counters.length;
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var maxYRange = maxValue - minValue;
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var yFactor = maxYRange ? height / (maxYRange) : 1;
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ctx.beginPath();
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var currentY = originY + (height - (valueGetter(this._counters[this._minimumIndex]) - minValue) * yFactor);
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ctx.moveTo(0, currentY);
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = this._minimumIndex; i <= this._maximumIndex; i++) {
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             var x = this._counters[i].x;
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             ctx.lineTo(x, currentY);
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             currentY = originY + (height - (valueGetter(this._counters[i]) - minValue) * yFactor);
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             ctx.lineTo(x, currentY);
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)             yValues[i] = currentY;
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ctx.lineTo(width, currentY);
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ctx.lineWidth = 1;
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ctx.strokeStyle = counterUI.graphColor;
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ctx.stroke();
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ctx.closePath();
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _discardImageUnderMarker: function()
315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < this._counterUI.length; i++)
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._counterUI[i].discardImageUnderMarker();
318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.MemoryStatistics.prototype
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
323