| Index: remoting/webapp/host_installer.js
|
| diff --git a/remoting/webapp/host_installer.js b/remoting/webapp/host_installer.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..45dbadde70338b8031f4302eca78823670806cd7
|
| --- /dev/null
|
| +++ b/remoting/webapp/host_installer.js
|
| @@ -0,0 +1,162 @@
|
| +// 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
|
| + *
|
| + * HostInstaller allows the caller to download the host binary and monitor the
|
| + * install progress of the host by pinging the host periodically via native
|
| + * messaging.
|
| + *
|
| + * To download the host and wait for install:
|
| + * var hostInstaller = new remoting.HostInstaller();
|
| + * hostInstaller.downloadAndWaitForInstall().then(function() {
|
| + * // Install has completed.
|
| + * }, function(){
|
| + * // Download has failed.
|
| + * })
|
| + *
|
| + * To stop listening to the install progress:
|
| + * hostInstaller.cancel();
|
| + */
|
| +
|
| +'use strict';
|
| +
|
| +/** @suppress {duplicate} */
|
| +var remoting = remoting || {};
|
| +
|
| +/**
|
| + * @constructor
|
| + */
|
| +remoting.HostInstaller = function() {
|
| + /**
|
| + * @type {Promise}
|
| + * @private
|
| + */
|
| + this.downloadAndWaitForInstallPromise_ = null;
|
| +
|
| + /**
|
| + * @type {?number}
|
| + * @private
|
| + */
|
| + this.checkInstallIntervalId_ = null;
|
| +};
|
| +
|
| +/**
|
| + * @return {Promise} The promise will resolve to a boolean value indicating
|
| + * whether the host is installed or not.
|
| + */
|
| +remoting.HostInstaller.prototype.isInstalled = function() {
|
| + // Always do a fresh check as we don't get notified when the host is
|
| + // uninstalled.
|
| +
|
| + /** @param {function(*=):void} resolve */
|
| + return new Promise(function(resolve) {
|
| + // TODO(kelvinp): Use different native messaging ports for the Me2me host
|
| + // vs It2MeHost.
|
| + /** @type {chrome.runtime.Port} */
|
| + var port =
|
| + chrome.runtime.connectNative('com.google.chrome.remote_assistance');
|
| +
|
| + function onMessage() {
|
| + port.onDisconnect.removeListener(onDisconnected);
|
| + port.onMessage.removeListener(onMessage);
|
| + port.disconnect();
|
| + resolve(true);
|
| + }
|
| +
|
| + function onDisconnected() {
|
| + port.onDisconnect.removeListener(onDisconnected);
|
| + port.onMessage.removeListener(onMessage);
|
| + resolve(false);
|
| + }
|
| +
|
| + port.onDisconnect.addListener(onDisconnected);
|
| + port.onMessage.addListener(onMessage);
|
| + port.postMessage({type: 'hello'});
|
| + });
|
| +};
|
| +
|
| +/**
|
| + * @throws {Error} Throws if there is no matching host binary for the current
|
| + * platform.
|
| + * @private
|
| + */
|
| +remoting.HostInstaller.prototype.download_ = function() {
|
| + /** @type {Object.<string,string>} */
|
| + var hostDownloadUrls = {
|
| + 'Win32' : 'http://dl.google.com/dl/edgedl/chrome-remote-desktop/' +
|
| + 'chromeremotedesktophost.msi',
|
| + 'MacIntel' : 'https://dl.google.com/chrome-remote-desktop/' +
|
| + 'chromeremotedesktop.dmg',
|
| + 'Linux x86_64' : 'https://dl.google.com/linux/direct/' +
|
| + 'chrome-remote-desktop_current_amd64.deb',
|
| + 'Linux i386' : 'https://dl.google.com/linux/direct/' +
|
| + 'chrome-remote-desktop_current_i386.deb'
|
| + };
|
| +
|
| + var hostPackageUrl = hostDownloadUrls[navigator.platform];
|
| + if (hostPackageUrl === undefined) {
|
| + throw new Error(remoting.Error.CANCELLED);
|
| + }
|
| +
|
| + // Start downloading the package.
|
| + if (remoting.isAppsV2) {
|
| + // TODO(jamiewalch): Use chrome.downloads when it is available to
|
| + // apps v2 (http://crbug.com/174046)
|
| + window.open(hostPackageUrl);
|
| + } else {
|
| + window.location = hostPackageUrl;
|
| + }
|
| +};
|
| +
|
| +/** @return {Promise} */
|
| +remoting.HostInstaller.prototype.downloadAndWaitForInstall = function() {
|
| + /** @type {remoting.HostInstaller} */
|
| + var that = this;
|
| + /**
|
| + * @type {number}
|
| + * @const
|
| + */
|
| + var CHECK_INSTALL_INTERVAL_IN_MILLISECONDS = 1000;
|
| +
|
| + /** @param {boolean} installed */
|
| + return this.isInstalled().then(function(installed){
|
| + if (installed) {
|
| + return Promise.resolve(true);
|
| + }
|
| +
|
| + if (that.downloadAndWaitForInstallPromise_ !== null) {
|
| + that.downloadAndWaitForInstallPromise_ = new Promise(
|
| + /** @param {Function} resolve */
|
| + function(resolve){
|
| + that.download_();
|
| + that.checkInstallIntervalId_ = window.setInterval(function() {
|
| + /** @param {boolean} installed */
|
| + that.isInstalled().then(function(installed) {
|
| + if (installed) {
|
| + that.cancel();
|
| + resolve();
|
| + }
|
| + });
|
| + }, CHECK_INSTALL_INTERVAL_IN_MILLISECONDS);
|
| + });
|
| + }
|
| + return that.downloadAndWaitForInstallPromise_;
|
| + });
|
| +};
|
| +
|
| +/**
|
| + * Stops waiting for the host to be installed.
|
| + * For example
|
| + * var promise = hostInstaller.downloadAndWaitForInstall();
|
| + * hostInstaller.cancel(); // This will prevent |promise| from fulfilling.
|
| + */
|
| +remoting.HostInstaller.prototype.cancel = function() {
|
| + if (this.checkInstallIntervalId_ !== null) {
|
| + window.clearInterval(this.checkInstallIntervalId_);
|
| + this.checkInstallIntervalId_ = null;
|
| + }
|
| + this.downloadAndWaitForInstallPromise_ = null;
|
| +};
|
|
|