| Index: remoting/webapp/client_plugin.js
|
| diff --git a/remoting/webapp/client_plugin.js b/remoting/webapp/client_plugin.js
|
| index 7b854a20698c7c7f01b840dfca33f21375e990fb..181abcc83e5800433af723d752f46e6acd1cc128 100644
|
| --- a/remoting/webapp/client_plugin.js
|
| +++ b/remoting/webapp/client_plugin.js
|
| @@ -17,14 +17,33 @@
|
| var remoting = remoting || {};
|
|
|
| /**
|
| - * @param {remoting.ViewerPlugin} plugin The plugin embed element.
|
| + * @param {Element} container The container for the embed element.
|
| * @param {function(string, string):boolean} onExtensionMessage The handler for
|
| * protocol extension messages. Returns true if a message is recognized;
|
| * false otherwise.
|
| * @constructor
|
| */
|
| -remoting.ClientPlugin = function(plugin, onExtensionMessage) {
|
| - this.plugin = plugin;
|
| +remoting.ClientPlugin = function(container, onExtensionMessage) {
|
| + this.plugin_ = /** @type {remoting.ViewerPlugin} */
|
| + document.createElement('embed');
|
| +
|
| + this.plugin_.id = 'session-client-plugin';
|
| + if (remoting.settings.CLIENT_PLUGIN_TYPE == 'pnacl') {
|
| + this.plugin_.src = 'remoting_client_pnacl.nmf';
|
| + this.plugin_.type = 'application/x-pnacl';
|
| + } else if (remoting.settings.CLIENT_PLUGIN_TYPE == 'nacl') {
|
| + this.plugin_.src = 'remoting_client_nacl.nmf';
|
| + this.plugin_.type = 'application/x-nacl';
|
| + } else {
|
| + this.plugin_.src = 'about://none';
|
| + this.plugin_.type = 'application/vnd.chromium.remoting-viewer';
|
| + }
|
| +
|
| + this.plugin_.width = 0;
|
| + this.plugin_.height = 0;
|
| + this.plugin_.tabIndex = 0; // Required, otherwise focus() doesn't work.
|
| + container.appendChild(this.plugin_);
|
| +
|
| this.onExtensionMessage_ = onExtensionMessage;
|
|
|
| this.desktopWidth = 0;
|
| @@ -87,7 +106,7 @@ remoting.ClientPlugin = function(plugin, onExtensionMessage) {
|
| /** @type {remoting.ClientPlugin} */
|
| var that = this;
|
| /** @param {Event} event Message event from the plugin. */
|
| - this.plugin.addEventListener('message', function(event) {
|
| + this.plugin_.addEventListener('message', function(event) {
|
| that.handleMessage_(event.data);
|
| }, false);
|
|
|
| @@ -380,14 +399,17 @@ remoting.ClientPlugin.prototype.handleMessageMethod_ = function(message) {
|
| * Deletes the plugin.
|
| */
|
| remoting.ClientPlugin.prototype.cleanup = function() {
|
| - this.plugin.parentNode.removeChild(this.plugin);
|
| + if (this.plugin_) {
|
| + this.plugin_.parentNode.removeChild(this.plugin_);
|
| + this.plugin_ = null;
|
| + }
|
| };
|
|
|
| /**
|
| - * @return {HTMLEmbedElement} HTML element that correspods to the plugin.
|
| + * @return {HTMLEmbedElement} HTML element that corresponds to the plugin.
|
| */
|
| remoting.ClientPlugin.prototype.element = function() {
|
| - return this.plugin;
|
| + return this.plugin_;
|
| };
|
|
|
| /**
|
| @@ -438,8 +460,8 @@ remoting.ClientPlugin.prototype.isInjectKeyEventSupported = function() {
|
| * @param {string} iq Incoming IQ stanza.
|
| */
|
| remoting.ClientPlugin.prototype.onIncomingIq = function(iq) {
|
| - if (this.plugin && this.plugin.postMessage) {
|
| - this.plugin.postMessage(JSON.stringify(
|
| + if (this.plugin_ && this.plugin_.postMessage) {
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'incomingIq', data: { iq: iq } }));
|
| } else {
|
| // plugin.onIq may not be set after the plugin has been shut
|
| @@ -475,9 +497,9 @@ remoting.ClientPlugin.prototype.connect = function(
|
| } else if (remoting.platformIsChromeOS()) {
|
| keyFilter = 'cros';
|
| }
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'delegateLargeCursors', data: {} }));
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'connect', data: {
|
| hostJid: hostJid,
|
| hostPublicKey: hostPublicKey,
|
| @@ -497,7 +519,7 @@ remoting.ClientPlugin.prototype.connect = function(
|
| * Release all currently pressed keys.
|
| */
|
| remoting.ClientPlugin.prototype.releaseAllKeys = function() {
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'releaseAllKeys', data: {} }));
|
| };
|
|
|
| @@ -509,7 +531,7 @@ remoting.ClientPlugin.prototype.releaseAllKeys = function() {
|
| */
|
| remoting.ClientPlugin.prototype.injectKeyEvent =
|
| function(usbKeycode, pressed) {
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'injectKeyEvent', data: {
|
| 'usbKeycode': usbKeycode,
|
| 'pressed': pressed}
|
| @@ -524,7 +546,7 @@ remoting.ClientPlugin.prototype.injectKeyEvent =
|
| */
|
| remoting.ClientPlugin.prototype.remapKey =
|
| function(fromKeycode, toKeycode) {
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'remapKey', data: {
|
| 'fromKeycode': fromKeycode,
|
| 'toKeycode': toKeycode}
|
| @@ -538,7 +560,7 @@ remoting.ClientPlugin.prototype.remapKey =
|
| * @param {Boolean} trap True to enable trapping, False to disable.
|
| */
|
| remoting.ClientPlugin.prototype.trapKey = function(keycode, trap) {
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'trapKey', data: {
|
| 'keycode': keycode,
|
| 'trap': trap}
|
| @@ -564,7 +586,7 @@ remoting.ClientPlugin.prototype.sendClipboardItem =
|
| function(mimeType, item) {
|
| if (!this.hasFeature(remoting.ClientPlugin.Feature.SEND_CLIPBOARD_ITEM))
|
| return;
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'sendClipboardItem',
|
| data: { mimeType: mimeType, item: item }}));
|
| };
|
| @@ -580,7 +602,7 @@ remoting.ClientPlugin.prototype.notifyClientResolution =
|
| function(width, height, device_scale) {
|
| if (this.hasFeature(remoting.ClientPlugin.Feature.NOTIFY_CLIENT_RESOLUTION)) {
|
| var dpi = Math.floor(device_scale * 96);
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'notifyClientResolution',
|
| data: { width: Math.floor(width * device_scale),
|
| height: Math.floor(height * device_scale),
|
| @@ -596,10 +618,10 @@ remoting.ClientPlugin.prototype.notifyClientResolution =
|
| remoting.ClientPlugin.prototype.pauseVideo =
|
| function(pause) {
|
| if (this.hasFeature(remoting.ClientPlugin.Feature.VIDEO_CONTROL)) {
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'videoControl', data: { pause: pause }}));
|
| } else if (this.hasFeature(remoting.ClientPlugin.Feature.PAUSE_VIDEO)) {
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'pauseVideo', data: { pause: pause }}));
|
| }
|
| };
|
| @@ -614,7 +636,7 @@ remoting.ClientPlugin.prototype.pauseAudio =
|
| if (!this.hasFeature(remoting.ClientPlugin.Feature.PAUSE_AUDIO)) {
|
| return;
|
| }
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'pauseAudio', data: { pause: pause }}));
|
| };
|
|
|
| @@ -628,7 +650,7 @@ remoting.ClientPlugin.prototype.setLosslessEncode =
|
| if (!this.hasFeature(remoting.ClientPlugin.Feature.VIDEO_CONTROL)) {
|
| return;
|
| }
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'videoControl', data: { losslessEncode: wantLossless }}));
|
| };
|
|
|
| @@ -642,7 +664,7 @@ remoting.ClientPlugin.prototype.setLosslessColor =
|
| if (!this.hasFeature(remoting.ClientPlugin.Feature.VIDEO_CONTROL)) {
|
| return;
|
| }
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'videoControl', data: { losslessColor: wantLossless }}));
|
| };
|
|
|
| @@ -656,7 +678,7 @@ remoting.ClientPlugin.prototype.onPinFetched =
|
| if (!this.hasFeature(remoting.ClientPlugin.Feature.ASYNC_PIN)) {
|
| return;
|
| }
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'onPinFetched', data: { pin: pin }}));
|
| };
|
|
|
| @@ -668,7 +690,7 @@ remoting.ClientPlugin.prototype.useAsyncPinDialog =
|
| if (!this.hasFeature(remoting.ClientPlugin.Feature.ASYNC_PIN)) {
|
| return;
|
| }
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'useAsyncPinDialog', data: {} }));
|
| };
|
|
|
| @@ -680,7 +702,7 @@ remoting.ClientPlugin.prototype.useAsyncPinDialog =
|
| */
|
| remoting.ClientPlugin.prototype.onThirdPartyTokenFetched = function(
|
| token, sharedSecret) {
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'onThirdPartyTokenFetched',
|
| data: { token: token, sharedSecret: sharedSecret}}));
|
| };
|
| @@ -698,7 +720,7 @@ remoting.ClientPlugin.prototype.requestPairing =
|
| return;
|
| }
|
| this.onPairingComplete_ = onDone;
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'requestPairing', data: { clientName: clientName } }));
|
| };
|
|
|
| @@ -713,7 +735,7 @@ remoting.ClientPlugin.prototype.sendClientMessage =
|
| if (!this.hasFeature(remoting.ClientPlugin.Feature.EXTENSION_MESSAGE)) {
|
| return;
|
| }
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'extensionMessage',
|
| data: { type: type, data: message } }));
|
|
|
| @@ -730,7 +752,7 @@ remoting.ClientPlugin.prototype.enableMediaSourceRendering =
|
| return;
|
| }
|
| this.mediaSourceRenderer_ = mediaSourceRenderer;
|
| - this.plugin.postMessage(JSON.stringify(
|
| + this.plugin_.postMessage(JSON.stringify(
|
| { method: 'enableMediaSourceRendering', data: {} }));
|
| };
|
|
|
| @@ -744,14 +766,14 @@ remoting.ClientPlugin.prototype.showPluginForClickToPlay_ = function() {
|
| if (!this.helloReceived_) {
|
| var width = 200;
|
| var height = 200;
|
| - this.plugin.style.width = width + 'px';
|
| - this.plugin.style.height = height + 'px';
|
| + this.plugin_.style.width = width + 'px';
|
| + this.plugin_.style.height = height + 'px';
|
| // Center the plugin just underneath the "Connnecting..." dialog.
|
| var dialog = document.getElementById('client-dialog');
|
| var dialogRect = dialog.getBoundingClientRect();
|
| - this.plugin.style.top = (dialogRect.bottom + 16) + 'px';
|
| - this.plugin.style.left = (window.innerWidth - width) / 2 + 'px';
|
| - this.plugin.style.position = 'fixed';
|
| + this.plugin_.style.top = (dialogRect.bottom + 16) + 'px';
|
| + this.plugin_.style.left = (window.innerWidth - width) / 2 + 'px';
|
| + this.plugin_.style.position = 'fixed';
|
| }
|
| };
|
|
|
| @@ -760,9 +782,9 @@ remoting.ClientPlugin.prototype.showPluginForClickToPlay_ = function() {
|
| * @private
|
| */
|
| remoting.ClientPlugin.prototype.hidePluginForClickToPlay_ = function() {
|
| - this.plugin.style.width = '';
|
| - this.plugin.style.height = '';
|
| - this.plugin.style.top = '';
|
| - this.plugin.style.left = '';
|
| - this.plugin.style.position = '';
|
| + this.plugin_.style.width = '';
|
| + this.plugin_.style.height = '';
|
| + this.plugin_.style.top = '';
|
| + this.plugin_.style.left = '';
|
| + this.plugin_.style.position = '';
|
| };
|
|
|