Chromium Code Reviews| Index: Source/devtools/front_end/elements/ElementsTreeElement.js |
| diff --git a/Source/devtools/front_end/elements/ElementsTreeElement.js b/Source/devtools/front_end/elements/ElementsTreeElement.js |
| index 1c99db89405cca39ccb74dcc479820415bfe46ca..c4c59062997d755148baf4cac73f216f5351b14d 100644 |
| --- a/Source/devtools/front_end/elements/ElementsTreeElement.js |
| +++ b/Source/devtools/front_end/elements/ElementsTreeElement.js |
| @@ -40,6 +40,9 @@ WebInspector.ElementsTreeElement = function(node, elementCloseTag) |
| TreeElement.call(this); |
| this._node = node; |
| + this._decorationsElement = createElementWithClass("div"); |
| + this.listItemElement.appendChild(this._decorationsElement); |
| + |
| this._elementCloseTag = elementCloseTag; |
| if (this._node.nodeType() == Node.ELEMENT_NODE && !elementCloseTag) |
| @@ -117,7 +120,7 @@ WebInspector.ElementsTreeElement.canShowInlineText = function(node) |
| WebInspector.ElementsTreeElement.populateForcedPseudoStateItems = function(subMenu, node) |
| { |
| const pseudoClasses = ["active", "hover", "focus", "visited"]; |
| - var forcedPseudoState = node.getUserProperty(WebInspector.CSSStyleModel.PseudoStatePropertyName) || []; |
| + var forcedPseudoState = WebInspector.CSSStyleModel.fromNode(node).pseudoState(node); |
| for (var i = 0; i < pseudoClasses.length; ++i) { |
| var pseudoClassForced = forcedPseudoState.indexOf(pseudoClasses[i]) >= 0; |
| subMenu.appendCheckboxItem(":" + pseudoClasses[i], setPseudoStateCallback.bind(null, pseudoClasses[i], !pseudoClassForced), pseudoClassForced, false); |
| @@ -1061,7 +1064,8 @@ WebInspector.ElementsTreeElement.prototype = { |
| highlightElement.className = "highlight"; |
| highlightElement.appendChild(nodeInfo); |
| this.title = highlightElement; |
| - this._updateDecorations(); |
| + this.updateDecorations(); |
| + this.listItemElement.insertBefore(this._decorationsElement, this.listItemElement.firstChild); |
| delete this._highlightResult; |
| } |
| @@ -1072,48 +1076,62 @@ WebInspector.ElementsTreeElement.prototype = { |
| this._highlightSearchResults(); |
| }, |
| - /** |
| - * @return {?Element} |
| - */ |
| - _createDecoratorElement: function() |
| + updateDecorations: function() |
| { |
| + if (this.isClosingTag()) |
| + return; |
| var node = this._node; |
| - var decoratorMessages = []; |
| - var parentDecoratorMessages = []; |
| - var decorators = this.treeOutline.nodeDecorators(); |
| - for (var i = 0; i < decorators.length; ++i) { |
| - var decorator = decorators[i]; |
| - var message = decorator.decorate(node); |
| - if (message) { |
| - decoratorMessages.push(message); |
| - continue; |
| - } |
| + if (node.nodeType() !== Node.ELEMENT_NODE) |
| + return; |
| + |
| + var extensions = runtime.extensions(WebInspector.DOMPresentationUtils.MarkerDecorator); |
| + var markerToExtension = new Map(); |
| + for (var extension of extensions) |
| + markerToExtension.set(extension.descriptor()["marker"], extension); |
| - if (this.expanded || this._elementCloseTag) |
| - continue; |
| + var promises = []; |
| + var decorations = []; |
| + var descendantDecorations = []; |
| + node.traverseMarkers(visitor); |
| - message = decorator.decorateAncestor(node); |
| - if (message) |
| - parentDecoratorMessages.push(message) |
| + /** |
| + * @param {!WebInspector.DOMNode} n |
| + * @param {string} marker |
| + */ |
| + function visitor(n, marker) |
| + { |
| + var extension = markerToExtension.get(marker); |
| + if (!extension) |
| + return; |
| + promises.push(extension.instancePromise().then(decorate.bind(null, n))); |
| } |
| - if (!decoratorMessages.length && !parentDecoratorMessages.length) |
| - return null; |
| - |
| - var decoratorElement = createElement("div"); |
| - decoratorElement.classList.add("elements-gutter-decoration"); |
| - if (!decoratorMessages.length) |
| - decoratorElement.classList.add("elements-has-decorated-children"); |
| - decoratorElement.title = decoratorMessages.concat(parentDecoratorMessages).join("\n"); |
| - return decoratorElement; |
| - }, |
| - _updateDecorations: function() |
| - { |
| - if (this._decoratorElement) |
| - this._decoratorElement.remove(); |
| - this._decoratorElement = this._createDecoratorElement(); |
| - if (this._decoratorElement && this.listItemElement) |
| - this.listItemElement.insertBefore(this._decoratorElement, this.listItemElement.firstChild); |
| + /** |
| + * @param {!WebInspector.DOMNode} n |
| + * @param {!WebInspector.DOMPresentationUtils.MarkerDecorator} decorator |
| + */ |
| + function decorate(n, decorator) |
|
dgozman
2015/08/07 23:35:05
This is more of |collectDecoration| rather than |d
pfeldman
2015/08/10 21:35:17
Done.
|
| + { |
| + var decoration = decorator.decorate(n); |
| + if (!decoration) |
| + return; |
| + (n === node ? decorations : descendantDecorations).push(decoration); |
| + } |
| + |
| + Promise.all(promises).then(setTitle.bind(this)); |
| + |
| + /** |
| + * @this {WebInspector.ElementsTreeElement} |
| + */ |
| + function setTitle() |
| + { |
| + this._decorationsElement.classList.toggle("elements-gutter-decoration", decorations.length || (descendantDecorations.length && !this.expanded)); |
| + this._decorationsElement.classList.toggle("elements-has-decorated-children", descendantDecorations.length && !this.expanded); |
| + var title = decorations.join("\n"); |
| + if (descendantDecorations.length) |
| + title += WebInspector.UIString("\nChildren:\n") + descendantDecorations.join("\n"); |
| + this._decorationsElement.title = title; |
| + } |
| }, |
| /** |