|  | // 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. | 
|  |  | 
|  | var remoting = remoting || {}; | 
|  |  | 
|  | (function() { | 
|  |  | 
|  | 'use strict'; | 
|  |  | 
|  | /** | 
|  | * @param {HTMLElement} rootElement | 
|  | * @param {remoting.LocalHostSection.Controller} controller | 
|  | * | 
|  | * @constructor | 
|  | * @implements {base.Disposable} | 
|  | */ | 
|  | remoting.LocalHostSection = function(rootElement, controller) { | 
|  | /** @private */ | 
|  | this.rootElement_ = rootElement; | 
|  | /** @private */ | 
|  | this.controller_ = controller; | 
|  | /** @private {remoting.Host} */ | 
|  | this.host_ = null; | 
|  | /** @private {remoting.HostController.State} */ | 
|  | this.state_ = remoting.HostController.State.UNKNOWN; | 
|  |  | 
|  | var hostContainer = rootElement.querySelector('.host-entry'); | 
|  | /** @private */ | 
|  | this.hostTableEntry_ = new remoting.HostTableEntry( | 
|  | parseInt(chrome.runtime.getManifest().version, 10), | 
|  | controller.connect.bind(controller), | 
|  | this.rename_.bind(this)); | 
|  | hostContainer.appendChild(this.hostTableEntry_.element()); | 
|  | this.hostTableEntry_.element().id = 'local-host-connect-button'; | 
|  |  | 
|  | var startButton = rootElement.querySelector('.start-daemon'); | 
|  | var stopButton = rootElement.querySelector('.stop-daemon'); | 
|  | var stopLocalDaemonButton = rootElement.querySelector('.stop-local-daemon'); | 
|  | var changePINButton = rootElement.querySelector('.change-daemon-pin'); | 
|  |  | 
|  | /** @private */ | 
|  | this.eventHooks_ = new base.Disposables( | 
|  | new base.DomEventHook(startButton, 'click', | 
|  | controller.start.bind(controller), false), | 
|  | new base.DomEventHook(stopButton, 'click', | 
|  | controller.stop.bind(controller), false), | 
|  | new base.DomEventHook(stopLocalDaemonButton, 'click', | 
|  | controller.stop.bind(controller), false), | 
|  | new base.DomEventHook(changePINButton, 'click', | 
|  | controller.changePIN.bind(controller), false)); | 
|  | /** @private */ | 
|  | this.hasError_ = false; | 
|  | }; | 
|  |  | 
|  | remoting.LocalHostSection.prototype.dispose = function() { | 
|  | base.dispose(this.eventHooks_); | 
|  | this.eventHooks_ = null; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @param {remoting.Host} host | 
|  | * @param {remoting.HostController.State} state | 
|  | * @param {boolean} hasError Whether the host list is in an error state. | 
|  | */ | 
|  | remoting.LocalHostSection.prototype.setModel = function(host, state, hasError) { | 
|  | this.host_ = host; | 
|  | this.state_ = state; | 
|  | this.hasError_ = hasError; | 
|  | this.updateUI_(); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @return {?string} | 
|  | */ | 
|  | remoting.LocalHostSection.prototype.getHostId = function() { | 
|  | return this.host_ ? this.host_.hostId : null; | 
|  | }; | 
|  |  | 
|  | /** @return {boolean} */ | 
|  | remoting.LocalHostSection.prototype.isEnabled_ = function() { | 
|  | return (this.state_ == remoting.HostController.State.STARTING) || | 
|  | (this.state_ == remoting.HostController.State.STARTED); | 
|  | }; | 
|  |  | 
|  | /** @return {boolean} */ | 
|  | remoting.LocalHostSection.prototype.canChangeState = function() { | 
|  | // The local host cannot be stopped or started if the host controller is not | 
|  | // implemented for this platform. | 
|  | var state = this.state_; | 
|  | if (state === remoting.HostController.State.NOT_IMPLEMENTED || | 
|  | state === remoting.HostController.State.UNKNOWN) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | // Return false if the host is uninstallable.  The NOT_INSTALLED check is | 
|  | // required to handle the special case for Ubuntu, as we report the host as | 
|  | // uninstallable on Linux. | 
|  | if (!this.isMe2MeInstallable_() && | 
|  | state === remoting.HostController.State.NOT_INSTALLED) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | // In addition, it cannot be started if there is an error (in many error | 
|  | // states, the start operation will fail anyway, but even if it succeeds, the | 
|  | // chance of a related but hard-to-diagnose future error is high). | 
|  | return this.isEnabled_() || !this.hasError_; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Returns true if the current platform is fully supported. It's only used when | 
|  | * we detect that host native messaging components are not installed. In that | 
|  | * case the result of this function determines if the webapp should show the | 
|  | * controls that allow to install and enable Me2Me host. | 
|  | * | 
|  | * @return {boolean} | 
|  | * @private | 
|  | */ | 
|  | remoting.LocalHostSection.prototype.isMe2MeInstallable_ = function() { | 
|  | // The chromoting host is currently not installable on ChromeOS. | 
|  | // For Linux, we have a install package for Ubuntu but not other distros. | 
|  | // Since we cannot tell from javascript alone the Linux distro the client is | 
|  | // on, we don't show the daemon-control UI for Linux unless the host is | 
|  | // installed. | 
|  | return remoting.platformIsWindows() || remoting.platformIsMac(); | 
|  | } | 
|  |  | 
|  | /** @private */ | 
|  | remoting.LocalHostSection.prototype.updateUI_ = function() { | 
|  | this.hostTableEntry_.setHost(this.host_); | 
|  |  | 
|  | // Disable elements. | 
|  | var enabled = this.isEnabled_(); | 
|  | var canChangeLocalHostState = this.canChangeState(); | 
|  | var daemonState = ''; | 
|  | if (!enabled) { | 
|  | daemonState = 'disabled'; | 
|  | } else if (this.host_ !== null) { | 
|  | daemonState = 'enabled'; | 
|  | } else { | 
|  | daemonState = 'enabled-other-account'; | 
|  | } | 
|  | remoting.updateModalUi(daemonState, 'data-daemon-state'); | 
|  | this.rootElement_.hidden = !canChangeLocalHostState; | 
|  | }; | 
|  |  | 
|  | remoting.LocalHostSection.prototype.rename_ = function() { | 
|  | return this.controller_.rename(this.hostTableEntry_); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @constructor | 
|  | * @param {remoting.HostList} hostList | 
|  | * @param {remoting.HostSetupDialog} setupDialog | 
|  | * @param {function(string)} handleConnect  Function to call to connect to the | 
|  | *     host with |hostId|. | 
|  | */ | 
|  | remoting.LocalHostSection.Controller = | 
|  | function(hostList, setupDialog, handleConnect) { | 
|  | /** @private */ | 
|  | this.hostList_ = hostList; | 
|  | /** @private */ | 
|  | this.setupDialog_ = setupDialog; | 
|  | /** @private */ | 
|  | this.handleConnect_ = handleConnect; | 
|  | }; | 
|  |  | 
|  | remoting.LocalHostSection.Controller.prototype.start = function() { | 
|  | this.setupDialog_.showForStart(); | 
|  | }; | 
|  |  | 
|  | remoting.LocalHostSection.Controller.prototype.stop = function() { | 
|  | this.setupDialog_.showForStop(); | 
|  | }; | 
|  |  | 
|  | remoting.LocalHostSection.Controller.prototype.changePIN = function() { | 
|  | this.setupDialog_.showForPin(); | 
|  | }; | 
|  |  | 
|  | /** @param {remoting.HostTableEntry} host */ | 
|  | remoting.LocalHostSection.Controller.prototype.rename = function(host) { | 
|  | this.hostList_.renameHost(host); | 
|  | }; | 
|  |  | 
|  | /** @param {string} hostId */ | 
|  | remoting.LocalHostSection.Controller.prototype.connect = function(hostId) { | 
|  | this.handleConnect_(hostId); | 
|  | }; | 
|  |  | 
|  | }()); | 
|  |  |