1e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)/*
2e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
3e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *
4e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * modification, are permitted provided that the following conditions are
6e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * met:
7e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *
8e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
9e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
10e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
11e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
12e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * in the documentation and/or other materials provided with the
13e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * distribution.
14e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
15e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
16e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * this software without specific prior written permission.
17e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *
18e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) */
30e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
31e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)/**
32e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * @constructor
33e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * @extends {WebInspector.Object}
34a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.LayerTreeModel} model
35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!TreeOutline} treeOutline
36e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) */
37e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)WebInspector.LayerTree = function(model, treeOutline)
38e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
39e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    WebInspector.Object.call(this);
40e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    this._model = model;
41e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    this._treeOutline = treeOutline;
42e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    this._treeOutline.childrenListElement.addEventListener("mousemove", this._onMouseMove.bind(this), false);
43e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    this._treeOutline.childrenListElement.addEventListener("mouseout", this._onMouseMove.bind(this), false);
44c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this._treeOutline.childrenListElement.addEventListener("contextmenu", this._onContextMenu.bind(this), true);
45e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerTreeChanged, this._update.bind(this));
46e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    this._lastHoveredNode = null;
47e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
48e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
49e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)/**
50e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * @enum {string}
51e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) */
52e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)WebInspector.LayerTree.Events = {
53e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    LayerHovered: "LayerHovered",
54e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    LayerSelected: "LayerSelected"
55e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
56e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
57e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)WebInspector.LayerTree.prototype = {
58e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /**
59a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Layer} layer
60e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     */
61e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    selectLayer: function(layer)
62e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
63e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        this.hoverLayer(null);
64e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var node = layer && this._treeOutline.getCachedTreeElement(layer);
65e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (node)
66e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            node.revealAndSelect(true);
67c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        else if (this._treeOutline.selectedTreeElement)
68c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            this._treeOutline.selectedTreeElement.deselect();
69e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
70e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
71e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /**
72a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?WebInspector.Layer} layer
73e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     */
74e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    hoverLayer: function(layer)
75e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
76e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var node = layer && this._treeOutline.getCachedTreeElement(layer);
77e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (node === this._lastHoveredNode)
78e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            return;
79e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (this._lastHoveredNode)
80e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            this._lastHoveredNode.setHovered(false);
81e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (node)
82e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            node.setHovered(true);
83e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        this._lastHoveredNode = node;
84e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
85e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
86e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    _update: function()
87e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
88e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var seenLayers = {};
89e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
90e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        /**
91a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @param {!WebInspector.Layer} layer
92e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)         * @this {WebInspector.LayerTree}
93e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)         */
94e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        function updateLayer(layer)
95e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        {
96e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            var id = layer.id();
97e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            if (seenLayers[id])
98e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                console.assert(false, "Duplicate layer id: " + id);
99e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            seenLayers[id] = true;
100e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            var node = this._treeOutline.getCachedTreeElement(layer);
1018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            var parent = layer === this._model.contentRoot() ? this._treeOutline : this._treeOutline.getCachedTreeElement(layer.parent());
102e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            if (!parent)
103e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                console.assert(false, "Parent is not in the tree");
104e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            if (!node) {
105e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                node = new WebInspector.LayerTreeElement(this, layer);
106e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                parent.appendChild(node);
107e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            } else {
108e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                var oldParentId = node.parent.representedObject && node.parent.representedObject.id();
109e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                if (oldParentId !== layer.parentId()) {
110e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    (node.parent || this._treeOutline).removeChild(node);
111e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    parent.appendChild(node);
112e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                }
113e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                node._update();
114e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            }
115e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        }
116f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (this._model.contentRoot())
117f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            this._model.forEachLayer(updateLayer.bind(this), this._model.contentRoot());
1189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        // Cleanup layers that don't exist anymore from tree.
119a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        for (var node = /** @type {!TreeElement|!TreeOutline|null} */(this._treeOutline.children[0]); node && !node.root;) {
1209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            if (seenLayers[node.representedObject.id()]) {
1219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                node = node.traverseNextTreeElement(false);
1229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            } else {
1239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                var nextNode = node.nextSibling || node.parent;
1249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                node.parent.removeChild(node);
1259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                if (node === this._lastHoveredNode)
1269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                    this._lastHoveredNode = null;
1279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                node = nextNode;
128e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            }
129e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        }
130e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
131e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
132e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /**
133a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?Event} event
134e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     */
135e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    _onMouseMove: function(event)
136e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
137e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var node = this._treeOutline.treeElementFromPoint(event.pageX, event.pageY);
138e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (node === this._lastHoveredNode)
139e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            return;
140e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.LayerTree.Events.LayerHovered, node && node.representedObject);
141e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
142e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
143e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /**
144a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.LayerTreeElement} node
145e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     */
146e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    _selectedNodeChanged: function(node)
147e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
148a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var layer = /** @type {!WebInspector.Layer} */ (node.representedObject);
149e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.LayerTree.Events.LayerSelected, layer);
150e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
151e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
152c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    /**
153a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?Event} event
154c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)     */
155c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    _onContextMenu: function(event)
156c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    {
157c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        var node = this._treeOutline.treeElementFromPoint(event.pageX, event.pageY);
158c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        if (!node || !node.representedObject)
159c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            return;
160a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var layer = /** @type {!WebInspector.Layer} */ (node.representedObject);
161c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        if (!layer)
162c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            return;
163c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        var nodeId = layer.nodeId();
164c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        if (!nodeId)
165c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            return;
166c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        var domNode = WebInspector.domAgent.nodeForId(nodeId);
167c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        if (!domNode)
168c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            return;
169c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        var contextMenu = new WebInspector.ContextMenu(event);
170c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        contextMenu.appendApplicableItems(domNode);
171c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        contextMenu.show();
172c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    },
173c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
174e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    __proto__: WebInspector.Object.prototype
175e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
176e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
177e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)/**
178e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)  * @constructor
179a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)  * @param {!WebInspector.LayerTree} tree
180a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)  * @param {!WebInspector.Layer} layer
181e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)  * @extends {TreeElement}
182e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)  */
183e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)WebInspector.LayerTreeElement = function(tree, layer)
184e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
185e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    TreeElement.call(this, "", layer);
186e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    this._layerTree = tree;
187e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    this._update();
188e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
189e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
190e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)WebInspector.LayerTreeElement.prototype = {
191e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    onattach: function()
192e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
193e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var selection = document.createElement("div");
194e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        selection.className = "selection";
195e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        this.listItemElement.insertBefore(selection, this.listItemElement.firstChild);
196e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
197e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
198e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    _update: function()
199e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
200a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var layer = /** @type {!WebInspector.Layer} */ (this.representedObject);
201e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var nodeId = layer.nodeIdForSelfOrAncestor();
20251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        var node = nodeId ? WebInspector.domAgent.nodeForId(nodeId) : null;
203e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var title = document.createDocumentFragment();
204e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        title.createChild("div", "selection");
20551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        title.appendChild(document.createTextNode(node ? WebInspector.DOMPresentationUtils.appropriateSelectorFor(node, false) :  "#" + layer.id()));
206e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        var details = title.createChild("span", "dimmed");
207e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        details.textContent = WebInspector.UIString(" (%d × %d)", layer.width(), layer.height());
208e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        this.title = title;
209e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
210e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
211a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /**
212a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @override
213a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     */
214e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    onselect: function()
215e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
216e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        this._layerTree._selectedNodeChanged(this);
217a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return false;
218e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
219e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
220e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /**
221e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     * @param {boolean} hovered
222e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     */
223e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    setHovered: function(hovered)
224e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
225e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        this.listItemElement.enableStyleClass("hovered", hovered);
226e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    },
227e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
228e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    __proto__: TreeElement.prototype
229e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
230