Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1658)

Unified Diff: Source/devtools/front_end/sdk/RemoteObject.js

Issue 1325783003: [DevTools] Added RemoteArray and RemoteFunction wrappers (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/devtools/front_end/platform/utilities.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/devtools/front_end/sdk/RemoteObject.js
diff --git a/Source/devtools/front_end/sdk/RemoteObject.js b/Source/devtools/front_end/sdk/RemoteObject.js
index 445f441ca1e483f564b1b29cbbb52d0bc618d421..1fd92f239272afde3896dbc114396375cfbbcaa4 100644
--- a/Source/devtools/front_end/sdk/RemoteObject.js
+++ b/Source/devtools/front_end/sdk/RemoteObject.js
@@ -28,6 +28,11 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+ /**
+ * @typedef {{object: ?WebInspector.RemoteObject, wasThrown: (boolean|undefined)}}
+ */
+WebInspector.CallFunctionResult;
+
/**
* This may not be an interface due to "instanceof WebInspector.RemoteObject" checks in the code.
*
@@ -174,7 +179,7 @@ WebInspector.RemoteObject.prototype = {
/**
* @param {function(this:Object, ...)} functionDeclaration
- * @param {!Array.<!RuntimeAgent.CallArgument>=} args
+ * @param {!Array<!RuntimeAgent.CallArgument>=} args
* @param {function(?WebInspector.RemoteObject, boolean=)=} callback
*/
callFunction: function(functionDeclaration, args, callback)
@@ -184,15 +189,15 @@ WebInspector.RemoteObject.prototype = {
/**
* @param {function(this:Object, ...)} functionDeclaration
- * @param {!Array.<!RuntimeAgent.CallArgument>=} args
- * @return {!Promise.<!{object: ?WebInspector.RemoteObject, wasThrown: (boolean|undefined)}>}
+ * @param {!Array<!RuntimeAgent.CallArgument>=} args
+ * @return {!Promise<!WebInspector.CallFunctionResult>}
*/
callFunctionPromise: function(functionDeclaration, args)
{
return new Promise(promiseConstructor.bind(this));
/**
- * @param {function(!{object: ?WebInspector.RemoteObject, wasThrown: (boolean|undefined)})} success
+ * @param {function(!WebInspector.CallFunctionResult)} success
* @this {WebInspector.RemoteObject}
*/
function promiseConstructor(success)
@@ -201,7 +206,7 @@ WebInspector.RemoteObject.prototype = {
}
/**
- * @param {function(!{object: ?WebInspector.RemoteObject, wasThrown: (boolean|undefined)})} callback
+ * @param {function(!WebInspector.CallFunctionResult)} callback
* @param {?WebInspector.RemoteObject} object
* @param {boolean=} wasThrown
*/
@@ -215,7 +220,7 @@ WebInspector.RemoteObject.prototype = {
},
/**
- * @param {function(this:Object)} functionDeclaration
+ * @param {function(this:Object, ...)} functionDeclaration
* @param {!Array<!RuntimeAgent.CallArgument>|undefined} args
* @param {function(*)} callback
*/
@@ -225,7 +230,7 @@ WebInspector.RemoteObject.prototype = {
},
/**
- * @param {function(this:Object)} functionDeclaration
+ * @param {function(this:Object, ...)} functionDeclaration
* @param {!Array<!RuntimeAgent.CallArgument>|undefined} args
* @return {!Promise<*>}
*/
@@ -1338,6 +1343,180 @@ WebInspector.LocalJSONObject.prototype = {
/**
* @constructor
+ * @param {!WebInspector.RemoteObject} object
+ */
+WebInspector.RemoteArray = function(object)
+{
+ this._object = object;
+};
+
+/**
+ * @param {?WebInspector.RemoteObject} object
+ * @return {!WebInspector.RemoteArray}
+ */
+WebInspector.RemoteArray.objectAsArray = function(object)
+{
+ if (!object || object.subtype !== "array")
+ throw new Error("Object is empty or not an array");
+ return new WebInspector.RemoteArray(object);
+}
+
+/**
+ * @param {!Array<!WebInspector.RemoteObject>} objects
+ * @return {!Promise<!WebInspector.RemoteArray>}
+ */
+WebInspector.RemoteArray.createFromRemoteObjects = function(objects)
+{
+ if (!objects.length)
+ throw new Error("Input array is empty");
+ var objectArguments = [];
+ for (var i = 0; i < objects.length; ++i)
+ objectArguments.push(WebInspector.RemoteObject.toCallArgument(objects[i]))
+ return objects[0].callFunctionPromise(createArray, objectArguments).then(returnRemoteArray);
+
+ /**
+ * @return {!Array<*>}
+ */
+ function createArray()
+ {
+ if (arguments.length > 1)
+ return new Array(arguments);
+ return [arguments[0]];
+ }
+
+ /**
+ * @param {!WebInspector.CallFunctionResult} result
+ * @return {!WebInspector.RemoteArray}
+ */
+ function returnRemoteArray(result)
+ {
+ if (result.wasThrown || !result.object)
+ throw new Error("Call function throws exceptions or returns empty value");
+ return WebInspector.RemoteArray.objectAsArray(result.object);
+ }
+}
+
+WebInspector.RemoteArray.prototype = {
+ /**
+ * @param {number} index
+ * @return {!Promise<!WebInspector.RemoteObject>}
+ */
+ at: function(index)
+ {
+ if (index < 0 || index > this._object.arrayLength())
+ throw new Error("Out of range");
+ return this._object.callFunctionPromise(at, [WebInspector.RemoteObject.toCallArgument(index)]).then(assertCallFunctionResult);
+
+ /**
+ * @suppressReceiverCheck
+ * @param {number} index
+ * @return {*}
+ * @this {!Object}
+ */
+ function at(index)
+ {
+ return this[index];
+ }
+
+ /**
+ * @param {!WebInspector.CallFunctionResult} result
+ * @return {!WebInspector.RemoteObject}
+ */
+ function assertCallFunctionResult(result)
+ {
+ if (result.wasThrown || !result.object)
+ throw new Error("Exception in callFunction or result value is empty");
+ return result.object;
+ }
+ },
+
+ /**
+ * @return {number}
+ */
+ length: function()
+ {
+ return this._object.arrayLength();
+ },
+
+ /**
+ * @param {function(!WebInspector.RemoteObject):!Promise<T>} func
+ * @return {!Promise<!Array<T>>}
+ * @template T
+ */
+ map: function(func)
+ {
+ var promises = [];
+ for (var i = 0; i < this.length(); ++i)
+ promises.push(this.at(i).then(func));
+ return Promise.all(promises);
+ },
+
+ /**
+ * @return {!WebInspector.RemoteObject}
+ */
+ object: function()
+ {
+ return this._object;
+ }
+}
+
+/**
+ * @constructor
+ * @param {!WebInspector.RemoteObject} object
+ */
+WebInspector.RemoteFunction = function(object)
+{
+ this._object = object;
+}
+
+/**
+ * @param {?WebInspector.RemoteObject} object
+ * @return {!WebInspector.RemoteFunction}
+ */
+WebInspector.RemoteFunction.objectAsFunction = function(object)
+{
+ if (!object || object.type !== "function")
+ throw new Error("Object is empty or not a function");
+ return new WebInspector.RemoteFunction(object);
+}
+
+WebInspector.RemoteFunction.prototype = {
+ /**
+ * @return {!Promise<!WebInspector.RemoteObject>}
+ */
+ targetFunction: function()
+ {
+ return this._object.getOwnPropertiesPromise().then(targetFunction.bind(this));
+
+ /**
+ * @param {!{properties: ?Array<!WebInspector.RemoteObjectProperty>, internalProperties: ?Array<!WebInspector.RemoteObjectProperty>}} ownProperties
+ * @return {!WebInspector.RemoteObject}
+ * @this {WebInspector.RemoteFunction}
+ */
+ function targetFunction(ownProperties)
+ {
+ if (!ownProperties.internalProperties)
+ return this._object;
+ var internalProperties = ownProperties.internalProperties;
+ for (var property of internalProperties) {
+ if (property.name === "[[TargetFunction]]")
+ return property.value;
+ }
+ return this._object;
+ }
+ },
+
+ /**
+ * @return {!WebInspector.RemoteObject}
+ */
+ object: function()
+ {
+ return this._object;
+ }
+}
+
+/**
+ * @constructor
* @extends {WebInspector.LocalJSONObject}
* @param {*} value
*/
« no previous file with comments | « Source/devtools/front_end/platform/utilities.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698