Chromium Code Reviews| Index: Source/devtools/front_end/TimelinePowerOverview.js |
| diff --git a/Source/devtools/front_end/TimelinePowerOverview.js b/Source/devtools/front_end/TimelinePowerOverview.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b34401f203a6ef1fdafc0054c2a948c434f31142 |
| --- /dev/null |
| +++ b/Source/devtools/front_end/TimelinePowerOverview.js |
| @@ -0,0 +1,154 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +/** |
| + * @constructor |
| + * @extends {WebInspector.Object} |
| + */ |
| +WebInspector.TimelinePowerOverviewDataProvider = function() |
| +{ |
| + this._records = []; |
| + if (Capabilities.canProfilePower) |
| + WebInspector.powerProfiler.addEventListener(WebInspector.PowerProfiler.EventTypes.PowerEventRecorded, this._onRecordAdded, this); |
| +} |
| + |
| +WebInspector.TimelinePowerOverviewDataProvider.prototype = { |
| + /** |
| + * @return {Array.<PowerEvent>} |
| + */ |
| + records : function() |
| + { |
| + // The last record is not used, as its "value" is not set. |
| + return this._records.slice(0, this._records.length - 1); |
| + }, |
| + |
| + _onRecordAdded: function(event) |
| + { |
| + // "value" of original PowerEvent means the anverage power between previous sampling to current one. |
| + // Here, it is converted to anverage power between current sampling to next one. |
| + var record = event.data; |
| + var length = this._records.length; |
| + if (length) |
| + this._records[length - 1].value = record.value; |
| + this._records.push(record); |
| + }, |
| + |
| + __proto__: WebInspector.Object.prototype |
| +} |
| + |
| +/** |
| + * @constructor |
| + * @extends {WebInspector.TimelineOverviewBase} |
| + * @param {!WebInspector.TimelineModel} model |
| + */ |
| +WebInspector.TimelinePowerOverview = function(model) |
| +{ |
| + WebInspector.TimelineOverviewBase.call(this, model); |
| + this.element.id = "timeline-overview-power"; |
| + this._dataProvider = new WebInspector.TimelinePowerOverviewDataProvider(); |
| + |
| + this._maxPowerLabel = this.element.createChild("div", "max memory-graph-label"); |
| + this._minPowerLabel = this.element.createChild("div", "min memory-graph-label"); |
| +} |
| + |
| +WebInspector.TimelinePowerOverview.prototype = { |
| + timelineStarted: function() |
| + { |
| + if (Capabilities.canProfilePower) |
| + WebInspector.powerProfiler.startProfile(); |
| + }, |
| + |
| + timelineStopped: function() |
| + { |
| + if (Capabilities.canProfilePower) |
| + WebInspector.powerProfiler.stopProfile(); |
| + }, |
| + |
| + _resetPowerLabels: function() |
| + { |
| + this._maxPowerLabel.textContent = ""; |
| + this._minPowerLabel.textContent = ""; |
| + }, |
| + |
| + update: function() |
| + { |
| + this.resetCanvas(); |
| + |
| + var records = this._dataProvider.records(); |
| + if (!records.length) { |
| + this._resetPowerLabels(); |
| + return; |
| + } |
| + |
| + const lowerOffset = 3; |
| + var maxPower = 0; |
| + var minPower = 100000000000; |
| + var minTime = this._model.minimumRecordTime(); |
| + var maxTime = this._model.maximumRecordTime(); |
| + for (var i = 0; i < records.length; i++) { |
| + var record = records[i]; |
| + if (record.timestamp < minTime || record.timestamp > maxTime) |
| + continue; |
| + maxPower = Math.max(maxPower, record.value); |
| + minPower = Math.min(minPower, record.value); |
| + } |
| + minPower = Math.min(minPower, maxPower); |
| + |
| + |
| + var width = this._canvas.width; |
| + var height = this._canvas.height - lowerOffset; |
| + var xFactor = width / (maxTime - minTime); |
| + var yFactor = height / Math.max(maxPower - minPower, 1); |
| + |
| + var histogram = new Array(width); |
|
pfeldman
2014/03/25 13:00:51
Yes, we will want to extract the histogram graph.
Pan
2014/03/25 14:08:15
thanks, plan it in another change.
|
| + for (var i = 0; i < records.length - 1; i++) { |
| + var record = records[i]; |
| + if (record.timestamp < minTime || record.timestamp > maxTime) |
| + continue; |
| + var x = Math.round((record.timestamp - minTime) * xFactor); |
| + var y = Math.round((record.value- minPower ) * yFactor); |
| + histogram[x] = Math.max(histogram[x] || 0, y); |
| + } |
| + |
| + var y = 0; |
| + var isFirstPoint = true; |
| + var ctx = this._context; |
| + ctx.save(); |
| + ctx.translate(0.5, 0.5); |
| + ctx.beginPath(); |
| + ctx.moveTo(-1, this._canvas.height); |
| + for (var x = 0; x < histogram.length; x++) { |
| + if (typeof histogram[x] === "undefined") |
| + continue; |
| + if (isFirstPoint) { |
| + isFirstPoint = false; |
| + y = histogram[x]; |
| + ctx.lineTo(-1, height - y); |
| + } |
| + ctx.lineTo(x, height - y); |
| + y = histogram[x]; |
| + ctx.lineTo(x, height - y); |
| + } |
| + |
| + ctx.lineTo(width, height - y); |
| + ctx.lineTo(width, this._canvas.height); |
| + ctx.lineTo(-1, this._canvas.height); |
| + ctx.closePath(); |
| + |
| + ctx.fillStyle = "rgba(255,192,0, 0.8);"; |
| + ctx.fill(); |
| + |
| + ctx.lineWidth = 0.5; |
| + ctx.strokeStyle = "rgba(20,0,0,0.8)"; |
| + ctx.stroke(); |
| + ctx.restore(); |
| + |
| + this._maxPowerLabel.textContent = WebInspector.UIString("%.2f\u2009watts", maxPower); |
| + this._minPowerLabel.textContent = WebInspector.UIString("%.2f\u2009watts", minPower);; |
| + }, |
| + |
| + __proto__: WebInspector.TimelineOverviewBase.prototype |
| +} |
| + |
| + |