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