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

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

Issue 1268353005: [DevTools] Support JQuery event listeners (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 4 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
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..492f7224264e1d41f99bdc2f11100ea871fd3a3a 100644
--- a/Source/devtools/front_end/sdk/RemoteObject.js
+++ b/Source/devtools/front_end/sdk/RemoteObject.js
@@ -29,6 +29,11 @@
*/
/**
+ * @typedef {{object: ?WebInspector.RemoteObject, wasThrown: (boolean|undefined)}}
+ */
+WebInspector.CallFunctionResult;
+
+/**
* This may not be an interface due to "instanceof WebInspector.RemoteObject" checks in the code.
*
* @constructor
@@ -164,6 +169,24 @@ WebInspector.RemoteObject.prototype = {
},
/**
+ * @param {function(this:Object):!Array<!{handler:function(), useCapture: boolean, type:string}>} getter
+ * @return {!Promise<?Array<!WebInspector.EventListener>>}
+ */
+ frameworkEventListeners: function(getter)
+ {
+ throw "Not implemented";
+ },
+
+ /**
+ * @param {function(this:Object):!Array<function()>} getter
+ * @return {!Promise<?WebInspector.RemoteSet>}
+ */
+ frameworkInternalHandlers: function(getter)
+ {
+ throw "Not implemented";
+ },
+
+ /**
* @param {!RuntimeAgent.CallArgument} name
* @param {function(string=)} callback
*/
@@ -185,14 +208,14 @@ WebInspector.RemoteObject.prototype = {
/**
* @param {function(this:Object, ...)} functionDeclaration
* @param {!Array.<!RuntimeAgent.CallArgument>=} args
- * @return {!Promise.<!{object: ?WebInspector.RemoteObject, wasThrown: (boolean|undefined)}>}
+ * @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 +224,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 +238,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 +248,7 @@ WebInspector.RemoteObject.prototype = {
},
/**
- * @param {function(this:Object)} functionDeclaration
+ * @param {function(this:Object, ...)} functionDeclaration
* @param {!Array<!RuntimeAgent.CallArgument>|undefined} args
* @return {!Promise<*>}
*/
@@ -565,6 +588,177 @@ WebInspector.RemoteObjectImpl.prototype = {
},
/**
+ * @override
+ * @param {function(this:Object):!Array<!{handler:function(), useCapture: boolean, type:string}>} getter
+ * @return {!Promise<?Array<!WebInspector.EventListener>>}
+ */
+ frameworkEventListeners: function(getter)
pfeldman 2015/08/27 01:21:32 This does not belong to RemoteObject, I thought we
+ {
+ return this.callFunctionPromise(getter, undefined)
+ .then(WebInspector.assertCallFunctionResult)
+ .then(WebInspector.RemoteArray.createPromise)
+ .then(toEventListeners)
+ .catchException(/** @type {?Array<!WebInspector.EventListener>} */(null));
+
+ /**
+ * @param {!WebInspector.RemoteArray} array
+ * @return {!Promise<?Array<!WebInspector.EventListener>>}
+ */
+ function toEventListeners(array)
+ {
+ var promises = [];
+ for (var i = 0; i < array.length(); ++i) {
+ var promise = array.at(i)
+ .then(WebInspector.assertCallFunctionResult)
+ .then(toEventListener)
+ .catchException(/** @type {?WebInspector.EventListener} */(null));
+ promises.push(promise);
+ }
+ return /** @type {!Promise<?Array<!WebInspector.EventListener>>} */(Promise.all(promises).then(nonEmptyListeners));
+ }
+
+ /**
+ * @param {!WebInspector.RemoteObject} object
+ * @return {!Promise<!WebInspector.EventListener>}
+ */
+ function toEventListener(object)
+ {
+ var data = {};
+ var promises = [];
+ promises.push(object.callFunctionPromise(listenerEffectiveFunction, undefined)
+ .then(WebInspector.assertCallFunctionResult)
+ .then(WebInspector.RemoteFunction.createPromise)
+ .then(storeTargetFunctionWithDetails.bind(null, data)));
+ promises.push(object.callFunctionJSONPromise(WebInspector.identity, undefined)
+ .then(WebInspector.storeTo.bind(null, data, "listenerJSON")));
+ return Promise.all(promises).then(createEventListener.bind(null, /** @type {!{targetFunction: !WebInspector.RemoteObject, listenerJSON: !Object, targetFunctionDetails: !WebInspector.DebuggerModel.FunctionDetails}}*/ (data)));
+ }
+
+ /**
+ * @param {?} data
+ * @param {!WebInspector.RemoteFunction} functionObject
+ * @return {!Promise<void>}
+ */
+ function storeTargetFunctionWithDetails(data, functionObject)
+ {
+ return functionObject.targetFunction()
+ .then(WebInspector.storeTo.bind(null, data, "targetFunction"))
+ .then(functionDetails);
+
+ /**
+ * @param {!WebInspector.RemoteObject} functionObject
+ * @return {!Promise<void>}
+ */
+ function functionDetails(functionObject)
+ {
+ return functionObject.functionDetailsPromise()
+ .then(WebInspector.storeTo.bind(null, data, "targetFunctionDetails"));
+ }
+ }
+
+ /**
+ * @param {!{targetFunction: !WebInspector.RemoteObject, listenerJSON: !Object, targetFunctionDetails: !WebInspector.DebuggerModel.FunctionDetails}} data
+ * @return {!WebInspector.EventListener}
+ */
+ function createEventListener(data)
+ {
+ return new WebInspector.EventListener(data.targetFunction._target,
+ data.listenerJSON.type,
+ data.listenerJSON.useCapture,
+ data.targetFunction,
+ /** @type {!WebInspector.DebuggerModel.Location}} */ (data.targetFunctionDetails.location));
+ }
+
+ /**
+ * @suppressReceiverCheck
+ * @return {function()}
+ * @this {Object}
+ */
+ function listenerEffectiveFunction()
+ {
+ if (typeof this.handler === "function")
+ return this.handler;
+ return typeof this.handler === "object" ? (this.handler.handlerEvent || this.handler.constructor) : null;
+ }
+
+ /**
+ * @param {!Array<?WebInspector.EventListener>} listeners
+ * @return {!Array<!WebInspector.EventListener>}
+ */
+ function nonEmptyListeners(listeners)
+ {
+ return listeners.filter(filterOutEmpty);
+
+ /**
+ * @param {?WebInspector.EventListener} listener
+ */
+ function filterOutEmpty(listener)
+ {
+ return !!listener;
+ }
+ }
+ },
+
+ /**
+ * @override
+ * @param {function(this:Object):!Array<function()>} getter
+ * @return {!Promise<?WebInspector.RemoteSet>}
+ */
+ frameworkInternalHandlers: function(getter)
+ {
+ return this.callFunctionPromise(getter, undefined)
+ .then(WebInspector.assertCallFunctionResult)
+ .then(WebInspector.RemoteArray.createPromise)
+ .then(toInternalHandlers.bind(this))
+ .catchException(/** @type {?WebInspector.RemoteSet} */(null));
+
+ /**
+ * @param {!WebInspector.RemoteArray} array
+ * @return {!Promise<!WebInspector.RemoteSet>}
+ * @this {WebInspector.RemoteObject}
+ */
+ function toInternalHandlers(array)
+ {
+ var promises = [];
+ for (var i = 0; i < array.length(); ++i) {
+ var promise = array.at(i)
+ .then(WebInspector.assertCallFunctionResult)
+ .then(WebInspector.RemoteFunction.createPromise)
+ .then(toInternalHandler)
+ .catchException(/** @type {?WebInspector.RemoteObject} */(null));
+ promises.push(promise);
+ }
+ return Promise.all(promises).then(nonEmptyHandlers).then(WebInspector.RemoteSet.createFromArrayPromise.bind(this));
+ }
+
+ /**
+ * @param {!WebInspector.RemoteFunction} handler
+ * @return {!Promise<!WebInspector.RemoteObject>}
+ */
+ function toInternalHandler(handler)
+ {
+ return handler.targetFunction();
+ }
+
+ /**
+ * @param {!Array<?WebInspector.RemoteObject>} handlers
+ * @return {!Array<!WebInspector.RemoteObject>}
+ */
+ function nonEmptyHandlers(handlers)
+ {
+ return handlers.filter(filterOutEmpty);
+
+ /**
+ * @param {?WebInspector.RemoteObject} handler
+ */
+ function filterOutEmpty(handler)
+ {
+ return !!handler;
+ }
+ }
+ },
+
+ /**
* @param {!Array.<string>} propertyPath
* @param {function(?WebInspector.RemoteObject, boolean=)} callback
*/

Powered by Google App Engine
This is Rietveld 408576698