| 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 f5b4372e679503709cd9ec9b4efa4bb3ec1f3ec0..0182f703f10905b2e3d2638e41ac5cf49115102a 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
|
| @@ -1,7 +1,6 @@
|
| // Copyright 2016 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.
|
| -
|
| /** @typedef {!{
|
| bounds: {height: number, width: number},
|
| children: Array.<!WebInspector.TracingLayerPayload>,
|
| @@ -35,480 +34,447 @@ WebInspector.TracingLayerTile;
|
| WebInspector.SnapshotWithRect;
|
|
|
| /**
|
| - * @constructor
|
| - * @extends {WebInspector.LayerTreeBase}
|
| - * @param {?WebInspector.Target} target
|
| - */
|
| -WebInspector.TracingLayerTree = function(target)
|
| -{
|
| - WebInspector.LayerTreeBase.call(this, target);
|
| + * @unrestricted
|
| + */
|
| +WebInspector.TracingLayerTree = class extends WebInspector.LayerTreeBase {
|
| + /**
|
| + * @param {?WebInspector.Target} target
|
| + */
|
| + constructor(target) {
|
| + super(target);
|
| /** @type {!Map.<string, !WebInspector.TracingLayerTile>} */
|
| this._tileById = new Map();
|
| -};
|
| -
|
| -WebInspector.TracingLayerTree.prototype = {
|
| - /**
|
| - * @param {?WebInspector.TracingLayerPayload} root
|
| - * @param {?Array<!WebInspector.TracingLayerPayload>} layers
|
| - * @param {!Array<!WebInspector.LayerPaintEvent>} paints
|
| - * @param {function()} callback
|
| - */
|
| - setLayers: function(root, layers, paints, callback)
|
| - {
|
| - var idsToResolve = new Set();
|
| - if (root) {
|
| - // This is a legacy code path for compatibility, as cc is removing
|
| - // layer tree hierarchy, this code will eventually be removed.
|
| - this._extractNodeIdsToResolve(idsToResolve, {}, root);
|
| - } else {
|
| - for (var i = 0; i < layers.length; ++i)
|
| - this._extractNodeIdsToResolve(idsToResolve, {}, layers[i]);
|
| - }
|
| - this._resolveBackendNodeIds(idsToResolve, onBackendNodeIdsResolved.bind(this));
|
| -
|
| - /**
|
| - * @this {WebInspector.TracingLayerTree}
|
| - */
|
| - function onBackendNodeIdsResolved()
|
| - {
|
| - var oldLayersById = this._layersById;
|
| - this._layersById = {};
|
| - this.setContentRoot(null);
|
| - if (root) {
|
| - var convertedLayers = this._innerSetLayers(oldLayersById, root);
|
| - this.setRoot(convertedLayers);
|
| - } else {
|
| - var processedLayers = layers.map(this._innerSetLayers.bind(this, oldLayersById));
|
| - var contentRoot = this.contentRoot();
|
| - this.setRoot(contentRoot);
|
| - for (var i = 0; i < processedLayers.length; ++i) {
|
| - if (processedLayers[i].id() !== contentRoot.id())
|
| - contentRoot.addChild(processedLayers[i]);
|
| - }
|
| - }
|
| - this._setPaints(paints);
|
| - callback();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array.<!WebInspector.TracingLayerTile>} tiles
|
| - */
|
| - setTiles: function(tiles)
|
| - {
|
| - this._tileById = new Map();
|
| - for (var tile of tiles)
|
| - this._tileById.set(tile.id, tile);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} tileId
|
| - * @return {!Promise<?WebInspector.SnapshotWithRect>}
|
| - */
|
| - pictureForRasterTile: function(tileId)
|
| - {
|
| - var tile = this._tileById.get("cc::Tile/" + tileId);
|
| - if (!tile) {
|
| - WebInspector.console.error(`Tile ${tileId} is missing`);
|
| - 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`);
|
| - return /** @type {!Promise<?WebInspector.SnapshotWithRect>} */ (Promise.resolve(null));
|
| - }
|
| - return layer._pictureForRect(tile.content_rect);
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array<!WebInspector.LayerPaintEvent>} paints
|
| - */
|
| - _setPaints: function(paints)
|
| - {
|
| - for (var i = 0; i < paints.length; ++i) {
|
| - var layer = this._layersById[paints[i].layerId()];
|
| - if (layer)
|
| - layer._addPaintEvent(paints[i]);
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.TracingLayerPayload} root
|
| + * @param {?Array<!WebInspector.TracingLayerPayload>} layers
|
| + * @param {!Array<!WebInspector.LayerPaintEvent>} paints
|
| + * @param {function()} callback
|
| + */
|
| + setLayers(root, layers, paints, callback) {
|
| + var idsToResolve = new Set();
|
| + if (root) {
|
| + // This is a legacy code path for compatibility, as cc is removing
|
| + // layer tree hierarchy, this code will eventually be removed.
|
| + this._extractNodeIdsToResolve(idsToResolve, {}, root);
|
| + } else {
|
| + for (var i = 0; i < layers.length; ++i)
|
| + this._extractNodeIdsToResolve(idsToResolve, {}, layers[i]);
|
| + }
|
| + this._resolveBackendNodeIds(idsToResolve, onBackendNodeIdsResolved.bind(this));
|
| +
|
| + /**
|
| + * @this {WebInspector.TracingLayerTree}
|
| + */
|
| + function onBackendNodeIdsResolved() {
|
| + var oldLayersById = this._layersById;
|
| + this._layersById = {};
|
| + this.setContentRoot(null);
|
| + if (root) {
|
| + var convertedLayers = this._innerSetLayers(oldLayersById, root);
|
| + this.setRoot(convertedLayers);
|
| + } else {
|
| + var processedLayers = layers.map(this._innerSetLayers.bind(this, oldLayersById));
|
| + var contentRoot = this.contentRoot();
|
| + this.setRoot(contentRoot);
|
| + for (var i = 0; i < processedLayers.length; ++i) {
|
| + if (processedLayers[i].id() !== contentRoot.id())
|
| + contentRoot.addChild(processedLayers[i]);
|
| }
|
| - },
|
| -
|
| - /**
|
| - * @param {!Object<(string|number), !WebInspector.Layer>} oldLayersById
|
| - * @param {!WebInspector.TracingLayerPayload} payload
|
| - * @return {!WebInspector.TracingLayer}
|
| - */
|
| - _innerSetLayers: function(oldLayersById, payload)
|
| - {
|
| - var layer = /** @type {?WebInspector.TracingLayer} */ (oldLayersById[payload.layer_id]);
|
| - if (layer)
|
| - layer._reset(payload);
|
| - else
|
| - layer = new WebInspector.TracingLayer(this.target(), payload);
|
| - this._layersById[payload.layer_id] = layer;
|
| - if (payload.owner_node)
|
| - layer._setNode(this._backendNodeIdToNode.get(payload.owner_node) || null);
|
| - if (!this.contentRoot() && layer.drawsContent())
|
| - this.setContentRoot(layer);
|
| - for (var i = 0; payload.children && i < payload.children.length; ++i)
|
| - layer.addChild(this._innerSetLayers(oldLayersById, payload.children[i]));
|
| - return layer;
|
| - },
|
| + }
|
| + this._setPaints(paints);
|
| + callback();
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @param {!Set<number>} nodeIdsToResolve
|
| - * @param {!Object} seenNodeIds
|
| - * @param {!WebInspector.TracingLayerPayload} payload
|
| - */
|
| - _extractNodeIdsToResolve: function(nodeIdsToResolve, seenNodeIds, payload)
|
| - {
|
| - var backendNodeId = payload.owner_node;
|
| - if (backendNodeId && !this._backendNodeIdToNode.has(backendNodeId))
|
| - nodeIdsToResolve.add(backendNodeId);
|
| - for (var i = 0; payload.children && i < payload.children.length; ++i)
|
| - this._extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload.children[i]);
|
| - },
|
| -
|
| - __proto__: WebInspector.LayerTreeBase.prototype
|
| + /**
|
| + * @param {!Array.<!WebInspector.TracingLayerTile>} tiles
|
| + */
|
| + setTiles(tiles) {
|
| + this._tileById = new Map();
|
| + for (var tile of tiles)
|
| + this._tileById.set(tile.id, tile);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} tileId
|
| + * @return {!Promise<?WebInspector.SnapshotWithRect>}
|
| + */
|
| + pictureForRasterTile(tileId) {
|
| + var tile = this._tileById.get('cc::Tile/' + tileId);
|
| + if (!tile) {
|
| + WebInspector.console.error(`Tile ${tileId} is missing`);
|
| + 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`);
|
| + return /** @type {!Promise<?WebInspector.SnapshotWithRect>} */ (Promise.resolve(null));
|
| + }
|
| + return layer._pictureForRect(tile.content_rect);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<!WebInspector.LayerPaintEvent>} paints
|
| + */
|
| + _setPaints(paints) {
|
| + for (var i = 0; i < paints.length; ++i) {
|
| + var layer = this._layersById[paints[i].layerId()];
|
| + if (layer)
|
| + layer._addPaintEvent(paints[i]);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Object<(string|number), !WebInspector.Layer>} oldLayersById
|
| + * @param {!WebInspector.TracingLayerPayload} payload
|
| + * @return {!WebInspector.TracingLayer}
|
| + */
|
| + _innerSetLayers(oldLayersById, payload) {
|
| + var layer = /** @type {?WebInspector.TracingLayer} */ (oldLayersById[payload.layer_id]);
|
| + if (layer)
|
| + layer._reset(payload);
|
| + else
|
| + layer = new WebInspector.TracingLayer(this.target(), payload);
|
| + this._layersById[payload.layer_id] = layer;
|
| + if (payload.owner_node)
|
| + layer._setNode(this._backendNodeIdToNode.get(payload.owner_node) || null);
|
| + if (!this.contentRoot() && layer.drawsContent())
|
| + this.setContentRoot(layer);
|
| + for (var i = 0; payload.children && i < payload.children.length; ++i)
|
| + layer.addChild(this._innerSetLayers(oldLayersById, payload.children[i]));
|
| + return layer;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Set<number>} nodeIdsToResolve
|
| + * @param {!Object} seenNodeIds
|
| + * @param {!WebInspector.TracingLayerPayload} payload
|
| + */
|
| + _extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload) {
|
| + var backendNodeId = payload.owner_node;
|
| + if (backendNodeId && !this._backendNodeIdToNode.has(backendNodeId))
|
| + nodeIdsToResolve.add(backendNodeId);
|
| + for (var i = 0; payload.children && i < payload.children.length; ++i)
|
| + this._extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload.children[i]);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.TracingLayerPayload} payload
|
| - * @param {?WebInspector.Target} target
|
| * @implements {WebInspector.Layer}
|
| + * @unrestricted
|
| */
|
| -WebInspector.TracingLayer = function(target, payload)
|
| -{
|
| +WebInspector.TracingLayer = class {
|
| + /**
|
| + * @param {!WebInspector.TracingLayerPayload} payload
|
| + * @param {?WebInspector.Target} target
|
| + */
|
| + constructor(target, payload) {
|
| this._target = target;
|
| this._reset(payload);
|
| -};
|
| -
|
| -WebInspector.TracingLayer.prototype = {
|
| - /**
|
| - * @param {!WebInspector.TracingLayerPayload} payload
|
| - */
|
| - _reset: function(payload)
|
| - {
|
| - /** @type {?WebInspector.DOMNode} */
|
| - this._node = null;
|
| - this._layerId = String(payload.layer_id);
|
| - this._offsetX = payload.position[0];
|
| - this._offsetY = payload.position[1];
|
| - this._width = payload.bounds.width;
|
| - this._height = payload.bounds.height;
|
| - this._children = [];
|
| - this._parentLayerId = null;
|
| - this._parent = null;
|
| - this._quad = payload.layer_quad || [];
|
| - this._createScrollRects(payload);
|
| - this._compositingReasons = payload.compositing_reasons || [];
|
| - this._drawsContent = !!payload.draws_content;
|
| - this._gpuMemoryUsage = payload.gpu_memory_usage;
|
| - this._paints = [];
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {string}
|
| - */
|
| - id: function()
|
| - {
|
| - return this._layerId;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {?string}
|
| - */
|
| - parentId: function()
|
| - {
|
| - return this._parentLayerId;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {?WebInspector.Layer}
|
| - */
|
| - parent: function()
|
| - {
|
| - return this._parent;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {boolean}
|
| - */
|
| - isRoot: function()
|
| - {
|
| - return !this.parentId();
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array.<!WebInspector.Layer>}
|
| - */
|
| - children: function()
|
| - {
|
| - return this._children;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.Layer} child
|
| - */
|
| - addChild: function(child)
|
| - {
|
| - if (child._parent)
|
| - console.assert(false, "Child already has a parent");
|
| - this._children.push(child);
|
| - child._parent = this;
|
| - child._parentLayerId = this._layerId;
|
| - },
|
| -
|
| -
|
| - /**
|
| - * @param {?WebInspector.DOMNode} node
|
| - */
|
| - _setNode: function(node)
|
| - {
|
| - this._node = node;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {?WebInspector.DOMNode}
|
| - */
|
| - node: function()
|
| - {
|
| - return this._node;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {?WebInspector.DOMNode}
|
| - */
|
| - nodeForSelfOrAncestor: function()
|
| - {
|
| - for (var layer = this; layer; layer = layer._parent) {
|
| - if (layer._node)
|
| - return layer._node;
|
| - }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingLayerPayload} payload
|
| + */
|
| + _reset(payload) {
|
| + /** @type {?WebInspector.DOMNode} */
|
| + this._node = null;
|
| + this._layerId = String(payload.layer_id);
|
| + this._offsetX = payload.position[0];
|
| + this._offsetY = payload.position[1];
|
| + this._width = payload.bounds.width;
|
| + this._height = payload.bounds.height;
|
| + this._children = [];
|
| + this._parentLayerId = null;
|
| + this._parent = null;
|
| + this._quad = payload.layer_quad || [];
|
| + this._createScrollRects(payload);
|
| + this._compositingReasons = payload.compositing_reasons || [];
|
| + this._drawsContent = !!payload.draws_content;
|
| + this._gpuMemoryUsage = payload.gpu_memory_usage;
|
| + this._paints = [];
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {string}
|
| + */
|
| + id() {
|
| + return this._layerId;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?string}
|
| + */
|
| + parentId() {
|
| + return this._parentLayerId;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?WebInspector.Layer}
|
| + */
|
| + parent() {
|
| + return this._parent;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + isRoot() {
|
| + return !this.parentId();
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array.<!WebInspector.Layer>}
|
| + */
|
| + children() {
|
| + return this._children;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.Layer} child
|
| + */
|
| + addChild(child) {
|
| + if (child._parent)
|
| + console.assert(false, 'Child already has a parent');
|
| + this._children.push(child);
|
| + child._parent = this;
|
| + child._parentLayerId = this._layerId;
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.DOMNode} node
|
| + */
|
| + _setNode(node) {
|
| + this._node = node;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?WebInspector.DOMNode}
|
| + */
|
| + node() {
|
| + return this._node;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?WebInspector.DOMNode}
|
| + */
|
| + nodeForSelfOrAncestor() {
|
| + for (var layer = this; layer; layer = layer._parent) {
|
| + if (layer._node)
|
| + return layer._node;
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + offsetX() {
|
| + return this._offsetX;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + offsetY() {
|
| + return this._offsetY;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + width() {
|
| + return this._width;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + height() {
|
| + return this._height;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?Array.<number>}
|
| + */
|
| + transform() {
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array.<number>}
|
| + */
|
| + quad() {
|
| + return this._quad;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array.<number>}
|
| + */
|
| + anchorPoint() {
|
| + return [0.5, 0.5, 0];
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + invisible() {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + paintCount() {
|
| + return 0;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {?DOMAgent.Rect}
|
| + */
|
| + lastPaintRect() {
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array.<!LayerTreeAgent.ScrollRect>}
|
| + */
|
| + scrollRects() {
|
| + return this._scrollRects;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {number}
|
| + */
|
| + gpuMemoryUsage() {
|
| + return this._gpuMemoryUsage;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Array<!Promise<?WebInspector.SnapshotWithRect>>}
|
| + */
|
| + snapshots() {
|
| + return this._paints.map(paint => paint.snapshotPromise().then(snapshot => {
|
| + if (!snapshot)
|
| return null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - offsetX: function()
|
| - {
|
| - return this._offsetX;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - offsetY: function()
|
| - {
|
| - return this._offsetY;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - width: function()
|
| - {
|
| - return this._width;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - height: function()
|
| - {
|
| - return this._height;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {?Array.<number>}
|
| - */
|
| - transform: function()
|
| - {
|
| + var rect = {x: snapshot.rect[0], y: snapshot.rect[1], width: snapshot.rect[2], height: snapshot.rect[3]};
|
| + return {rect: rect, snapshot: snapshot.snapshot};
|
| + }));
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<number>} targetRect
|
| + * @return {!Promise<?WebInspector.SnapshotWithRect>}
|
| + */
|
| + _pictureForRect(targetRect) {
|
| + 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 || !this._target)
|
| return null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array.<number>}
|
| - */
|
| - quad: function()
|
| - {
|
| - return this._quad;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array.<number>}
|
| - */
|
| - anchorPoint: function()
|
| - {
|
| - return [0.5, 0.5, 0];
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| + var x0 = fragments.reduce((min, item) => Math.min(min, item.x), Infinity);
|
| + var y0 = fragments.reduce((min, item) => Math.min(min, item.y), Infinity);
|
| + // 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]};
|
| + return WebInspector.PaintProfilerSnapshot.loadFromFragments(this._target, fragments)
|
| + .then(snapshot => snapshot ? {rect: rect, snapshot: snapshot} : null);
|
| + });
|
| +
|
| + /**
|
| + * @param {number} a1
|
| + * @param {number} a2
|
| + * @param {number} b1
|
| + * @param {number} b2
|
| * @return {boolean}
|
| */
|
| - invisible: function()
|
| - {
|
| - return false;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - paintCount: function()
|
| - {
|
| - return 0;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {?DOMAgent.Rect}
|
| - */
|
| - lastPaintRect: function()
|
| - {
|
| - return null;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array.<!LayerTreeAgent.ScrollRect>}
|
| - */
|
| - scrollRects: function()
|
| - {
|
| - return this._scrollRects;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {number}
|
| - */
|
| - gpuMemoryUsage: function()
|
| - {
|
| - return this._gpuMemoryUsage;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Array<!Promise<?WebInspector.SnapshotWithRect>>}
|
| - */
|
| - snapshots: function()
|
| - {
|
| - return this._paints.map(paint => paint.snapshotPromise().then(snapshot => {
|
| - if (!snapshot)
|
| - return null;
|
| - var rect = {x: snapshot.rect[0], y: snapshot.rect[1], width: snapshot.rect[2], height: snapshot.rect[3]};
|
| - return {rect: rect, snapshot: snapshot.snapshot};
|
| - }));
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array<number>} targetRect
|
| - * @return {!Promise<?WebInspector.SnapshotWithRect>}
|
| - */
|
| - _pictureForRect: function(targetRect)
|
| - {
|
| - 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 || !this._target)
|
| - return null;
|
| - var x0 = fragments.reduce((min, item) => Math.min(min, item.x), Infinity);
|
| - var y0 = fragments.reduce((min, item) => Math.min(min, item.y), Infinity);
|
| - // 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]};
|
| - return WebInspector.PaintProfilerSnapshot.loadFromFragments(this._target, fragments).then(snapshot => snapshot ? {rect: rect, snapshot: snapshot} : null);
|
| - });
|
| -
|
| - /**
|
| - * @param {number} a1
|
| - * @param {number} a2
|
| - * @param {number} b1
|
| - * @param {number} b2
|
| - * @return {boolean}
|
| - */
|
| - function segmentsOverlap(a1, a2, b1, b2)
|
| - {
|
| - 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
|
| - * @return {boolean}
|
| - */
|
| - function rectsOverlap(a, b)
|
| - {
|
| - 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]);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array.<number>} params
|
| - * @param {string} type
|
| - * @return {!Object}
|
| - */
|
| - _scrollRectsFromParams: function(params, type)
|
| - {
|
| - return {rect: {x: params[0], y: params[1], width: params[2], height: params[3]}, type: type};
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.TracingLayerPayload} payload
|
| - */
|
| - _createScrollRects: function(payload)
|
| - {
|
| - this._scrollRects = [];
|
| - if (payload.non_fast_scrollable_region)
|
| - this._scrollRects.push(this._scrollRectsFromParams(payload.non_fast_scrollable_region, WebInspector.Layer.ScrollRectType.NonFastScrollable.name));
|
| - if (payload.touch_event_handler_region)
|
| - this._scrollRects.push(this._scrollRectsFromParams(payload.touch_event_handler_region, WebInspector.Layer.ScrollRectType.TouchEventHandler.name));
|
| - if (payload.wheel_event_handler_region)
|
| - this._scrollRects.push(this._scrollRectsFromParams(payload.wheel_event_handler_region, WebInspector.Layer.ScrollRectType.WheelEventHandler.name));
|
| - if (payload.scroll_event_handler_region)
|
| - this._scrollRects.push(this._scrollRectsFromParams(payload.scroll_event_handler_region, WebInspector.Layer.ScrollRectType.RepaintsOnScroll.name));
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.LayerPaintEvent} paint
|
| - */
|
| - _addPaintEvent: function(paint)
|
| - {
|
| - this._paints.push(paint);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {function(!Array.<string>)} callback
|
| - */
|
| - requestCompositingReasons: function(callback)
|
| - {
|
| - callback(this._compositingReasons);
|
| - },
|
| + function segmentsOverlap(a1, a2, b1, b2) {
|
| + console.assert(a1 <= a2 && b1 <= b2, 'segments should be specified as ordered pairs');
|
| + return a2 > b1 && a1 < b2;
|
| + }
|
|
|
| /**
|
| - * @override
|
| + * @param {!Array.<number>} a
|
| + * @param {!Array.<number>} b
|
| * @return {boolean}
|
| */
|
| - drawsContent: function()
|
| - {
|
| - return this._drawsContent;
|
| + function rectsOverlap(a, b) {
|
| + 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]);
|
| }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array.<number>} params
|
| + * @param {string} type
|
| + * @return {!Object}
|
| + */
|
| + _scrollRectsFromParams(params, type) {
|
| + return {rect: {x: params[0], y: params[1], width: params[2], height: params[3]}, type: type};
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.TracingLayerPayload} payload
|
| + */
|
| + _createScrollRects(payload) {
|
| + this._scrollRects = [];
|
| + if (payload.non_fast_scrollable_region)
|
| + this._scrollRects.push(this._scrollRectsFromParams(
|
| + payload.non_fast_scrollable_region, WebInspector.Layer.ScrollRectType.NonFastScrollable.name));
|
| + if (payload.touch_event_handler_region)
|
| + this._scrollRects.push(this._scrollRectsFromParams(
|
| + payload.touch_event_handler_region, WebInspector.Layer.ScrollRectType.TouchEventHandler.name));
|
| + if (payload.wheel_event_handler_region)
|
| + this._scrollRects.push(this._scrollRectsFromParams(
|
| + payload.wheel_event_handler_region, WebInspector.Layer.ScrollRectType.WheelEventHandler.name));
|
| + if (payload.scroll_event_handler_region)
|
| + this._scrollRects.push(this._scrollRectsFromParams(
|
| + payload.scroll_event_handler_region, WebInspector.Layer.ScrollRectType.RepaintsOnScroll.name));
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.LayerPaintEvent} paint
|
| + */
|
| + _addPaintEvent(paint) {
|
| + this._paints.push(paint);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {function(!Array.<string>)} callback
|
| + */
|
| + requestCompositingReasons(callback) {
|
| + callback(this._compositingReasons);
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {boolean}
|
| + */
|
| + drawsContent() {
|
| + return this._drawsContent;
|
| + }
|
| };
|
|
|