summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/devtools/front_end/DOMAgent.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/DOMAgent.js')
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/DOMAgent.js1618
1 files changed, 0 insertions, 1618 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/DOMAgent.js b/chromium/third_party/WebKit/Source/devtools/front_end/DOMAgent.js
deleted file mode 100644
index 09286b7ab17..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/DOMAgent.js
+++ /dev/null
@@ -1,1618 +0,0 @@
-/*
- * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
- * Copyright (C) 2009 Joseph Pecoraro
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @constructor
- * @param {!WebInspector.DOMAgent} domAgent
- * @param {?WebInspector.DOMDocument} doc
- * @param {boolean} isInShadowTree
- * @param {!DOMAgent.Node} payload
- */
-WebInspector.DOMNode = function(domAgent, doc, isInShadowTree, payload) {
- this._domAgent = domAgent;
- this.ownerDocument = doc;
- this._isInShadowTree = isInShadowTree;
-
- this.id = payload.nodeId;
- domAgent._idToDOMNode[this.id] = this;
- this._nodeType = payload.nodeType;
- this._nodeName = payload.nodeName;
- this._localName = payload.localName;
- this._nodeValue = payload.nodeValue;
- this._pseudoType = payload.pseudoType;
- this._shadowRootType = payload.shadowRootType;
-
- this._shadowRoots = [];
-
- this._attributes = [];
- this._attributesMap = {};
- if (payload.attributes)
- this._setAttributesPayload(payload.attributes);
-
- this._userProperties = {};
- this._descendantUserPropertyCounters = {};
-
- this._childNodeCount = payload.childNodeCount || 0;
- this._children = null;
-
- this.nextSibling = null;
- this.previousSibling = null;
- this.firstChild = null;
- this.lastChild = null;
- this.parentNode = null;
-
- if (payload.shadowRoots) {
- for (var i = 0; i < payload.shadowRoots.length; ++i) {
- var root = payload.shadowRoots[i];
- var node = new WebInspector.DOMNode(this._domAgent, this.ownerDocument, true, root);
- this._shadowRoots.push(node);
- node.parentNode = this;
- }
- }
-
- if (payload.templateContent) {
- this._templateContent = new WebInspector.DOMNode(this._domAgent, this.ownerDocument, true, payload.templateContent);
- this._templateContent.parentNode = this;
- }
-
- if (payload.children)
- this._setChildrenPayload(payload.children);
-
- this._setPseudoElements(payload.pseudoElements);
-
- if (payload.contentDocument) {
- this._contentDocument = new WebInspector.DOMDocument(domAgent, payload.contentDocument);
- this._children = [this._contentDocument];
- this._renumber();
- }
-
- if (this._nodeType === Node.ELEMENT_NODE) {
- // HTML and BODY from internal iframes should not overwrite top-level ones.
- if (this.ownerDocument && !this.ownerDocument.documentElement && this._nodeName === "HTML")
- this.ownerDocument.documentElement = this;
- if (this.ownerDocument && !this.ownerDocument.body && this._nodeName === "BODY")
- this.ownerDocument.body = this;
- } else if (this._nodeType === Node.DOCUMENT_TYPE_NODE) {
- this.publicId = payload.publicId;
- this.systemId = payload.systemId;
- this.internalSubset = payload.internalSubset;
- } else if (this._nodeType === Node.ATTRIBUTE_NODE) {
- this.name = payload.name;
- this.value = payload.value;
- }
-}
-
-WebInspector.DOMNode.PseudoElementNames = {
- Before: "before",
- After: "after"
-}
-
-WebInspector.DOMNode.ShadowRootTypes = {
- UserAgent: "user-agent",
- Author: "author"
-}
-
-WebInspector.DOMNode.prototype = {
- /**
- * @return {?Array.<!WebInspector.DOMNode>}
- */
- children: function()
- {
- return this._children ? this._children.slice() : null;
- },
-
- /**
- * @return {boolean}
- */
- hasAttributes: function()
- {
- return this._attributes.length > 0;
- },
-
- /**
- * @return {number}
- */
- childNodeCount: function()
- {
- return this._childNodeCount;
- },
-
- /**
- * @return {boolean}
- */
- hasShadowRoots: function()
- {
- return !!this._shadowRoots.length;
- },
-
- /**
- * @return {!Array.<!WebInspector.DOMNode>}
- */
- shadowRoots: function()
- {
- return this._shadowRoots.slice();
- },
-
- /**
- * @return {!WebInspector.DOMNode}
- */
- templateContent: function()
- {
- return this._templateContent;
- },
-
- /**
- * @return {number}
- */
- nodeType: function()
- {
- return this._nodeType;
- },
-
- /**
- * @return {string}
- */
- nodeName: function()
- {
- return this._nodeName;
- },
-
- /**
- * @return {string|undefined}
- */
- pseudoType: function()
- {
- return this._pseudoType;
- },
-
- /**
- * @return {boolean}
- */
- hasPseudoElements: function()
- {
- return Object.keys(this._pseudoElements).length !== 0;
- },
-
- /**
- * @return {!Object.<string, !WebInspector.DOMNode>}
- */
- pseudoElements: function()
- {
- return this._pseudoElements;
- },
-
- /**
- * @return {boolean}
- */
- isInShadowTree: function()
- {
- return this._isInShadowTree;
- },
-
- /**
- * @return {?string}
- */
- shadowRootType: function()
- {
- return this._shadowRootType || null;
- },
-
- /**
- * @return {string}
- */
- nodeNameInCorrectCase: function()
- {
- return this.isXMLNode() ? this.nodeName() : this.nodeName().toLowerCase();
- },
-
- /**
- * @param {string} name
- * @param {function(?Protocol.Error)=} callback
- */
- setNodeName: function(name, callback)
- {
- DOMAgent.setNodeName(this.id, name, WebInspector.domAgent._markRevision(this, callback));
- },
-
- /**
- * @return {string}
- */
- localName: function()
- {
- return this._localName;
- },
-
- /**
- * @return {string}
- */
- nodeValue: function()
- {
- return this._nodeValue;
- },
-
- /**
- * @param {string} value
- * @param {function(?Protocol.Error)=} callback
- */
- setNodeValue: function(value, callback)
- {
- DOMAgent.setNodeValue(this.id, value, WebInspector.domAgent._markRevision(this, callback));
- },
-
- /**
- * @param {string} name
- * @return {string}
- */
- getAttribute: function(name)
- {
- var attr = this._attributesMap[name];
- return attr ? attr.value : undefined;
- },
-
- /**
- * @param {string} name
- * @param {string} text
- * @param {function(?Protocol.Error)=} callback
- */
- setAttribute: function(name, text, callback)
- {
- DOMAgent.setAttributesAsText(this.id, text, name, WebInspector.domAgent._markRevision(this, callback));
- },
-
- /**
- * @param {string} name
- * @param {string} value
- * @param {function(?Protocol.Error)=} callback
- */
- setAttributeValue: function(name, value, callback)
- {
- DOMAgent.setAttributeValue(this.id, name, value, WebInspector.domAgent._markRevision(this, callback));
- },
-
- /**
- * @return {!Object}
- */
- attributes: function()
- {
- return this._attributes;
- },
-
- /**
- * @param {string} name
- * @param {function(?Protocol.Error)=} callback
- */
- removeAttribute: function(name, callback)
- {
- /**
- * @param {?Protocol.Error} error
- * @this {WebInspector.DOMNode}
- */
- function mycallback(error)
- {
- if (!error) {
- delete this._attributesMap[name];
- for (var i = 0; i < this._attributes.length; ++i) {
- if (this._attributes[i].name === name) {
- this._attributes.splice(i, 1);
- break;
- }
- }
- }
-
- WebInspector.domAgent._markRevision(this, callback)(error);
- }
- DOMAgent.removeAttribute(this.id, name, mycallback.bind(this));
- },
-
- /**
- * @param {function(?Array.<!WebInspector.DOMNode>)=} callback
- */
- getChildNodes: function(callback)
- {
- if (this._children) {
- if (callback)
- callback(this.children());
- return;
- }
-
- /**
- * @this {WebInspector.DOMNode}
- * @param {?Protocol.Error} error
- */
- function mycallback(error)
- {
- if (callback)
- callback(error ? null : this.children());
- }
-
- DOMAgent.requestChildNodes(this.id, undefined, mycallback.bind(this));
- },
-
- /**
- * @param {number} depth
- * @param {function(?Array.<!WebInspector.DOMNode>)=} callback
- */
- getSubtree: function(depth, callback)
- {
- /**
- * @this {WebInspector.DOMNode}
- * @param {?Protocol.Error} error
- */
- function mycallback(error)
- {
- if (callback)
- callback(error ? null : this._children);
- }
-
- DOMAgent.requestChildNodes(this.id, depth, mycallback.bind(this));
- },
-
- /**
- * @param {function(?Protocol.Error)=} callback
- */
- getOuterHTML: function(callback)
- {
- DOMAgent.getOuterHTML(this.id, callback);
- },
-
- /**
- * @param {string} html
- * @param {function(?Protocol.Error)=} callback
- */
- setOuterHTML: function(html, callback)
- {
- DOMAgent.setOuterHTML(this.id, html, WebInspector.domAgent._markRevision(this, callback));
- },
-
- /**
- * @param {function(?Protocol.Error, !DOMAgent.NodeId=)=} callback
- */
- removeNode: function(callback)
- {
- DOMAgent.removeNode(this.id, WebInspector.domAgent._markRevision(this, callback));
- },
-
- copyNode: function()
- {
- function copy(error, text)
- {
- if (!error)
- InspectorFrontendHost.copyText(text);
- }
- DOMAgent.getOuterHTML(this.id, copy);
- },
-
- /**
- * @param {string} objectGroupId
- * @param {function(?Protocol.Error)=} callback
- */
- eventListeners: function(objectGroupId, callback)
- {
- DOMAgent.getEventListenersForNode(this.id, objectGroupId, callback);
- },
-
- /**
- * @return {string}
- */
- path: function()
- {
- var path = [];
- var node = this;
- while (node && "index" in node && node._nodeName.length) {
- path.push([node.index, node._nodeName]);
- node = node.parentNode;
- }
- path.reverse();
- return path.join(",");
- },
-
- /**
- * @param {!WebInspector.DOMNode} node
- * @return {boolean}
- */
- isAncestor: function(node)
- {
- if (!node)
- return false;
-
- var currentNode = node.parentNode;
- while (currentNode) {
- if (this === currentNode)
- return true;
- currentNode = currentNode.parentNode;
- }
- return false;
- },
-
- /**
- * @param {!WebInspector.DOMNode} descendant
- * @return {boolean}
- */
- isDescendant: function(descendant)
- {
- return descendant !== null && descendant.isAncestor(this);
- },
-
- /**
- * @param {!Array.<string>} attrs
- * @return {boolean}
- */
- _setAttributesPayload: function(attrs)
- {
- var attributesChanged = !this._attributes || attrs.length !== this._attributes.length * 2;
- var oldAttributesMap = this._attributesMap || {};
-
- this._attributes = [];
- this._attributesMap = {};
-
- for (var i = 0; i < attrs.length; i += 2) {
- var name = attrs[i];
- var value = attrs[i + 1];
- this._addAttribute(name, value);
-
- if (attributesChanged)
- continue;
-
- if (!oldAttributesMap[name] || oldAttributesMap[name].value !== value)
- attributesChanged = true;
- }
- return attributesChanged;
- },
-
- /**
- * @param {!WebInspector.DOMNode} prev
- * @param {!DOMAgent.Node} payload
- * @return {!WebInspector.DOMNode}
- */
- _insertChild: function(prev, payload)
- {
- var node = new WebInspector.DOMNode(this._domAgent, this.ownerDocument, this._isInShadowTree, payload);
- this._children.splice(this._children.indexOf(prev) + 1, 0, node);
- this._renumber();
- return node;
- },
-
- /**
- * @param {!WebInspector.DOMNode} node
- */
- _removeChild: function(node)
- {
- if (node.pseudoType()) {
- delete this._pseudoElements[node.pseudoType()];
- } else {
- var shadowRootIndex = this._shadowRoots.indexOf(node);
- if (shadowRootIndex !== -1)
- this._shadowRoots.splice(shadowRootIndex, 1);
- else
- this._children.splice(this._children.indexOf(node), 1);
- }
- node.parentNode = null;
- node._updateChildUserPropertyCountsOnRemoval(this);
- this._renumber();
- },
-
- /**
- * @param {!Array.<!DOMAgent.Node>} payloads
- */
- _setChildrenPayload: function(payloads)
- {
- // We set children in the constructor.
- if (this._contentDocument)
- return;
-
- this._children = [];
- for (var i = 0; i < payloads.length; ++i) {
- var payload = payloads[i];
- var node = new WebInspector.DOMNode(this._domAgent, this.ownerDocument, this._isInShadowTree, payload);
- this._children.push(node);
- }
- this._renumber();
- },
-
- /**
- * @param {!Array.<!DOMAgent.Node>|undefined} payloads
- */
- _setPseudoElements: function(payloads)
- {
- this._pseudoElements = {};
- if (!payloads)
- return;
-
- for (var i = 0; i < payloads.length; ++i) {
- var node = new WebInspector.DOMNode(this._domAgent, this.ownerDocument, this._isInShadowTree, payloads[i]);
- node.parentNode = this;
- this._pseudoElements[node.pseudoType()] = node;
- }
- },
-
- _renumber: function()
- {
- this._childNodeCount = this._children.length;
- if (this._childNodeCount == 0) {
- this.firstChild = null;
- this.lastChild = null;
- return;
- }
- this.firstChild = this._children[0];
- this.lastChild = this._children[this._childNodeCount - 1];
- for (var i = 0; i < this._childNodeCount; ++i) {
- var child = this._children[i];
- child.index = i;
- child.nextSibling = i + 1 < this._childNodeCount ? this._children[i + 1] : null;
- child.previousSibling = i - 1 >= 0 ? this._children[i - 1] : null;
- child.parentNode = this;
- }
- },
-
- /**
- * @param {string} name
- * @param {string} value
- */
- _addAttribute: function(name, value)
- {
- var attr = {
- name: name,
- value: value,
- _node: this
- };
- this._attributesMap[name] = attr;
- this._attributes.push(attr);
- },
-
- /**
- * @param {string} name
- * @param {string} value
- */
- _setAttribute: function(name, value)
- {
- var attr = this._attributesMap[name];
- if (attr)
- attr.value = value;
- else
- this._addAttribute(name, value);
- },
-
- /**
- * @param {string} name
- */
- _removeAttribute: function(name)
- {
- var attr = this._attributesMap[name];
- if (attr) {
- this._attributes.remove(attr);
- delete this._attributesMap[name];
- }
- },
-
- /**
- * @param {!WebInspector.DOMNode} targetNode
- * @param {?WebInspector.DOMNode} anchorNode
- * @param {function(?Protocol.Error, !DOMAgent.NodeId=)=} callback
- */
- moveTo: function(targetNode, anchorNode, callback)
- {
- DOMAgent.moveTo(this.id, targetNode.id, anchorNode ? anchorNode.id : undefined, WebInspector.domAgent._markRevision(this, callback));
- },
-
- /**
- * @return {boolean}
- */
- isXMLNode: function()
- {
- return !!this.ownerDocument && !!this.ownerDocument.xmlVersion;
- },
-
- _updateChildUserPropertyCountsOnRemoval: function(parentNode)
- {
- var result = {};
- if (this._userProperties) {
- for (var name in this._userProperties)
- result[name] = (result[name] || 0) + 1;
- }
-
- if (this._descendantUserPropertyCounters) {
- for (var name in this._descendantUserPropertyCounters) {
- var counter = this._descendantUserPropertyCounters[name];
- result[name] = (result[name] || 0) + counter;
- }
- }
-
- for (var name in result)
- parentNode._updateDescendantUserPropertyCount(name, -result[name]);
- },
-
- _updateDescendantUserPropertyCount: function(name, delta)
- {
- if (!this._descendantUserPropertyCounters.hasOwnProperty(name))
- this._descendantUserPropertyCounters[name] = 0;
- this._descendantUserPropertyCounters[name] += delta;
- if (!this._descendantUserPropertyCounters[name])
- delete this._descendantUserPropertyCounters[name];
- if (this.parentNode)
- this.parentNode._updateDescendantUserPropertyCount(name, delta);
- },
-
- setUserProperty: function(name, value)
- {
- if (value === null) {
- this.removeUserProperty(name);
- return;
- }
-
- if (this.parentNode && !this._userProperties.hasOwnProperty(name))
- this.parentNode._updateDescendantUserPropertyCount(name, 1);
-
- this._userProperties[name] = value;
- },
-
- removeUserProperty: function(name)
- {
- if (!this._userProperties.hasOwnProperty(name))
- return;
-
- delete this._userProperties[name];
- if (this.parentNode)
- this.parentNode._updateDescendantUserPropertyCount(name, -1);
- },
-
- getUserProperty: function(name)
- {
- return this._userProperties ? this._userProperties[name] : null;
- },
-
- descendantUserPropertyCount: function(name)
- {
- return this._descendantUserPropertyCounters && this._descendantUserPropertyCounters[name] ? this._descendantUserPropertyCounters[name] : 0;
- },
-
- /**
- * @param {string} url
- * @return {?string}
- */
- resolveURL: function(url)
- {
- if (!url)
- return url;
- for (var frameOwnerCandidate = this; frameOwnerCandidate; frameOwnerCandidate = frameOwnerCandidate.parentNode) {
- if (frameOwnerCandidate.baseURL)
- return WebInspector.ParsedURL.completeURL(frameOwnerCandidate.baseURL, url);
- }
- return null;
- }
-}
-
-/**
- * @extends {WebInspector.DOMNode}
- * @constructor
- * @param {!WebInspector.DOMAgent} domAgent
- * @param {!DOMAgent.Node} payload
- */
-WebInspector.DOMDocument = function(domAgent, payload)
-{
- WebInspector.DOMNode.call(this, domAgent, this, false, payload);
- this.documentURL = payload.documentURL || "";
- this.baseURL = payload.baseURL || "";
- this.xmlVersion = payload.xmlVersion;
- this._listeners = {};
-}
-
-WebInspector.DOMDocument.prototype = {
- __proto__: WebInspector.DOMNode.prototype
-}
-
-/**
- * @extends {WebInspector.Object}
- * @constructor
- */
-WebInspector.DOMAgent = function() {
- /** @type {!Object.<number, !WebInspector.DOMNode>} */
- this._idToDOMNode = {};
- /** @type {?WebInspector.DOMDocument} */
- this._document = null;
- /** @type {!Object.<number, boolean>} */
- this._attributeLoadNodeIds = {};
- InspectorBackend.registerDOMDispatcher(new WebInspector.DOMDispatcher(this));
-
- this._defaultHighlighter = new WebInspector.DefaultDOMNodeHighlighter();
- this._highlighter = this._defaultHighlighter;
-}
-
-WebInspector.DOMAgent.Events = {
- AttrModified: "AttrModified",
- AttrRemoved: "AttrRemoved",
- CharacterDataModified: "CharacterDataModified",
- NodeInserted: "NodeInserted",
- NodeRemoved: "NodeRemoved",
- DocumentUpdated: "DocumentUpdated",
- ChildNodeCountUpdated: "ChildNodeCountUpdated",
- UndoRedoRequested: "UndoRedoRequested",
- UndoRedoCompleted: "UndoRedoCompleted",
- InspectNodeRequested: "InspectNodeRequested"
-}
-
-WebInspector.DOMAgent.prototype = {
- /**
- * @param {function(!WebInspector.DOMDocument)=} callback
- */
- requestDocument: function(callback)
- {
- if (this._document) {
- if (callback)
- callback(this._document);
- return;
- }
-
- if (this._pendingDocumentRequestCallbacks) {
- this._pendingDocumentRequestCallbacks.push(callback);
- return;
- }
-
- this._pendingDocumentRequestCallbacks = [callback];
-
- /**
- * @this {WebInspector.DOMAgent}
- * @param {?Protocol.Error} error
- * @param {!DOMAgent.Node} root
- */
- function onDocumentAvailable(error, root)
- {
- if (!error)
- this._setDocument(root);
-
- for (var i = 0; i < this._pendingDocumentRequestCallbacks.length; ++i) {
- var callback = this._pendingDocumentRequestCallbacks[i];
- if (callback)
- callback(this._document);
- }
- delete this._pendingDocumentRequestCallbacks;
- }
-
- DOMAgent.getDocument(onDocumentAvailable.bind(this));
- },
-
- /**
- * @return {?WebInspector.DOMDocument}
- */
- existingDocument: function()
- {
- return this._document;
- },
-
- /**
- * @param {!RuntimeAgent.RemoteObjectId} objectId
- * @param {function(?DOMAgent.NodeId)=} callback
- */
- pushNodeToFrontend: function(objectId, callback)
- {
- this._dispatchWhenDocumentAvailable(DOMAgent.requestNode.bind(DOMAgent, objectId), callback);
- },
-
- /**
- * @param {string} path
- * @param {function(?number)=} callback
- */
- pushNodeByPathToFrontend: function(path, callback)
- {
- this._dispatchWhenDocumentAvailable(DOMAgent.pushNodeByPathToFrontend.bind(DOMAgent, path), callback);
- },
-
- /**
- * @param {number} backendNodeId
- * @param {function(?number)=} callback
- */
- pushNodeByBackendIdToFrontend: function(backendNodeId, callback)
- {
- this._dispatchWhenDocumentAvailable(DOMAgent.pushNodeByBackendIdToFrontend.bind(DOMAgent, backendNodeId), callback);
- },
-
- /**
- * @param {function(!T)=} callback
- * @return {function(?Protocol.Error, !T=)|undefined}
- * @template T
- */
- _wrapClientCallback: function(callback)
- {
- if (!callback)
- return;
- /**
- * @param {?Protocol.Error} error
- * @param {!T=} result
- * @template T
- */
- return function(error, result)
- {
- // Caller is responsible for handling the actual error.
- callback(error ? null : result);
- }
- },
-
- /**
- * @param {function(function(?Protocol.Error, !T=)=)} func
- * @param {function(!T)=} callback
- * @template T
- */
- _dispatchWhenDocumentAvailable: function(func, callback)
- {
- var callbackWrapper = this._wrapClientCallback(callback);
-
- /**
- * @this {WebInspector.DOMAgent}
- */
- function onDocumentAvailable()
- {
- if (this._document)
- func(callbackWrapper);
- else {
- if (callbackWrapper)
- callbackWrapper("No document");
- }
- }
- this.requestDocument(onDocumentAvailable.bind(this));
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {string} name
- * @param {string} value
- */
- _attributeModified: function(nodeId, name, value)
- {
- var node = this._idToDOMNode[nodeId];
- if (!node)
- return;
-
- node._setAttribute(name, value);
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.AttrModified, { node: node, name: name });
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {string} name
- */
- _attributeRemoved: function(nodeId, name)
- {
- var node = this._idToDOMNode[nodeId];
- if (!node)
- return;
- node._removeAttribute(name);
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.AttrRemoved, { node: node, name: name });
- },
-
- /**
- * @param {!Array.<!DOMAgent.NodeId>} nodeIds
- */
- _inlineStyleInvalidated: function(nodeIds)
- {
- for (var i = 0; i < nodeIds.length; ++i)
- this._attributeLoadNodeIds[nodeIds[i]] = true;
- if ("_loadNodeAttributesTimeout" in this)
- return;
- this._loadNodeAttributesTimeout = setTimeout(this._loadNodeAttributes.bind(this), 0);
- },
-
- _loadNodeAttributes: function()
- {
- /**
- * @this {WebInspector.DOMAgent}
- * @param {!DOMAgent.NodeId} nodeId
- * @param {?Protocol.Error} error
- * @param {!Array.<string>} attributes
- */
- function callback(nodeId, error, attributes)
- {
- if (error) {
- // We are calling _loadNodeAttributes asynchronously, it is ok if node is not found.
- return;
- }
- var node = this._idToDOMNode[nodeId];
- if (node) {
- if (node._setAttributesPayload(attributes))
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.AttrModified, { node: node, name: "style" });
- }
- }
-
- delete this._loadNodeAttributesTimeout;
-
- for (var nodeId in this._attributeLoadNodeIds) {
- var nodeIdAsNumber = parseInt(nodeId, 10);
- DOMAgent.getAttributes(nodeIdAsNumber, callback.bind(this, nodeIdAsNumber));
- }
- this._attributeLoadNodeIds = {};
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {string} newValue
- */
- _characterDataModified: function(nodeId, newValue)
- {
- var node = this._idToDOMNode[nodeId];
- node._nodeValue = newValue;
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.CharacterDataModified, node);
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @return {?WebInspector.DOMNode}
- */
- nodeForId: function(nodeId)
- {
- return this._idToDOMNode[nodeId] || null;
- },
-
- _documentUpdated: function()
- {
- this._setDocument(null);
- },
-
- /**
- * @param {?DOMAgent.Node} payload
- */
- _setDocument: function(payload)
- {
- this._idToDOMNode = {};
- if (payload && "nodeId" in payload)
- this._document = new WebInspector.DOMDocument(this, payload);
- else
- this._document = null;
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.DocumentUpdated, this._document);
- },
-
- /**
- * @param {!DOMAgent.Node} payload
- */
- _setDetachedRoot: function(payload)
- {
- if (payload.nodeName === "#document")
- new WebInspector.DOMDocument(this, payload);
- else
- new WebInspector.DOMNode(this, null, false, payload);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentId
- * @param {!Array.<!DOMAgent.Node>} payloads
- */
- _setChildNodes: function(parentId, payloads)
- {
- if (!parentId && payloads.length) {
- this._setDetachedRoot(payloads[0]);
- return;
- }
-
- var parent = this._idToDOMNode[parentId];
- parent._setChildrenPayload(payloads);
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {number} newValue
- */
- _childNodeCountUpdated: function(nodeId, newValue)
- {
- var node = this._idToDOMNode[nodeId];
- node._childNodeCount = newValue;
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.ChildNodeCountUpdated, node);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentId
- * @param {!DOMAgent.NodeId} prevId
- * @param {!DOMAgent.Node} payload
- */
- _childNodeInserted: function(parentId, prevId, payload)
- {
- var parent = this._idToDOMNode[parentId];
- var prev = this._idToDOMNode[prevId];
- var node = parent._insertChild(prev, payload);
- this._idToDOMNode[node.id] = node;
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.NodeInserted, node);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentId
- * @param {!DOMAgent.NodeId} nodeId
- */
- _childNodeRemoved: function(parentId, nodeId)
- {
- var parent = this._idToDOMNode[parentId];
- var node = this._idToDOMNode[nodeId];
- parent._removeChild(node);
- this._unbind(node);
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.NodeRemoved, {node: node, parent: parent});
- },
-
- /**
- * @param {!DOMAgent.NodeId} hostId
- * @param {!DOMAgent.Node} root
- */
- _shadowRootPushed: function(hostId, root)
- {
- var host = this._idToDOMNode[hostId];
- if (!host)
- return;
- var node = new WebInspector.DOMNode(this, host.ownerDocument, true, root);
- node.parentNode = host;
- this._idToDOMNode[node.id] = node;
- host._shadowRoots.push(node);
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.NodeInserted, node);
- },
-
- /**
- * @param {!DOMAgent.NodeId} hostId
- * @param {!DOMAgent.NodeId} rootId
- */
- _shadowRootPopped: function(hostId, rootId)
- {
- var host = this._idToDOMNode[hostId];
- if (!host)
- return;
- var root = this._idToDOMNode[rootId];
- if (!root)
- return;
- host._removeChild(root);
- this._unbind(root);
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.NodeRemoved, {node: root, parent: host});
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentId
- * @param {!DOMAgent.Node} pseudoElement
- */
- _pseudoElementAdded: function(parentId, pseudoElement)
- {
- var parent = this._idToDOMNode[parentId];
- if (!parent)
- return;
- var node = new WebInspector.DOMNode(this, parent.ownerDocument, false, pseudoElement);
- node.parentNode = parent;
- this._idToDOMNode[node.id] = node;
- console.assert(!parent._pseudoElements[node.pseudoType()]);
- parent._pseudoElements[node.pseudoType()] = node;
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.NodeInserted, node);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentId
- * @param {!DOMAgent.NodeId} pseudoElementId
- */
- _pseudoElementRemoved: function(parentId, pseudoElementId)
- {
- var parent = this._idToDOMNode[parentId];
- if (!parent)
- return;
- var pseudoElement = this._idToDOMNode[pseudoElementId];
- if (!pseudoElement)
- return;
- parent._removeChild(pseudoElement);
- this._unbind(pseudoElement);
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.NodeRemoved, {node: pseudoElement, parent: parent});
- },
-
- /**
- * @param {!WebInspector.DOMNode} node
- */
- _unbind: function(node)
- {
- delete this._idToDOMNode[node.id];
- for (var i = 0; node._children && i < node._children.length; ++i)
- this._unbind(node._children[i]);
- for (var i = 0; i < node._shadowRoots.length; ++i)
- this._unbind(node._shadowRoots[i]);
- var pseudoElements = node.pseudoElements();
- for (var id in pseudoElements)
- this._unbind(pseudoElements[id]);
- if (node._templateContent)
- this._unbind(node._templateContent);
- },
-
- /**
- * @param {number} nodeId
- */
- inspectElement: function(nodeId)
- {
- var node = this._idToDOMNode[nodeId];
- if (node)
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.InspectNodeRequested, nodeId);
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- */
- _inspectNodeRequested: function(nodeId)
- {
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.InspectNodeRequested, nodeId);
- },
-
- /**
- * @param {string} query
- * @param {function(number)} searchCallback
- */
- performSearch: function(query, searchCallback)
- {
- this.cancelSearch();
-
- /**
- * @param {?Protocol.Error} error
- * @param {string} searchId
- * @param {number} resultsCount
- * @this {WebInspector.DOMAgent}
- */
- function callback(error, searchId, resultsCount)
- {
- this._searchId = searchId;
- searchCallback(resultsCount);
- }
- DOMAgent.performSearch(query, callback.bind(this));
- },
-
- /**
- * @param {number} index
- * @param {?function(?WebInspector.DOMNode)} callback
- */
- searchResult: function(index, callback)
- {
- if (this._searchId)
- DOMAgent.getSearchResults(this._searchId, index, index + 1, searchResultsCallback.bind(this));
- else
- callback(null);
-
- /**
- * @param {?Protocol.Error} error
- * @param {!Array.<number>} nodeIds
- * @this {WebInspector.DOMAgent}
- */
- function searchResultsCallback(error, nodeIds)
- {
- if (error) {
- console.error(error);
- callback(null);
- return;
- }
- if (nodeIds.length != 1)
- return;
-
- callback(this.nodeForId(nodeIds[0]));
- }
- },
-
- cancelSearch: function()
- {
- if (this._searchId) {
- DOMAgent.discardSearchResults(this._searchId);
- delete this._searchId;
- }
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {string} selectors
- * @param {function(?DOMAgent.NodeId)=} callback
- */
- querySelector: function(nodeId, selectors, callback)
- {
- DOMAgent.querySelector(nodeId, selectors, this._wrapClientCallback(callback));
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {string} selectors
- * @param {function(!Array.<!DOMAgent.NodeId>=)=} callback
- */
- querySelectorAll: function(nodeId, selectors, callback)
- {
- DOMAgent.querySelectorAll(nodeId, selectors, this._wrapClientCallback(callback));
- },
-
- /**
- * @param {!DOMAgent.NodeId=} nodeId
- * @param {string=} mode
- * @param {!RuntimeAgent.RemoteObjectId=} objectId
- */
- highlightDOMNode: function(nodeId, mode, objectId)
- {
- if (this._hideDOMNodeHighlightTimeout) {
- clearTimeout(this._hideDOMNodeHighlightTimeout);
- delete this._hideDOMNodeHighlightTimeout;
- }
- this._highlighter.highlightDOMNode(nodeId || 0, this._buildHighlightConfig(mode), objectId);
- },
-
- hideDOMNodeHighlight: function()
- {
- this.highlightDOMNode(0);
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- */
- highlightDOMNodeForTwoSeconds: function(nodeId)
- {
- this.highlightDOMNode(nodeId);
- this._hideDOMNodeHighlightTimeout = setTimeout(this.hideDOMNodeHighlight.bind(this), 2000);
- },
-
- /**
- * @param {boolean} enabled
- * @param {boolean} inspectShadowDOM
- * @param {function(?Protocol.Error)=} callback
- */
- setInspectModeEnabled: function(enabled, inspectShadowDOM, callback)
- {
- /**
- * @this {WebInspector.DOMAgent}
- */
- function onDocumentAvailable()
- {
- this._highlighter.setInspectModeEnabled(enabled, inspectShadowDOM, this._buildHighlightConfig(), callback);
- }
- this.requestDocument(onDocumentAvailable.bind(this));
- },
-
- /**
- * @param {string=} mode
- * @return {!DOMAgent.HighlightConfig}
- */
- _buildHighlightConfig: function(mode)
- {
- mode = mode || "all";
- var highlightConfig = { showInfo: mode === "all", showRulers: WebInspector.settings.showMetricsRulers.get() };
- if (mode === "all" || mode === "content")
- highlightConfig.contentColor = WebInspector.Color.PageHighlight.Content.toProtocolRGBA();
-
- if (mode === "all" || mode === "padding")
- highlightConfig.paddingColor = WebInspector.Color.PageHighlight.Padding.toProtocolRGBA();
-
- if (mode === "all" || mode === "border")
- highlightConfig.borderColor = WebInspector.Color.PageHighlight.Border.toProtocolRGBA();
-
- if (mode === "all" || mode === "margin")
- highlightConfig.marginColor = WebInspector.Color.PageHighlight.Margin.toProtocolRGBA();
-
- if (mode === "all")
- highlightConfig.eventTargetColor = WebInspector.Color.PageHighlight.EventTarget.toProtocolRGBA();
-
- return highlightConfig;
- },
-
- /**
- * @param {!WebInspector.DOMNode} node
- * @param {function(?Protocol.Error, !A=, !B=)=} callback
- * @return {function(?Protocol.Error, !A=, !B=)}
- * @template A,B
- */
- _markRevision: function(node, callback)
- {
- /**
- * @param {?Protocol.Error} error
- * @this {WebInspector.DOMAgent}
- */
- function wrapperFunction(error)
- {
- if (!error)
- this.markUndoableState();
-
- if (callback)
- callback.apply(this, arguments);
- }
- return wrapperFunction.bind(this);
- },
-
- /**
- * @param {boolean} emulationEnabled
- */
- emulateTouchEventObjects: function(emulationEnabled)
- {
- const injectedFunction = function() {
- const touchEvents = ["ontouchstart", "ontouchend", "ontouchmove", "ontouchcancel"];
- var recepients = [window.__proto__, document.__proto__];
- for (var i = 0; i < touchEvents.length; ++i) {
- for (var j = 0; j < recepients.length; ++j) {
- if (!(touchEvents[i] in recepients[j]))
- Object.defineProperty(recepients[j], touchEvents[i], { value: null, writable: true, configurable: true, enumerable: true });
- }
- }
- }
-
- if (emulationEnabled && !this._addTouchEventsScriptInjecting) {
- this._addTouchEventsScriptInjecting = true;
- PageAgent.addScriptToEvaluateOnLoad("(" + injectedFunction.toString() + ")()", scriptAddedCallback.bind(this));
- } else {
- if (typeof this._addTouchEventsScriptId !== "undefined") {
- PageAgent.removeScriptToEvaluateOnLoad(this._addTouchEventsScriptId);
- delete this._addTouchEventsScriptId;
- }
- }
-
- /**
- * @param {?Protocol.Error} error
- * @param {string} scriptId
- * @this {WebInspector.DOMAgent}
- */
- function scriptAddedCallback(error, scriptId)
- {
- delete this._addTouchEventsScriptInjecting;
- if (error)
- return;
- this._addTouchEventsScriptId = scriptId;
- }
-
- PageAgent.setTouchEmulationEnabled(emulationEnabled);
- },
-
- markUndoableState: function()
- {
- DOMAgent.markUndoableState();
- },
-
- /**
- * @param {function(?Protocol.Error)=} callback
- */
- undo: function(callback)
- {
- /**
- * @param {?Protocol.Error} error
- * @this {WebInspector.DOMAgent}
- */
- function mycallback(error)
- {
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.UndoRedoCompleted);
- callback(error);
- }
-
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.UndoRedoRequested);
- DOMAgent.undo(callback);
- },
-
- /**
- * @param {function(?Protocol.Error)=} callback
- */
- redo: function(callback)
- {
- /**
- * @param {?Protocol.Error} error
- * @this {WebInspector.DOMAgent}
- */
- function mycallback(error)
- {
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.UndoRedoCompleted);
- callback(error);
- }
-
- this.dispatchEventToListeners(WebInspector.DOMAgent.Events.UndoRedoRequested);
- DOMAgent.redo(callback);
- },
-
- /**
- * @param {?WebInspector.DOMNodeHighlighter} highlighter
- */
- setHighlighter: function(highlighter)
- {
- this._highlighter = highlighter || this._defaultHighlighter;
- },
-
- __proto__: WebInspector.Object.prototype
-}
-
-/**
- * @constructor
- * @implements {DOMAgent.Dispatcher}
- * @param {!WebInspector.DOMAgent} domAgent
- */
-WebInspector.DOMDispatcher = function(domAgent)
-{
- this._domAgent = domAgent;
-}
-
-WebInspector.DOMDispatcher.prototype = {
- documentUpdated: function()
- {
- this._domAgent._documentUpdated();
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- */
- inspectNodeRequested: function(nodeId)
- {
- this._domAgent._inspectNodeRequested(nodeId);
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {string} name
- * @param {string} value
- */
- attributeModified: function(nodeId, name, value)
- {
- this._domAgent._attributeModified(nodeId, name, value);
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {string} name
- */
- attributeRemoved: function(nodeId, name)
- {
- this._domAgent._attributeRemoved(nodeId, name);
- },
-
- /**
- * @param {!Array.<!DOMAgent.NodeId>} nodeIds
- */
- inlineStyleInvalidated: function(nodeIds)
- {
- this._domAgent._inlineStyleInvalidated(nodeIds);
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {string} characterData
- */
- characterDataModified: function(nodeId, characterData)
- {
- this._domAgent._characterDataModified(nodeId, characterData);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentId
- * @param {!Array.<!DOMAgent.Node>} payloads
- */
- setChildNodes: function(parentId, payloads)
- {
- this._domAgent._setChildNodes(parentId, payloads);
- },
-
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {number} childNodeCount
- */
- childNodeCountUpdated: function(nodeId, childNodeCount)
- {
- this._domAgent._childNodeCountUpdated(nodeId, childNodeCount);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentNodeId
- * @param {!DOMAgent.NodeId} previousNodeId
- * @param {!DOMAgent.Node} payload
- */
- childNodeInserted: function(parentNodeId, previousNodeId, payload)
- {
- this._domAgent._childNodeInserted(parentNodeId, previousNodeId, payload);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentNodeId
- * @param {!DOMAgent.NodeId} nodeId
- */
- childNodeRemoved: function(parentNodeId, nodeId)
- {
- this._domAgent._childNodeRemoved(parentNodeId, nodeId);
- },
-
- /**
- * @param {!DOMAgent.NodeId} hostId
- * @param {!DOMAgent.Node} root
- */
- shadowRootPushed: function(hostId, root)
- {
- this._domAgent._shadowRootPushed(hostId, root);
- },
-
- /**
- * @param {!DOMAgent.NodeId} hostId
- * @param {!DOMAgent.NodeId} rootId
- */
- shadowRootPopped: function(hostId, rootId)
- {
- this._domAgent._shadowRootPopped(hostId, rootId);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentId
- * @param {!DOMAgent.Node} pseudoElement
- */
- pseudoElementAdded: function(parentId, pseudoElement)
- {
- this._domAgent._pseudoElementAdded(parentId, pseudoElement);
- },
-
- /**
- * @param {!DOMAgent.NodeId} parentId
- * @param {!DOMAgent.NodeId} pseudoElementId
- */
- pseudoElementRemoved: function(parentId, pseudoElementId)
- {
- this._domAgent._pseudoElementRemoved(parentId, pseudoElementId);
- }
-}
-
-/**
- * @interface
- */
-WebInspector.DOMNodeHighlighter = function() {
-}
-
-WebInspector.DOMNodeHighlighter.prototype = {
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {!DOMAgent.HighlightConfig} config
- * @param {!RuntimeAgent.RemoteObjectId=} objectId
- */
- highlightDOMNode: function(nodeId, config, objectId) {},
-
- /**
- * @param {boolean} enabled
- * @param {boolean} inspectShadowDOM
- * @param {!DOMAgent.HighlightConfig} config
- * @param {function(?Protocol.Error)=} callback
- */
- setInspectModeEnabled: function(enabled, inspectShadowDOM, config, callback) {}
-}
-
-/**
- * @constructor
- * @implements {WebInspector.DOMNodeHighlighter}
- */
-WebInspector.DefaultDOMNodeHighlighter = function() {
-}
-
-WebInspector.DefaultDOMNodeHighlighter.prototype = {
- /**
- * @param {!DOMAgent.NodeId} nodeId
- * @param {!DOMAgent.HighlightConfig} config
- * @param {!RuntimeAgent.RemoteObjectId=} objectId
- */
- highlightDOMNode: function(nodeId, config, objectId)
- {
- if (objectId || nodeId)
- DOMAgent.highlightNode(config, objectId ? undefined : nodeId, objectId);
- else
- DOMAgent.hideHighlight();
- },
-
- /**
- * @param {boolean} enabled
- * @param {boolean} inspectShadowDOM
- * @param {!DOMAgent.HighlightConfig} config
- * @param {function(?Protocol.Error)=} callback
- */
- setInspectModeEnabled: function(enabled, inspectShadowDOM, config, callback)
- {
- DOMAgent.setInspectModeEnabled(enabled, inspectShadowDOM, config, callback);
- }
-}
-
-/**
- * @type {!WebInspector.DOMAgent}
- */
-WebInspector.domAgent;