| Index: Source/devtools/front_end/elements/ElementsTreeOutline.js
|
| diff --git a/Source/devtools/front_end/elements/ElementsTreeOutline.js b/Source/devtools/front_end/elements/ElementsTreeOutline.js
|
| index 42d8d3b2923a11f683b48c77b184299f9d961eab..a2839eab640a6ec4be6d3a533ada82b70466d99d 100644
|
| --- a/Source/devtools/front_end/elements/ElementsTreeOutline.js
|
| +++ b/Source/devtools/front_end/elements/ElementsTreeOutline.js
|
| @@ -1024,7 +1024,7 @@ WebInspector.ElementsTreeElement = function(node, elementCloseTag)
|
| this._node = node;
|
|
|
| this._elementCloseTag = elementCloseTag;
|
| - this._updateHasChildren();
|
| + this._updateChildrenDisplayMode();
|
|
|
| if (this._node.nodeType() == Node.ELEMENT_NODE && !elementCloseTag)
|
| this._canAddAttributes = true;
|
| @@ -1046,6 +1046,13 @@ WebInspector.ElementsTreeElement.EditTagBlacklist = [
|
| "html", "head", "body"
|
| ].keySet();
|
|
|
| +/** @enum {number} */
|
| +WebInspector.ElementsTreeElement.ChildrenDisplayMode = {
|
| + NoChildren: 0,
|
| + InlineText: 1,
|
| + HasChildren: 2
|
| +}
|
| +
|
| WebInspector.ElementsTreeElement.prototype = {
|
| /**
|
| * @return {!WebInspector.DOMNode}
|
| @@ -1248,7 +1255,7 @@ WebInspector.ElementsTreeElement.prototype = {
|
| onpopulate: function()
|
| {
|
| this.populated = true;
|
| - if (this.children.length || !this.hasChildren)
|
| + if (this.children.length || !this._hasChildTreeElements())
|
| return;
|
|
|
| this.updateChildren();
|
| @@ -1259,7 +1266,7 @@ WebInspector.ElementsTreeElement.prototype = {
|
| */
|
| updateChildren: function(fullRefresh)
|
| {
|
| - if (!this.hasChildren)
|
| + if (!this._hasChildTreeElements())
|
| return;
|
| console.assert(!this._elementCloseTag);
|
| this._node.getChildNodes(this._updateChildren.bind(this, fullRefresh || false));
|
| @@ -1352,7 +1359,7 @@ WebInspector.ElementsTreeElement.prototype = {
|
| this.updateTitle();
|
| this._adjustCollapsedRange();
|
|
|
| - if (this._node.nodeType() === Node.ELEMENT_NODE && this.hasChildren)
|
| + if (this._node.nodeType() === Node.ELEMENT_NODE && this._hasChildTreeElements())
|
| this.insertChildElement(this._node, this.children.length, true);
|
|
|
| // We want to restore the original selection and tree scroll position after a full refresh, if possible.
|
| @@ -1540,7 +1547,7 @@ WebInspector.ElementsTreeElement.prototype = {
|
| if (this._startEditingTarget(/** @type {!Element} */(event.target)))
|
| return false;
|
|
|
| - if (this.hasChildren && !this.expanded)
|
| + if (this._hasChildTreeElements() && !this.expanded)
|
| this.expand();
|
| return false;
|
| },
|
| @@ -2393,7 +2400,7 @@ WebInspector.ElementsTreeElement.prototype = {
|
| _nodeTitleInfo: function(linkify)
|
| {
|
| var node = this._node;
|
| - var info = {titleDOM: createDocumentFragment(), hasChildren: this.hasChildren};
|
| + var info = {titleDOM: createDocumentFragment(), hasChildren: this._hasChildTreeElements()};
|
|
|
| switch (node.nodeType()) {
|
| case Node.ATTRIBUTE_NODE:
|
| @@ -2417,28 +2424,30 @@ WebInspector.ElementsTreeElement.prototype = {
|
|
|
| this._buildTagDOM(info.titleDOM, tagName, false, false, linkify);
|
|
|
| - var showInlineText = this._showInlineText() && !this.hasChildren;
|
| - if (!this.expanded && !showInlineText && (this.treeOutline.isXMLMimeType || !WebInspector.ElementsTreeElement.ForbiddenClosingTagElements[tagName])) {
|
| - if (this.hasChildren) {
|
| + switch (this._childrenDisplayMode) {
|
| + case WebInspector.ElementsTreeElement.ChildrenDisplayMode.HasChildren:
|
| + if (!this.expanded) {
|
| var textNodeElement = info.titleDOM.createChild("span", "webkit-html-text-node bogus");
|
| textNodeElement.textContent = "\u2026";
|
| info.titleDOM.createTextChild("\u200B");
|
| + this._buildTagDOM(info.titleDOM, tagName, true, false);
|
| }
|
| - this._buildTagDOM(info.titleDOM, tagName, true, false);
|
| - }
|
| + break;
|
|
|
| - // If this element only has a single child that is a text node,
|
| - // just show that text and the closing tag inline rather than
|
| - // create a subtree for them
|
| - if (showInlineText) {
|
| - console.assert(!this.hasChildren);
|
| + case WebInspector.ElementsTreeElement.ChildrenDisplayMode.InlineText:
|
| var textNodeElement = info.titleDOM.createChild("span", "webkit-html-text-node");
|
| var result = this._convertWhitespaceToEntities(node.firstChild.nodeValue());
|
| textNodeElement.textContent = result.text;
|
| WebInspector.highlightRangesWithStyleClass(textNodeElement, result.entityRanges, "webkit-html-entity-value");
|
| info.titleDOM.createTextChild("\u200B");
|
| - this._buildTagDOM(info.titleDOM, tagName, true, false);
|
| info.hasChildren = false;
|
| + this._buildTagDOM(info.titleDOM, tagName, true, false);
|
| + break;
|
| +
|
| + case WebInspector.ElementsTreeElement.ChildrenDisplayMode.NoChildren:
|
| + if (this.treeOutline.isXMLMimeType || !WebInspector.ElementsTreeElement.ForbiddenClosingTagElements[tagName])
|
| + this._buildTagDOM(info.titleDOM, tagName, true, false);
|
| + break;
|
| }
|
| break;
|
|
|
| @@ -2507,24 +2516,6 @@ WebInspector.ElementsTreeElement.prototype = {
|
| return info;
|
| },
|
|
|
| - /**
|
| - * @return {boolean}
|
| - */
|
| - _showInlineText: function()
|
| - {
|
| - if (this._node.importedDocument() || this._node.templateContent() || this._visibleShadowRoots().length > 0 || this._node.hasPseudoElements())
|
| - return false;
|
| - if (this._node.nodeType() !== Node.ELEMENT_NODE)
|
| - return false;
|
| - if (!this._node.firstChild || this._node.firstChild !== this._node.lastChild || this._node.firstChild.nodeType() !== Node.TEXT_NODE)
|
| - return false;
|
| - var textChild = this._node.firstChild;
|
| - var maxInlineTextChildLength = 80;
|
| - if (textChild.nodeValue().length < maxInlineTextChildLength)
|
| - return true;
|
| - return false;
|
| - },
|
| -
|
| remove: function()
|
| {
|
| if (this._node.pseudoType())
|
| @@ -2703,9 +2694,45 @@ WebInspector.ElementsTreeElement.prototype = {
|
| return childCount;
|
| },
|
|
|
| - _updateHasChildren: function()
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + _hasChildTreeElements: function()
|
| + {
|
| + return this._childrenDisplayMode === WebInspector.ElementsTreeElement.ChildrenDisplayMode.HasChildren;
|
| + },
|
| +
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| + _canShowInlineText: function()
|
| + {
|
| + if (this._node.importedDocument() || this._node.templateContent() || this._visibleShadowRoots().length > 0 || this._node.hasPseudoElements())
|
| + return false;
|
| + if (this._node.nodeType() !== Node.ELEMENT_NODE)
|
| + return false;
|
| + if (!this._node.firstChild || this._node.firstChild !== this._node.lastChild || this._node.firstChild.nodeType() !== Node.TEXT_NODE)
|
| + return false;
|
| + var textChild = this._node.firstChild;
|
| + var maxInlineTextChildLength = 80;
|
| + if (textChild.nodeValue().length < maxInlineTextChildLength)
|
| + return true;
|
| + return false;
|
| + },
|
| +
|
| + _updateChildrenDisplayMode: function()
|
| {
|
| - this.hasChildren = !this._elementCloseTag && !this._showInlineText() && this._visibleChildCount() > 0;
|
| + var showInlineText = this._canShowInlineText();
|
| + var hasChildren = !this._elementCloseTag && this._visibleChildCount() > 0;
|
| +
|
| + if (showInlineText)
|
| + this._childrenDisplayMode = WebInspector.ElementsTreeElement.ChildrenDisplayMode.InlineText;
|
| + else if (hasChildren)
|
| + this._childrenDisplayMode = WebInspector.ElementsTreeElement.ChildrenDisplayMode.HasChildren;
|
| + else
|
| + this._childrenDisplayMode = WebInspector.ElementsTreeElement.ChildrenDisplayMode.NoChildren;
|
| +
|
| + this.setHasChildren(this._childrenDisplayMode === WebInspector.ElementsTreeElement.ChildrenDisplayMode.HasChildren);
|
| },
|
|
|
| __proto__: TreeElement.prototype
|
| @@ -2757,10 +2784,9 @@ WebInspector.ElementsTreeUpdater.prototype = {
|
|
|
| var treeElement = this._treeOutline.findTreeElement(parentNode);
|
| if (treeElement) {
|
| - var oldHasChildren = treeElement.hasChildren;
|
| - var oldShowInlineText = treeElement._showInlineText();
|
| - treeElement._updateHasChildren();
|
| - if (treeElement.hasChildren !== oldHasChildren || oldShowInlineText || treeElement._showInlineText())
|
| + var oldDisplayMode = treeElement._childrenDisplayMode;
|
| + treeElement._updateChildrenDisplayMode();
|
| + if (treeElement._childrenDisplayMode !== oldDisplayMode)
|
| this._nodeModified(parentNode);
|
| }
|
|
|
|
|