Index: extensions/renderer/resources/utils.js |
diff --git a/extensions/renderer/resources/utils.js b/extensions/renderer/resources/utils.js |
index 803a3518d753b271bf740dd982d51d8af86c4720..afcde50cd24999643b7f1648e53f0cbea1d4cae3 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,45 @@ function deepCopy(value) { |
return nativeDeepCopy(value); |
} |
+/** |
+ * 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) { |
+ 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; |
+} |
+ |
+/** |
+ * Asynchronously require a module from the background page, loading the |
+ * background page if necessary. |
+ */ |
+function requireAsyncFromBackgroundPage(moduleName) { |
+ return new Promise(function(resolve, reject) { |
+ chrome.runtime.getBackgroundPage(resolve); |
not at google - send to devlin
2014/08/18 21:22:11
Promise is neat, but strictly speaking you need to
Sam McNally
2014/08/19 01:44:56
Done. I'd prefer to keep requireAsyncFromBackgroun
|
+ }).then(function(backgroundPage) { |
+ if (!backgroundPage) |
+ backgroundPage = window; |
+ return context.GetModuleSystem(backgroundPage).requireAsync(moduleName); |
+ }).catch(function(e) { |
+ return requireAsync(moduleName); |
+ }); |
+} |
+ |
exports.forEach = forEach; |
exports.loadTypeSchema = loadTypeSchema; |
exports.lookup = lookup; |
exports.expose = expose; |
exports.deepCopy = deepCopy; |
+exports.createAsyncProxy = createAsyncProxy; |
+exports.requireAsyncFromBackgroundPage = requireAsyncFromBackgroundPage; |