Chromium Code Reviews| Index: remoting/webapp/host_dispatcher.js |
| diff --git a/remoting/webapp/host_dispatcher.js b/remoting/webapp/host_dispatcher.js |
| index ee33e41fc2e52ced77f070efaa5b64633e8a0304..5de4d55fb98c96da2b02bc509ac25f7c8732b97c 100644 |
| --- a/remoting/webapp/host_dispatcher.js |
| +++ b/remoting/webapp/host_dispatcher.js |
| @@ -28,9 +28,6 @@ var remoting = remoting || {}; |
| * unsupported. |
| */ |
| remoting.HostDispatcher = function(createPluginCallback) { |
| - /** @type {remoting.HostDispatcher} */ |
| - var that = this; |
| - |
| /** @type {remoting.HostNativeMessaging} @private */ |
| this.nativeMessagingHost_ = new remoting.HostNativeMessaging(); |
| @@ -43,23 +40,44 @@ remoting.HostDispatcher = function(createPluginCallback) { |
| /** @type {Array.<function()>} */ |
| this.pendingRequests_ = []; |
| + this.createPluginCallback_ = createPluginCallback; |
| + |
| + this.tryToInitialize_(); |
| +} |
| + |
| +/** @enum {number} */ |
| +remoting.HostDispatcher.State = { |
| + UNKNOWN: 0, |
| + NATIVE_MESSAGING: 1, |
| + NPAPI: 2, |
| + NOT_INSTALLED: 3 |
| +}; |
| + |
| +remoting.HostDispatcher.prototype.tryToInitialize_ = function() { |
| + /** @type {remoting.HostDispatcher} */ |
| + var that = this; |
| + |
| + if (this.state_ != remoting.HostDispatcher.State.UNKNOWN) |
| + return; |
| + |
| function sendPendingRequests() { |
| - for (var i = 0; i < that.pendingRequests_.length; i++) { |
| - that.pendingRequests_[i](); |
| + var pendingRequests = that.pendingRequests_; |
| + that.pendingRequests_ = []; |
| + for (var i = 0; i < pendingRequests.length; i++) { |
| + pendingRequests[i](); |
| } |
| - that.pendingRequests_ = null; |
| } |
| function onNativeMessagingInit() { |
| - console.log('Native Messaging supported.'); |
| that.state_ = remoting.HostDispatcher.State.NATIVE_MESSAGING; |
| sendPendingRequests(); |
| } |
| function onNativeMessagingFailed(error) { |
| - console.log('Native Messaging unsupported, falling back to NPAPI.'); |
| - that.npapiHost_ = createPluginCallback(); |
| - that.state_ = remoting.HostDispatcher.State.NPAPI; |
| + that.npapiHost_ = that.createPluginCallback_(); |
| + |
| + that.state_ = that.npapiHost_ ? remoting.HostDispatcher.State.NPAPI |
| + : remoting.HostDispatcher.State.NOT_INSTALLED; |
| sendPendingRequests(); |
| } |
| @@ -67,13 +85,6 @@ remoting.HostDispatcher = function(createPluginCallback) { |
| onNativeMessagingFailed); |
| }; |
| -/** @enum {number} */ |
| -remoting.HostDispatcher.State = { |
| - UNKNOWN: 0, |
| - NATIVE_MESSAGING: 1, |
| - NPAPI: 2 |
| -}; |
| - |
| /** |
| * @param {remoting.HostController.Feature} feature The feature to test for. |
| * @param {function(boolean):void} onDone |
| @@ -98,6 +109,9 @@ remoting.HostDispatcher.prototype.hasFeature = function( |
| } |
| onDone(supportedFeatures.indexOf(feature) >= 0); |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onDone(false); |
| + break; |
| } |
| }; |
| @@ -122,6 +136,9 @@ remoting.HostDispatcher.prototype.getHostName = function(onDone, onError) { |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onError(remoting.Error.MISSING_PLUGIN); |
| + break; |
| } |
| }; |
| @@ -149,6 +166,9 @@ remoting.HostDispatcher.prototype.getPinHash = |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onError(remoting.Error.MISSING_PLUGIN); |
| + break; |
| } |
| }; |
| @@ -173,6 +193,9 @@ remoting.HostDispatcher.prototype.generateKeyPair = function(onDone, onError) { |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onError(remoting.Error.MISSING_PLUGIN); |
| + break; |
| } |
| }; |
| @@ -199,6 +222,9 @@ remoting.HostDispatcher.prototype.updateDaemonConfig = |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onError(remoting.Error.MISSING_PLUGIN); |
| + break; |
| } |
| }; |
| @@ -238,6 +264,9 @@ remoting.HostDispatcher.prototype.getDaemonConfig = function(onDone, onError) { |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onDone({}); |
|
Jamie
2014/01/31 18:39:15
Why is this not onError like the other cases? Mayb
Sergey Ulanov
2014/01/31 23:34:17
For most other things we can'd do anything without
|
| + break; |
| } |
| }; |
| @@ -262,6 +291,9 @@ remoting.HostDispatcher.prototype.getDaemonVersion = function(onDone, onError) { |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onError(remoting.Error.MISSING_PLUGIN); |
| + break; |
| } |
| }; |
| @@ -287,6 +319,9 @@ remoting.HostDispatcher.prototype.getUsageStatsConsent = |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onError(remoting.Error.MISSING_PLUGIN); |
| + break; |
| } |
| }; |
| @@ -314,6 +349,9 @@ remoting.HostDispatcher.prototype.startDaemon = |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onError(remoting.Error.MISSING_PLUGIN); |
| + break; |
| } |
| }; |
| @@ -337,6 +375,9 @@ remoting.HostDispatcher.prototype.stopDaemon = function(onDone, onError) { |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onError(remoting.Error.MISSING_PLUGIN); |
| + break; |
| } |
| }; |
| @@ -346,10 +387,27 @@ remoting.HostDispatcher.prototype.stopDaemon = function(onDone, onError) { |
| * @return {void} |
| */ |
| remoting.HostDispatcher.prototype.getDaemonState = function(onDone, onError) { |
| + // If the host was in not-initialized state try initializing it again in case |
| + // it was installed. |
| + if (this.state_ == remoting.HostDispatcher.State.NOT_INSTALLED) { |
| + this.state_ = remoting.HostDispatcher.State.UNKNOWN; |
| + this.tryToInitialize_(); |
| + } |
| + |
| + this.getDaemonStateInternal_(onDone, onError); |
| +} |
| + |
| +/** |
| + * @param {function(remoting.HostController.State):void} onDone |
| + * @param {function(remoting.Error):void} onError |
| + * @return {void} |
| + */ |
| +remoting.HostDispatcher.prototype.getDaemonStateInternal_ = |
| + function(onDone, onError) { |
| switch (this.state_) { |
| case remoting.HostDispatcher.State.UNKNOWN: |
| this.pendingRequests_.push( |
| - this.getDaemonState.bind(this, onDone, onError)); |
| + this.getDaemonStateInternal_.bind(this, onDone, onError)); |
| break; |
| case remoting.HostDispatcher.State.NATIVE_MESSAGING: |
| this.nativeMessagingHost_.getDaemonState(onDone, onError); |
| @@ -364,6 +422,9 @@ remoting.HostDispatcher.prototype.getDaemonState = function(onDone, onError) { |
| onDone(state); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onDone(remoting.HostController.State.NOT_INSTALLED); |
| + break; |
| } |
| }; |
| @@ -404,6 +465,9 @@ remoting.HostDispatcher.prototype.getPairedClients = function(onDone, onError) { |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onDone(remoting.HostController.State.NOT_INSTALLED); |
|
Jamie
2014/01/31 18:39:15
This is the wrong type for onDone. I think you mea
Sergey Ulanov
2014/01/31 23:34:17
Done
|
| + break; |
| } |
| }; |
| @@ -449,6 +513,9 @@ remoting.HostDispatcher.prototype.clearPairedClients = |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onDone(remoting.HostController.State.NOT_INSTALLED); |
|
Jamie
2014/01/31 18:39:15
onDone take no parameters; perhaps you need to cal
Sergey Ulanov
2014/01/31 23:34:17
Yes.
|
| + break; |
| } |
| }; |
| @@ -477,6 +544,9 @@ remoting.HostDispatcher.prototype.deletePairedClient = |
| onError(remoting.Error.MISSING_PLUGIN); |
| } |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onDone(remoting.HostController.State.NOT_INSTALLED); |
|
Jamie
2014/01/31 18:39:15
onError?
Sergey Ulanov
2014/01/31 23:34:17
Done.
|
| + break; |
| } |
| }; |
| @@ -500,6 +570,9 @@ remoting.HostDispatcher.prototype.getHostClientId = |
| // doesn't have access to the API keys baked into the installed host. |
| onError(remoting.Error.UNEXPECTED); |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onDone(remoting.HostController.State.NOT_INSTALLED); |
|
Jamie
2014/01/31 18:39:15
onError?
Sergey Ulanov
2014/01/31 23:34:17
Done.
|
| + break; |
| } |
| }; |
| @@ -526,5 +599,8 @@ remoting.HostDispatcher.prototype.getCredentialsFromAuthCode = |
| // doesn't have access to the API keys baked into the installed host. |
| onError(remoting.Error.UNEXPECTED); |
| break; |
| + case remoting.HostDispatcher.State.NOT_INSTALLED: |
| + onDone(remoting.HostController.State.NOT_INSTALLED); |
|
Jamie
2014/01/31 18:39:15
onError?
Sergey Ulanov
2014/01/31 23:34:17
Done.
|
| + break; |
| } |
| }; |