Index: extensions/renderer/resources/utils.js |
diff --git a/extensions/renderer/resources/utils.js b/extensions/renderer/resources/utils.js |
index 803a3518d753b271bf740dd982d51d8af86c4720..edf7703b3d1f9383c1a9b39034ed273fc704a915 100644 |
--- a/extensions/renderer/resources/utils.js |
+++ b/extensions/renderer/resources/utils.js |
@@ -7,6 +7,7 @@ var nativeDeepCopy = requireNative('utils').deepCopy; |
var schemaRegistry = requireNative('schema_registry'); |
var CHECK = requireNative('logging').CHECK; |
var WARNING = requireNative('logging').WARNING; |
+var context = requireNative('v8_context'); |
/** |
* An object forEach. Calls |f| with each (key, value) pair of |obj|, using |
@@ -133,8 +134,62 @@ function deepCopy(value) { |
return nativeDeepCopy(value); |
} |
+/** |
+ * Wrap an asynchronous API call in a promise. |
not at google - send to devlin
2014/08/19 19:23:38
Explain how the call happens. I presume that |arg|
Sam McNally
2014/08/20 01:27:18
Done.
|
+ */ |
+function promise(func) { |
+ var args = $Array.slice(arguments, 1); |
+ return new Promise(function(resolve, reject) { |
+ args.push(function() { |
+ if (chrome.runtime.lastError) { |
+ reject(new Error(chrome.runtime.lastError)); |
+ return; |
+ } |
+ if (arguments.length <= 1) |
+ resolve(arguments[0]); |
+ else |
+ resolve($Array.slice(arguments)); |
not at google - send to devlin
2014/08/19 19:23:38
This doesn't seem right; so if there are multiple
Sam McNally
2014/08/20 01:27:18
Promises only support one argument.
not at google - send to devlin
2014/08/20 01:47:22
Yikes. THE MORE YOU KNOW.
|
+ }); |
+ $Function.apply(func, null, args); |
+ }); |
+} |
+ |
+/** |
+ * Asynchronously require a module from the background page, loading the |
+ * background page if necessary. |
not at google - send to devlin
2014/08/19 19:23:38
You might actually want to explain why you need th
Sam McNally
2014/08/20 01:27:18
Done and moved it into serial_custom_bindings.
|
+ */ |
+function requireAsyncFromBackgroundPage(moduleName) { |
+ return promise(chrome.runtime.getBackgroundPage).then(function(bgPage) { |
+ return context.GetModuleSystem(bgPage).requireAsync(moduleName); |
+ }).catch(function() { |
+ return requireAsync(moduleName); |
+ }); |
+} |
+ |
+/** |
+ * Create an async proxy for the resolved value of |targetPromise|. The returned |
+ * object will contain a function for each name in |functionNames|. Calling this |
+ * function will result in a call to the corresponding function on the resolved |
+ * value of |targetPromise| and returns a promise to the result of that call. |
+ */ |
+function createAsyncProxy(targetPromise, functionNames) { |
not at google - send to devlin
2014/08/19 19:23:38
I'm having a hard time grasping what this method d
Sam McNally
2014/08/20 01:27:18
Fair enough. Removed it and inlined the uses.
|
+ var functionProxies = {}; |
+ $Array.forEach(functionNames, function(name) { |
+ functionProxies[name] = function() { |
+ var args = arguments; |
+ return targetPromise.then(function(target) { |
+ return $Function.apply(target[name], target, args); |
+ }); |
+ }; |
+ }); |
+ return functionProxies; |
+} |
+ |
exports.forEach = forEach; |
exports.loadTypeSchema = loadTypeSchema; |
exports.lookup = lookup; |
exports.expose = expose; |
exports.deepCopy = deepCopy; |
+exports.promise = promise; |
+exports.requireAsyncFromBackgroundPage = requireAsyncFromBackgroundPage; |
+exports.createAsyncProxy = createAsyncProxy; |