blob: 1cb82e1d3ebe4014e72b9e7ae86577e07bafbbf8 [file] [log] [blame]
/*
* Copyright (C) 2013 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
importScript("LayerTreeModel.js");
importScript("LayerTree.js");
importScript("Layers3DView.js");
importScript("LayerDetailsView.js");
/**
* @constructor
* @extends {WebInspector.Panel}
*/
WebInspector.LayersPanel = function()
{
WebInspector.Panel.call(this, "layers");
this.registerRequiredCSS("layersPanel.css");
const initialLayerTreeSidebarWidth = 225;
const minimumMainWidthPercent = 0.5;
this.createSidebarViewWithTree();
this.sidebarElement.addStyleClass("outline-disclosure");
this.sidebarTreeElement.removeStyleClass("sidebar-tree");
this._model = new WebInspector.LayerTreeModel();
this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerTreeChanged, this._onLayerTreeUpdated, this);
this._currentlySelectedLayer = null;
this._currentlyHoveredLayer = null;
this._layerTree = new WebInspector.LayerTree(this._model, this.sidebarTree);
this._layerTree.addEventListener(WebInspector.LayerTree.Events.LayerSelected, this._onLayerSelected, this);
this._layerTree.addEventListener(WebInspector.LayerTree.Events.LayerHovered, this._onLayerHovered, this);
this._layerDetailsSplitView = new WebInspector.SplitView(false, "layerDetailsSplitView");
this._layerDetailsSplitView.show(this.splitView.mainElement);
this._layers3DView = new WebInspector.Layers3DView(this._model);
this._layers3DView.show(this._layerDetailsSplitView.firstElement());
this._layers3DView.addEventListener(WebInspector.Layers3DView.Events.LayerSelected, this._onLayerSelected, this);
this._layers3DView.addEventListener(WebInspector.Layers3DView.Events.LayerHovered, this._onLayerHovered, this);
this._layerDetailsView = new WebInspector.LayerDetailsView();
this._layerDetailsView.show(this._layerDetailsSplitView.secondElement());
this._model.requestLayers();
}
WebInspector.LayersPanel.prototype = {
wasShown: function()
{
WebInspector.Panel.prototype.wasShown.call(this);
this._layerTree.setVisible(true);
this.sidebarTreeElement.focus();
},
willHide: function()
{
this._layerTree.setVisible(false);
WebInspector.Panel.prototype.willHide.call(this);
},
_onLayerTreeUpdated: function()
{
if (this._currentlySelectedLayer && !this._model.layerById(this._currentlySelectedLayer.id()))
this._selectLayer(null);
if (this._currentlyHoveredLayer && !this._model.layerById(this._currentlyHoveredLayer.id()))
this._hoverLayer(null);
if (this._currentlySelectedLayer)
this._layerDetailsView.showLayer(this._currentlySelectedLayer);
},
/**
* @param {WebInspector.Event} event
*/
_onLayerSelected: function(event)
{
var layer = /** @type WebInspector.Layer */ (event.data);
this._selectLayer(layer);
},
/**
* @param {WebInspector.Event} event
*/
_onLayerHovered: function(event)
{
var layer = /** @type WebInspector.Layer */ (event.data);
this._hoverLayer(layer);
},
/**
* @param {WebInspector.Layer?} layer
*/
_selectLayer: function(layer)
{
if (this._currentlySelectedLayer === layer)
return;
this._currentlySelectedLayer = layer;
var nodeId = layer && layer.nodeIdForSelfOrAncestor();
if (nodeId)
WebInspector.domAgent.highlightDOMNodeForTwoSeconds(nodeId);
else
WebInspector.domAgent.hideDOMNodeHighlight();
this._layerTree.selectLayer(layer);
this._layers3DView.selectLayer(layer);
this._layerDetailsView.showLayer(layer);
},
/**
* @param {WebInspector.Layer?} layer
*/
_hoverLayer: function(layer)
{
if (this._currentlyHoveredLayer === layer)
return;
this._currentlyHoveredLayer = layer;
var nodeId = layer && layer.nodeIdForSelfOrAncestor();
if (nodeId)
WebInspector.domAgent.highlightDOMNode(nodeId);
else
WebInspector.domAgent.hideDOMNodeHighlight();
this._layerTree.hoverLayer(layer);
this._layers3DView.hoverLayer(layer);
},
__proto__: WebInspector.Panel.prototype
}