1d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)/*
2d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) * Copyright 2014 The Chromium Authors. All rights reserved.
3d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
4d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) * found in the LICENSE file.
5d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) */
6d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
7d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)/**
8d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) * @constructor
9d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) * @extends {WebInspector.VBox}
10d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) */
11d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)WebInspector.TimelineLayersView = function()
12d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
13d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WebInspector.VBox.call(this);
14197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
15197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._paintTiles = [];
16d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this._layers3DView = new WebInspector.Layers3DView();
17d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this._layers3DView.addEventListener(WebInspector.Layers3DView.Events.ObjectSelected, this._onObjectSelected, this);
18d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this._layers3DView.addEventListener(WebInspector.Layers3DView.Events.ObjectHovered, this._onObjectHovered, this);
19c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._layers3DView.addEventListener(WebInspector.Layers3DView.Events.JumpToPaintEventRequested, this._jumpToPaintEvent, this);
20d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this._layers3DView.show(this.element);
21d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
22d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
23d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)WebInspector.TimelineLayersView.prototype = {
24d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
25d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {!WebInspector.DeferredLayerTree} deferredLayerTree
26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {?Array.<!WebInspector.LayerPaintEvent>} paints
27d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    showLayerTree: function(deferredLayerTree, paints)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._disposeTiles();
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._deferredLayerTree = deferredLayerTree;
32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._paints = paints;
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (this.isShowing())
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._update();
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        else
36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._updateWhenVisible = true;
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    wasShown: function()
40d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (this._updateWhenVisible) {
42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._updateWhenVisible = false;
43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._update();
44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!WebInspector.TimelineModel} model
49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!WebInspector.TimelineModeViewDelegate} delegate
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    setTimelineModelAndDelegate: function(model, delegate)
52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._model = model;
54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._delegate = delegate;
55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
57c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
58c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!WebInspector.Event} event
59c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    _jumpToPaintEvent: function(event)
61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var traceEvent = event.data;
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var eventRecord;
64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        /**
66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)         * @param {!WebInspector.TimelineModel.Record} record
67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)         * @return {boolean}
68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)         */
69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        function findRecordWithEvent(record)
70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {
71c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            if (record.traceEvent() === traceEvent) {
72c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                eventRecord = record;
73c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                return true;
74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            }
75c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return false;
76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._model.forAllRecords(findRecordWithEvent);
79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (eventRecord) {
80c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            var selection = WebInspector.TimelineSelection.fromRecord(eventRecord);
81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._delegate.select(selection);
82c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
83c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _update: function()
86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var layerTree;
88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._target = this._deferredLayerTree.target();
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var originalTiles = this._paintTiles;
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var tilesReadyBarrier = new CallbackBarrier();
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._deferredLayerTree.resolve(tilesReadyBarrier.createCallback(onLayersReady));
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        for (var i = 0; this._paints && i < this._paints.length; ++i)
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._paints[i].loadPicture(tilesReadyBarrier.createCallback(onSnapshotLoaded.bind(this, this._paints[i])));
95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        tilesReadyBarrier.callWhenDone(onLayersAndTilesReady.bind(this));
96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        /**
98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {!WebInspector.LayerTreeBase} resolvedLayerTree
99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         */
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function onLayersReady(resolvedLayerTree)
101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            layerTree = resolvedLayerTree;
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        /**
106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {!WebInspector.LayerPaintEvent} paintEvent
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci         * @param {?Array.<number>} rect
108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {?WebInspector.PaintProfilerSnapshot} snapshot
109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @this {WebInspector.TimelineLayersView}
110197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         */
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        function onSnapshotLoaded(paintEvent, rect, snapshot)
112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (!rect || !snapshot)
114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                return;
115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            // We're too late and there's a new generation of tiles being loaded.
116197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (originalTiles !== this._paintTiles) {
117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                snapshot.dispose();
118197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                return;
119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._paintTiles.push({layerId: paintEvent.layerId(), rect: rect, snapshot: snapshot, traceEvent: paintEvent.event()});
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
123d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        /**
124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @this {WebInspector.TimelineLayersView}
125d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)         */
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function onLayersAndTilesReady()
127d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        {
128d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this._layers3DView.setLayerTree(layerTree);
129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._layers3DView.setTiles(this._paintTiles);
130d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
131d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
132d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
133d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
134d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {?WebInspector.Layers3DView.ActiveObject} activeObject
135d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
136d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    _selectObject: function(activeObject)
137d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
138d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var layer = activeObject && activeObject.layer;
139d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (this._currentlySelectedLayer === activeObject)
140d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            return;
141d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        this._currentlySelectedLayer = activeObject;
142197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._toggleNodeHighlight(layer ? layer.nodeForSelfOrAncestor() : null);
143d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        this._layers3DView.selectObject(activeObject);
144d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
145d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
146d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
147d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {?WebInspector.Layers3DView.ActiveObject} activeObject
148d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
149d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    _hoverObject: function(activeObject)
150d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
151d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var layer = activeObject && activeObject.layer;
152d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (this._currentlyHoveredLayer === activeObject)
153d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            return;
154d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        this._currentlyHoveredLayer = activeObject;
155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._toggleNodeHighlight(layer ? layer.nodeForSelfOrAncestor() : null);
156d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        this._layers3DView.hoverObject(activeObject);
157d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
158d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
159d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {?WebInspector.DOMNode} node
161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
162197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _toggleNodeHighlight: function(node)
163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (node) {
165197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            node.highlightForTwoSeconds();
166197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
167197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
168197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (this._target)
169197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._target.domModel.hideDOMNodeHighlight();
170197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
171197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
172197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
173197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
174d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {!WebInspector.Event} event
175d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
176d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    _onObjectSelected: function(event)
177d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
178d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var activeObject = /** @type {!WebInspector.Layers3DView.ActiveObject} */ (event.data);
179d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        this._selectObject(activeObject);
180d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
181d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
182d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
183d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {!WebInspector.Event} event
184d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
185d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    _onObjectHovered: function(event)
186d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
187d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var activeObject = /** @type {!WebInspector.Layers3DView.ActiveObject} */ (event.data);
188d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        this._hoverObject(activeObject);
189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
191197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _disposeTiles: function()
192197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
193197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 0; i < this._paintTiles.length; ++i)
194197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._paintTiles[i].snapshot.dispose();
195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._paintTiles = [];
196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
198d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    __proto__: WebInspector.VBox.prototype
199d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
200