Index: Source/devtools/front_end/TimelinePowerOverview.js |
diff --git a/Source/devtools/front_end/TimelinePowerOverview.js b/Source/devtools/front_end/TimelinePowerOverview.js |
index e6c511f0ed7051e5be67809e8dafcdeeb564e96f..3aaa6e31e11123f33283fc2a9a4164746a7dd72a 100644 |
--- a/Source/devtools/front_end/TimelinePowerOverview.js |
+++ b/Source/devtools/front_end/TimelinePowerOverview.js |
@@ -9,6 +9,8 @@ |
WebInspector.TimelinePowerOverviewDataProvider = function() |
{ |
this._records = []; |
+ this._energies = []; |
+ this._times = []; |
if (Capabilities.canProfilePower) |
WebInspector.powerProfiler.addEventListener(WebInspector.PowerProfiler.EventTypes.PowerEventRecorded, this._onRecordAdded, this); |
} |
@@ -23,15 +25,57 @@ WebInspector.TimelinePowerOverviewDataProvider.prototype = { |
return this._records.slice(0, this._records.length - 1); |
}, |
+ /** |
+ * @param {number} minTime |
+ * @param {number} maxTime |
+ * @return {number} energy in joules. |
+ */ |
+ _calculateEnergy : function(minTime, maxTime) |
+ { |
+ var times = this._times; |
+ var energies = this._energies; |
+ var last = times.length - 1; |
+ |
+ if (last < 1 || minTime >= times[last] || maxTime <= times[0]) |
+ return 0; |
+ |
+ // Maximum index of element whose time <= minTime. |
+ var start = Number.constrain(times.upperBound(minTime) - 1, 0, last); |
+ |
+ // Minimum index of element whose time >= maxTime. |
+ var end = Number.constrain(times.lowerBound(maxTime), 0, last); |
+ |
+ var startTime = minTime < times[0] ? times[0] : minTime; |
+ var endTime = maxTime > times[last] ? times[last] : maxTime; |
+ |
+ if (start + 1 === end) |
+ return (endTime - startTime) / (times[end] - times[start]) * (energies[end] - energies[start]) / 1000; |
+ |
+ var totalEnergy = 0; |
+ totalEnergy += energies[end - 1] - energies[start + 1]; |
+ totalEnergy += (times[start + 1] - startTime) / (times[start + 1] - times[start]) * (energies[start + 1] - energies[start]); |
+ totalEnergy += (endTime - times[end - 1]) / (times[end] - times[end - 1]) * (energies[end] - energies[end - 1]); |
+ return totalEnergy / 1000; |
+ }, |
+ |
_onRecordAdded: function(event) |
{ |
// "value" of original PowerEvent means the average power between previous sampling to current one. |
// Here, it is converted to average power between current sampling to next one. |
var record = event.data; |
+ var curTime = record.timestamp; |
var length = this._records.length; |
- if (length) |
+ var accumulatedEnergy = 0; |
+ if (length) { |
this._records[length - 1].value = record.value; |
+ |
+ var prevTime = this._records[length - 1].timestamp; |
+ accumulatedEnergy = this._energies[length - 1]; |
+ accumulatedEnergy += (curTime - prevTime) * record.value; |
+ } |
+ this._energies.push(accumulatedEnergy); |
this._records.push(record); |
+ this._times.push(curTime); |
}, |
__proto__: WebInspector.Object.prototype |
@@ -145,7 +189,17 @@ WebInspector.TimelinePowerOverview.prototype = { |
ctx.restore(); |
this._maxPowerLabel.textContent = WebInspector.UIString("%.2f\u2009watts", maxPower); |
- this._minPowerLabel.textContent = WebInspector.UIString("%.2f\u2009watts", minPower);; |
+ this._minPowerLabel.textContent = WebInspector.UIString("%.2f\u2009watts", minPower); |
+ }, |
+ |
+ /** |
+ * @param {number} minTime |
+ * @param {number} maxTime |
+ * @return {number} energy in joules. |
+ */ |
+ calculateEnergy: function(minTime, maxTime) |
+ { |
+ return this._dataProvider._calculateEnergy(minTime, maxTime); |
}, |
__proto__: WebInspector.TimelineOverviewBase.prototype |