Index: resources/inspector/DOMAgent.js |
=================================================================== |
--- resources/inspector/DOMAgent.js (revision 33840) |
+++ resources/inspector/DOMAgent.js (working copy) |
@@ -1,657 +0,0 @@ |
-/* |
- * Copyright (C) 2009 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. |
- */ |
- |
-WebInspector.DOMNode = function(doc, payload) { |
- this.ownerDocument = doc; |
- |
- this.id = payload.id; |
- this.nodeType = payload.nodeType; |
- this.nodeName = payload.nodeName; |
- this.localName = payload.localName; |
- this._nodeValue = payload.nodeValue; |
- this.textContent = this.nodeValue; |
- |
- this.attributes = []; |
- this._attributesMap = {}; |
- if (payload.attributes) |
- this._setAttributesPayload(payload.attributes); |
- |
- this._childNodeCount = payload.childNodeCount; |
- this.children = null; |
- |
- this.nextSibling = null; |
- this.prevSibling = null; |
- this.firstChild = null; |
- this.lastChild = null; |
- this.parentNode = null; |
- |
- if (payload.children) |
- this._setChildrenPayload(payload.children); |
- |
- this._computedStyle = null; |
- this.style = null; |
- this._matchedCSSRules = []; |
- |
- if (this.nodeType == Node.ELEMENT_NODE) { |
- if (this.nodeName == "HTML") |
- this.ownerDocument.documentElement = this; |
- if (this.nodeName == "BODY") |
- this.ownerDocument.body = this; |
- } |
-} |
- |
-WebInspector.DOMNode.prototype = { |
- hasAttributes: function() |
- { |
- return this.attributes.length > 0; |
- }, |
- |
- hasChildNodes: function() { |
- return this._childNodeCount > 0; |
- }, |
- |
- get nodeValue() { |
- return this._nodeValue; |
- }, |
- |
- set nodeValue(value) { |
- if (this.nodeType != Node.TEXT_NODE) |
- return; |
- var self = this; |
- var callback = function() |
- { |
- self._nodeValue = value; |
- self.textContent = value; |
- }; |
- this.ownerDocument._domAgent.setTextNodeValueAsync(this, value, callback); |
- }, |
- |
- getAttribute: function(name) |
- { |
- var attr = this._attributesMap[name]; |
- return attr ? attr.value : undefined; |
- }, |
- |
- setAttribute: function(name, value) |
- { |
- var self = this; |
- var callback = function() |
- { |
- var attr = self._attributesMap[name]; |
- if (attr) |
- attr.value = value; |
- else |
- attr = self._addAttribute(name, value); |
- }; |
- this.ownerDocument._domAgent.setAttributeAsync(this, name, value, callback); |
- }, |
- |
- removeAttribute: function(name) |
- { |
- var self = this; |
- var callback = function() |
- { |
- delete self._attributesMap[name]; |
- for (var i = 0; i < self.attributes.length; ++i) { |
- if (self.attributes[i].name == name) { |
- self.attributes.splice(i, 1); |
- break; |
- } |
- } |
- }; |
- this.ownerDocument._domAgent.removeAttributeAsync(this, name, callback); |
- }, |
- |
- _setAttributesPayload: function(attrs) |
- { |
- for (var i = 0; i < attrs.length; i += 2) |
- this._addAttribute(attrs[i], attrs[i + 1]); |
- }, |
- |
- _insertChild: function(prev, payload) |
- { |
- var node = new WebInspector.DOMNode(this.ownerDocument, payload); |
- if (!prev) |
- // First node |
- this.children = [ node ]; |
- else |
- this.children.splice(this.children.indexOf(prev) + 1, 0, node); |
- this._renumber(); |
- return node; |
- }, |
- |
- removeChild_: function(node) |
- { |
- this.children.splice(this.children.indexOf(node), 1); |
- node.parentNode = null; |
- this._renumber(); |
- }, |
- |
- _setChildrenPayload: function(payloads) |
- { |
- this.children = []; |
- for (var i = 0; i < payloads.length; ++i) { |
- var payload = payloads[i]; |
- var node = new WebInspector.DOMNode(this.ownerDocument, payload); |
- this.children.push(node); |
- } |
- this._renumber(); |
- }, |
- |
- _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.nextSibling = i + 1 < this._childNodeCount ? this.children[i + 1] : null; |
- child.prevSibling = i - 1 >= 0 ? this.children[i - 1] : null; |
- child.parentNode = this; |
- } |
- }, |
- |
- _addAttribute: function(name, value) |
- { |
- var attr = { |
- "name": name, |
- "value": value, |
- "_node": this |
- }; |
- this._attributesMap[name] = attr; |
- this.attributes.push(attr); |
- }, |
- |
- _setStyles: function(computedStyle, inlineStyle, styleAttributes, matchedCSSRules) |
- { |
- this._computedStyle = new WebInspector.CSSStyleDeclaration(computedStyle); |
- this.style = new WebInspector.CSSStyleDeclaration(inlineStyle); |
- |
- for (var name in styleAttributes) { |
- if (this._attributesMap[name]) |
- this._attributesMap[name].style = new WebInspector.CSSStyleDeclaration(styleAttributes[name]); |
- } |
- |
- this._matchedCSSRules = []; |
- for (var i = 0; i < matchedCSSRules.length; i++) |
- this._matchedCSSRules.push(WebInspector.CSSStyleDeclaration.parseRule(matchedCSSRules[i])); |
- }, |
- |
- _clearStyles: function() |
- { |
- this.computedStyle = null; |
- this.style = null; |
- for (var name in this._attributesMap) |
- this._attributesMap[name].style = null; |
- this._matchedCSSRules = null; |
- } |
-} |
- |
-WebInspector.DOMDocument = function(domAgent, defaultView, payload) |
-{ |
- WebInspector.DOMNode.call(this, this, payload); |
- this._listeners = {}; |
- this._domAgent = domAgent; |
- this.defaultView = defaultView; |
-} |
- |
-WebInspector.DOMDocument.prototype = { |
- |
- addEventListener: function(name, callback) |
- { |
- var listeners = this._listeners[name]; |
- if (!listeners) { |
- listeners = []; |
- this._listeners[name] = listeners; |
- } |
- listeners.push(callback); |
- }, |
- |
- removeEventListener: function(name, callback) |
- { |
- var listeners = this._listeners[name]; |
- if (!listeners) |
- return; |
- |
- var index = listeners.indexOf(callback); |
- if (index != -1) |
- listeners.splice(index, 1); |
- }, |
- |
- _fireDomEvent: function(name, event) |
- { |
- var listeners = this._listeners[name]; |
- if (!listeners) |
- return; |
- |
- for (var i = 0; i < listeners.length; ++i) { |
- var listener = listeners[i]; |
- listener.call(this, event); |
- } |
- } |
-} |
- |
-WebInspector.DOMDocument.prototype.__proto__ = WebInspector.DOMNode.prototype; |
- |
- |
-WebInspector.DOMWindow = function(domAgent) |
-{ |
- this._domAgent = domAgent; |
-} |
- |
-WebInspector.DOMWindow.prototype = { |
- get document() |
- { |
- return this._domAgent.document; |
- }, |
- |
- get Node() |
- { |
- return WebInspector.DOMNode; |
- }, |
- |
- get Element() |
- { |
- return WebInspector.DOMNode; |
- }, |
- |
- Object: function() |
- { |
- }, |
- |
- getComputedStyle: function(node) |
- { |
- return node._computedStyle; |
- }, |
- |
- getMatchedCSSRules: function(node, pseudoElement, authorOnly) |
- { |
- return node._matchedCSSRules; |
- } |
-} |
- |
-WebInspector.DOMAgent = function() { |
- this._window = new WebInspector.DOMWindow(this); |
- this._idToDOMNode = null; |
- this.document = null; |
-} |
- |
-WebInspector.DOMAgent.prototype = { |
- get domWindow() |
- { |
- return this._window; |
- }, |
- |
- getChildNodesAsync: function(parent, callback) |
- { |
- var children = parent.children; |
- if (children) { |
- callback(children); |
- return; |
- } |
- function mycallback() { |
- callback(parent.children); |
- } |
- var callId = WebInspector.Callback.wrap(mycallback); |
- InspectorController.getChildNodes(callId, parent.id); |
- }, |
- |
- setAttributeAsync: function(node, name, value, callback) |
- { |
- var mycallback = this._didApplyDomChange.bind(this, node, callback); |
- InspectorController.setAttribute(WebInspector.Callback.wrap(mycallback), node.id, name, value); |
- }, |
- |
- removeAttributeAsync: function(node, name, callback) |
- { |
- var mycallback = this._didApplyDomChange.bind(this, node, callback); |
- InspectorController.removeAttribute(WebInspector.Callback.wrap(mycallback), node.id, name); |
- }, |
- |
- setTextNodeValueAsync: function(node, text, callback) |
- { |
- var mycallback = this._didApplyDomChange.bind(this, node, callback); |
- InspectorController.setTextNodeValue(WebInspector.Callback.wrap(mycallback), node.id, text); |
- }, |
- |
- _didApplyDomChange: function(node, callback, success) |
- { |
- if (!success) |
- return; |
- callback(); |
- // TODO(pfeldman): Fix this hack. |
- var elem = WebInspector.panels.elements.treeOutline.findTreeElement(node); |
- if (elem) { |
- elem._updateTitle(); |
- } |
- }, |
- |
- _attributesUpdated: function(nodeId, attrsArray) |
- { |
- var node = this._idToDOMNode[nodeId]; |
- node._setAttributesPayload(attrsArray); |
- }, |
- |
- nodeForId: function(nodeId) { |
- return this._idToDOMNode[nodeId]; |
- }, |
- |
- _setDocument: function(payload) |
- { |
- this._idToDOMNode = {}; |
- if (payload) { |
- this.document = new WebInspector.DOMDocument(this, this._window, payload); |
- this._idToDOMNode[payload.id] = this.document; |
- this._bindNodes(this.document.children); |
- } else |
- this.document = null; |
- WebInspector.panels.elements.reset(); |
- }, |
- |
- _setDetachedRoot: function(payload) |
- { |
- var root = new WebInspector.DOMNode(this.document, payload); |
- this._idToDOMNode[payload.id] = root; |
- }, |
- |
- _setChildNodes: function(parentId, payloads) |
- { |
- var parent = this._idToDOMNode[parentId]; |
- parent._setChildrenPayload(payloads); |
- this._bindNodes(parent.children); |
- }, |
- |
- _bindNodes: function(children) |
- { |
- for (var i = 0; i < children.length; ++i) { |
- var child = children[i]; |
- this._idToDOMNode[child.id] = child; |
- if (child.children) |
- this._bindNodes(child.children); |
- } |
- }, |
- |
- _childNodeCountUpdated: function(nodeId, newValue) |
- { |
- var node = this._idToDOMNode[nodeId]; |
- node._childNodeCount = newValue; |
- var outline = WebInspector.panels.elements.treeOutline; |
- var treeElement = outline.findTreeElement(node); |
- if (treeElement) |
- treeElement.hasChildren = newValue; |
- }, |
- |
- _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; |
- var event = { target : node, relatedNode : parent }; |
- this.document._fireDomEvent("DOMNodeInserted", event); |
- }, |
- |
- _childNodeRemoved: function(parentId, nodeId) |
- { |
- var parent = this._idToDOMNode[parentId]; |
- var node = this._idToDOMNode[nodeId]; |
- parent.removeChild_(node); |
- var event = { target : node, relatedNode : parent }; |
- this.document._fireDomEvent("DOMNodeRemoved", event); |
- delete this._idToDOMNode[nodeId]; |
- } |
-} |
- |
-WebInspector.Cookies = {} |
- |
-WebInspector.Cookies.getCookiesAsync = function(callback, cookieDomain) |
-{ |
- function mycallback(cookies, cookiesString) { |
- if (cookiesString) |
- callback(WebInspector.Cookies.buildCookiesFromString(cookiesString), false); |
- else |
- callback(cookies, true); |
- } |
- var callId = WebInspector.Callback.wrap(mycallback); |
- InspectorController.getCookies(callId, cookieDomain); |
-} |
- |
-WebInspector.Cookies.buildCookiesFromString = function(rawCookieString) |
-{ |
- var rawCookies = rawCookieString.split(/;\s*/); |
- var cookies = []; |
- |
- if (!(/^\s*$/.test(rawCookieString))) { |
- for (var i = 0; i < rawCookies.length; ++i) { |
- var cookie = rawCookies[i]; |
- var delimIndex = cookie.indexOf("="); |
- var name = cookie.substring(0, delimIndex); |
- var value = cookie.substring(delimIndex + 1); |
- var size = name.length + value.length; |
- cookies.push({ name: name, value: value, size: size }); |
- } |
- } |
- |
- return cookies; |
-} |
- |
-WebInspector.EventListeners = {} |
- |
-WebInspector.EventListeners.getEventListenersForNodeAsync = function(node, callback) |
-{ |
- if (!node) |
- return; |
- |
- var callId = WebInspector.Callback.wrap(callback); |
- InspectorController.getEventListenersForNode(callId, node.id); |
-} |
- |
-WebInspector.CSSStyleDeclaration = function(payload) |
-{ |
- this.id = payload.id; |
- this.width = payload.width; |
- this.height = payload.height; |
- this.__disabledProperties = payload.__disabledProperties; |
- this.__disabledPropertyValues = payload.__disabledPropertyValues; |
- this.__disabledPropertyPriorities = payload.__disabledPropertyPriorities; |
- this.uniqueStyleProperties = payload.uniqueStyleProperties; |
- this._shorthandValues = payload.shorthandValues; |
- this._propertyMap = {}; |
- this._longhandProperties = {}; |
- this.length = payload.properties.length; |
- |
- for (var i = 0; i < this.length; ++i) { |
- var property = payload.properties[i]; |
- var name = property.name; |
- this[i] = name; |
- this._propertyMap[name] = property; |
- } |
- |
- // Index longhand properties. |
- for (var i = 0; i < this.uniqueStyleProperties.length; ++i) { |
- var name = this.uniqueStyleProperties[i]; |
- var property = this._propertyMap[name]; |
- if (property.shorthand) { |
- var longhands = this._longhandProperties[property.shorthand]; |
- if (!longhands) { |
- longhands = []; |
- this._longhandProperties[property.shorthand] = longhands; |
- } |
- longhands.push(name); |
- } |
- } |
-} |
- |
-WebInspector.CSSStyleDeclaration.parseStyle = function(payload) |
-{ |
- return new WebInspector.CSSStyleDeclaration(payload); |
-} |
- |
-WebInspector.CSSStyleDeclaration.parseRule = function(payload) |
-{ |
- var rule = {}; |
- rule.id = payload.id; |
- rule.selectorText = payload.selectorText; |
- rule.style = new WebInspector.CSSStyleDeclaration(payload.style); |
- rule.style.parentRule = rule; |
- rule.isUserAgent = payload.isUserAgent; |
- rule.isUser = payload.isUser; |
- rule.isViaInspector = payload.isViaInspector; |
- if (payload.parentStyleSheet) |
- rule.parentStyleSheet = { href: payload.parentStyleSheet.href }; |
- |
- return rule; |
-} |
- |
-WebInspector.CSSStyleDeclaration.prototype = { |
- getPropertyValue: function(name) |
- { |
- var property = this._propertyMap[name]; |
- return property ? property.value : ""; |
- }, |
- |
- getPropertyPriority: function(name) |
- { |
- var property = this._propertyMap[name]; |
- return property ? property.priority : ""; |
- }, |
- |
- getPropertyShorthand: function(name) |
- { |
- var property = this._propertyMap[name]; |
- return property ? property.shorthand : ""; |
- }, |
- |
- isPropertyImplicit: function(name) |
- { |
- var property = this._propertyMap[name]; |
- return property ? property.implicit : ""; |
- }, |
- |
- styleTextWithShorthands: function() |
- { |
- var cssText = ""; |
- var foundProperties = {}; |
- for (var i = 0; i < this.length; ++i) { |
- var individualProperty = this[i]; |
- var shorthandProperty = this.getPropertyShorthand(individualProperty); |
- var propertyName = (shorthandProperty || individualProperty); |
- |
- if (propertyName in foundProperties) |
- continue; |
- |
- if (shorthandProperty) { |
- var value = this.getPropertyValue(shorthandProperty); |
- var priority = this.getShorthandPriority(shorthandProperty); |
- } else { |
- var value = this.getPropertyValue(individualProperty); |
- var priority = this.getPropertyPriority(individualProperty); |
- } |
- |
- foundProperties[propertyName] = true; |
- |
- cssText += propertyName + ": " + value; |
- if (priority) |
- cssText += " !" + priority; |
- cssText += "; "; |
- } |
- |
- return cssText; |
- }, |
- |
- getLonghandProperties: function(name) |
- { |
- return this._longhandProperties[name] || []; |
- }, |
- |
- getShorthandValue: function(shorthandProperty) |
- { |
- return this._shorthandValues[shorthandProperty]; |
- }, |
- |
- getShorthandPriority: function(shorthandProperty) |
- { |
- var priority = this.getPropertyPriority(shorthandProperty); |
- if (priority) |
- return priority; |
- |
- var longhands = this._longhandProperties[shorthandProperty]; |
- return longhands ? this.getPropertyPriority(longhands[0]) : null; |
- } |
-} |
- |
-WebInspector.attributesUpdated = function() |
-{ |
- this.domAgent._attributesUpdated.apply(this.domAgent, arguments); |
-} |
- |
-WebInspector.setDocument = function() |
-{ |
- this.domAgent._setDocument.apply(this.domAgent, arguments); |
-} |
- |
-WebInspector.setDetachedRoot = function() |
-{ |
- this.domAgent._setDetachedRoot.apply(this.domAgent, arguments); |
-} |
- |
-WebInspector.setChildNodes = function() |
-{ |
- this.domAgent._setChildNodes.apply(this.domAgent, arguments); |
-} |
- |
-WebInspector.childNodeCountUpdated = function() |
-{ |
- this.domAgent._childNodeCountUpdated.apply(this.domAgent, arguments); |
-} |
- |
-WebInspector.childNodeInserted = function() |
-{ |
- this.domAgent._childNodeInserted.apply(this.domAgent, arguments); |
-} |
- |
-WebInspector.childNodeRemoved = function() |
-{ |
- this.domAgent._childNodeRemoved.apply(this.domAgent, arguments); |
-} |
- |
-WebInspector.didGetCookies = WebInspector.Callback.processCallback; |
-WebInspector.didGetChildNodes = WebInspector.Callback.processCallback; |
-WebInspector.didPerformSearch = WebInspector.Callback.processCallback; |
-WebInspector.didApplyDomChange = WebInspector.Callback.processCallback; |
-WebInspector.didRemoveAttribute = WebInspector.Callback.processCallback; |
-WebInspector.didSetTextNodeValue = WebInspector.Callback.processCallback; |
-WebInspector.didGetEventListenersForNode = WebInspector.Callback.processCallback; |