Index: remoting/webapp/background/app_launcher.js |
diff --git a/remoting/webapp/background/app_launcher.js b/remoting/webapp/background/app_launcher.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a6159dc76fbfe252732f5381e3456e0778152fc3 |
--- /dev/null |
+++ b/remoting/webapp/background/app_launcher.js |
@@ -0,0 +1,135 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+/** |
+ * @fileoverview |
+ * AppLauncher is an interface for app launching closing implementations. |
+ * It nows the client code to launch and close the app without knowing the |
+ * implementation difference between launching a v1 app and a v2 app. |
Jamie
2014/08/12 02:24:56
Can you clean up this comment? Specifically, I don
kelvinp
2014/08/12 18:22:44
Done.
|
+ */ |
+ |
+'use strict'; |
+ |
+/** @suppress {duplicate} */ |
+var remoting = remoting || {}; |
+ |
+/** @interface */ |
+remoting.AppLauncher = function() {}; |
+ |
+/** |
+ * @param {Object=} opt_launchArgs |
+ * @return {Promise} |
Jamie
2014/08/12 02:24:56
The methods of this interface need descriptions, o
Jamie
2014/08/12 02:24:56
Make it clear that when the Promise resolves, it w
kelvinp
2014/08/12 18:22:44
Done.
|
+ */ |
+remoting.AppLauncher.prototype.launch = function(opt_launchArgs) { }; |
Jamie
2014/08/12 02:24:56
Nit: No space between braces.
kelvinp
2014/08/12 18:22:44
Done.
|
+ |
+/** |
+ * @param {string} id The id of the tab/window to close. |
+ * @return {Promise} |
+ */ |
+remoting.AppLauncher.prototype.close = function(id) {}; |
+ |
+/** |
+ * @param {string} url |
+ * @param {Object.<string>=} opt_params |
+ * @return {string} |
+ */ |
+remoting.AppLauncher.urlJoin = function(url, opt_params) { |
Jamie
2014/08/12 02:24:56
Interfaces should not have concrete methods, and i
kelvinp
2014/08/12 18:22:44
Moved to base.js
|
+ if (!opt_params) { |
+ return url; |
+ } |
+ var queryParameters = []; |
+ for (var key in opt_params) { |
+ queryParameters.push(encodeURIComponent(key) + "=" + |
+ encodeURIComponent(opt_params[key])); |
+ } |
+ return url + '?' + queryParameters.join('&'); |
+}; |
+ |
+/** |
+ * @constructor |
+ * @implements {remoting.AppLauncher} |
+ */ |
+remoting.V1AppLauncher = function() {}; |
+ |
+remoting.V1AppLauncher.prototype.launch = function(opt_launchArgs) { |
+ var url = remoting.AppLauncher.urlJoin('main.html', opt_launchArgs); |
+ |
+ /** |
+ * @param {function(*=):void} resolve |
+ * @param {function(*=):void} reject |
+ */ |
+ return new Promise(function(resolve, reject) { |
+ chrome.tabs.create({ url: url, selected: true}, |
Jamie
2014/08/12 02:24:56
Nit: No space after '{' (or add one after 'true').
kelvinp
2014/08/12 18:22:44
Done.
|
+ /** @param {chrome.Tab} tab The created tab. */ |
+ function(tab) { |
+ if (!tab) { |
+ reject(chrome.runtime.lastError); |
Jamie
2014/08/12 02:24:56
Is it better to use new Error to get a stack trace
|
+ } else { |
+ resolve(tab.id); |
+ } |
+ }); |
+ }); |
+}; |
+ |
+remoting.V1AppLauncher.prototype.close = function(id) { |
+ /** |
+ * @param {function(*=):void} resolve |
+ * @param {function(*=):void} reject |
+ */ |
+ return new Promise(function(resolve, reject) { |
+ /** @param {chrome.Tab} tab The retrieved tab. */ |
+ chrome.tabs.get(id, function(tab) { |
+ if (!tab) { |
+ reject(chrome.runtime.lastError.message); |
Jamie
2014/08/12 02:24:56
Why .message here but not in launch?
kelvinp
2014/08/12 18:22:44
Good catch. Typo in launch
|
+ } else { |
+ chrome.tabs.remove(tab.id, function(){ |
Jamie
2014/08/12 02:24:56
Do you need the wrapper function?
kelvinp
2014/08/12 18:22:44
Done.
|
+ resolve(); |
+ }); |
+ } |
+ }); |
+ }); |
+}; |
+ |
+ |
+/** |
+ * @constructor |
+ * @implements {remoting.AppLauncher} |
+ */ |
+remoting.V2AppLauncher = function() {}; |
+ |
+remoting.V2AppLauncher.nextWindowId_ = 0; |
Jamie
2014/08/12 02:24:56
@type and @private annotations, please.
|
+ |
+remoting.V2AppLauncher.prototype.launch = function(opt_launchArgs) { |
+ var url = remoting.AppLauncher.urlJoin('main.html', opt_launchArgs); |
+ |
+ /** |
+ * @param {function(*=):void} resolve |
+ * @param {function(*=):void} reject |
+ */ |
+ return new Promise(function(resolve, reject) { |
+ chrome.app.window.create(url, { |
+ 'width': 800, |
+ 'height': 600, |
+ 'frame': 'none', |
+ 'id': "hangout" + remoting.V2AppLauncher.nextWindowId_++ |
Jamie
2014/08/12 02:24:56
I think the id would be better managed by the call
kelvinp
2014/08/12 18:22:44
You are right. Prefix removed.
|
+ }, |
+ /** @param {AppWindow} appWindow */ |
+ function(appWindow) { |
+ if (!appWindow) { |
+ reject(chrome.runtime.lastError.message); |
+ } else { |
+ resolve(appWindow.id); |
+ } |
+ }); |
+ }); |
+}; |
+ |
+remoting.V2AppLauncher.prototype.close = function(id) { |
+ var appWindow = chrome.app.window.get(id); |
+ if (!appWindow) { |
+ return Promise.reject(chrome.runtime.lastError.message); |
+ } |
+ appWindow.close(); |
+ return Promise.resolve(); |
+}; |