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

Unified Diff: extensions/renderer/resources/serial_custom_bindings.js

Issue 481853002: Add support for asynchronously loading modules from the background page. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 6 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
« no previous file with comments | « no previous file | extensions/renderer/resources/utils.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/resources/serial_custom_bindings.js
diff --git a/extensions/renderer/resources/serial_custom_bindings.js b/extensions/renderer/resources/serial_custom_bindings.js
index 31f6daec467a7a6e59a9692e57d26d0088ff8f0f..1d107c0e016729098f2a0bffb4090eac6d8ceb20 100644
--- a/extensions/renderer/resources/serial_custom_bindings.js
+++ b/extensions/renderer/resources/serial_custom_bindings.js
@@ -12,31 +12,32 @@
*/
var binding = require('binding').Binding.create('serial');
+var context = requireNative('v8_context');
+var utils = require('utils');
-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;
-}
+var serialServicePromise = function() {
+ // getBackgroundPage is not available in unit tests so fall back to the
+ // current page's serial_service module.
+ if (!chrome.runtime.getBackgroundPage)
+ return requireAsync('serial_service');
-var serialService = createAsyncProxy(requireAsync('serial_service'), [
- 'getDevices',
- 'createConnection',
- 'getConnection',
- 'getConnections',
-]);
+ // Load the serial_service module from the background page if one exists. This
+ // is necessary for serial connections created in one window to be usable
+ // after that window is closed. This is necessary because the Mojo async
+ // waiter only functions while the v8 context remains.
+ return utils.promise(chrome.runtime.getBackgroundPage).then(function(bgPage) {
+ return context.GetModuleSystem(bgPage).requireAsync('serial_service');
+ }).catch(function() {
+ return requireAsync('serial_service');
+ });
+}();
function forwardToConnection(methodName) {
return function(connectionId) {
var args = $Array.slice(arguments, 1);
- return serialService.getConnection(connectionId).then(function(connection) {
+ return serialServicePromise.then(function(serialService) {
+ return serialService.getConnection(connectionId);
+ }).then(function(connection) {
return $Function.apply(connection[methodName], connection, args);
});
};
@@ -44,11 +45,16 @@ function forwardToConnection(methodName) {
binding.registerCustomHook(function(bindingsAPI) {
var apiFunctions = bindingsAPI.apiFunctions;
- apiFunctions.setHandleRequestWithPromise('getDevices',
- serialService.getDevices);
+ apiFunctions.setHandleRequestWithPromise('getDevices', function() {
+ return serialServicePromise.then(function(serialService) {
+ return serialService.getDevices();
+ })
+ });
apiFunctions.setHandleRequestWithPromise('connect', function(path, options) {
- return serialService.createConnection(path, options).then(function(result) {
+ return serialServicePromise.then(function(serialService) {
+ return serialService.createConnection(path, options);
+ }).then(function(result) {
return result.info;
}).catch (function(e) {
throw new Error('Failed to connect to the port.');
@@ -71,7 +77,9 @@ binding.registerCustomHook(function(bindingsAPI) {
'setPaused', forwardToConnection('setPaused'));
apiFunctions.setHandleRequestWithPromise('getConnections', function() {
- return serialService.getConnections().then(function(connections) {
+ return serialServicePromise.then(function(serialService) {
+ return serialService.getConnections();
+ }).then(function(connections) {
var promises = [];
for (var id in connections) {
promises.push(connections[id].getInfo());
« no previous file with comments | « no previous file | extensions/renderer/resources/utils.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698