blob: c4046e4a1967b34124305e2a2c7cd5287583b948 [file] [log] [blame]
// Copyright (c) 2015 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.
/**
* @constructor
* @extends {WebInspector.ElementsPanel.BaseToolbarPaneWidget}
* @param {!WebInspector.ToolbarItem} toolbarItem
*/
WebInspector.ElementStatePaneWidget = function(toolbarItem)
{
WebInspector.ElementsPanel.BaseToolbarPaneWidget.call(this, toolbarItem);
this.element.className = "styles-element-state-pane";
this.element.createChild("div").createTextChild(WebInspector.UIString("Force element state"));
var table = createElementWithClass("table", "source-code");
var inputs = [];
this._inputs = inputs;
/**
* @param {!Event} event
*/
function clickListener(event)
{
var node = WebInspector.context.flavor(WebInspector.DOMNode);
if (!node)
return;
WebInspector.CSSStyleModel.fromNode(node).forcePseudoState(node, event.target.state, event.target.checked);
}
/**
* @param {string} state
* @return {!Element}
*/
function createCheckbox(state)
{
var td = createElement("td");
var label = createCheckboxLabel(":" + state);
var input = label.checkboxElement;
input.state = state;
input.addEventListener("click", clickListener, false);
inputs.push(input);
td.appendChild(label);
return td;
}
var tr = table.createChild("tr");
tr.appendChild(createCheckbox.call(null, "active"));
tr.appendChild(createCheckbox.call(null, "hover"));
tr = table.createChild("tr");
tr.appendChild(createCheckbox.call(null, "focus"));
tr.appendChild(createCheckbox.call(null, "visited"));
this.element.appendChild(table);
}
WebInspector.ElementStatePaneWidget.prototype = {
/**
* @param {?WebInspector.Target} target
*/
_updateTarget: function(target)
{
if (this._target === target)
return;
if (this._target) {
var cssModel = WebInspector.CSSStyleModel.fromTarget(this._target);
cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.PseudoStateForced, this._pseudoStateForced, this)
}
this._target = target;
if (target) {
var cssModel = WebInspector.CSSStyleModel.fromTarget(target);
cssModel.addEventListener(WebInspector.CSSStyleModel.Events.PseudoStateForced, this._pseudoStateForced, this)
}
},
/**
* @param {!WebInspector.Event} event
*/
_pseudoStateForced: function(event)
{
this.update();
},
/**
* @override
* @param {?WebInspector.DOMNode} newNode
*/
onNodeChanged: function(newNode)
{
this._updateTarget(newNode? newNode.target() : null);
this.update();
},
/**
* @override
* @return {!Promise.<?>}
*/
doUpdate: function()
{
var node = WebInspector.context.flavor(WebInspector.DOMNode);
if (node) {
var nodePseudoState = WebInspector.CSSStyleModel.fromNode(node).pseudoState(node);
for (var input of this._inputs) {
input.disabled = !!node.pseudoType();
input.checked = nodePseudoState.indexOf(input.state) >= 0;
}
} else {
for (var input of this._inputs) {
input.disabled = true;
input.checked = false;
}
}
return Promise.resolve();
},
__proto__: WebInspector.ElementsPanel.BaseToolbarPaneWidget.prototype
}
/**
* @constructor
* @implements {WebInspector.ToolbarItem.Provider}
*/
WebInspector.ElementStatePaneWidget.ButtonProvider = function()
{
this._button = new WebInspector.ToolbarButton(WebInspector.UIString("Toggle Element State"), "pin-toolbar-item");
this._button.addEventListener("click", this._clicked, this);
this._view = new WebInspector.ElementStatePaneWidget(this.item());
WebInspector.context.addFlavorChangeListener(WebInspector.DOMNode, this._nodeChanged, this);
this._nodeChanged();
}
WebInspector.ElementStatePaneWidget.ButtonProvider.prototype = {
_clicked: function()
{
WebInspector.ElementsPanel.instance().showToolbarPane(!this._view.isShowing() ? this._view : null);
},
/**
* @override
* @return {!WebInspector.ToolbarItem}
*/
item: function()
{
return this._button;
},
_nodeChanged: function()
{
var enabled = !!WebInspector.context.flavor(WebInspector.DOMNode);
this._button.setEnabled(enabled);
if (!enabled && this._button.toggled())
WebInspector.ElementsPanel.instance().showToolbarPane(null);
}
}