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