diff options
Diffstat (limited to 'WebCore/inspector/front-end')
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; }, |