* unsupported.
*/
remoting.HostDispatcher = function(createPluginCallback) {
- /** @type {remoting.HostDispatcher} */
- var that = this;
-
/** @type {remoting.HostNativeMessaging} @private */
this.nativeMessagingHost_ = new remoting.HostNativeMessaging();
/** @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();
}
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
}
onDone(supportedFeatures.indexOf(feature) >= 0);
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onDone(false);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onDone({});
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
* @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);
onDone(state);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onDone(remoting.HostController.State.NOT_INSTALLED);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
onError(remoting.Error.MISSING_PLUGIN);
}
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
// doesn't have access to the API keys baked into the installed host.
onError(remoting.Error.UNEXPECTED);
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
// doesn't have access to the API keys baked into the installed host.
onError(remoting.Error.UNEXPECTED);
break;
+ case remoting.HostDispatcher.State.NOT_INSTALLED:
+ onError(remoting.Error.MISSING_PLUGIN);
+ break;
}
};
+
+/**
+ * Returns true if the NPAPI plugin is being used.
+ * @return {boolean}
+ */
+remoting.HostDispatcher.prototype.usingNpapiPlugin = function() {
+ return this.state_ == remoting.HostDispatcher.State.NPAPI;
+}