1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5/** 6 * @fileoverview 7 * AppLauncher is an interface that allows the client code to launch and close 8 * the app without knowing the implementation difference between a v1 app and 9 * a v2 app. 10 * 11 * To launch an app: 12 * var appLauncher = new remoting.V1AppLauncher(); 13 * var appId = ""; 14 * appLauncher.launch({arg1:'someValue'}).then(function(id){ 15 * appId = id; 16 * }); 17 * 18 * To close an app: 19 * appLauncher.close(appId); 20 */ 21 22'use strict'; 23 24/** @suppress {duplicate} */ 25var remoting = remoting || {}; 26 27/** @interface */ 28remoting.AppLauncher = function() {}; 29 30/** 31 * @param {Object=} opt_launchArgs 32 * @return {Promise} The promise will resolve when the app is launched. It will 33 * provide the caller with the appId (which is either the id of the hosting tab 34 * or window). The caller can use the appId to close the app. 35 */ 36remoting.AppLauncher.prototype.launch = function(opt_launchArgs) { }; 37 38/** 39 * @param {string} id The id of the app to close. 40 * @return {Promise} The promise will resolve when the app is closed. 41 */ 42remoting.AppLauncher.prototype.close = function(id) {}; 43 44/** 45 * @constructor 46 * @implements {remoting.AppLauncher} 47 */ 48remoting.V1AppLauncher = function() {}; 49 50remoting.V1AppLauncher.prototype.launch = function(opt_launchArgs) { 51 var url = base.urlJoin('main.html', opt_launchArgs); 52 53 /** 54 * @param {function(*=):void} resolve 55 * @param {function(*=):void} reject 56 */ 57 return new Promise(function(resolve, reject) { 58 chrome.tabs.create({ url: url, selected: true }, 59 /** @param {chrome.Tab} tab The created tab. */ 60 function(tab) { 61 if (!tab) { 62 reject(new Error(chrome.runtime.lastError.message)); 63 } else { 64 resolve(String(tab.id)); 65 } 66 }); 67 }); 68}; 69 70remoting.V1AppLauncher.prototype.close = function(id) { 71 /** 72 * @param {function(*=):void} resolve 73 * @param {function(*=):void} reject 74 */ 75 return new Promise(function(resolve, reject) { 76 /** @param {chrome.Tab} tab The retrieved tab. */ 77 chrome.tabs.get(id, function(tab) { 78 if (!tab) { 79 reject(new Error(chrome.runtime.lastError.message)); 80 } else { 81 chrome.tabs.remove(tab.id, resolve); 82 } 83 }); 84 }); 85}; 86 87 88/** 89 * @constructor 90 * @implements {remoting.AppLauncher} 91 */ 92remoting.V2AppLauncher = function() {}; 93 94/** 95 * @type {number} 96 * @private 97 */ 98remoting.V2AppLauncher.nextWindowId_ = 0; 99 100remoting.V2AppLauncher.prototype.launch = function(opt_launchArgs) { 101 var url = base.urlJoin('main.html', opt_launchArgs); 102 103 /** 104 * @param {function(*=):void} resolve 105 * @param {function(*=):void} reject 106 */ 107 return new Promise(function(resolve, reject) { 108 chrome.app.window.create(url, { 109 'width': 800, 110 'height': 600, 111 'frame': 'none', 112 'id': String(remoting.V2AppLauncher.nextWindowId_++) 113 }, 114 /** @param {AppWindow} appWindow */ 115 function(appWindow) { 116 if (!appWindow) { 117 reject(new Error(chrome.runtime.lastError.message)); 118 } else { 119 resolve(appWindow.id); 120 } 121 }); 122 }); 123}; 124 125remoting.V2AppLauncher.prototype.close = function(id) { 126 var appWindow = chrome.app.window.get(id); 127 if (!appWindow) { 128 return Promise.reject(new Error(chrome.runtime.lastError.message)); 129 } 130 appWindow.close(); 131 return Promise.resolve(); 132}; 133