Index: Source/devtools/front_end/elements/ElementsPanel.js |
diff --git a/Source/devtools/front_end/elements/ElementsPanel.js b/Source/devtools/front_end/elements/ElementsPanel.js |
index 073be86290aa16286827fe661f75c6cc9bef3eb7..db559104804f916973e837686b6d79ee0385b48d 100644 |
--- a/Source/devtools/front_end/elements/ElementsPanel.js |
+++ b/Source/devtools/front_end/elements/ElementsPanel.js |
@@ -50,6 +50,7 @@ WebInspector.ElementsPanel = function() |
this._contentElement = createElement("div"); |
var crumbsContainer = createElement("div"); |
+ this._showLayoutEditor = false; |
if (Runtime.experiments.isEnabled("materialDesign")) { |
this._toolbar = this._createElementsToolbar(); |
var toolbar = stackElement.createChild("div", "elements-topbar hbox"); |
@@ -135,6 +136,12 @@ WebInspector.ElementsPanel.prototype = { |
toolbar.appendToolbarItem(this._breakpointsButton); |
toolbar.appendSeparator(); |
+ if (Runtime.experiments.isEnabled("layoutEditor") && !Runtime.queryParam("remoteFrontend")) { |
+ this._layoutEditorButton = new WebInspector.ToolbarButton(WebInspector.UIString("Toggle Layout Editor"), "layout-editor-toolbar-item"); |
+ toolbar.appendToolbarItem(this._layoutEditorButton); |
+ this._layoutEditorButton.addEventListener("click", this._toggleLayoutEditor, this); |
+ toolbar.appendSeparator(); |
+ } |
return toolbar; |
}, |
@@ -259,6 +266,9 @@ WebInspector.ElementsPanel.prototype = { |
// Perform attach if necessary. |
if (this.isShowing()) |
this.wasShown(); |
+ |
+ if (this._showLayoutEditor) |
+ domModel.setHighlighter(new WebInspector.ElementsPanel.LayoutEditorNodeHighlighter(target, treeOutline)); |
}, |
/** |
@@ -274,6 +284,8 @@ WebInspector.ElementsPanel.prototype = { |
treeOutline.unwireFromDOMModel(); |
this._treeOutlines.remove(treeOutline); |
treeOutline.element.remove(); |
+ if (this._showLayoutEditor) |
+ domModel.setHighlighter(null); |
}, |
_updateTreeOutlineVisibleWidth: function() |
@@ -876,7 +888,11 @@ WebInspector.ElementsPanel.prototype = { |
this._omitDefaultSelection = true; |
WebInspector.inspectorView.setCurrentPanel(this); |
node = WebInspector.moduleSetting("showUAShadowDOM").get() ? node : this._leaveUserAgentShadowDOM(node); |
- node.highlightForTwoSeconds(); |
+ if (this._showLayoutEditor) |
+ node.highlight(); |
+ else |
+ node.highlightForTwoSeconds(); |
+ |
this.selectDOMNode(node, true); |
delete this._omitDefaultSelection; |
@@ -1078,6 +1094,29 @@ WebInspector.ElementsPanel.prototype = { |
} |
}, |
+ _toggleLayoutEditor: function() |
+ { |
+ this._showLayoutEditor = !this._showLayoutEditor; |
+ this._layoutEditorButton.setToggled(this._showLayoutEditor); |
+ var targets = WebInspector.targetManager.targets(); |
+ for (var target of targets) { |
+ var domModel = WebInspector.DOMModel.fromTarget(target); |
+ if (!domModel) |
+ continue; |
+ |
+ var treeOutline = /** @type {!WebInspector.ElementsTreeOutline} */(this._modelToTreeOutline.get(domModel)); |
+ if (this._showLayoutEditor) |
+ domModel.setHighlighter(new WebInspector.ElementsPanel.LayoutEditorNodeHighlighter(target, treeOutline)); |
+ else |
+ domModel.setHighlighter(null); |
+ |
+ // We need to correct (turn on/off layout editor) the config which is used by inspect element mode, so we re-enable it. |
+ if (WebInspector.inspectElementModeController && WebInspector.inspectElementModeController.enabled()) |
+ domModel.setInspectModeEnabled(true, WebInspector.moduleSetting("showUAShadowDOM").get()); |
+ } |
+ WebInspector.DOMModel.hideDOMNodeHighlight(); |
+ }, |
+ |
__proto__: WebInspector.Panel.prototype |
} |
@@ -1257,3 +1296,56 @@ WebInspector.ElementsPanel.HiddenMarkerDecorator.prototype = { |
return { color: "#555", title: WebInspector.UIString("Element is hidden") }; |
} |
} |
+ |
+/** |
+ * @constructor |
+ * @extends {WebInspector.DefaultDOMNodeHighlighter} |
+ * @param {!WebInspector.Target} target |
+ * @param {!WebInspector.ElementsTreeOutline} treeOutline |
+ */ |
+WebInspector.ElementsPanel.LayoutEditorNodeHighlighter = function(target, treeOutline) |
+{ |
+ WebInspector.DefaultDOMNodeHighlighter.call(this, target.domAgent()); |
+ this._treeOutline = treeOutline; |
+} |
+ |
+WebInspector.ElementsPanel.LayoutEditorNodeHighlighter.prototype = { |
+ /** |
+ * @override |
+ * @param {?WebInspector.DOMNode} node |
+ * @param {!DOMAgent.HighlightConfig} config |
+ * @param {!DOMAgent.BackendNodeId=} backendNodeId |
+ * @param {!RuntimeAgent.RemoteObjectId=} objectId |
+ */ |
+ highlightDOMNode: function(node, config, backendNodeId, objectId) |
+ { |
+ config.showLayoutEditor = config.showInfo; |
+ var selectedNode = this._treeOutline.selectedDOMNode(); |
+ if (objectId || node || backendNodeId || !selectedNode) |
+ WebInspector.DefaultDOMNodeHighlighter.prototype.highlightDOMNode.call(this, node, config, backendNodeId, objectId); |
+ else |
+ WebInspector.DefaultDOMNodeHighlighter.prototype.highlightDOMNode.call(this, selectedNode, config); |
+ }, |
+ |
+ /** |
+ * @override |
+ * @param {boolean} enabled |
+ * @param {boolean} inspectUAShadowDOM |
+ * @param {!DOMAgent.HighlightConfig} config |
+ * @param {function(?Protocol.Error)=} callback |
+ */ |
+ setInspectModeEnabled: function(enabled, inspectUAShadowDOM, config, callback) |
+ { |
+ config.showLayoutEditor = config.showInfo; |
+ WebInspector.DefaultDOMNodeHighlighter.prototype.setInspectModeEnabled.call(this, enabled, inspectUAShadowDOM, config, callback); |
+ |
+ if (enabled) |
+ return; |
+ |
+ var selectedNode = this._treeOutline.selectedDOMNode(); |
+ if (selectedNode) |
+ WebInspector.DefaultDOMNodeHighlighter.prototype.highlightDOMNode.call(this, selectedNode, config); |
+ }, |
+ |
+ __proto__: WebInspector.DefaultDOMNodeHighlighter.prototype |
+} |