Home | History | Annotate | Download | only in webapp
      1 // Copyright (c) 2012 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  * Class handling creation and teardown of a remoting host session.
      8  *
      9  * This abstracts a <embed> element and controls the plugin which does the
     10  * actual remoting work.  There should be no UI code inside this class.  It
     11  * should be purely thought of as a controller of sorts.
     12  */
     13 
     14 'use strict';
     15 
     16 /** @suppress {duplicate} */
     17 var remoting = remoting || {};
     18 
     19 /**
     20  * @constructor
     21  */
     22 remoting.HostSession = function() {
     23 };
     24 
     25 /** @type {remoting.HostPlugin} */
     26 remoting.HostSession.prototype.plugin = null;
     27 
     28 // Note that these values are copied directly from host_script_object.h and
     29 // must be kept in sync.
     30 /** @enum {number} */
     31 remoting.HostSession.State = {
     32   UNKNOWN: -1,
     33   DISCONNECTED: 0,
     34   STARTING: 1,
     35   REQUESTED_ACCESS_CODE: 2,
     36   RECEIVED_ACCESS_CODE: 3,
     37   CONNECTED: 4,
     38   DISCONNECTING: 5,
     39   ERROR: 6,
     40   INVALID_DOMAIN_ERROR: 7
     41 };
     42 
     43 /**
     44  * Create an instance of the host plugin.
     45  * @return {remoting.HostPlugin} The new plugin instance.
     46  */
     47 remoting.HostSession.createPlugin = function() {
     48   var plugin = document.createElement('embed');
     49   plugin.type = remoting.settings.PLUGIN_MIMETYPE;
     50   // Hiding the plugin means it doesn't load, so make it size zero instead.
     51   plugin.width = 0;
     52   plugin.height = 0;
     53   return /** @type {remoting.HostPlugin} */ (plugin);
     54 };
     55 
     56 /**
     57  * Create the host plugin and initiate a connection.
     58  * @param {Element} container The parent element to which to add the plugin.
     59  * @param {string} email The user's email address.
     60  * @param {string} accessToken A valid OAuth2 access token.
     61  * @param {function(boolean):void} onNatTraversalPolicyChanged Callback
     62  *     for notification of changes to the NAT traversal policy.
     63  * @param {function(remoting.HostSession.State):void} onStateChanged
     64  *     Callback for notifications of changes to the host plugin's state.
     65  * @param {function(string):void} logDebugInfo Callback allowing the plugin
     66  *     to log messages to the debug log.
     67  */
     68 remoting.HostSession.prototype.createPluginAndConnect =
     69     function(container, email, accessToken,
     70              onNatTraversalPolicyChanged, onStateChanged, logDebugInfo) {
     71   this.plugin = remoting.HostSession.createPlugin();
     72   container.appendChild(this.plugin);
     73   this.plugin.onNatTraversalPolicyChanged = onNatTraversalPolicyChanged;
     74   this.plugin.onStateChanged = onStateChanged;
     75   this.plugin.logDebugInfo = logDebugInfo;
     76   this.plugin.localize(chrome.i18n.getMessage);
     77   this.plugin.xmppServerAddress = remoting.settings.XMPP_SERVER_ADDRESS;
     78   this.plugin.xmppServerUseTls = remoting.settings.XMPP_SERVER_USE_TLS;
     79   this.plugin.directoryBotJid = remoting.settings.DIRECTORY_BOT_JID;
     80   this.plugin.connect(email, 'oauth2:' + accessToken);
     81 };
     82 
     83 /**
     84  * Get the access code generated by the host plugin. Valid only after the
     85  * plugin state is RECEIVED_ACCESS_CODE.
     86  * @return {string} The access code.
     87  */
     88 remoting.HostSession.prototype.getAccessCode = function() {
     89   return this.plugin.accessCode;
     90 };
     91 
     92 /**
     93  * Get the lifetime for the access code. Valid only after the plugin state is
     94  * RECEIVED_ACCESS_CODE.
     95  * @return {number} The access code lifetime, in seconds.
     96  */
     97 remoting.HostSession.prototype.getAccessCodeLifetime = function() {
     98   return this.plugin.accessCodeLifetime;
     99 };
    100 
    101 /**
    102  * Get the email address of the connected client. Valid only after the plugin
    103  * state is CONNECTED.
    104  * @return {string} The client's email address.
    105  */
    106 remoting.HostSession.prototype.getClient = function() {
    107   return this.plugin.client;
    108 };
    109 
    110 /**
    111  * Disconnect the client.
    112  * @return {void} Nothing.
    113  */
    114 remoting.HostSession.prototype.disconnect = function() {
    115   this.plugin.disconnect();
    116 };
    117 
    118 
    119 /**
    120  * Remove the plugin element from the document.
    121  * @return {void} Nothing.
    122  */
    123 remoting.HostSession.prototype.removePlugin = function() {
    124   this.plugin.parentNode.removeChild(this.plugin);
    125 };
    126