summaryrefslogtreecommitdiffstats
path: root/WebCore/inspector/front-end
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/inspector/front-end')
-rw-r--r--WebCore/inspector/front-end/AuditRules.js8
-rw-r--r--WebCore/inspector/front-end/ConsoleView.js46
-rw-r--r--WebCore/inspector/front-end/DOMAgent.js4
-rw-r--r--WebCore/inspector/front-end/DatabaseTableView.js2
-rw-r--r--WebCore/inspector/front-end/ElementsPanel.js2
-rw-r--r--WebCore/inspector/front-end/ElementsTreeOutline.js4
-rw-r--r--WebCore/inspector/front-end/EventListenersSidebarPane.js24
-rw-r--r--WebCore/inspector/front-end/ExtensionServer.js16
-rw-r--r--WebCore/inspector/front-end/InjectedScript.js967
-rw-r--r--WebCore/inspector/front-end/InjectedScriptAccess.js32
-rw-r--r--WebCore/inspector/front-end/InspectorBackendStub.js129
-rw-r--r--WebCore/inspector/front-end/InspectorBackendStub.qrc6
-rw-r--r--WebCore/inspector/front-end/ObjectPropertiesSection.js14
-rw-r--r--WebCore/inspector/front-end/ObjectProxy.js70
-rw-r--r--WebCore/inspector/front-end/PropertiesSidebarPane.js11
-rw-r--r--WebCore/inspector/front-end/RemoteObject.js138
-rw-r--r--WebCore/inspector/front-end/ResourcesPanel.js2
-rw-r--r--WebCore/inspector/front-end/ScopeChainSidebarPane.js4
-rw-r--r--WebCore/inspector/front-end/ScriptsPanel.js8
-rw-r--r--WebCore/inspector/front-end/SourceFrame.js8
-rw-r--r--WebCore/inspector/front-end/WatchExpressionsSidebarPane.js20
-rw-r--r--WebCore/inspector/front-end/WebKit.qrc3
-rw-r--r--WebCore/inspector/front-end/inspector.html2
-rw-r--r--WebCore/inspector/front-end/inspector.js56
-rw-r--r--WebCore/inspector/front-end/utilities.js18
25 files changed, 771 insertions, 823 deletions
diff --git a/WebCore/inspector/front-end/AuditRules.js b/WebCore/inspector/front-end/AuditRules.js
index 8519cf2..e28a364 100644
--- a/WebCore/inspector/front-end/AuditRules.js
+++ b/WebCore/inspector/front-end/AuditRules.js
@@ -724,9 +724,9 @@ WebInspector.AuditRules.CssInHeadRule = function()
WebInspector.AuditRules.CssInHeadRule.prototype = {
doRun: function(resources, result, callback)
{
- function evalCallback(evalResult, isException)
+ function evalCallback(evalResult)
{
- if (isException || !evalResult)
+ if (!evalResult)
return callback(null);
var summary = result.addChild("");
@@ -800,9 +800,9 @@ WebInspector.AuditRules.StylesScriptsOrderRule = function()
WebInspector.AuditRules.StylesScriptsOrderRule.prototype = {
doRun: function(resources, result, callback)
{
- function evalCallback(resultValue, isException)
+ function evalCallback(resultValue)
{
- if (isException || !resultValue)
+ if (!resultValue)
return callback(null);
var lateCssUrls = resultValue[0];
diff --git a/WebCore/inspector/front-end/ConsoleView.js b/WebCore/inspector/front-end/ConsoleView.js
index 6a4e0d3..474c362 100644
--- a/WebCore/inspector/front-end/ConsoleView.js
+++ b/WebCore/inspector/front-end/ConsoleView.js
@@ -296,7 +296,7 @@ WebInspector.ConsoleView.prototype = {
requestClearMessages: function()
{
- InspectorBackend.clearConsoleMessages(WebInspector.Callback.wrap(this.clearMessages.bind(this)));
+ InspectorBackend.clearConsoleMessages();
},
clearMessages: function()
@@ -342,7 +342,7 @@ WebInspector.ConsoleView.prototype = {
var injectedScriptAccess;
if (WebInspector.panels.scripts && WebInspector.panels.scripts.paused) {
var selectedCallFrame = WebInspector.panels.scripts.sidebarPanes.callstack.selectedCallFrame;
- injectedScriptAccess = InjectedScriptAccess.get(selectedCallFrame.injectedScriptId);
+ injectedScriptAccess = InjectedScriptAccess.get(selectedCallFrame.worldId);
} else
injectedScriptAccess = InjectedScriptAccess.getDefault();
injectedScriptAccess.getCompletions(expressionString, includeInspectorCommandLineAPI, callFrameId, reportCompletions);
@@ -511,7 +511,7 @@ WebInspector.ConsoleView.prototype = {
function evalCallback(result)
{
- callback(result.value, result.isException);
+ callback(WebInspector.RemoteObject.fromPayload(result));
};
InjectedScriptAccess.getDefault().evaluate(expression, objectGroup, evalCallback);
},
@@ -534,7 +534,7 @@ WebInspector.ConsoleView.prototype = {
this.addMessage(commandMessage);
var self = this;
- function printResult(result, exception)
+ function printResult(result)
{
self.prompt.history.push(str);
self.prompt.historyOffset = 0;
@@ -542,7 +542,7 @@ WebInspector.ConsoleView.prototype = {
WebInspector.applicationSettings.consoleHistory = self.prompt.history.slice(-30);
- self.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
+ self.addMessage(new WebInspector.ConsoleCommandResult(result, commandMessage));
}
this.evalInInspectedWindow(str, "console", printResult);
},
@@ -550,7 +550,7 @@ WebInspector.ConsoleView.prototype = {
_format: function(output, forceObjectFormat)
{
var isProxy = (output != null && typeof output === "object");
- var type = (forceObjectFormat ? "object" : Object.proxyType(output));
+ var type = (forceObjectFormat ? "object" : WebInspector.RemoteObject.type(output));
var formatter = this._customFormatters[type];
if (!formatter || !isProxy) {
@@ -589,12 +589,12 @@ WebInspector.ConsoleView.prototype = {
elem.appendChild(treeOutline.element);
}
- InjectedScriptAccess.get(object.injectedScriptId).pushNodeToFrontend(object, printNode);
+ object.pushNodeToFrontend(printNode);
},
_formatarray: function(arr, elem)
{
- InjectedScriptAccess.get(arr.injectedScriptId).getProperties(arr, false, false, this._printArray.bind(this, elem));
+ arr.getOwnProperties(false, this._printArray.bind(this, elem));
},
_formatstring: function(output, elem)
@@ -637,9 +637,8 @@ WebInspector.ConsoleView.prototype = {
_formatAsArrayEntry: function(output)
{
- var type = Object.proxyType(output);
// Prevent infinite expansion of cross-referencing arrays.
- return this._format(output, type === "array");
+ return this._format(output, WebInspector.RemoteObject.type(output) === "array");
}
}
@@ -728,12 +727,15 @@ WebInspector.ConsoleMessage.prototype = {
// Formatting code below assumes that parameters are all wrappers whereas frontend console
// API allows passing arbitrary values as messages (strings, numbers, etc.). Wrap them here.
- for (var i = 0; i < parameters.length; ++i)
- if (typeof parameters[i] !== "object" && typeof parameters[i] !== "function")
- parameters[i] = WebInspector.ObjectProxy.wrapPrimitiveValue(parameters[i]);
+ for (var i = 0; i < parameters.length; ++i) {
+ if (typeof parameters[i] === "object")
+ parameters[i] = WebInspector.RemoteObject.fromPayload(parameters[i]);
+ else
+ parameters[i] = WebInspector.RemoteObject.fromPrimitiveValue(parameters[i]);
+ }
// There can be string log and string eval result. We distinguish between them based on message type.
- var shouldFormatMessage = Object.proxyType(parameters[0]) === "string" && this.type !== WebInspector.ConsoleMessage.MessageType.Result;
+ var shouldFormatMessage = WebInspector.RemoteObject.type(parameters[0]) === "string" && this.type !== WebInspector.ConsoleMessage.MessageType.Result;
// Multiple parameters with the first being a format string. Save unused substitutions.
if (shouldFormatMessage) {
@@ -1048,21 +1050,11 @@ WebInspector.ConsoleCommand.prototype = {
}
}
-WebInspector.ConsoleCommandResult = function(result, exception, originatingCommand)
+WebInspector.ConsoleCommandResult = function(result, originatingCommand)
{
- var level = (exception ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log);
- var message = result;
- if (exception) {
- // Distinguish between strings and errors (no need to quote latter).
- message = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
- message.type = "error";
- }
- var line = (exception ? result.line : -1);
- var url = (exception ? result.sourceURL : null);
-
+ var level = (result.isError() ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log);
this.originatingCommand = originatingCommand;
-
- WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Result, level, line, url, null, 1, null, [message]);
+ WebInspector.ConsoleMessage.call(this, WebInspector.ConsoleMessage.MessageSource.JS, WebInspector.ConsoleMessage.MessageType.Result, level, -1, null, null, 1, null, [result]);
}
WebInspector.ConsoleCommandResult.prototype = {
diff --git a/WebCore/inspector/front-end/DOMAgent.js b/WebCore/inspector/front-end/DOMAgent.js
index c41d038..57422f6 100644
--- a/WebCore/inspector/front-end/DOMAgent.js
+++ b/WebCore/inspector/front-end/DOMAgent.js
@@ -33,10 +33,6 @@ WebInspector.DOMNode = function(doc, payload) {
this.ownerDocument = doc;
this.id = payload.id;
- // injectedScriptId is a node is for DOM nodes which should be converted
- // to corresponding InjectedScript by the inspector backend. We indicate
- // this by making injectedScriptId negative.
- this.injectedScriptId = -payload.id;
this.nodeType = payload.nodeType;
this.nodeName = payload.nodeName;
this.localName = payload.localName;
diff --git a/WebCore/inspector/front-end/DatabaseTableView.js b/WebCore/inspector/front-end/DatabaseTableView.js
index 9e6d374..5440763 100644
--- a/WebCore/inspector/front-end/DatabaseTableView.js
+++ b/WebCore/inspector/front-end/DatabaseTableView.js
@@ -46,7 +46,7 @@ WebInspector.DatabaseTableView.prototype = {
get statusBarItems()
{
- return [this.refreshButton];
+ return [this.refreshButton.element];
},
update: function()
diff --git a/WebCore/inspector/front-end/ElementsPanel.js b/WebCore/inspector/front-end/ElementsPanel.js
index 6713ddc..0296737 100644
--- a/WebCore/inspector/front-end/ElementsPanel.js
+++ b/WebCore/inspector/front-end/ElementsPanel.js
@@ -255,7 +255,7 @@ WebInspector.ElementsPanel.prototype = {
this._matchesCountUpdateTimeout = null;
this._searchQuery = query;
- InspectorBackend.performSearch(whitespaceTrimmedQuery);
+ InspectorBackend.performSearch(whitespaceTrimmedQuery, false);
},
searchingForNodeWasEnabled: function()
diff --git a/WebCore/inspector/front-end/ElementsTreeOutline.js b/WebCore/inspector/front-end/ElementsTreeOutline.js
index 87d85c1..c7d39f1 100644
--- a/WebCore/inspector/front-end/ElementsTreeOutline.js
+++ b/WebCore/inspector/front-end/ElementsTreeOutline.js
@@ -413,8 +413,8 @@ WebInspector.ElementsTreeElement.prototype = {
else
this.tooltip = WebInspector.UIString("%d × %d pixels (Natural: %d × %d pixels)", properties.offsetWidth, properties.offsetHeight, properties.naturalWidth, properties.naturalHeight);
}
- var objectProxy = new WebInspector.ObjectProxy(node.injectedScriptId, node.id);
- WebInspector.ObjectProxy.getPropertiesAsync(objectProxy, ["naturalHeight", "naturalWidth", "offsetHeight", "offsetWidth"], setTooltip.bind(this));
+
+ InjectedScriptAccess.getForNode(node).getNodeProperties(node.id, ["naturalHeight", "naturalWidth", "offsetHeight", "offsetWidth"], setTooltip.bind(this));
},
updateSelection: function()
diff --git a/WebCore/inspector/front-end/EventListenersSidebarPane.js b/WebCore/inspector/front-end/EventListenersSidebarPane.js
index 6798845..2800d6e 100644
--- a/WebCore/inspector/front-end/EventListenersSidebarPane.js
+++ b/WebCore/inspector/front-end/EventListenersSidebarPane.js
@@ -189,17 +189,21 @@ WebInspector.EventListenerBar = function(eventListener, nodeId)
WebInspector.EventListenerBar.prototype = {
update: function()
{
- var properties = [];
- for (var propertyName in this.eventListener) {
- // Just build properties in place - no need to reach out for injected script.
- var value = this.eventListener[propertyName];
- if (value instanceof WebInspector.DOMNode)
- value = new WebInspector.ObjectProxy(value.injectedScriptId, value.id, [], appropriateSelectorForNode(value), true);
- else
- value = WebInspector.ObjectProxy.wrapPrimitiveValue(value);
- properties.push(new WebInspector.ObjectPropertyProxy(propertyName, value));
+ function updateWithNodeObject(nodeObject)
+ {
+ var properties = [];
+ if (nodeObject)
+ properties.push(new WebInspector.RemoteObjectProperty("node", nodeObject));
+
+ for (var propertyName in this.eventListener) {
+ var value = WebInspector.RemoteObject.fromPrimitiveValue(value);
+ properties.push(new WebInspector.RemoteObjectProperty(propertyName, value));
+ }
+ this.updateProperties(properties);
}
- this.updateProperties(properties);
+ var node = this.eventListener.node;
+ delete this.eventListener.node;
+ WebInspector.RemoteObject.resolveNode(node, updateWithNodeObject.bind(this));
},
_setNodeTitle: function()
diff --git a/WebCore/inspector/front-end/ExtensionServer.js b/WebCore/inspector/front-end/ExtensionServer.js
index 2abe1db..95f373f 100644
--- a/WebCore/inspector/front-end/ExtensionServer.js
+++ b/WebCore/inspector/front-end/ExtensionServer.js
@@ -139,7 +139,8 @@ WebInspector.ExtensionServer.prototype = {
var lastToolbarItem = WebInspector.panelOrder[WebInspector.panelOrder.length - 1].toolbarItem;
WebInspector.addPanelToolbarIcon(toolbarElement, panel, lastToolbarItem);
WebInspector.panels[id] = panel;
- this._createClientIframe(panel.element, message.url);
+ var iframe = this._createClientIframe(panel.element, message.url);
+ iframe.style.height = "100%";
return this._status.OK();
},
@@ -165,6 +166,7 @@ WebInspector.ExtensionServer.prototype = {
iframe.src = url;
iframe.style.width = "100%";
parent.appendChild(iframe);
+ return iframe;
},
_onSetSidebarHeight: function(message)
@@ -193,7 +195,17 @@ WebInspector.ExtensionServer.prototype = {
_onEvaluateOnInspectedPage: function(message, port)
{
- InjectedScriptAccess.getDefault().evaluateAndStringify(message.expression, this._dispatchCallback.bind(this, message.requestId, port));
+ var escapedMessage = escape(message.expression);
+ function callback(resultPayload)
+ {
+ var resultObject = WebInspector.RemoteObject.fromPayload(resultPayload);
+ var result = {};
+ if (resultObject.isError())
+ result.isException = true;
+ result.value = resultObject.description;
+ this._dispatchCallback(message.requestId, port, result);
+ }
+ InjectedScriptAccess.getDefault().evaluate("(function() { var a = window.eval(unescape(\"" + escapedMessage + "\")); return JSON.stringify(a); })();", "", callback.bind(this));
},
_onRevealAndSelect: function(message)
diff --git a/WebCore/inspector/front-end/InjectedScript.js b/WebCore/inspector/front-end/InjectedScript.js
index b8bf9f2..d4e3d80 100644
--- a/WebCore/inspector/front-end/InjectedScript.js
+++ b/WebCore/inspector/front-end/InjectedScript.js
@@ -28,392 +28,517 @@
var injectedScriptConstructor = (function (InjectedScriptHost, inspectedWindow, injectedScriptId, jsEngine) {
-var InjectedScript = {};
-
-InjectedScript.lastBoundObjectId = 1;
-InjectedScript.idToWrappedObject = {};
-InjectedScript.objectGroups = {};
-
-InjectedScript.wrapObjectForConsole = function(object, canAccessInspectedWindow)
+var InjectedScript = function()
{
- if (canAccessInspectedWindow)
- return InjectedScript.wrapObject(object, "console");
- var result = {};
- result.type = typeof object;
- result.description = InjectedScript._toString(object);
- return result;
+ this._lastBoundObjectId = 1;
+ this._idToWrappedObject = {};
+ this._objectGroups = {};
}
-InjectedScript.wrapObject = function(object, objectGroupName)
-{
- try {
- var objectId;
- if (typeof object === "object" || typeof object === "function" || InjectedScript._isHTMLAllCollection(object)) {
- var id = InjectedScript.lastBoundObjectId++;
- objectId = "object#" + id;
- InjectedScript.idToWrappedObject[objectId] = object;
-
- var group = InjectedScript.objectGroups[objectGroupName];
- if (!group) {
- group = [];
- InjectedScript.objectGroups[objectGroupName] = group;
+InjectedScript.prototype = {
+ wrapObjectForConsole: function(object, canAccessInspectedWindow)
+ {
+ if (canAccessInspectedWindow)
+ return this._wrapObject(object, "console");
+ var result = {};
+ result.type = typeof object;
+ result.description = this._toString(object);
+ return result;
+ },
+
+ _wrapObject: function(object, objectGroupName, abbreviate)
+ {
+ try {
+ var objectId;
+ if (typeof object === "object" || typeof object === "function" || this._isHTMLAllCollection(object)) {
+ var id = this._lastBoundObjectId++;
+ objectId = id;
+ this._idToWrappedObject[id] = object;
+
+ var group = this._objectGroups[objectGroupName];
+ if (!group) {
+ group = [];
+ this._objectGroups[objectGroupName] = group;
+ }
+ group.push(id);
+ objectId = this._serializeObjectId(id, objectGroupName);
}
- group.push(objectId);
+ return InjectedScript.RemoteObject.fromObject(object, objectId, abbreviate);
+ } catch (e) {
+ return InjectedScript.RemoteObject.fromObject("[ Exception: " + e.toString() + " ]");
}
- return InjectedScript.createProxyObject(object, objectId);
- } catch (e) {
- return InjectedScript.createProxyObject("[ Exception: " + e.toString() + " ]");
- }
- return InjectedScript.createProxyObject(object, objectId);
-};
-
-InjectedScript.unwrapObject = function(objectId) {
- return InjectedScript.idToWrappedObject[objectId];
-};
-
-InjectedScript.releaseWrapperObjectGroup = function(objectGroupName) {
- var group = InjectedScript.objectGroups[objectGroupName];
- if (!group)
- return;
- for (var i = 0; i < group.length; i++)
- delete InjectedScript.idToWrappedObject[group[i]];
- delete InjectedScript.objectGroups[objectGroupName];
-};
-
-InjectedScript.dispatch = function(methodName, args, callId)
-{
- var argsArray = eval("(" + args + ")");
- if (callId)
- argsArray.splice(0, 0, callId); // Methods that run asynchronously have a call back id parameter.
- var result = InjectedScript[methodName].apply(InjectedScript, argsArray);
- if (typeof result === "undefined") {
- inspectedWindow.console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);
- result = null;
- }
- return result;
-}
+ },
-InjectedScript.getPrototypes = function(nodeId)
-{
- var node = InjectedScript._nodeForId(nodeId);
- if (!node)
- return false;
-
- var result = [];
- for (var prototype = node; prototype; prototype = prototype.__proto__) {
- var title = InjectedScript._describe(prototype, true);
- if (title.match(/Prototype$/)) {
- title = title.replace(/Prototype$/, "");
+ _serializeObjectId: function(id, groupName)
+ {
+ return injectedScriptId + ":" + id + ":" + groupName;
+ },
+
+ _parseObjectId: function(objectId)
+ {
+ var tokens = objectId.split(":");
+ var parsedObjectId = {};
+ parsedObjectId.id = parseInt(tokens[1]);
+ parsedObjectId.groupName = tokens[2];
+ return parsedObjectId;
+ },
+
+ releaseWrapperObjectGroup: function(objectGroupName)
+ {
+ var group = this._objectGroups[objectGroupName];
+ if (!group)
+ return;
+ for (var i = 0; i < group.length; i++)
+ delete this._idToWrappedObject[group[i]];
+ delete this._objectGroups[objectGroupName];
+ },
+
+ dispatch: function(methodName, args)
+ {
+ var argsArray = eval("(" + args + ")");
+ var result = this[methodName].apply(this, argsArray);
+ if (typeof result === "undefined") {
+ inspectedWindow.console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);
+ result = null;
}
- result.push(title);
- }
- return result;
-}
+ return result;
+ },
-InjectedScript.getProperties = function(objectProxy, ignoreHasOwnProperty, abbreviate)
-{
- var object = InjectedScript._resolveObject(objectProxy);
- if (!InjectedScript._isDefined(object))
- return false;
- var properties = [];
+ getPrototypes: function(nodeId)
+ {
+ this.releaseWrapperObjectGroup("prototypes");
+ var node = this._nodeForId(nodeId);
+ if (!node)
+ return false;
+
+ var result = [];
+ var prototype = node;
+ do {
+ result.push(this._wrapObject(prototype, "prototypes"));
+ prototype = prototype.__proto__;
+ } while (prototype)
+ return result;
+ },
+
+ getProperties: function(objectId, ignoreHasOwnProperty, abbreviate)
+ {
+ var parsedObjectId = this._parseObjectId(objectId);
+ var object = this._objectForId(parsedObjectId);
+ if (!this._isDefined(object))
+ return false;
+ var properties = [];
+
+ var propertyNames = ignoreHasOwnProperty ? this._getPropertyNames(object) : Object.getOwnPropertyNames(object);
+ if (!ignoreHasOwnProperty && object.__proto__)
+ propertyNames.push("__proto__");
- var propertyNames = ignoreHasOwnProperty ? InjectedScript._getPropertyNames(object) : Object.getOwnPropertyNames(object);
- if (!ignoreHasOwnProperty && object.__proto__)
- propertyNames.push("__proto__");
-
- // Go over properties, prepare results.
- for (var i = 0; i < propertyNames.length; ++i) {
- var propertyName = propertyNames[i];
-
- var property = {};
- property.name = propertyName + "";
- property.parentObjectProxy = objectProxy;
- var isGetter = object["__lookupGetter__"] && object.__lookupGetter__(propertyName);
- if (!isGetter) {
- try {
- var childObject = object[propertyName];
- var childObjectProxy = new InjectedScript.createProxyObject(childObject, objectProxy.objectId, abbreviate);
- childObjectProxy.path = objectProxy.path ? objectProxy.path.slice() : [];
- childObjectProxy.path.push(propertyName);
- property.value = childObjectProxy;
- } catch(e) {
- property.value = { description: e.toString() };
- property.isError = true;
+ // Go over properties, prepare results.
+ for (var i = 0; i < propertyNames.length; ++i) {
+ var propertyName = propertyNames[i];
+
+ var property = {};
+ property.name = propertyName + "";
+ var isGetter = object["__lookupGetter__"] && object.__lookupGetter__(propertyName);
+ if (!isGetter) {
+ try {
+ property.value = this._wrapObject(object[propertyName], parsedObjectId.groupName, abbreviate);
+ } catch(e) {
+ property.value = new InjectedScript.RemoteObject.fromException(e);
+ }
+ } else {
+ // FIXME: this should show something like "getter" (bug 16734).
+ property.value = new InjectedScript.RemoteObject.fromObject("\u2014"); // em dash
+ property.isGetter = true;
}
- } else {
- // FIXME: this should show something like "getter" (bug 16734).
- property.value = { description: "\u2014" }; // em dash
- property.isGetter = true;
+ properties.push(property);
}
- properties.push(property);
- }
- return properties;
-}
-
-InjectedScript.setPropertyValue = function(objectProxy, propertyName, expression)
-{
- var object = InjectedScript._resolveObject(objectProxy);
- if (!InjectedScript._isDefined(object))
- return false;
-
- var expressionLength = expression.length;
- if (!expressionLength) {
- delete object[propertyName];
- return !(propertyName in object);
- }
+ return properties;
+ },
- try {
- // Surround the expression in parenthesis so the result of the eval is the result
- // of the whole expression not the last potential sub-expression.
-
- // There is a regression introduced here: eval is now happening against global object,
- // not call frame while on a breakpoint.
- // TODO: bring evaluation against call frame back.
- var result = inspectedWindow.eval("(" + expression + ")");
- // Store the result in the property.
- object[propertyName] = result;
- return true;
- } catch(e) {
+ setPropertyValue: function(objectId, propertyName, expression)
+ {
+ var parsedObjectId = this._parseObjectId(objectId);
+ var object = this._objectForId(parsedObjectId);
+ if (!this._isDefined(object))
+ return false;
+
+ var expressionLength = expression.length;
+ if (!expressionLength) {
+ delete object[propertyName];
+ return !(propertyName in object);
+ }
+
try {
- var result = inspectedWindow.eval("\"" + expression.replace(/"/g, "\\\"") + "\"");
+ // Surround the expression in parenthesis so the result of the eval is the result
+ // of the whole expression not the last potential sub-expression.
+
+ // There is a regression introduced here: eval is now happening against global object,
+ // not call frame while on a breakpoint.
+ // TODO: bring evaluation against call frame back.
+ var result = inspectedWindow.eval("(" + expression + ")");
+ // Store the result in the property.
object[propertyName] = result;
return true;
} catch(e) {
- return false;
+ try {
+ var result = inspectedWindow.eval("\"" + expression.replace(/"/g, "\\\"") + "\"");
+ object[propertyName] = result;
+ return true;
+ } catch(e) {
+ return false;
+ }
}
- }
-}
+ },
-InjectedScript._populatePropertyNames = function(object, resultSet)
-{
- for (var o = object; o; o = o.__proto__) {
- try {
- var names = Object.getOwnPropertyNames(o);
- for (var i = 0; i < names.length; ++i)
- resultSet[names[i]] = true;
- } catch (e) {
+ _populatePropertyNames: function(object, resultSet)
+ {
+ for (var o = object; o; o = o.__proto__) {
+ try {
+ var names = Object.getOwnPropertyNames(o);
+ for (var i = 0; i < names.length; ++i)
+ resultSet[names[i]] = true;
+ } catch (e) {
+ }
}
- }
-}
+ },
-InjectedScript._getPropertyNames = function(object, resultSet)
-{
- var propertyNameSet = {};
- InjectedScript._populatePropertyNames(object, propertyNameSet);
- return Object.keys(propertyNameSet);
-}
+ _getPropertyNames: function(object, resultSet)
+ {
+ var propertyNameSet = {};
+ this._populatePropertyNames(object, propertyNameSet);
+ return Object.keys(propertyNameSet);
+ },
-InjectedScript.getCompletions = function(expression, includeInspectorCommandLineAPI, callFrameId)
-{
- var props = {};
- try {
- var expressionResult;
- // Evaluate on call frame if call frame id is available.
- if (typeof callFrameId === "number") {
- var callFrame = InjectedScript._callFrameForId(callFrameId);
- if (!callFrame)
- return props;
- if (expression)
- expressionResult = InjectedScript._evaluateOn(callFrame.evaluate, callFrame, expression, true);
- else {
- // Evaluate into properties in scope of the selected call frame.
- var scopeChain = callFrame.scopeChain;
- for (var i = 0; i < scopeChain.length; ++i)
- InjectedScript._populatePropertyNames(scopeChain[i], props);
+ getCompletions: function(expression, includeInspectorCommandLineAPI, callFrameId)
+ {
+ var props = {};
+ try {
+ var expressionResult;
+ // Evaluate on call frame if call frame id is available.
+ if (typeof callFrameId === "number") {
+ var callFrame = this._callFrameForId(callFrameId);
+ if (!callFrame)
+ return props;
+ if (expression)
+ expressionResult = this._evaluateOn(callFrame.evaluate, callFrame, expression);
+ else {
+ // Evaluate into properties in scope of the selected call frame.
+ var scopeChain = callFrame.scopeChain;
+ for (var i = 0; i < scopeChain.length; ++i)
+ this._populatePropertyNames(scopeChain[i], props);
+ }
+ } else {
+ if (!expression)
+ expression = "this";
+ expressionResult = this._evaluateOn(inspectedWindow.eval, inspectedWindow, expression);
}
- } else {
- if (!expression)
- expression = "this";
- expressionResult = InjectedScript._evaluateOn(inspectedWindow.eval, inspectedWindow, expression, false);
+ if (typeof expressionResult === "object")
+ this._populatePropertyNames(expressionResult, props);
+
+ if (includeInspectorCommandLineAPI) {
+ for (var prop in this._commandLineAPI)
+ props[prop] = true;
+ }
+ } catch(e) {
}
- if (typeof expressionResult === "object")
- InjectedScript._populatePropertyNames(expressionResult, props);
+ return props;
+ },
- if (includeInspectorCommandLineAPI) {
- for (var prop in InjectedScript._commandLineAPI)
- props[prop] = true;
+ evaluate: function(expression, objectGroup)
+ {
+ return this._evaluateAndWrap(inspectedWindow.eval, inspectedWindow, expression, objectGroup);
+ },
+
+ _evaluateAndWrap: function(evalFunction, object, expression, objectGroup)
+ {
+ try {
+ return this._wrapObject(this._evaluateOn(evalFunction, object, expression), objectGroup);
+ } catch (e) {
+ return InjectedScript.RemoteObject.fromException(e);
}
- } catch(e) {
- }
- return props;
-}
+ },
-InjectedScript.evaluateAndStringify = function(expression)
-{
- var result = {};
- try {
- var value = InjectedScript._evaluateOn(inspectedWindow.eval, inspectedWindow, expression, false);
- result.value = JSON.stringify(value);
- } catch (e) {
- result.value = e.toString();
- result.isException = true;
- }
- return result;
-}
+ _evaluateOn: function(evalFunction, object, expression)
+ {
+ // Only install command line api object for the time of evaluation.
+ // Surround the expression in with statements to inject our command line API so that
+ // the window object properties still take more precedent than our API functions.
+ inspectedWindow.console._commandLineAPI = this._commandLineAPI;
+
+ expression = "with (window.console._commandLineAPI) { with (window) {\n" + expression + "\n} }";
+ var value = evalFunction.call(object, expression);
+
+ delete inspectedWindow.console._commandLineAPI;
+
+ // When evaluating on call frame error is not thrown, but returned as a value.
+ if (this._type(value) === "error")
+ throw value.toString();
+
+ return value;
+ },
-InjectedScript.evaluate = function(expression, objectGroup)
-{
- return InjectedScript._evaluateAndWrap(inspectedWindow.eval, inspectedWindow, expression, objectGroup);
-}
+ getNodeId: function(node)
+ {
+ return InjectedScriptHost.pushNodePathToFrontend(node, false, false);
+ },
-InjectedScript._evaluateAndWrap = function(evalFunction, object, expression, objectGroup, dontUseCommandLineAPI)
-{
- var result = {};
- try {
- result.value = InjectedScript.wrapObject(InjectedScript._evaluateOn(evalFunction, object, expression, dontUseCommandLineAPI), objectGroup);
+ callFrames: function()
+ {
+ var callFrame = InjectedScriptHost.currentCallFrame();
+ if (!callFrame)
+ return false;
+
+ injectedScript.releaseWrapperObjectGroup("backtrace");
+ var result = [];
+ var depth = 0;
+ do {
+ result.push(new InjectedScript.CallFrameProxy(depth++, callFrame));
+ callFrame = callFrame.caller;
+ } while (callFrame);
+ return result;
+ },
- // Handle error that might have happened while describing result.
- if (result.value.errorText) {
- result.value = result.value.errorText;
- result.isException = true;
- }
- } catch (e) {
- result.value = e.toString();
- result.isException = true;
- }
- return result;
-}
+ evaluateInCallFrame: function(callFrameId, code, objectGroup)
+ {
+ var callFrame = this._callFrameForId(callFrameId);
+ if (!callFrame)
+ return false;
+ return this._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup);
+ },
-InjectedScript._evaluateOn = function(evalFunction, object, expression, dontUseCommandLineAPI)
-{
- if (!dontUseCommandLineAPI) {
- // Only install command line api object for the time of evaluation.
+ _callFrameForId: function(id)
+ {
+ var callFrame = InjectedScriptHost.currentCallFrame();
+ while (--id >= 0 && callFrame)
+ callFrame = callFrame.caller;
+ return callFrame;
+ },
- // Surround the expression in with statements to inject our command line API so that
- // the window object properties still take more precedent than our API functions.
- inspectedWindow.console._commandLineAPI = InjectedScript._commandLineAPI;
+ _nodeForId: function(nodeId)
+ {
+ if (!nodeId)
+ return null;
+ return InjectedScriptHost.nodeForId(nodeId);
+ },
- expression = "with (window.console._commandLineAPI) { with (window) {\n" + expression + "\n} }";
- }
+ _objectForId: function(parsedObjectId)
+ {
+ return this._idToWrappedObject[parsedObjectId.id];
+ },
- var value = evalFunction.call(object, expression);
+ resolveNode: function(nodeId)
+ {
+ var node = this._nodeForId(nodeId);
+ if (!node)
+ return false;
+ // FIXME: receive the object group from client.
+ return this._wrapObject(node, "prototype");
+ },
- if (!dontUseCommandLineAPI)
- delete inspectedWindow.console._commandLineAPI;
+ getNodeProperties: function(nodeId, properties)
+ {
+ var node = this._nodeForId(nodeId);
+ if (!node)
+ return false;
+ var result = {};
+ for (var i = 0; i < properties.length; ++i)
+ result[properties[i]] = node[properties[i]];
+ return result;
+ },
- // When evaluating on call frame error is not thrown, but returned as a value.
- if (InjectedScript._type(value) === "error")
- throw value.toString();
+ pushNodeToFrontend: function(objectId)
+ {
+ var parsedObjectId = this._parseObjectId(objectId);
+ var object = this._objectForId(parsedObjectId);
+ if (!object || this._type(object) !== "node")
+ return false;
+ return InjectedScriptHost.pushNodePathToFrontend(object, false, false);
+ },
- return value;
-}
+ evaluateOnSelf: function(funcBody, args)
+ {
+ var func = window.eval("(" + funcBody + ")");
+ return func.apply(this, args || []);
+ },
-InjectedScript.getNodeId = function(node)
-{
- return InjectedScriptHost.pushNodePathToFrontend(node, false, false);
-}
+ _isDefined: function(object)
+ {
+ return object || this._isHTMLAllCollection(object);
+ },
-InjectedScript.openInInspectedWindow = function(url)
-{
- // Don't call window.open on wrapper - popup blocker mutes it.
- // URIs should have no double quotes.
- inspectedWindow.eval("window.open(\"" + url + "\")");
- return true;
-}
+ _isHTMLAllCollection: function(object)
+ {
+ // document.all is reported as undefined, but we still want to process it.
+ return (typeof object === "undefined") && inspectedWindow.HTMLAllCollection && object instanceof inspectedWindow.HTMLAllCollection;
+ },
-InjectedScript.callFrames = function()
-{
- var callFrame = InjectedScriptHost.currentCallFrame();
- if (!callFrame)
- return false;
-
- var result = [];
- var depth = 0;
- do {
- result.push(new InjectedScript.CallFrameProxy(depth++, callFrame));
- callFrame = callFrame.caller;
- } while (callFrame);
- return result;
-}
+ _type: function(obj)
+ {
+ if (obj === null)
+ return "null";
+
+ var type = typeof obj;
+ if (type !== "object" && type !== "function") {
+ // FIXME(33716): typeof document.all is always 'undefined'.
+ if (this._isHTMLAllCollection(obj))
+ return "array";
+ return type;
+ }
-InjectedScript.evaluateInCallFrame = function(callFrameId, code, objectGroup)
-{
- var callFrame = InjectedScript._callFrameForId(callFrameId);
- if (!callFrame)
- return false;
- return InjectedScript._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup, true);
-}
+ // If owning frame has navigated to somewhere else window properties will be undefined.
+ // In this case just return result of the typeof.
+ if (!inspectedWindow.document)
+ return type;
-InjectedScript._callFrameForId = function(id)
-{
- var callFrame = InjectedScriptHost.currentCallFrame();
- while (--id >= 0 && callFrame)
- callFrame = callFrame.caller;
- return callFrame;
-}
+ if (obj instanceof inspectedWindow.Node)
+ return (obj.nodeType === undefined ? type : "node");
+ if (obj instanceof inspectedWindow.String)
+ return "string";
+ if (obj instanceof inspectedWindow.Array)
+ return "array";
+ if (obj instanceof inspectedWindow.Boolean)
+ return "boolean";
+ if (obj instanceof inspectedWindow.Number)
+ return "number";
+ if (obj instanceof inspectedWindow.Date)
+ return "date";
+ if (obj instanceof inspectedWindow.RegExp)
+ return "regexp";
+ // FireBug's array detection.
+ if (isFinite(obj.length) && typeof obj.splice === "function")
+ return "array";
+ if (isFinite(obj.length) && typeof obj.callee === "function") // arguments.
+ return "array";
+ if (obj instanceof inspectedWindow.NodeList)
+ return "array";
+ if (obj instanceof inspectedWindow.HTMLCollection)
+ return "array";
+ if (obj instanceof inspectedWindow.Error)
+ return "error";
+ return type;
+ },
-InjectedScript._resolveObject = function(objectProxy)
-{
- var object = InjectedScript._objectForId(objectProxy.objectId);
- var path = objectProxy.path;
+ _describe: function(obj, abbreviated)
+ {
+ var type = this._type(obj);
+
+ switch (type) {
+ case "object":
+ case "node":
+ return this._className(obj);
+ case "array":
+ var className = this._className(obj);
+ if (typeof obj.length === "number")
+ className += "[" + obj.length + "]";
+ return className;
+ case "string":
+ if (!abbreviated)
+ return obj;
+ if (obj.length > 100)
+ return "\"" + obj.substring(0, 100) + "\u2026\"";
+ return "\"" + obj + "\"";
+ case "function":
+ var objectText = this._toString(obj);
+ if (abbreviated)
+ objectText = /.*/.exec(objectText)[0].replace(/ +$/g, "");
+ return objectText;
+ default:
+ return this._toString(obj);
+ }
+ },
- // Follow the property path.
- for (var i = 0; InjectedScript._isDefined(object) && path && i < path.length; ++i)
- object = object[path[i]];
+ _toString: function(obj)
+ {
+ // We don't use String(obj) because inspectedWindow.String is undefined if owning frame navigated to another page.
+ return "" + obj;
+ },
- return object;
-}
+ _className: function(obj)
+ {
+ // We can't use the same code for fetching class names of the dom bindings prototype chain.
+ // Both of the methods below result in "Object" names on the foreign engine bindings.
+ // I gave up and am using a check below to distinguish between the egine bingings.
-InjectedScript._nodeForId = function(nodeId)
-{
- if (!nodeId)
- return null;
- return InjectedScriptHost.nodeForId(nodeId);
+ if (jsEngine == "JSC") {
+ var str = inspectedWindow.Object ? inspectedWindow.Object.prototype.toString.call(obj) : this._toString(obj);
+ return str.replace(/^\[object (.*)\]$/i, "$1");
+ } else {
+ // V8
+ return obj.constructor && obj.constructor.name || "Object";
+ }
+ },
+
+ _logEvent: function(event)
+ {
+ console.log(event.type, event);
+ },
+
+ _normalizeEventTypes: function(types)
+ {
+ if (typeof types === "undefined")
+ types = [ "mouse", "key", "load", "unload", "abort", "error", "select", "change", "submit", "reset", "focus", "blur", "resize", "scroll" ];
+ else if (typeof types === "string")
+ types = [ types ];
+
+ var result = [];
+ for (var i = 0; i < types.length; i++) {
+ if (types[i] === "mouse")
+ result.splice(0, 0, "mousedown", "mouseup", "click", "dblclick", "mousemove", "mouseover", "mouseout");
+ else if (types[i] === "key")
+ result.splice(0, 0, "keydown", "keyup", "keypress");
+ else
+ result.push(types[i]);
+ }
+ return result;
+ },
+
+ _inspectedNode: function(num)
+ {
+ var nodeId = InjectedScriptHost.inspectedNode(num);
+ return this._nodeForId(nodeId);
+ },
+
+ _bindToScript: function(func)
+ {
+ var args = Array.prototype.slice.call(arguments, 1);
+ function bound()
+ {
+ return func.apply(injectedScript, args.concat(Array.prototype.slice.call(arguments)));
+ }
+ bound.toString = function() {
+ return "bound: " + func;
+ };
+ return bound;
+ }
}
-InjectedScript._objectForId = function(objectId)
+var injectedScript = new InjectedScript();
+
+InjectedScript.RemoteObject = function(objectId, type, description, hasChildren)
{
- // There are three types of object ids used:
- // - numbers point to DOM Node via the InspectorDOMAgent mapping
- // - strings point to console objects cached in InspectorController for lazy evaluation upon them
- // - objects contain complex ids and are currently used for scoped objects
- if (typeof objectId === "number")
- return InjectedScript._nodeForId(objectId);
- else if (typeof objectId === "string")
- return InjectedScript.unwrapObject(objectId);
- else if (typeof objectId === "object") {
- var callFrame = InjectedScript._callFrameForId(objectId.callFrame);
- if (objectId.thisObject)
- return callFrame.thisObject;
- else
- return callFrame.scopeChain[objectId.chainIndex];
- }
- return objectId;
+ this.objectId = objectId;
+ this.type = type;
+ this.description = description;
+ this.hasChildren = hasChildren;
}
-InjectedScript.pushNodeToFrontend = function(objectProxy)
+InjectedScript.RemoteObject.fromException = function(e)
{
- var object = InjectedScript._resolveObject(objectProxy);
- if (!object || InjectedScript._type(object) !== "node")
- return false;
- return InjectedScriptHost.pushNodePathToFrontend(object, false, false);
+ return new InjectedScript.RemoteObject(null, "error", e.toString());
}
-// Called from within InspectorController on the 'inspected page' side.
-InjectedScript.createProxyObject = function(object, objectId, abbreviate)
+InjectedScript.RemoteObject.fromObject = function(object, objectId, abbreviate)
{
- var result = {};
- result.injectedScriptId = injectedScriptId;
- result.objectId = objectId;
- result.type = InjectedScript._type(object);
- if (result.type === "array")
- result.propertyLength = object.length;
-
- var type = typeof object;
-
- result.hasChildren = (type === "object" && object !== null && (Object.getOwnPropertyNames(object).length || !!object.__proto__)) || type === "function";
+ var type = injectedScript._type(object);
+ var rawType = typeof object;
+ var hasChildren = (rawType === "object" && object !== null && (Object.getOwnPropertyNames(object).length || !!object.__proto__)) || rawType === "function";
+ var description = "";
try {
- result.description = InjectedScript._describe(object, abbreviate);
+ var description = injectedScript._describe(object, abbreviate);
+ return new InjectedScript.RemoteObject(objectId, type, description, hasChildren);
} catch (e) {
- result.errorText = e.toString();
+ return InjectedScript.RemoteObject.fromException(e);
}
- return result;
-}
-
-InjectedScript.evaluateOnSelf = function(funcBody, args)
-{
- var func = window.eval("(" + funcBody + ")");
- return func.apply(this, args || []);
}
InjectedScript.CallFrameProxy = function(id, callFrame)
@@ -424,7 +549,7 @@ InjectedScript.CallFrameProxy = function(id, callFrame)
this.sourceID = callFrame.sourceID;
this.line = callFrame.line;
this.scopeChain = this._wrapScopeChain(callFrame);
- this.injectedScriptId = injectedScriptId;
+ this.worldId = injectedScriptId;
}
InjectedScript.CallFrameProxy.prototype = {
@@ -442,13 +567,13 @@ InjectedScript.CallFrameProxy.prototype = {
for (var i = 0; i < scopeChain.length; i++) {
var scopeType = callFrame.scopeType(i);
var scopeObject = scopeChain[i];
- var scopeObjectProxy = InjectedScript.createProxyObject(scopeObject, { callFrame: this.id, chainIndex: i }, true);
+ var scopeObjectProxy = injectedScript._wrapObject(scopeObject, "backtrace", true);
switch(scopeType) {
case LOCAL_SCOPE: {
foundLocalScope = true;
scopeObjectProxy.isLocal = true;
- scopeObjectProxy.thisObject = InjectedScript.createProxyObject(callFrame.thisObject, { callFrame: this.id, thisObject: true }, true);
+ scopeObjectProxy.thisObject = injectedScript._wrapObject(callFrame.thisObject, "backtrace", true);
break;
}
case CLOSURE_SCOPE: {
@@ -472,138 +597,10 @@ InjectedScript.CallFrameProxy.prototype = {
}
}
-InjectedScript._isDefined = function(object)
-{
- return object || InjectedScript._isHTMLAllCollection(object);
-}
-
-InjectedScript._isHTMLAllCollection = function(object)
-{
- // document.all is reported as undefined, but we still want to process it.
- return (typeof object === "undefined") && inspectedWindow.HTMLAllCollection && object instanceof inspectedWindow.HTMLAllCollection;
-}
-
-InjectedScript._type = function(obj)
-{
- if (obj === null)
- return "null";
-
- var type = typeof obj;
- if (type !== "object" && type !== "function") {
- // FIXME(33716): typeof document.all is always 'undefined'.
- if (InjectedScript._isHTMLAllCollection(obj))
- return "array";
- return type;
- }
-
- // If owning frame has navigated to somewhere else window properties will be undefined.
- // In this case just return result of the typeof.
- if (!inspectedWindow.document)
- return type;
-
- if (obj instanceof inspectedWindow.Node)
- return (obj.nodeType === undefined ? type : "node");
- if (obj instanceof inspectedWindow.String)
- return "string";
- if (obj instanceof inspectedWindow.Array)
- return "array";
- if (obj instanceof inspectedWindow.Boolean)
- return "boolean";
- if (obj instanceof inspectedWindow.Number)
- return "number";
- if (obj instanceof inspectedWindow.Date)
- return "date";
- if (obj instanceof inspectedWindow.RegExp)
- return "regexp";
- if (obj instanceof inspectedWindow.NodeList)
- return "array";
- if (obj instanceof inspectedWindow.HTMLCollection)
- return "array";
- if (typeof inspectedWindow.jQuery === "function" && obj instanceof inspectedWindow.jQuery)
- return "array";
- if (obj instanceof inspectedWindow.Error)
- return "error";
- return type;
-}
-
-InjectedScript._describe = function(obj, abbreviated)
-{
- var type = InjectedScript._type(obj);
-
- switch (type) {
- case "object":
- case "node":
- case "array":
- return InjectedScript._className(obj);
- case "string":
- if (!abbreviated)
- return obj;
- if (obj.length > 100)
- return "\"" + obj.substring(0, 100) + "\u2026\"";
- return "\"" + obj + "\"";
- case "function":
- var objectText = InjectedScript._toString(obj);
- if (abbreviated)
- objectText = /.*/.exec(objectText)[0].replace(/ +$/g, "");
- return objectText;
- default:
- return InjectedScript._toString(obj);
- }
-}
-
-InjectedScript._toString = function(obj)
-{
- // We don't use String(obj) because inspectedWindow.String is undefined if owning frame navigated to another page.
- return "" + obj;
-}
-
-InjectedScript._className = function(obj)
-{
- // We can't use the same code for fetching class names of the dom bindings prototype chain.
- // Both of the methods below result in "Object" names on the foreign engine bindings.
- // I gave up and am using a check below to distinguish between the egine bingings.
-
- if (jsEngine == "JSC") {
- var str = inspectedWindow.Object ? inspectedWindow.Object.prototype.toString.call(obj) : InjectedScript._toString(obj);
- return str.replace(/^\[object (.*)\]$/i, "$1");
- } else {
- // V8
- return obj.constructor && obj.constructor.name || "Object";
- }
-}
-
-InjectedScript._logEvent = function(event)
-{
- console.log(event.type, event);
-}
-
-InjectedScript._normalizeEventTypes = function(types)
-{
- if (typeof types === "undefined")
- types = [ "mouse", "key", "load", "unload", "abort", "error", "select", "change", "submit", "reset", "focus", "blur", "resize", "scroll" ];
- else if (typeof types === "string")
- types = [ types ];
-
- var result = [];
- for (var i = 0; i < types.length; i++) {
- if (types[i] === "mouse")
- result.splice(0, 0, "mousedown", "mouseup", "click", "dblclick", "mousemove", "mouseover", "mouseout");
- else if (types[i] === "key")
- result.splice(0, 0, "keydown", "keyup", "keypress");
- else
- result.push(types[i]);
- }
- return result;
-}
-
-InjectedScript._inspectedNode = function(num)
-{
- var nodeId = InjectedScriptHost.inspectedNode(num);
- return InjectedScript._nodeForId(nodeId);
-}
-
function CommandLineAPI()
{
+ for (var i = 0; i < 5; ++i)
+ this.__defineGetter__("$" + i, injectedScript._bindToScript(injectedScript._inspectedNode, i));
}
CommandLineAPI.prototype = {
@@ -670,10 +667,10 @@ CommandLineAPI.prototype = {
{
if (!object || !object.addEventListener || !object.removeEventListener)
return;
- types = InjectedScript._normalizeEventTypes(types);
+ types = injectedScript._normalizeEventTypes(types);
for (var i = 0; i < types.length; ++i) {
- object.removeEventListener(types[i], InjectedScript._logEvent, false);
- object.addEventListener(types[i], InjectedScript._logEvent, false);
+ object.removeEventListener(types[i], injectedScript._logEvent, false);
+ object.addEventListener(types[i], injectedScript._logEvent, false);
}
},
@@ -681,9 +678,9 @@ CommandLineAPI.prototype = {
{
if (!object || !object.addEventListener || !object.removeEventListener)
return;
- types = InjectedScript._normalizeEventTypes(types);
+ types = injectedScript._normalizeEventTypes(types);
for (var i = 0; i < types.length; ++i)
- object.removeEventListener(types[i], InjectedScript._logEvent, false);
+ object.removeEventListener(types[i], injectedScript._logEvent, false);
},
inspect: function(object)
@@ -692,10 +689,10 @@ CommandLineAPI.prototype = {
return;
inspectedWindow.console.log(object);
- if (InjectedScript._type(object) === "node")
+ if (injectedScript._type(object) === "node")
InjectedScriptHost.pushNodePathToFrontend(object, false, true);
else {
- switch (InjectedScript._describe(object)) {
+ switch (injectedScript._describe(object)) {
case "Database":
InjectedScriptHost.selectDatabase(object);
break;
@@ -708,7 +705,7 @@ CommandLineAPI.prototype = {
copy: function(object)
{
- if (InjectedScript._type(object) === "node") {
+ if (injectedScript._type(object) === "node") {
var nodeId = InjectedScriptHost.pushNodePathToFrontend(object, false, false);
InjectedScriptHost.copyNode(nodeId);
} else
@@ -718,35 +715,9 @@ CommandLineAPI.prototype = {
clear: function()
{
InjectedScriptHost.clearConsoleMessages();
- },
-
- get $0()
- {
- return InjectedScript._inspectedNode(0);
- },
-
- get $1()
- {
- return InjectedScript._inspectedNode(1);
- },
-
- get $2()
- {
- return InjectedScript._inspectedNode(2);
- },
-
- get $3()
- {
- return InjectedScript._inspectedNode(3);
- },
-
- get $4()
- {
- return InjectedScript._inspectedNode(4);
}
}
-InjectedScript._commandLineAPI = new CommandLineAPI();
-
-return InjectedScript;
+injectedScript._commandLineAPI = new CommandLineAPI();
+return injectedScript;
});
diff --git a/WebCore/inspector/front-end/InjectedScriptAccess.js b/WebCore/inspector/front-end/InjectedScriptAccess.js
index b5aa9c7..ce264dd 100644
--- a/WebCore/inspector/front-end/InjectedScriptAccess.js
+++ b/WebCore/inspector/front-end/InjectedScriptAccess.js
@@ -29,17 +29,29 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-function InjectedScriptAccess(injectedScriptId) {
- this._injectedScriptId = injectedScriptId;
+function InjectedScriptAccess(worldId) {
+ this._worldId = worldId;
}
-InjectedScriptAccess.get = function(injectedScriptId)
+InjectedScriptAccess.get = function(worldId)
{
- if (typeof injectedScriptId === "number")
- return new InjectedScriptAccess(injectedScriptId);
+ if (typeof worldId === "number")
+ return new InjectedScriptAccess(worldId);
- console.error("Access to injected script with no id");
- console.trace();
+ console.assert(false, "Access to injected script with no id");
+}
+
+InjectedScriptAccess.getForNode = function(node)
+{
+ // FIXME: do something.
+ return InjectedScriptAccess.get(-node.id);
+}
+
+InjectedScriptAccess.getForObjectId = function(objectId)
+{
+ // FIXME: move to native layer.
+ var tokens = objectId.split(":");
+ return InjectedScriptAccess.get(parseInt(tokens[0]));
}
InjectedScriptAccess.getDefault = function()
@@ -66,7 +78,7 @@ InjectedScriptAccess._installHandler = function(methodName, async)
}
var callId = WebInspector.Callback.wrap(myCallback);
- InspectorBackend.dispatchOnInjectedScript(callId, this._injectedScriptId, methodName, argsString);
+ InspectorBackend.dispatchOnInjectedScript(callId, this._worldId, methodName, argsString);
};
}
@@ -75,12 +87,12 @@ InjectedScriptAccess._installHandler = function(methodName, async)
// - Make sure last parameter of all the InjectedSriptAccess.* calls is a callback function.
// We keep these sorted.
InjectedScriptAccess._installHandler("evaluate");
-InjectedScriptAccess._installHandler("evaluateAndStringify");
InjectedScriptAccess._installHandler("evaluateInCallFrame");
InjectedScriptAccess._installHandler("evaluateOnSelf");
InjectedScriptAccess._installHandler("getCompletions");
InjectedScriptAccess._installHandler("getProperties");
InjectedScriptAccess._installHandler("getPrototypes");
-InjectedScriptAccess._installHandler("openInInspectedWindow");
InjectedScriptAccess._installHandler("pushNodeToFrontend");
+InjectedScriptAccess._installHandler("resolveNode");
+InjectedScriptAccess._installHandler("getNodeProperties");
InjectedScriptAccess._installHandler("setPropertyValue");
diff --git a/WebCore/inspector/front-end/InspectorBackendStub.js b/WebCore/inspector/front-end/InspectorBackendStub.js
deleted file mode 100644
index c87cb81..0000000
--- a/WebCore/inspector/front-end/InspectorBackendStub.js
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
- *
- * 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.InspectorBackendStub = function()
-{
- this._registerDelegate("addInspectedNode");
- this._registerDelegate("addScriptToEvaluateOnLoad");
- this._registerDelegate("changeTagName");
- this._registerDelegate("clearConsoleMessages");
- this._registerDelegate("copyNode");
- this._registerDelegate("deleteCookie");
- this._registerDelegate("didEvaluateForTestInFrontend");
- this._registerDelegate("disableMonitoringXHR");
- this._registerDelegate("disableResourceTracking");
- this._registerDelegate("disableSearchingForNode");
- this._registerDelegate("disableTimeline");
- this._registerDelegate("dispatchOnInjectedScript");
- this._registerDelegate("enableMonitoringXHR");
- this._registerDelegate("enableResourceTracking");
- this._registerDelegate("enableSearchingForNode");
- this._registerDelegate("enableTimeline");
- this._registerDelegate("getApplicationCaches");
- this._registerDelegate("getChildNodes");
- this._registerDelegate("getCookies");
- this._registerDelegate("getDatabaseTableNames");
- this._registerDelegate("getDOMStorageEntries");
- this._registerDelegate("getEventListenersForNode");
- this._registerDelegate("getOuterHTML");
- this._registerDelegate("getProfile");
- this._registerDelegate("getProfileHeaders");
- this._registerDelegate("removeProfile");
- this._registerDelegate("clearProfiles");
- this._registerDelegate("getResourceContent");
- this._registerDelegate("highlightDOMNode");
- this._registerDelegate("hideDOMNodeHighlight");
- this._registerDelegate("performSearch");
- this._registerDelegate("pushNodeByPathToFrontend");
- this._registerDelegate("releaseWrapperObjectGroup");
- this._registerDelegate("removeAllScriptsToEvaluateOnLoad");
- this._registerDelegate("reloadPage");
- this._registerDelegate("removeAttribute");
- this._registerDelegate("removeDOMStorageItem");
- this._registerDelegate("removeNode");
- this._registerDelegate("saveApplicationSettings");
- this._registerDelegate("saveSessionSettings");
- this._registerDelegate("searchCanceled");
- this._registerDelegate("setAttribute");
- this._registerDelegate("setDOMStorageItem");
- this._registerDelegate("setInjectedScriptSource");
- this._registerDelegate("setOuterHTML");
- this._registerDelegate("setTextNodeValue");
- this._registerDelegate("startProfiling");
- this._registerDelegate("startTimelineProfiler");
- this._registerDelegate("stopProfiling");
- this._registerDelegate("stopTimelineProfiler");
- this._registerDelegate("storeLastActivePanel");
- this._registerDelegate("takeHeapSnapshot");
- this._registerDelegate("getProfilerLogLines");
-
- this._registerDelegate("getAllStyles");
- this._registerDelegate("getStyles");
- this._registerDelegate("getComputedStyle");
- this._registerDelegate("getInlineStyle");
- this._registerDelegate("getStyleSheet");
- this._registerDelegate("getRuleRanges");
- this._registerDelegate("applyStyleText");
- this._registerDelegate("setStyleText");
- this._registerDelegate("setStyleProperty");
- this._registerDelegate("toggleStyleEnabled");
- this._registerDelegate("setRuleSelector");
- this._registerDelegate("addRule");
-
- this._registerDelegate("disableDebugger");
- this._registerDelegate("editScriptSource");
- this._registerDelegate("getScriptSource");
- this._registerDelegate("enableDebugger");
- this._registerDelegate("setBreakpoint");
- this._registerDelegate("removeBreakpoint");
- this._registerDelegate("activateBreakpoints");
- this._registerDelegate("deactivateBreakpoints");
- this._registerDelegate("pause");
- this._registerDelegate("resume");
- this._registerDelegate("stepIntoStatement");
- this._registerDelegate("stepOutOfFunction");
- this._registerDelegate("stepOverStatement");
- this._registerDelegate("setPauseOnExceptionsState");
-}
-
-WebInspector.InspectorBackendStub.prototype = {
- _registerDelegate: function(methodName)
- {
- this[methodName] = this.sendMessageToBackend.bind(this, methodName);
- },
-
- sendMessageToBackend: function()
- {
- var message = JSON.stringify(Array.prototype.slice.call(arguments));
- InspectorFrontendHost.sendMessageToBackend(message);
- }
-}
-
-InspectorBackend = new WebInspector.InspectorBackendStub();
diff --git a/WebCore/inspector/front-end/InspectorBackendStub.qrc b/WebCore/inspector/front-end/InspectorBackendStub.qrc
new file mode 100644
index 0000000..30f6d75
--- /dev/null
+++ b/WebCore/inspector/front-end/InspectorBackendStub.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/webkit/inspector">
+ <file>InspectorBackendStub.js</file>
+</qresource>
+</RCC>
+
diff --git a/WebCore/inspector/front-end/ObjectPropertiesSection.js b/WebCore/inspector/front-end/ObjectPropertiesSection.js
index a32e799..aab9546 100644
--- a/WebCore/inspector/front-end/ObjectPropertiesSection.js
+++ b/WebCore/inspector/front-end/ObjectPropertiesSection.js
@@ -50,7 +50,7 @@ WebInspector.ObjectPropertiesSection.prototype = {
return;
self.updateProperties(properties);
};
- InjectedScriptAccess.get(this.object.injectedScriptId).getProperties(this.object, this.ignoreHasOwnProperty, true, callback);
+ this.object.getProperties(this.ignoreHasOwnProperty, true, callback);
},
updateProperties: function(properties, rootTreeElementConstructor, rootPropertyComparer)
@@ -69,8 +69,10 @@ WebInspector.ObjectPropertiesSection.prototype = {
this.propertiesTreeOutline.removeChildren();
- for (var i = 0; i < properties.length; ++i)
+ for (var i = 0; i < properties.length; ++i) {
+ properties[i].parentObject = this.object;
this.propertiesTreeOutline.appendChild(new rootTreeElementConstructor(properties[i]));
+ }
if (!this.propertiesTreeOutline.children.length) {
var title = "<div class=\"info\">" + this.emptyPlaceholder + "</div>";
@@ -152,7 +154,7 @@ WebInspector.ObjectPropertyTreeElement.prototype = {
this.appendChild(new this.treeOutline.section.treeElementConstructor(properties[i]));
}
};
- InjectedScriptAccess.get(this.property.value.injectedScriptId).getProperties(this.property.value, false, true, callback.bind(this));
+ this.property.value.getOwnProperties(true, callback.bind(this));
},
ondblclick: function(event)
@@ -178,11 +180,9 @@ WebInspector.ObjectPropertyTreeElement.prototype = {
this.valueElement = document.createElement("span");
this.valueElement.className = "value";
this.valueElement.textContent = this.property.value.description;
- if (typeof this.property.value.propertyLength !== "undefined")
- this.valueElement.textContent += " (" + this.property.value.propertyLength + ")";
if (this.property.isGetter)
this.valueElement.addStyleClass("dimmed");
- if (this.property.isError)
+ if (this.property.value.isError())
this.valueElement.addStyleClass("error");
this.listItemElement.removeChildren();
@@ -260,7 +260,7 @@ WebInspector.ObjectPropertyTreeElement.prototype = {
self.updateSiblings();
}
};
- InjectedScriptAccess.get(this.property.parentObjectProxy.injectedScriptId).setPropertyValue(this.property.parentObjectProxy, this.property.name, expression.trim(), callback);
+ this.property.parentObject.setPropertyValue(this.property.name, expression.trim(), callback);
}
}
diff --git a/WebCore/inspector/front-end/ObjectProxy.js b/WebCore/inspector/front-end/ObjectProxy.js
deleted file mode 100644
index ef139c6..0000000
--- a/WebCore/inspector/front-end/ObjectProxy.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * 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.ObjectProxy = function(injectedScriptId, objectId, path, description, hasChildren)
-{
- this.objectId = objectId;
- this.injectedScriptId = injectedScriptId;
- this.path = path || [];
- this.description = description;
- this.hasChildren = hasChildren;
-}
-
-WebInspector.ObjectProxy.wrapPrimitiveValue = function(value)
-{
- var proxy = new WebInspector.ObjectProxy();
- proxy.type = typeof value;
- proxy.description = value;
- return proxy;
-}
-
-WebInspector.ObjectProxy.getPropertiesAsync = function(objectProxy, propertiesToQueryFor, callback)
-{
- function createPropertiesMapThenCallback(propertiesPayload)
- {
- if (!propertiesPayload) {
- callback();
- return;
- }
-
- var result = [];
- for (var i = 0; i < propertiesPayload.length; ++i)
- if (propertiesToQueryFor.indexOf(propertiesPayload[i].name) !== -1)
- result[propertiesPayload[i].name] = propertiesPayload[i].value.description;
- callback(result);
- };
- InjectedScriptAccess.get(objectProxy.injectedScriptId).getProperties(objectProxy, true, false, createPropertiesMapThenCallback);
-}
-
-WebInspector.ObjectPropertyProxy = function(name, value)
-{
- this.name = name;
- this.value = value;
-}
diff --git a/WebCore/inspector/front-end/PropertiesSidebarPane.js b/WebCore/inspector/front-end/PropertiesSidebarPane.js
index 9df6448..75d6a48 100644
--- a/WebCore/inspector/front-end/PropertiesSidebarPane.js
+++ b/WebCore/inspector/front-end/PropertiesSidebarPane.js
@@ -48,17 +48,18 @@ WebInspector.PropertiesSidebarPane.prototype = {
body.removeChildren();
self.sections = [];
- var path = [];
// Get array of prototype user-friendly names.
for (var i = 0; i < prototypes.length; ++i) {
- var prototype = new WebInspector.ObjectProxy(node.injectedScriptId, node.id, path.slice());
- var section = new WebInspector.ObjectPropertiesSection(prototype, prototypes[i], WebInspector.UIString("Prototype"));
+ var prototype = WebInspector.RemoteObject.fromPayload(prototypes[i]);
+ var title = prototype.description;
+ if (title.match(/Prototype$/))
+ title = title.replace(/Prototype$/, "");
+ var section = new WebInspector.ObjectPropertiesSection(prototype, title, WebInspector.UIString("Prototype"));
self.sections.push(section);
body.appendChild(section.element);
- path.push("__proto__");
}
};
- InjectedScriptAccess.get(node.injectedScriptId).getPrototypes(node.id, callback);
+ InjectedScriptAccess.getForNode(node).getPrototypes(node.id, callback);
}
}
diff --git a/WebCore/inspector/front-end/RemoteObject.js b/WebCore/inspector/front-end/RemoteObject.js
new file mode 100644
index 0000000..003d483
--- /dev/null
+++ b/WebCore/inspector/front-end/RemoteObject.js
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * 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.RemoteObject = function(objectId, type, description, hasChildren)
+{
+ this._objectId = objectId;
+ this._type = type;
+ this._description = description;
+ this._hasChildren = hasChildren;
+}
+
+WebInspector.RemoteObject.fromPrimitiveValue = function(value)
+{
+ return new WebInspector.RemoteObject(null, typeof value, value);
+}
+
+WebInspector.RemoteObject.resolveNode = function(node, callback)
+{
+ function mycallback(object)
+ {
+ callback(object ? WebInspector.RemoteObject.fromPayload(object) : null);
+ }
+ InjectedScriptAccess.getForNode(node).resolveNode(node.id, mycallback);
+}
+
+WebInspector.RemoteObject.fromPayload = function(payload)
+{
+ if (typeof payload === "object")
+ return new WebInspector.RemoteObject(payload.objectId, payload.type, payload.description, payload.hasChildren);
+ // FIXME: make sure we only get here with real payloads in the new DebuggerAgent.js.
+ return payload;
+}
+
+WebInspector.RemoteObject.type = function(remoteObject)
+{
+ if (remoteObject === null)
+ return "null";
+
+ var type = typeof remoteObject;
+ if (type !== "object" && type !== "function")
+ return type;
+
+ return remoteObject.type;
+}
+
+WebInspector.RemoteObject.prototype = {
+ get objectId()
+ {
+ return this._objectId;
+ },
+
+ get type()
+ {
+ return this._type;
+ },
+
+ get description()
+ {
+ return this._description;
+ },
+
+ get hasChildren()
+ {
+ return this._hasChildren;
+ },
+
+ isError: function()
+ {
+ return this._type === "error";
+ },
+
+ getOwnProperties: function(abbreviate, callback)
+ {
+ this.getProperties(false, abbreviate, callback);
+ },
+
+ getProperties: function(ignoreHasOwnProperty, abbreviate, callback)
+ {
+ if (!this._objectId) {
+ callback([]);
+ return;
+ }
+ function remoteObjectBinder(properties)
+ {
+ for (var i = 0; properties && i < properties.length; ++i)
+ properties[i].value = WebInspector.RemoteObject.fromPayload(properties[i].value);
+ callback(properties);
+ }
+ InjectedScriptAccess.getForObjectId(this._objectId).getProperties(this._objectId, ignoreHasOwnProperty, abbreviate, remoteObjectBinder);
+ },
+
+ setPropertyValue: function(name, value, callback)
+ {
+ if (!this._objectId) {
+ callback(false);
+ return;
+ }
+ InjectedScriptAccess.getForObjectId(this._objectId).setPropertyValue(this._objectId, name, value, callback);
+ },
+
+ pushNodeToFrontend: function(callback)
+ {
+ InjectedScriptAccess.getForObjectId(this._objectId).pushNodeToFrontend(this._objectId, callback);
+ }
+}
+
+WebInspector.RemoteObjectProperty = function(name, value)
+{
+ this.name = name;
+ this.value = value;
+}
diff --git a/WebCore/inspector/front-end/ResourcesPanel.js b/WebCore/inspector/front-end/ResourcesPanel.js
index 9785644..01eefc7 100644
--- a/WebCore/inspector/front-end/ResourcesPanel.js
+++ b/WebCore/inspector/front-end/ResourcesPanel.js
@@ -1186,7 +1186,7 @@ WebInspector.ResourceSidebarTreeElement.prototype = {
ondblclick: function(event)
{
- InjectedScriptAccess.getDefault().openInInspectedWindow(this.resource.url, function() {});
+ InspectorBackend.openInInspectedWindow(this.resource.url);
},
ondragstart: function(event) {
diff --git a/WebCore/inspector/front-end/ScopeChainSidebarPane.js b/WebCore/inspector/front-end/ScopeChainSidebarPane.js
index fdfcd38..d3190a9 100644
--- a/WebCore/inspector/front-end/ScopeChainSidebarPane.js
+++ b/WebCore/inspector/front-end/ScopeChainSidebarPane.js
@@ -60,7 +60,7 @@ WebInspector.ScopeChainSidebarPane.prototype = {
emptyPlaceholder = WebInspector.UIString("No Variables");
subtitle = null;
if (scopeObjectProxy.thisObject)
- extraProperties = [ new WebInspector.ObjectPropertyProxy("this", scopeObjectProxy.thisObject) ];
+ extraProperties = [ new WebInspector.RemoteObjectProperty("this", WebInspector.RemoteObject.fromPayload(scopeObjectProxy.thisObject)) ];
} else if (scopeObjectProxy.isClosure) {
title = WebInspector.UIString("Closure");
emptyPlaceholder = WebInspector.UIString("No Variables");
@@ -77,7 +77,7 @@ WebInspector.ScopeChainSidebarPane.prototype = {
if (!title || title === subtitle)
subtitle = null;
- var section = new WebInspector.ObjectPropertiesSection(scopeObjectProxy, title, subtitle, emptyPlaceholder, true, extraProperties, WebInspector.ScopeVariableTreeElement);
+ var section = new WebInspector.ObjectPropertiesSection(WebInspector.RemoteObject.fromPayload(scopeObjectProxy), title, subtitle, emptyPlaceholder, true, extraProperties, WebInspector.ScopeVariableTreeElement);
section.editInSelectedCallFrameWhenPaused = true;
section.pane = this;
diff --git a/WebCore/inspector/front-end/ScriptsPanel.js b/WebCore/inspector/front-end/ScriptsPanel.js
index 44c1dba..8675f79 100644
--- a/WebCore/inspector/front-end/ScriptsPanel.js
+++ b/WebCore/inspector/front-end/ScriptsPanel.js
@@ -387,9 +387,9 @@ WebInspector.ScriptsPanel.prototype = {
updateInterface = true;
var self = this;
- function updatingCallbackWrapper(result, exception)
+ function updatingCallbackWrapper(result)
{
- callback(result, exception);
+ callback(result);
if (updateInterface)
self.sidebarPanes.scopechain.update(selectedCallFrame);
}
@@ -401,9 +401,9 @@ WebInspector.ScriptsPanel.prototype = {
function evalCallback(result)
{
if (result)
- callback(result.value, result.isException);
+ callback(WebInspector.RemoteObject.fromPayload(result));
}
- InjectedScriptAccess.get(callFrame.injectedScriptId).evaluateInCallFrame(callFrame.id, code, objectGroup, evalCallback);
+ InjectedScriptAccess.get(callFrame.worldId).evaluateInCallFrame(callFrame.id, code, objectGroup, evalCallback);
},
debuggerPaused: function(callFrames)
diff --git a/WebCore/inspector/front-end/SourceFrame.js b/WebCore/inspector/front-end/SourceFrame.js
index 73c3e2a..01a8ec2 100644
--- a/WebCore/inspector/front-end/SourceFrame.js
+++ b/WebCore/inspector/front-end/SourceFrame.js
@@ -625,9 +625,9 @@ WebInspector.SourceFrame.prototype = {
popupContentElement.addEventListener("mousemove", killHidePopupTimer.bind(this), true);
}
- function evaluateCallback(result, exception)
+ function evaluateCallback(result)
{
- if (exception)
+ if (result.isError())
return;
if (!WebInspector.panels.scripts.paused)
return;
@@ -699,11 +699,11 @@ WebInspector.SourceFrame.prototype = {
return;
var expression = selection.getRangeAt(0).toString().trim();
- WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", function(result, exception) {
+ WebInspector.panels.scripts.evaluateInSelectedCallFrame(expression, false, "console", function(result) {
WebInspector.showConsole();
var commandMessage = new WebInspector.ConsoleCommand(expression);
WebInspector.console.addMessage(commandMessage);
- WebInspector.console.addMessage(new WebInspector.ConsoleCommandResult(result, exception, commandMessage));
+ WebInspector.console.addMessage(new WebInspector.ConsoleCommandResult(result, commandMessage));
});
},
diff --git a/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js b/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js
index b530ab6..28dad23 100644
--- a/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js
+++ b/WebCore/inspector/front-end/WatchExpressionsSidebarPane.js
@@ -90,24 +90,10 @@ WebInspector.WatchExpressionsSection.NewWatchExpression = "\xA0";
WebInspector.WatchExpressionsSection.prototype = {
update: function()
{
- function appendResult(expression, watchIndex, result, exception)
+ function appendResult(expression, watchIndex, result)
{
- if (exception) {
- // Exception results are not wrappers, but text messages.
- result = WebInspector.ObjectProxy.wrapPrimitiveValue(result);
- } else if (result.type === "string") {
- // Evaluation result is intentionally not abbreviated. However, we'd like to distinguish between null and "null"
- result.description = "\"" + result.description + "\"";
- }
-
- var property = new WebInspector.ObjectPropertyProxy(expression, result);
+ var property = new WebInspector.RemoteObjectProperty(expression, result);
property.watchIndex = watchIndex;
- property.isException = exception;
-
- // For newly added, empty expressions, set description to "",
- // since otherwise you get DOMWindow
- if (property.name === WebInspector.WatchExpressionsSection.NewWatchExpression)
- property.value.description = "";
// To clarify what's going on here:
// In the outer function, we calculate the number of properties
@@ -222,7 +208,7 @@ WebInspector.WatchExpressionTreeElement.prototype = {
{
WebInspector.ObjectPropertyTreeElement.prototype.update.call(this);
- if (this.property.isException)
+ if (this.property.value.isError())
this.valueElement.addStyleClass("watch-expressions-error-level");
var deleteButton = document.createElement("input");
diff --git a/WebCore/inspector/front-end/WebKit.qrc b/WebCore/inspector/front-end/WebKit.qrc
index a54936c..4901857 100644
--- a/WebCore/inspector/front-end/WebKit.qrc
+++ b/WebCore/inspector/front-end/WebKit.qrc
@@ -46,13 +46,11 @@
<file>InjectedScript.js</file>
<file>InjectedScriptAccess.js</file>
<file>inspector.js</file>
- <file>InspectorBackendStub.js</file>
<file>InspectorFrontendHostStub.js</file>
<file>KeyboardShortcut.js</file>
<file>MetricsSidebarPane.js</file>
<file>Object.js</file>
<file>ObjectPropertiesSection.js</file>
- <file>ObjectProxy.js</file>
<file>Panel.js</file>
<file>PanelEnablerView.js</file>
<file>Placard.js</file>
@@ -62,6 +60,7 @@
<file>ProfileView.js</file>
<file>PropertiesSection.js</file>
<file>PropertiesSidebarPane.js</file>
+ <file>RemoteObject.js</file>
<file>Resource.js</file>
<file>ResourceCategory.js</file>
<file>ResourcesPanel.js</file>
diff --git a/WebCore/inspector/front-end/inspector.html b/WebCore/inspector/front-end/inspector.html
index 48e95bb..14e2cdc 100644
--- a/WebCore/inspector/front-end/inspector.html
+++ b/WebCore/inspector/front-end/inspector.html
@@ -73,7 +73,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<script type="text/javascript" src="SidebarTreeElement.js"></script>
<script type="text/javascript" src="Section.js"></script>
<script type="text/javascript" src="PropertiesSection.js"></script>
- <script type="text/javascript" src="ObjectProxy.js"></script>
+ <script type="text/javascript" src="RemoteObject.js"></script>
<script type="text/javascript" src="ObjectPropertiesSection.js"></script>
<script type="text/javascript" src="BreakpointsSidebarPane.js"></script>
<script type="text/javascript" src="CallStackSidebarPane.js"></script>
diff --git a/WebCore/inspector/front-end/inspector.js b/WebCore/inspector/front-end/inspector.js
index 4e8e633..fa57916 100644
--- a/WebCore/inspector/front-end/inspector.js
+++ b/WebCore/inspector/front-end/inspector.js
@@ -28,7 +28,8 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-function preloadImages()
+// Keep this ; so that concatenated version of the script worked.
+;(function preloadImages()
{
(new Image()).src = "Images/clearConsoleButtonGlyph.png";
(new Image()).src = "Images/consoleButtonGlyph.png";
@@ -45,9 +46,7 @@ function preloadImages()
(new Image()).src = "Images/recordToggledButtonGlyph.png";
(new Image()).src = "Images/reloadButtonGlyph.png";
(new Image()).src = "Images/undockButtonGlyph.png";
-}
-
-preloadImages();
+})();
var WebInspector = {
resources: {},
@@ -427,10 +426,39 @@ WebInspector.PlatformFlavor = {
MacTiger: "mac-tiger",
MacLeopard: "mac-leopard",
MacSnowLeopard: "mac-snowleopard"
-}
+};
+
+(function parseQueryParameters()
+{
+ WebInspector.queryParamsObject = {};
+ var queryParams = window.location.search;
+ if (!queryParams)
+ return;
+ var params = queryParams.substring(1).split("&");
+ for (var i = 0; i < params.length; ++i) {
+ var pair = params[i].split("=");
+ WebInspector.queryParamsObject[pair[0]] = pair[1];
+ }
+})();
WebInspector.loaded = function()
{
+ if ("page" in WebInspector.queryParamsObject) {
+ WebInspector.socket = new WebSocket("ws://" + window.location.host + "/devtools/page/" + WebInspector.queryParamsObject.page);
+ WebInspector.socket.onmessage = function(message) { WebInspector_syncDispatch(message.data); }
+ WebInspector.socket.onerror = function(error) { console.error(error); }
+ WebInspector.socket.onopen = function() {
+ InspectorFrontendHost.sendMessageToBackend = WebInspector.socket.send.bind(WebInspector.socket);
+ InspectorFrontendHost.loaded = WebInspector.socket.send.bind(WebInspector.socket, "loaded");
+ WebInspector.doLoadedDone();
+ }
+ return;
+ }
+ WebInspector.doLoadedDone();
+}
+
+WebInspector.doLoadedDone = function()
+{
InspectorBackend.setInjectedScriptSource("(" + injectedScriptConstructor + ");");
var platform = WebInspector.platform;
@@ -581,6 +609,15 @@ WebInspector.dispatch = function() {
setTimeout(delayDispatch, 0);
}
+// This function is purposely put into the global scope for easy access.
+WebInspector_syncDispatch = function(message)
+{
+ var args = JSON.parse(message);
+ var methodName = args[0];
+ var parameters = args.slice(1);
+ WebInspector[methodName].apply(WebInspector, parameters);
+}
+
WebInspector.dispatchMessageFromBackend = function(arguments)
{
WebInspector.dispatch.apply(this, arguments);
@@ -1109,6 +1146,11 @@ WebInspector.selectDatabase = function(o)
WebInspector.panels.storage.selectDatabase(o);
}
+WebInspector.consoleMessagesCleared = function()
+{
+ WebInspector.console.clearMessages();
+}
+
WebInspector.selectDOMStorage = function(o)
{
WebInspector.showPanel("storage");
@@ -1470,7 +1512,7 @@ WebInspector.log = function(message, messageLevel)
// return indication if we can actually log a message
function isLogAvailable()
{
- return WebInspector.ConsoleMessage && WebInspector.ObjectProxy && self.console;
+ return WebInspector.ConsoleMessage && WebInspector.RemoteObject && self.console;
}
// flush the queue of pending messages
@@ -1510,7 +1552,7 @@ WebInspector.log = function(message, messageLevel)
WebInspector.log.repeatCount = repeatCount;
// ConsoleMessage expects a proxy object
- message = new WebInspector.ObjectProxy(null, null, [], message, false);
+ message = new WebInspector.RemoteObject.fromPrimitiveValue(message);
// post the message
var msg = new WebInspector.ConsoleMessage(
diff --git a/WebCore/inspector/front-end/utilities.js b/WebCore/inspector/front-end/utilities.js
index dd3e761..66cf284 100644
--- a/WebCore/inspector/front-end/utilities.js
+++ b/WebCore/inspector/front-end/utilities.js
@@ -26,18 +26,6 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-Object.proxyType = function(objectProxy)
-{
- if (objectProxy === null)
- return "null";
-
- var type = typeof objectProxy;
- if (type !== "object" && type !== "function")
- return type;
-
- return objectProxy.type;
-}
-
Object.properties = function(obj)
{
var properties = [];
@@ -847,7 +835,7 @@ String.tokenizeFormatString = function(format)
String.standardFormatters = {
d: function(substitution)
{
- if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
+ if (typeof substitution == "object" && WebInspector.RemoteObject.type(substitution) === "number")
substitution = substitution.description;
substitution = parseInt(substitution);
return !isNaN(substitution) ? substitution : 0;
@@ -855,7 +843,7 @@ String.standardFormatters = {
f: function(substitution, token)
{
- if (typeof substitution == "object" && Object.proxyType(substitution) === "number")
+ if (typeof substitution == "object" && WebInspector.RemoteObject.type(substitution) === "number")
substitution = substitution.description;
substitution = parseFloat(substitution);
if (substitution && token.precision > -1)
@@ -865,7 +853,7 @@ String.standardFormatters = {
s: function(substitution)
{
- if (typeof substitution == "object" && Object.proxyType(substitution) !== "null")
+ if (typeof substitution == "object" && WebInspector.RemoteObject.type(substitution) !== "null")
substitution = substitution.description;
return substitution;
},