| Index: Source/core/inspector/InjectedScriptSource.js
|
| diff --git a/Source/core/inspector/InjectedScriptSource.js b/Source/core/inspector/InjectedScriptSource.js
|
| index 1ddcd7f02828f4d93aa8bf90d6c3c868f0905eba..449ddc9c93c51df8e822a70677855d0a03f9aaae 100644
|
| --- a/Source/core/inspector/InjectedScriptSource.js
|
| +++ b/Source/core/inspector/InjectedScriptSource.js
|
| @@ -93,7 +93,7 @@ var InjectedScript = function()
|
| {
|
| /** @type {number} */
|
| this._lastBoundObjectId = 1;
|
| - /** @type {!Object.<number, Object>} */
|
| + /** @type {!Object.<number, *>} */
|
| this._idToWrappedObject = {};
|
| /** @type {!Object.<number, string>} */
|
| this._idToObjectGroupName = {};
|
| @@ -135,7 +135,7 @@ InjectedScript.prototype = {
|
| wrapObject: function(object, groupName, canAccessInspectedWindow, generatePreview)
|
| {
|
| if (canAccessInspectedWindow)
|
| - return this._wrapObject(object, groupName, false, generatePreview);
|
| + return this._wrapObject(object, groupName, false, false, generatePreview);
|
| return this._fallbackWrapper(object);
|
| },
|
|
|
| @@ -172,7 +172,7 @@ InjectedScript.prototype = {
|
| for (var i = 0; i < columns.length; ++i)
|
| columnNames.push(toString(columns[i]));
|
| }
|
| - return this._wrapObject(table, "console", false, true, columnNames, true);
|
| + return this._wrapObject(table, "console", false, false, true, columnNames, true);
|
| },
|
|
|
| /**
|
| @@ -216,16 +216,17 @@ InjectedScript.prototype = {
|
| * @param {*} object
|
| * @param {string=} objectGroupName
|
| * @param {boolean=} forceValueType
|
| + * @param {boolean=} forceObjectId
|
| * @param {boolean=} generatePreview
|
| * @param {?Array.<string>=} columnNames
|
| * @param {boolean=} isTable
|
| * @return {!RuntimeAgent.RemoteObject}
|
| * @suppress {checkTypes}
|
| */
|
| - _wrapObject: function(object, objectGroupName, forceValueType, generatePreview, columnNames, isTable)
|
| + _wrapObject: function(object, objectGroupName, forceValueType, forceObjectId, generatePreview, columnNames, isTable)
|
| {
|
| try {
|
| - return new InjectedScript.RemoteObject(object, objectGroupName, forceValueType, generatePreview, columnNames, isTable);
|
| + return new InjectedScript.RemoteObject(object, objectGroupName, forceValueType, forceObjectId, generatePreview, columnNames, isTable);
|
| } catch (e) {
|
| try {
|
| var description = injectedScript._describe(e);
|
| @@ -237,7 +238,7 @@ InjectedScript.prototype = {
|
| },
|
|
|
| /**
|
| - * @param {Object} object
|
| + * @param {*} object
|
| * @param {string=} objectGroupName
|
| * @return {string}
|
| */
|
| @@ -260,7 +261,7 @@ InjectedScript.prototype = {
|
|
|
| /**
|
| * @param {string} objectId
|
| - * @return {Object}
|
| + * @return {{injectedScriptId: number, id: number}}
|
| */
|
| _parseObjectId: function(objectId)
|
| {
|
| @@ -305,12 +306,12 @@ InjectedScript.prototype = {
|
| getProperties: function(objectId, ownProperties, accessorPropertiesOnly)
|
| {
|
| var parsedObjectId = this._parseObjectId(objectId);
|
| - var object = this._objectForId(parsedObjectId);
|
| + var object = this._objectForId(parsedObjectId.id);
|
| var objectGroupName = this._idToObjectGroupName[parsedObjectId.id];
|
|
|
| if (!this._isDefined(object))
|
| return false;
|
| - var descriptors = this._propertyDescriptors(object, ownProperties, accessorPropertiesOnly);
|
| + var descriptors = this._propertyDescriptors(/** @type {!Object} */ (object), ownProperties, accessorPropertiesOnly);
|
|
|
| // Go over properties, wrap object values.
|
| for (var i = 0; i < descriptors.length; ++i) {
|
| @@ -336,7 +337,7 @@ InjectedScript.prototype = {
|
| getInternalProperties: function(objectId, ownProperties)
|
| {
|
| var parsedObjectId = this._parseObjectId(objectId);
|
| - var object = this._objectForId(parsedObjectId);
|
| + var object = this._objectForId(parsedObjectId.id);
|
| var objectGroupName = this._idToObjectGroupName[parsedObjectId.id];
|
| if (!this._isDefined(object))
|
| return false;
|
| @@ -362,7 +363,7 @@ InjectedScript.prototype = {
|
| getFunctionDetails: function(functionId)
|
| {
|
| var parsedFunctionId = this._parseObjectId(functionId);
|
| - var func = this._objectForId(parsedFunctionId);
|
| + var func = this._objectForId(parsedFunctionId.id);
|
| if (typeof func !== "function")
|
| return "Cannot resolve function by id.";
|
| var details = InjectedScriptHost.functionDetails(func);
|
| @@ -473,24 +474,26 @@ InjectedScript.prototype = {
|
| * @param {string} objectGroup
|
| * @param {boolean} injectCommandLineAPI
|
| * @param {boolean} returnByValue
|
| + * @param {boolean} forceObjectId
|
| * @param {boolean} generatePreview
|
| * @return {*}
|
| */
|
| - evaluate: function(expression, objectGroup, injectCommandLineAPI, returnByValue, generatePreview)
|
| + evaluate: function(expression, objectGroup, injectCommandLineAPI, returnByValue, forceObjectId, generatePreview)
|
| {
|
| - return this._evaluateAndWrap(InjectedScriptHost.evaluate, InjectedScriptHost, expression, objectGroup, false, injectCommandLineAPI, returnByValue, generatePreview);
|
| + return this._evaluateAndWrap(InjectedScriptHost.evaluate, InjectedScriptHost, expression, objectGroup, false, injectCommandLineAPI, returnByValue, forceObjectId, generatePreview);
|
| },
|
|
|
| /**
|
| * @param {string} objectId
|
| * @param {string} expression
|
| * @param {boolean} returnByValue
|
| + * @param {boolean} forceObjectId
|
| * @return {Object|string}
|
| */
|
| - callFunctionOn: function(objectId, expression, args, returnByValue)
|
| + callFunctionOn: function(objectId, expression, args, returnByValue, forceObjectId)
|
| {
|
| var parsedObjectId = this._parseObjectId(objectId);
|
| - var object = this._objectForId(parsedObjectId);
|
| + var object = this._objectForId(parsedObjectId.id);
|
| if (!this._isDefined(object))
|
| return "Could not find object with given id";
|
|
|
| @@ -515,7 +518,7 @@ InjectedScript.prototype = {
|
| return "Given expression does not evaluate to a function";
|
|
|
| return { wasThrown: false,
|
| - result: this._wrapObject(func.apply(object, resolvedArgs), objectGroup, returnByValue) };
|
| + result: this._wrapObject(func.apply(object, resolvedArgs), objectGroup, returnByValue, forceObjectId) };
|
| } catch (e) {
|
| return this._createThrownValue(e, objectGroup);
|
| }
|
| @@ -531,18 +534,15 @@ InjectedScript.prototype = {
|
| var objectId = callArgumentJson.objectId;
|
| if (objectId) {
|
| var parsedArgId = this._parseObjectId(objectId);
|
| - if (!parsedArgId || parsedArgId["injectedScriptId"] !== injectedScriptId)
|
| + if (!parsedArgId || parsedArgId.injectedScriptId !== injectedScriptId)
|
| throw "Arguments should belong to the same JavaScript world as the target object.";
|
| -
|
| - var resolvedArg = this._objectForId(parsedArgId);
|
| - if (!this._isDefined(resolvedArg))
|
| + if (!this._hasObjectForId(parsedArgId.id))
|
| throw "Could not find object with given id";
|
| -
|
| - return resolvedArg;
|
| - } else if ("value" in callArgumentJson)
|
| + return this._objectForId(parsedArgId.id);
|
| + } else if ("value" in callArgumentJson) {
|
| return callArgumentJson.value;
|
| - else
|
| - return undefined;
|
| + }
|
| + return undefined;
|
| },
|
|
|
| /**
|
| @@ -552,14 +552,15 @@ InjectedScript.prototype = {
|
| * @param {boolean} isEvalOnCallFrame
|
| * @param {boolean} injectCommandLineAPI
|
| * @param {boolean} returnByValue
|
| + * @param {boolean} forceObjectId
|
| * @param {boolean} generatePreview
|
| * @return {*}
|
| */
|
| - _evaluateAndWrap: function(evalFunction, object, expression, objectGroup, isEvalOnCallFrame, injectCommandLineAPI, returnByValue, generatePreview)
|
| + _evaluateAndWrap: function(evalFunction, object, expression, objectGroup, isEvalOnCallFrame, injectCommandLineAPI, returnByValue, forceObjectId, generatePreview)
|
| {
|
| try {
|
| return { wasThrown: false,
|
| - result: this._wrapObject(this._evaluateOn(evalFunction, object, objectGroup, expression, isEvalOnCallFrame, injectCommandLineAPI), objectGroup, returnByValue, generatePreview) };
|
| + result: this._wrapObject(this._evaluateOn(evalFunction, object, objectGroup, expression, isEvalOnCallFrame, injectCommandLineAPI), objectGroup, returnByValue, forceObjectId, generatePreview) };
|
| } catch (e) {
|
| return this._createThrownValue(e, objectGroup);
|
| }
|
| @@ -635,15 +636,16 @@ InjectedScript.prototype = {
|
| * @param {string} objectGroup
|
| * @param {boolean} injectCommandLineAPI
|
| * @param {boolean} returnByValue
|
| + * @param {boolean} forceObjectId
|
| * @param {boolean} generatePreview
|
| * @return {*}
|
| */
|
| - evaluateOnCallFrame: function(topCallFrame, callFrameId, expression, objectGroup, injectCommandLineAPI, returnByValue, generatePreview)
|
| + evaluateOnCallFrame: function(topCallFrame, callFrameId, expression, objectGroup, injectCommandLineAPI, returnByValue, forceObjectId, generatePreview)
|
| {
|
| var callFrame = this.callFrameForId(topCallFrame, callFrameId);
|
| if (!callFrame)
|
| return "Could not find call frame with given id";
|
| - return this._evaluateAndWrap(callFrame.evaluate, callFrame, expression, objectGroup, true, injectCommandLineAPI, returnByValue, generatePreview);
|
| + return this._evaluateAndWrap(callFrame.evaluate, callFrame, expression, objectGroup, true, injectCommandLineAPI, returnByValue, forceObjectId, generatePreview);
|
| },
|
|
|
| /**
|
| @@ -698,7 +700,7 @@ InjectedScript.prototype = {
|
| setter = callFrame.setVariableValue.bind(callFrame);
|
| } else {
|
| var parsedFunctionId = this._parseObjectId(/** @type {string} */ (functionObjectId));
|
| - var func = this._objectForId(parsedFunctionId);
|
| + var func = this._objectForId(parsedFunctionId.id);
|
| if (typeof func !== "function")
|
| return "Cannot resolve function by id.";
|
| setter = InjectedScriptHost.setFunctionVariableValue.bind(InjectedScriptHost, func);
|
| @@ -739,22 +741,31 @@ InjectedScript.prototype = {
|
| },
|
|
|
| /**
|
| - * @param {Object} objectId
|
| - * @return {Object}
|
| + * @param {number} objectId
|
| + * @return {*}
|
| */
|
| _objectForId: function(objectId)
|
| {
|
| - return this._idToWrappedObject[objectId.id];
|
| + return this._idToWrappedObject[objectId];
|
| + },
|
| +
|
| + /**
|
| + * @param {number} objectId
|
| + * @return {boolean}
|
| + */
|
| + _hasObjectForId: function(objectId)
|
| + {
|
| + return (objectId in this._idToWrappedObject);
|
| },
|
|
|
| /**
|
| * @param {string} objectId
|
| - * @return {Object}
|
| + * @return {*}
|
| */
|
| findObjectById: function(objectId)
|
| {
|
| var parsedObjectId = this._parseObjectId(objectId);
|
| - return this._objectForId(parsedObjectId);
|
| + return this._objectForId(parsedObjectId.id);
|
| },
|
|
|
| /**
|
| @@ -802,7 +813,7 @@ InjectedScript.prototype = {
|
| */
|
| _isDefined: function(object)
|
| {
|
| - return !!object || this._isHTMLAllCollection(object);
|
| + return (!!object && !InjectedScript.primitiveTypes[typeof object]) || this._isHTMLAllCollection(object);
|
| },
|
|
|
| /**
|
| @@ -913,11 +924,12 @@ var injectedScript = new InjectedScript();
|
| * @param {*} object
|
| * @param {string=} objectGroupName
|
| * @param {boolean=} forceValueType
|
| + * @param {boolean=} forceObjectId
|
| * @param {boolean=} generatePreview
|
| * @param {?Array.<string>=} columnNames
|
| * @param {boolean=} isTable
|
| */
|
| -InjectedScript.RemoteObject = function(object, objectGroupName, forceValueType, generatePreview, columnNames, isTable)
|
| +InjectedScript.RemoteObject = function(object, objectGroupName, forceValueType, forceObjectId, generatePreview, columnNames, isTable)
|
| {
|
| this.type = typeof object;
|
| if (injectedScript.isPrimitiveValue(object) || object === null || forceValueType) {
|
| @@ -932,6 +944,9 @@ InjectedScript.RemoteObject = function(object, objectGroupName, forceValueType,
|
| // Provide user-friendly number values.
|
| if (this.type === "number")
|
| this.description = toString(object);
|
| +
|
| + if (forceObjectId)
|
| + this.objectId = injectedScript._bind(object, objectGroupName);
|
| return;
|
| }
|
|
|
|
|