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} */ 17var remoting = remoting || {}; 18 19/** 20 * @constructor 21 */ 22remoting.HostSession = function() { 23}; 24 25/** @type {remoting.HostPlugin} */ 26remoting.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} */ 31remoting.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 */ 47remoting.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 */ 68remoting.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 */ 88remoting.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 */ 97remoting.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 */ 106remoting.HostSession.prototype.getClient = function() { 107 return this.plugin.client; 108}; 109 110/** 111 * Disconnect the client. 112 * @return {void} Nothing. 113 */ 114remoting.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 */ 123remoting.HostSession.prototype.removePlugin = function() { 124 this.plugin.parentNode.removeChild(this.plugin); 125}; 126