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

Unified Diff: remoting/webapp/host_installer.js

Issue 466143003: Hangouts remote desktop part IV - Host installer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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 | « remoting/webapp/host_install_dialog.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
+};
« no previous file with comments | « remoting/webapp/host_install_dialog.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698