UNPKG

monaca-lib

Version:

Monaca cloud API bindings for JavaScript

173 lines (160 loc) 5.48 kB
// Copyright 2014 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.View} * @param {!Document} parsedXML */ WebInspector.XMLView = function(parsedXML) { WebInspector.View.call(this, true); this.registerRequiredCSS("network/xmlView.css"); this.contentElement.classList.add("shadow-xml-view", "source-code"); WebInspector.XMLView.Node.populate(new TreeOutline(this.contentElement.createChild("ol")), parsedXML); } /** * @param {string} text * @param {string} mimeType * @return {?Document} */ WebInspector.XMLView.parseXML = function(text, mimeType) { var parsedXML; try { parsedXML = (new DOMParser()).parseFromString(text, mimeType); } catch (e) { return null; } if (parsedXML.body) return null; return parsedXML; } WebInspector.XMLView.prototype = { __proto__: WebInspector.View.prototype } /** * @constructor * @extends {TreeElement} * @param {!Node} node * @param {boolean} closeTag */ WebInspector.XMLView.Node = function(node, closeTag) { TreeElement.call(this, "", null, true); this._node = node; this._closeTag = closeTag; this._populated = false; this.selectable = false; this.hasChildren = !closeTag && !!node.childElementCount; this._updateTitle(); } /** * @param {!TreeOutline|!TreeElement} root * @param {!Node} xmlNode */ WebInspector.XMLView.Node.populate = function(root, xmlNode) { var node = xmlNode.firstChild; while (node) { var currentNode = node; node = node.nextSibling; var nodeType = currentNode.nodeType; // ignore empty TEXT if (nodeType === 3 && currentNode.nodeValue.match(/\s+/)) continue; // ignore ATTRIBUTE, ENTITY_REFERENCE, ENTITY, DOCUMENT, DOCUMENT_TYPE, DOCUMENT_FRAGMENT, NOTATION if ((nodeType !== 1) && (nodeType !== 3) && (nodeType !== 4) && (nodeType !== 7) && (nodeType !== 8)) continue; root.appendChild(new WebInspector.XMLView.Node(currentNode, false)); } } WebInspector.XMLView.Node.prototype = { _updateTitle: function() { var node = this._node; switch (node.nodeType) { case 1: // ELEMENT var tag = node.tagName; if (this._closeTag) { this._setTitle(["</" + tag + ">", "shadow-xml-view-tag"]); return; } var titleItems = ["<" + tag, "shadow-xml-view-tag"]; var attributes = node.attributes; for (var i = 0; i < attributes.length; ++i) { var attributeNode = attributes.item(i); titleItems.push( "\u00a0", "shadow-xml-view-tag", attributeNode.name, "shadow-xml-view-attribute-name", "=\"", "shadow-xml-view-tag", attributeNode.value, "shadow-xml-view-attribute-value", "\"", "shadow-xml-view-tag") } if (!this.expanded) { if (node.childElementCount) { titleItems.push( ">", "shadow-xml-view-tag", "\u2026", "shadow-xml-view-comment", "</" + tag, "shadow-xml-view-tag"); } else if (this._node.textContent) { titleItems.push( ">", "shadow-xml-view-tag", node.textContent, "shadow-xml-view-text", "</" + tag, "shadow-xml-view-tag"); } else { titleItems.push(" /", "shadow-xml-view-tag"); } } titleItems.push(">", "shadow-xml-view-tag"); this._setTitle(titleItems); return; case 3: // TEXT this._setTitle([node.nodeValue, "shadow-xml-view-text"]); return; case 4: // CDATA this._setTitle([ "<![CDATA[", "shadow-xml-view-cdata", node.nodeValue, "shadow-xml-view-text", "]]>", "shadow-xml-view-cdata"]); return; case 7: // PROCESSING_INSTRUCTION this._setTitle(["<?" + node.nodeName + " " + node.nodeValue + "?>", "shadow-xml-view-processing-instruction"]); return; case 8: // COMMENT this._setTitle(["<!--" + node.nodeValue + "-->", "shadow-xml-view-comment"]); return; } }, /** * @param {!Array.<string>} items */ _setTitle: function(items) { var titleFragment = createDocumentFragment(); for (var i = 0; i < items.length; i += 2) titleFragment.createChild("span", items[i + 1]).textContent = items[i]; this.title = titleFragment; }, onattach: function() { this.listItemElement.classList.toggle("shadow-xml-view-close-tag", this._closeTag); }, onexpand: function() { this._updateTitle(); }, oncollapse: function() { this._updateTitle(); }, onpopulate: function() { if (this._populated || this._closeTag) return; WebInspector.XMLView.Node.populate(this, this._node); this.appendChild(new WebInspector.XMLView.Node(this._node, true)); this._populated = true; }, __proto__: TreeElement.prototype }