Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / remoting / webapp / crd / js / local_host_section.js
blob3532a1ec69abf8912f35540b65984b25c90dd82b
1 // Copyright 2015 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.
5 var remoting = remoting || {};
7 (function() {
9 'use strict';
11 /**
12  * @param {HTMLElement} rootElement
13  * @param {remoting.LocalHostSection.Controller} controller
14  *
15  * @constructor
16  * @implements {base.Disposable}
17  */
18 remoting.LocalHostSection = function(rootElement, controller) {
19   /** @private */
20   this.rootElement_ = rootElement;
21   /** @private */
22   this.controller_ = controller;
23   /** @private {remoting.Host} */
24   this.host_ = null;
25   /** @private {remoting.HostController.State} */
26   this.state_ = remoting.HostController.State.UNKNOWN;
28   var hostContainer = rootElement.querySelector('.host-entry');
29   /** @private */
30   this.hostTableEntry_ = new remoting.HostTableEntry(
31       parseInt(chrome.runtime.getManifest().version, 10),
32       controller.connect.bind(controller),
33       this.rename_.bind(this));
34   hostContainer.appendChild(this.hostTableEntry_.element());
35   this.hostTableEntry_.element().id = 'local-host-connect-button';
37   var startButton = rootElement.querySelector('.start-daemon');
38   var stopButton = rootElement.querySelector('.stop-daemon');
39   var stopLocalDaemonButton = rootElement.querySelector('.stop-local-daemon');
40   var changePINButton = rootElement.querySelector('.change-daemon-pin');
42   /** @private */
43   this.eventHooks_ = new base.Disposables(
44       new base.DomEventHook(startButton, 'click',
45                             controller.start.bind(controller), false),
46       new base.DomEventHook(stopButton, 'click',
47                             controller.stop.bind(controller), false),
48       new base.DomEventHook(stopLocalDaemonButton, 'click',
49                             controller.stop.bind(controller), false),
50       new base.DomEventHook(changePINButton, 'click',
51                             controller.changePIN.bind(controller), false));
52   /** @private */
53   this.hasError_ = false;
56 remoting.LocalHostSection.prototype.dispose = function() {
57   base.dispose(this.eventHooks_);
58   this.eventHooks_ = null;
61 /**
62  * @param {remoting.Host} host
63  * @param {remoting.HostController.State} state
64  * @param {boolean} hasError Whether the host list is in an error state.
65  */
66 remoting.LocalHostSection.prototype.setModel = function(host, state, hasError) {
67   this.host_ = host;
68   this.state_ = state;
69   this.hasError_ = hasError;
70   this.updateUI_();
73 /**
74  * @return {?string}
75  */
76 remoting.LocalHostSection.prototype.getHostId = function() {
77   return this.host_ ? this.host_.hostId : null;
80 /** @return {boolean} */
81 remoting.LocalHostSection.prototype.isEnabled_ = function() {
82   return (this.state_ == remoting.HostController.State.STARTING) ||
83       (this.state_ == remoting.HostController.State.STARTED);
86 /** @return {boolean} */
87 remoting.LocalHostSection.prototype.canChangeState = function() {
88   // The local host cannot be stopped or started if the host controller is not
89   // implemented for this platform.
90   var state = this.state_;
91   if (state === remoting.HostController.State.NOT_IMPLEMENTED ||
92       state === remoting.HostController.State.UNKNOWN) {
93     return false;
94   }
96   // Return false if the host is uninstallable.  The NOT_INSTALLED check is
97   // required to handle the special case for Ubuntu, as we report the host as
98   // uninstallable on Linux.
99   if (!this.isMe2MeInstallable_() &&
100       state === remoting.HostController.State.NOT_INSTALLED) {
101     return false;
102   }
104   // In addition, it cannot be started if there is an error (in many error
105   // states, the start operation will fail anyway, but even if it succeeds, the
106   // chance of a related but hard-to-diagnose future error is high).
107   return this.isEnabled_() || !this.hasError_;
111  * Returns true if the current platform is fully supported. It's only used when
112  * we detect that host native messaging components are not installed. In that
113  * case the result of this function determines if the webapp should show the
114  * controls that allow to install and enable Me2Me host.
116  * @return {boolean}
117  * @private
118  */
119 remoting.LocalHostSection.prototype.isMe2MeInstallable_ = function() {
120   // The chromoting host is currently not installable on ChromeOS.
121   // For Linux, we have a install package for Ubuntu but not other distros.
122   // Since we cannot tell from javascript alone the Linux distro the client is
123   // on, we don't show the daemon-control UI for Linux unless the host is
124   // installed.
125   return remoting.platformIsWindows() || remoting.platformIsMac();
128 /** @private */
129 remoting.LocalHostSection.prototype.updateUI_ = function() {
130   this.hostTableEntry_.setHost(this.host_);
132   // Disable elements.
133   var enabled = this.isEnabled_();
134   var canChangeLocalHostState = this.canChangeState();
135   var daemonState = '';
136   if (!enabled) {
137     daemonState = 'disabled';
138   } else if (this.host_ !== null) {
139     daemonState = 'enabled';
140   } else {
141     daemonState = 'enabled-other-account';
142   }
143   remoting.updateModalUi(daemonState, 'data-daemon-state');
144   this.rootElement_.hidden = !canChangeLocalHostState;
147 remoting.LocalHostSection.prototype.rename_ = function() {
148   return this.controller_.rename(this.hostTableEntry_);
152  * @constructor
153  * @param {remoting.HostList} hostList
154  * @param {remoting.HostSetupDialog} setupDialog
155  * @param {function(string)} handleConnect  Function to call to connect to the
156  *     host with |hostId|.
157  */
158 remoting.LocalHostSection.Controller =
159     function(hostList, setupDialog, handleConnect) {
160   /** @private */
161   this.hostList_ = hostList;
162   /** @private */
163   this.setupDialog_ = setupDialog;
164   /** @private */
165   this.handleConnect_ = handleConnect;
168 remoting.LocalHostSection.Controller.prototype.start = function() {
169   this.setupDialog_.showForStart();
172 remoting.LocalHostSection.Controller.prototype.stop = function() {
173   this.setupDialog_.showForStop();
176 remoting.LocalHostSection.Controller.prototype.changePIN = function() {
177   this.setupDialog_.showForPin();
180 /** @param {remoting.HostTableEntry} host */
181 remoting.LocalHostSection.Controller.prototype.rename = function(host) {
182   this.hostList_.renameHost(host);
185 /** @param {string} hostId */
186 remoting.LocalHostSection.Controller.prototype.connect = function(hostId) {
187   this.handleConnect_(hostId);
190 }());