| Index: remoting/webapp/client_plugin_async.js
|
| diff --git a/remoting/webapp/client_plugin_async.js b/remoting/webapp/client_plugin_async.js
|
| index e9b1f6564bb65678d8433516493f0eb0caa44f77..71ec21f6dc6523074902d68a6bd8a5cc7043093e 100644
|
| --- a/remoting/webapp/client_plugin_async.js
|
| +++ b/remoting/webapp/client_plugin_async.js
|
| @@ -41,6 +41,8 @@ remoting.ClientPluginAsync = function(plugin) {
|
| /** @param {boolean} ready Connection ready state. */
|
| this.onConnectionReadyHandler = function(ready) {};
|
| this.onDesktopSizeUpdateHandler = function () {};
|
| + /** @param {!Array.<string>} capabilities The negotiated capabilities. */
|
| + this.onSetCapabilitiesHandler = function (capabilities) {};
|
| this.fetchPinHandler = function () {};
|
|
|
| /** @type {number} */
|
| @@ -49,6 +51,8 @@ remoting.ClientPluginAsync = function(plugin) {
|
| this.pluginApiFeatures_ = [];
|
| /** @type {number} */
|
| this.pluginApiMinVersion_ = -1;
|
| + /** @type {!Array.<string>} */
|
| + this.capabilities_ = [];
|
| /** @type {boolean} */
|
| this.helloReceived_ = false;
|
| /** @type {function(boolean)|null} */
|
| @@ -98,6 +102,17 @@ remoting.ClientPluginAsync.prototype.handleMessage_ = function(messageStr) {
|
| return;
|
| }
|
|
|
| + /**
|
| + * Splits a string into a list of words delimited by spaces.
|
| + * @param {string} str String that should be split.
|
| + * @return {!Array.<string>} List of words.
|
| + */
|
| + var tokenize = function(str) {
|
| + /** @type {Array.<string>} */
|
| + var tokens = str.match(/\S+/g);
|
| + return tokens ? tokens : [];
|
| + };
|
| +
|
| if (message.method == 'hello') {
|
| // Reset the size in case we had to enlarge it to support click-to-play.
|
| this.plugin.width = 0;
|
| @@ -108,13 +123,47 @@ remoting.ClientPluginAsync.prototype.handleMessage_ = function(messageStr) {
|
| return;
|
| }
|
| this.pluginApiVersion_ = /** @type {number} */ message.data['apiVersion'];
|
| +
|
| if (this.pluginApiVersion_ >= 7) {
|
| if (typeof message.data['apiFeatures'] != 'string') {
|
| console.error('Received invalid hello message: ' + messageStr);
|
| return;
|
| }
|
| this.pluginApiFeatures_ =
|
| - /** @type {Array.<string>} */ message.data['apiFeatures'].split(' ');
|
| + /** @type {Array.<string>} */ tokenize(message.data['apiFeatures']);
|
| +
|
| + // Negotiate capabilities.
|
| +
|
| + /** @type {!Array.<string>} */
|
| + var requestedCapabilities = [];
|
| + if ('requestedCapabilities' in message.data) {
|
| + if (typeof message.data['requestedCapabilities'] != 'string') {
|
| + console.error('Received invalid hello message: ' + messageStr);
|
| + return;
|
| + }
|
| + requestedCapabilities = tokenize(message.data['requestedCapabilities']);
|
| + }
|
| +
|
| + /** @type {!Array.<string>} */
|
| + var supportedCapabilities = [];
|
| + if ('supportedCapabilities' in message.data) {
|
| + if (typeof message.data['supportedCapabilities'] != 'string') {
|
| + console.error('Received invalid hello message: ' + messageStr);
|
| + return;
|
| + }
|
| + supportedCapabilities = tokenize(message.data['supportedCapabilities']);
|
| + }
|
| +
|
| + // At the moment the webapp does not recognize any of
|
| + // 'requestedCapabilities' capabilities (so they all should be disabled)
|
| + // and do not care about any of 'supportedCapabilities' capabilities (so
|
| + // they all can be enabled).
|
| + this.capabilities_ = supportedCapabilities;
|
| +
|
| + // Let the host know that the webapp can be requested to always send
|
| + // the client's dimensions.
|
| + this.capabilities_.push(
|
| + remoting.ClientSession.Capability.SEND_INITIAL_RESOLUTION);
|
| } else if (this.pluginApiVersion_ >= 6) {
|
| this.pluginApiFeatures_ = ['highQualityScaling', 'injectKeyEvent'];
|
| } else {
|
| @@ -208,6 +257,15 @@ remoting.ClientPluginAsync.prototype.handleMessage_ = function(messageStr) {
|
| this.onConnectionReadyHandler(ready);
|
| } else if (message.method == 'fetchPin') {
|
| this.fetchPinHandler();
|
| + } else if (message.method == 'setCapabilities') {
|
| + if (typeof message.data['capabilities'] != 'string') {
|
| + console.error('Received incorrect setCapabilities message.');
|
| + return;
|
| + }
|
| +
|
| + /** @type {!Array.<string>} */
|
| + var capabilities = tokenize(message.data['capabilities']);
|
| + this.onSetCapabilitiesHandler(capabilities);
|
| }
|
| };
|
|
|
| @@ -306,7 +364,8 @@ remoting.ClientPluginAsync.prototype.connect = function(
|
| localJid: localJid,
|
| sharedSecret: sharedSecret,
|
| authenticationMethods: authenticationMethods,
|
| - authenticationTag: authenticationTag
|
| + authenticationTag: authenticationTag,
|
| + capabilities: this.capabilities_.join(" ")
|
| }
|
| }));
|
| };
|
|
|