Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Unified Diff: third_party/WebKit/Source/devtools/front_end/timeline_model/TracingLayerTree.js

Issue 2434393002: Timeline: promisify paint profiler and Layers panel, part I (Closed)
Patch Set: Timeline: promisify paint profiler and Layers panel, part I Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/devtools/front_end/timeline_model/TracingLayerTree.js
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline_model/TracingLayerTree.js b/third_party/WebKit/Source/devtools/front_end/timeline_model/TracingLayerTree.js
index 4a7b5145be30ed707182925d451232710556253e..2d2890a0fa48c5e7ac4029c916e8e7aaff2413be 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline_model/TracingLayerTree.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline_model/TracingLayerTree.js
@@ -27,6 +27,13 @@ WebInspector.TracingLayerPayload;
*/
WebInspector.TracingLayerTile;
+/** @typedef {!{
+ rect: !DOMAgent.Rect,
alph 2016/10/21 00:25:10 indent
+ snapshot: !WebInspector.PaintProfilerSnapshot
+ }}
+*/
+WebInspector.SnapshotWithRect;
+
/**
* @constructor
* @extends {WebInspector.LayerTreeBase}
@@ -96,23 +103,21 @@ WebInspector.TracingLayerTree.prototype = {
/**
* @param {string} tileId
- * @param {function(?DOMAgent.Rect, ?WebInspector.PaintProfilerSnapshot)} callback
+ * @return {!Promise<?WebInspector.SnapshotWithRect>}
*/
- pictureForRasterTile: function(tileId, callback)
+ pictureForRasterTile: function(tileId)
{
var tile = this._tileById.get("cc::Tile/" + tileId);
if (!tile) {
WebInspector.console.error(`Tile ${tileId} is missing`);
- callback(null, null);
- return;
+ return /** @type {!Promise<?WebInspector.SnapshotWithRect>} */ (Promise.resolve(null));
}
var layer = this.layerById(tile.layer_id);
if (!layer) {
WebInspector.console.error(`Layer ${tile.layer_id} for tile ${tileId} is not found`);
- callback(null, null);
- return;
+ return /** @type {!Promise<?WebInspector.SnapshotWithRect>} */ (Promise.resolve(null));
}
- layer.pictureForRect(this.target(), tile.content_rect, callback);
+ return layer.pictureForRect(this.target(), tile.content_rect);
},
/**
@@ -400,13 +405,20 @@ WebInspector.TracingLayer.prototype = {
/**
* @param {!WebInspector.Target} target
* @param {!Array<number>} targetRect
- * @param {function(?DOMAgent.Rect, ?WebInspector.PaintProfilerSnapshot)} callback
+ * @return {!Promise<?{rect: !DOMAgent.Rect, snapshot: !WebInspector.PaintProfilerSnapshot}>}
*/
- pictureForRect: function(target, targetRect, callback)
+ pictureForRect: function(target, targetRect)
{
- var fetchPictureFragmentsBarrier = new CallbackBarrier();
- this._paints.forEach(paint => paint.loadPicture(fetchPictureFragmentsBarrier.createCallback(pictureLoaded)));
- fetchPictureFragmentsBarrier.callWhenDone(allPicturesLoaded);
+ return Promise.all(this._paints.map(paint => paint.picturePromise())).then(pictures => {
+ var fragments = pictures.filter(picture => picture && rectsOverlap(picture.rect, targetRect))
+ .map(picture => ({x: picture.rect[0], y: picture.rect[1], picture: picture.serializedPicture}));
+ if (!fragments.length)
+ return null;
+ var topLeft = fragments.reduce((acc, current) => ({x: Math.min(acc.x, current.x), y: Math.min(acc.y, current.y)}), {x: Infinity, y: Infinity});
alph 2016/10/21 00:25:10 For the sake of performance I'd do it with two red
+ // Rect is in layer content coordinates, make it relative to picture by offsetting to the top left corner.
+ var rect = {x: targetRect[0] - topLeft.x, y: targetRect[1] - topLeft.y, width: targetRect[2], height: targetRect[3]};
+ return WebInspector.PaintProfilerSnapshot.loadFromFragments(target, fragments).then(snapshot => snapshot ? {rect: rect, snapshot: snapshot} : null);
+ });
/**
* @param {number} a1
@@ -420,6 +432,7 @@ WebInspector.TracingLayer.prototype = {
console.assert(a1 <= a2 && b1 <= b2, "segments should be specified as ordered pairs");
return a2 > b1 && a1 < b2;
}
+
/**
* @param {!Array.<number>} a
* @param {!Array.<number>} b
@@ -429,37 +442,6 @@ WebInspector.TracingLayer.prototype = {
{
return segmentsOverlap(a[0], a[0] + a[2], b[0], b[0] + b[2]) && segmentsOverlap(a[1], a[1] + a[3], b[1], b[1] + b[3]);
}
-
- var x0 = Infinity;
- var y0 = Infinity;
- var fragments = [];
- /**
- * @param {?Array.<number>} rect
- * @param {?string} picture
- */
- function pictureLoaded(rect, picture)
- {
- if (!rect || !picture)
- return;
- if (!rectsOverlap(rect, targetRect))
- return;
- var x = rect[0];
- var y = rect[1];
- x0 = Math.min(x0, x);
- y0 = Math.min(y0, y);
- fragments.push({x: x, y: y, picture: picture});
- }
-
- function allPicturesLoaded()
- {
- if (!fragments.length) {
- callback(null, null);
- return;
- }
- // Rect is in layer content coordinates, make it relative to picture by offsetting to the top left corner.
- var rect = {x: targetRect[0] - x0, y: targetRect[1] - y0, width: targetRect[2], height: targetRect[3]};
- WebInspector.PaintProfilerSnapshot.loadFromFragments(target, fragments, callback.bind(null, rect));
- }
},
/**

Powered by Google App Engine
This is Rietveld 408576698