Chromium Code Reviews| Index: Source/devtools/front_end/elements/ComputedStyleWidget.js |
| diff --git a/Source/devtools/front_end/elements/ComputedStyleWidget.js b/Source/devtools/front_end/elements/ComputedStyleWidget.js |
| index 6b6b6bbfb4f2df10d61fec21c1f37184df3d5970..6d6322ae4fee4bd41ebfb5926f07d0e56238bab5 100644 |
| --- a/Source/devtools/front_end/elements/ComputedStyleWidget.js |
| +++ b/Source/devtools/front_end/elements/ComputedStyleWidget.js |
| @@ -58,11 +58,13 @@ WebInspector.ComputedStyleWidget = function(stylesSidebarPane, sharedModel) |
| WebInspector.UIString("Show inherited properties"), |
| this._showInheritedComputedStylePropertiesSetting)); |
| - this._propertiesContainer = this.element.createChild("div", "monospace"); |
| - this._propertiesContainer.classList.add("computed-properties"); |
| - this._onTracePropertyBound = this._onTraceProperty.bind(this); |
| + this._propertiesOutline = new TreeOutlineInShadow(); |
| + this._propertiesOutline.registerRequiredCSS("elements/computedStyleSidebarPane.css"); |
| + this._propertiesOutline.element.classList.add("monospace", "computed-properties"); |
| + this.element.appendChild(this._propertiesOutline.element); |
| this._stylesSidebarPane = stylesSidebarPane; |
| + this._linkifier = new WebInspector.Linkifier(new WebInspector.Linkifier.DefaultCSSFormatter()); |
| /** |
| * @param {?RegExp} regex |
| @@ -89,18 +91,6 @@ WebInspector.ComputedStyleWidget.createSidebarWrapper = function(stylesSidebarPa |
| WebInspector.ComputedStyleWidget._propertySymbol = Symbol("property"); |
| WebInspector.ComputedStyleWidget.prototype = { |
| - /** |
| - * @param {!Event} event |
| - */ |
| - _onTraceProperty: function(event) |
| - { |
| - var item = event.target.enclosingNodeOrSelfWithClass("computed-style-property"); |
| - var property = item && item[WebInspector.ComputedStyleWidget._propertySymbol]; |
| - if (!property) |
| - return; |
| - this._stylesSidebarPane.tracePropertyName(property.name); |
| - }, |
| - |
| _showInheritedComputedStyleChanged: function() |
| { |
| this.update(); |
| @@ -140,13 +130,16 @@ WebInspector.ComputedStyleWidget.prototype = { |
| */ |
| _innerRebuildUpdate: function(nodeStyle, cascades) |
| { |
| - this._propertiesContainer.removeChildren(); |
| - if (!nodeStyle || !cascades) |
| + this._propertiesOutline.removeChildren(); |
| + this._linkifier.reset(); |
| + var cssModel = this._sharedModel.cssModel(); |
| + if (!nodeStyle || !cascades || !cssModel) |
| return; |
| var uniqueProperties = nodeStyle.computedStyle.keysArray(); |
| uniqueProperties.sort(propertySorter); |
| + var propertyTraces = this._computePropertyTraces(cascades.matched); |
| var showInherited = this._showInheritedComputedStylePropertiesSetting.get(); |
| for (var i = 0; i < uniqueProperties.length; ++i) { |
| var propertyName = uniqueProperties[i]; |
| @@ -157,25 +150,33 @@ WebInspector.ComputedStyleWidget.prototype = { |
| var canonicalName = WebInspector.CSSMetadata.canonicalPropertyName(propertyName); |
| if (propertyName !== canonicalName && propertyValue === nodeStyle.computedStyle.get(canonicalName)) |
| continue; |
| - var item = this._propertiesContainer.createChild("div", "computed-style-property"); |
| - item[WebInspector.ComputedStyleWidget._propertySymbol] = { |
| + |
| + var propertyElement = createElement("div"); |
| + propertyElement.classList.add("computed-style-property"); |
| + propertyElement.classList.toggle("computed-style-property-inherited", inherited); |
| + var renderer = new WebInspector.StylesSidebarPropertyRenderer(null, nodeStyle.node, propertyName, /** @type {string} */(propertyValue)); |
| + renderer.setColorHandler(this._processColor.bind(this)); |
| + propertyElement.appendChild(renderer.renderName()); |
| + propertyElement.appendChild(createTextNode(": ")); |
|
pfeldman
2015/08/27 19:10:08
createTextChild
|
| + propertyElement.appendChild(renderer.renderValue()); |
| + propertyElement.appendChild(createTextNode(";")); |
|
pfeldman
2015/08/27 19:10:08
ditto
|
| + |
| + var treeElement = new TreeElement(); |
| + treeElement.selectable = false; |
| + treeElement.title = propertyElement; |
| + treeElement[WebInspector.ComputedStyleWidget._propertySymbol] = { |
| name: propertyName, |
| value: propertyValue |
| }; |
| - item.classList.toggle("computed-style-property-inherited", inherited); |
| - var renderer = new WebInspector.StylesSidebarPropertyRenderer(null, nodeStyle.node, propertyName, /** @type {string} */(propertyValue)); |
| - renderer.setColorHandler(this._processColor.bind(this)); |
| + this._propertiesOutline.appendChild(treeElement); |
| - if (!inherited) { |
| - var traceButton = item.createChild("div", "computed-style-trace-button"); |
| - traceButton.createChild("div", "glyph"); |
| - traceButton.addEventListener("click", this._onTracePropertyBound, false); |
| + var trace = propertyTraces.get(propertyName); |
| + if (trace) { |
| + this._renderPropertyTrace(treeElement, cssModel, trace); |
| + propertyElement.addEventListener("mousedown", consumeEvent, false); |
| + propertyElement.addEventListener("dblclick", consumeEvent, false); |
| + propertyElement.addEventListener("click", handleClick.bind(null, treeElement), false); |
| } |
| - item.appendChild(renderer.renderName()); |
| - item.appendChild(createTextNode(": ")); |
| - item.appendChild(renderer.renderValue()); |
| - item.appendChild(createTextNode(";")); |
| - this._propertiesContainer.appendChild(item); |
| } |
| this._updateFilter(this._filterRegex); |
| @@ -189,6 +190,77 @@ WebInspector.ComputedStyleWidget.prototype = { |
| var canonicalName = WebInspector.CSSMetadata.canonicalPropertyName; |
| return canonicalName(a).compareTo(canonicalName(b)); |
| } |
| + |
| + /** |
| + * @param {!TreeElement} treeElement |
| + * @param {!Event} event |
| + */ |
| + function handleClick(treeElement, event) |
| + { |
| + if (!treeElement.expanded) |
| + treeElement.expand(); |
| + else |
| + treeElement.collapse(); |
| + consumeEvent(event); |
| + } |
| + }, |
| + |
| + /** |
| + * @param {!TreeElement} rootTreeElement |
| + * @param {!WebInspector.CSSStyleModel} cssModel |
| + * @param {!Array.<!{property: !WebInspector.CSSProperty, overloaded: boolean}>} tracedProperties |
| + */ |
| + _renderPropertyTrace: function(rootTreeElement, cssModel, tracedProperties) |
| + { |
| + for (var propertyInfo of tracedProperties) { |
| + var trace = createElement("div"); |
| + trace.classList.add("property-trace"); |
| + if (propertyInfo.overloaded) |
| + trace.classList.add("property-trace-inactive"); |
| + |
| + var valueElement = trace.createChild("span", "property-trace-value"); |
| + valueElement.textContent = propertyInfo.property.value; |
| + trace.createTextChild(" - "); |
| + |
| + var rule = propertyInfo.property.ownerStyle.parentRule; |
| + if (rule) { |
| + var linkSpan = trace.createChild("span", "trace-link"); |
| + linkSpan.appendChild(WebInspector.StylePropertiesSection.createRuleOriginNode(cssModel, this._linkifier, rule)); |
| + } |
| + |
| + var selectorElement = trace.createChild("span", "property-trace-selector"); |
| + selectorElement.textContent = rule ? rule.selectorText : "element.style"; |
| + selectorElement.title = selectorElement.textContent; |
| + |
| + var traceTreeElement = new TreeElement(); |
| + traceTreeElement.title = trace; |
| + traceTreeElement.selectable = false; |
| + rootTreeElement.appendChild(traceTreeElement); |
| + } |
| + }, |
| + |
| + /** |
| + * @param {!WebInspector.SectionCascade} matchedCascade |
| + * @return {!Map.<string, !Array.<!{property: !WebInspector.CSSProperty, overloaded: boolean}>>} |
| + */ |
| + _computePropertyTraces: function(matchedCascade) |
| + { |
| + var result = new Map(); |
| + var models = matchedCascade.sectionModels(); |
| + for (var model of models) { |
| + var allProperties = model.style().allProperties; |
| + for (var property of allProperties) { |
| + if (!property.activeInStyle() || !model.isPropertyInCascade(property.name)) |
| + continue; |
| + if (!result.has(property.name)) |
| + result.set(property.name, []); |
| + result.get(property.name).push({ |
| + property: property, |
| + overloaded: model.isPropertyOverloaded(property.name) |
| + }); |
| + } |
| + } |
| + return result; |
| }, |
| /** |
| @@ -206,11 +278,11 @@ WebInspector.ComputedStyleWidget.prototype = { |
| */ |
| _updateFilter: function(regex) |
| { |
| - for (var i = 0; i < this._propertiesContainer.children.length; ++i) { |
| - var item = this._propertiesContainer.children[i]; |
| - var property = item[WebInspector.ComputedStyleWidget._propertySymbol]; |
| + var children = this._propertiesOutline.rootElement().children(); |
| + for (var child of children) { |
| + var property = child[WebInspector.ComputedStyleWidget._propertySymbol]; |
| var matched = !regex || regex.test(property.name) || regex.test(property.value); |
| - item.classList.toggle("hidden", !matched); |
| + child.hidden = !matched; |
| } |
| }, |