16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/** 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @fileoverview 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * Class to communicate with the background scripts via chrome runtime 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * messages to 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * 1. Forward session state notifications 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * 2. Closes the window when the session terminates 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */ 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)'use strict'; 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/** @suppress {duplicate} */ 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)var remoting = remoting || {}; 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/** 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @constructor 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @param {string} senderId id of the current tab or window. 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */ 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)remoting.HangoutSession = function(senderId) { 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) /** 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @private 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @type {chrome.runtime.Port} 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */ 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.port_ = null; 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) /** 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @private 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @type {string} 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */ 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.senderId_ = senderId; 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)remoting.HangoutSession.prototype.init = function() { 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) var portName = 'it2me.helper.webapp@' + this.senderId_; 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.port_ = chrome.runtime.connect({name: portName}); 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) remoting.hangoutSessionEvents.addEventListener( 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) remoting.hangoutSessionEvents.sessionStateChanged, 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.onSessionStateChanged_.bind(this)); 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/** 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @param {remoting.ClientSession.State} state 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */ 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)remoting.HangoutSession.prototype.onSessionStateChanged_ = function(state) { 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) var State = remoting.ClientSession.State; 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) try { 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.port_.postMessage({method: 'sessionStateChanged', state: state}); 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } catch (e) { 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // postMessage will throw an exception if the port is disconnected. 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // We can safely ignore this exception. 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) var error = /** @type {Error} */ e; 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) console.error(error); 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } finally { 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (state === State.FAILED || state === State.CLOSED) { 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // close the current window 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (base.isAppsV2()) { 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) chrome.app.window.current().close(); 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } else { 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window.close(); 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/** 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * remoting.clientSession does not exist until the session is connected. 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * hangoutSessionEvents serves as a global event source to plumb session 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * state changes until we cleanup clientSession and sessionConnector. 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @type {base.EventSource} 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */ 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)remoting.hangoutSessionEvents = new base.EventSource(); 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/** @type {string} */ 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)remoting.hangoutSessionEvents.sessionStateChanged = "sessionStateChanged"; 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)remoting.hangoutSessionEvents.defineEvents( 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) [remoting.hangoutSessionEvents.sessionStateChanged]);