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

Unified Diff: remoting/webapp/app_remoting/js/app_remoting_activity.js

Issue 1082973002: [Webapp Refactor] Implement AppRemotingActivity. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ClientEventHandler
Patch Set: Created 5 years, 8 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
Index: remoting/webapp/app_remoting/js/app_remoting_activity.js
diff --git a/remoting/webapp/app_remoting/js/app_remoting_activity.js b/remoting/webapp/app_remoting/js/app_remoting_activity.js
new file mode 100644
index 0000000000000000000000000000000000000000..c0d228a53b9d47493462dbc23c6dd66d496370b1
--- /dev/null
+++ b/remoting/webapp/app_remoting/js/app_remoting_activity.js
@@ -0,0 +1,168 @@
+// Copyright 2015 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.
+
+/** @suppress {duplicate} */
+var remoting = remoting || {};
+
+/**
+ * Type definition for the RunApplicationResponse returned by the API.
+ * @typedef {{
+ * status: string,
+ * hostJid: string,
+ * authorizationCode: string,
+ * sharedSecret: string,
+ * host: {
+ * applicationId: string,
+ * hostId: string
+ * }
+ * }}
+ */
+remoting.AppHostResponse;
+
+(function() {
+
+'use strict';
+
+/**
+ * @constructor
+ * @implements {remoting.Activity}
+ */
+remoting.AppRemotingActivity = function() {
+ /** @private {remoting.AppConnectedView} */
+ this.connectedView_ = null;
+};
+
+remoting.AppRemotingActivity.prototype.dispose = function() {
+ base.dispose(this.connectedView_);
+ this.connectedView_ = null;
+ remoting.LoadingWindow.close();
+};
+
+remoting.AppRemotingActivity.prototype.start = function() {
+ remoting.LoadingWindow.show();
+ var that = this;
+ return remoting.identity.getToken().then(function(/** string */ token) {
+ return that.getAppHostInfo_(token);
+ }).then(function(/** !remoting.Xhr.Response */ response) {
+ that.onAppHostResponse_(response);
+ });
+};
+
+/**
+ * @param {string} token
+ * @return {Promise<!remoting.Xhr.Response>}
+ * @private
+ */
+remoting.AppRemotingActivity.prototype.getAppHostInfo_ = function(token) {
+ var url = remoting.settings.APP_REMOTING_API_BASE_URL + '/applications/' +
+ remoting.settings.getAppRemotingApplicationId() + '/run';
+ return new remoting.Xhr({
+ method: 'POST',
+ url: url,
+ oauthToken: token
+ }).start();
+};
+
+/**
+ * @param {!remoting.Xhr.Response} xhrResponse
+ * @private
+ */
+remoting.AppRemotingActivity.prototype.onAppHostResponse_ =
+ function(xhrResponse) {
+ if (xhrResponse.status == 200) {
+ var response = /** @type {remoting.AppHostResponse} */
+ (base.jsonParseSafe(xhrResponse.getText()));
+ if (response &&
+ response.status &&
+ response.status == 'done' &&
+ response.hostJid &&
+ response.authorizationCode &&
+ response.sharedSecret &&
+ response.host &&
+ response.host.hostId) {
+ var hostJid = response.hostJid;
+ var host = new remoting.Host(response.host.hostId);
+ host.jabberId = hostJid;
+ host.authorizationCode = response.authorizationCode;
+ host.sharedSecret = response.sharedSecret;
+
+ remoting.setMode(remoting.AppMode.CLIENT_CONNECTING);
+
+ var idleDetector = new remoting.IdleDetector(
+ document.getElementById('idle-dialog'),
+ remoting.app.disconnect.bind(remoting.app));
+
+ /**
+ * @param {string} tokenUrl Token-issue URL received from the host.
+ * @param {string} hostPublicKey Host public key (DER and Base64
+ * encoded).
+ * @param {string} scope OAuth scope to request the token for.
+ * @param {function(string, string):void} onThirdPartyTokenFetched
+ * Callback.
+ */
+ var fetchThirdPartyToken = function(
+ tokenUrl, hostPublicKey, scope, onThirdPartyTokenFetched) {
+ // Use the authentication tokens returned by the app-remoting server.
+ onThirdPartyTokenFetched(host['authorizationCode'],
+ host['sharedSecret']);
+ };
+
+ var connector = remoting.SessionConnector.factory.createConnector(
+ document.getElementById('client-container'),
+ remoting.app_capabilities(), this);
garykac 2015/04/15 00:52:37 Having this call out to the global might make this
+
+ connector.connect(remoting.Application.Mode.APP_REMOTING, host,
+ new remoting.CredentialsProvider(
+ {fetchThirdPartyToken: fetchThirdPartyToken}));
+ } else if (response && response.status == 'pending') {
+ this.onError(new remoting.Error(
+ remoting.Error.Tag.SERVICE_UNAVAILABLE));
+ }
+ } else {
+ console.error('Invalid "runApplication" response from server.');
+ this.onError(remoting.Error.fromHttpStatus(xhrResponse.status));
+ }
+};
+
+/**
+ * @param {remoting.ConnectionInfo} connectionInfo
+ */
+remoting.AppRemotingActivity.prototype.onConnected = function(connectionInfo) {
+ this.connectedView_ = new remoting.AppConnectedView(
+ document.getElementById('client-container'), connectionInfo);
+
+ // Map Cmd to Ctrl on Mac since hosts typically use Ctrl for keyboard
+ // shortcuts, but we want them to act as natively as possible.
+ if (remoting.platformIsMac()) {
+ connectionInfo.plugin().setRemapKeys('0x0700e3>0x0700e0,0x0700e7>0x0700e4');
+ }
+};
+
+remoting.AppRemotingActivity.prototype.onDisconnected = function() {
+ base.dispose(this.connectedView_);
+ this.connectedView_ = null;
+ chrome.app.window.current().close();
+};
+
+/**
+ * @param {!remoting.Error} error
+ */
+remoting.AppRemotingActivity.prototype.onConnectionFailed = function(error) {
+ this.onError(error);
+};
+
+/**
+ * @param {!remoting.Error} error The error to be localized and displayed.
+ */
+remoting.AppRemotingActivity.prototype.onError = function(error) {
+ console.error('Connection failed: ' + error.toString());
+ remoting.LoadingWindow.close();
+ remoting.MessageWindow.showErrorMessage(
+ chrome.i18n.getMessage(/*i18n-content*/'CONNECTION_FAILED'),
+ chrome.i18n.getMessage(error.getTag()));
+ base.dispose(this.connectedView_);
+ this.connectedView_ = null;
+};
+
+})();

Powered by Google App Engine
This is Rietveld 408576698