OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview | 6 * @fileoverview |
7 * Class that wraps low-level details of interacting with the client plugin. | 7 * Class that wraps low-level details of interacting with the client plugin. |
8 * | 8 * |
9 * This abstracts a <embed> element and controls the plugin which does | 9 * This abstracts a <embed> element and controls the plugin which does |
10 * the actual remoting work. It also handles differences between | 10 * the actual remoting work. It also handles differences between |
11 * client plugins versions when it is necessary. | 11 * client plugins versions when it is necessary. |
12 */ | 12 */ |
13 | 13 |
14 'use strict'; | 14 'use strict'; |
15 | 15 |
16 /** @suppress {duplicate} */ | 16 /** @suppress {duplicate} */ |
17 var remoting = remoting || {}; | 17 var remoting = remoting || {}; |
18 | 18 |
19 /** | 19 /** |
20 * @param {Element} container The container for the embed element. | 20 * @param {Element} container The container for the embed element. |
21 * @param {function(string, string):boolean} onExtensionMessage The handler for | 21 * @param {function(string, string):boolean} onExtensionMessage The handler for |
22 * protocol extension messages. Returns true if a message is recognized; | 22 * protocol extension messages. Returns true if a message is recognized; |
23 * false otherwise. | 23 * false otherwise. |
24 * @constructor | 24 * @constructor |
25 */ | 25 */ |
26 remoting.ClientPlugin = function(container, onExtensionMessage) { | 26 remoting.ClientPlugin = function(container, onExtensionMessage) { |
27 this.plugin_ = /** @type {remoting.ViewerPlugin} */ | 27 this.plugin_ = remoting.ClientPlugin.createPluginElement_(); |
28 document.createElement('embed'); | |
29 | |
30 this.plugin_.id = 'session-client-plugin'; | 28 this.plugin_.id = 'session-client-plugin'; |
31 if (remoting.settings.CLIENT_PLUGIN_TYPE == 'pnacl') { | |
32 this.plugin_.src = 'remoting_client_pnacl.nmf'; | |
33 this.plugin_.type = 'application/x-pnacl'; | |
34 } else if (remoting.settings.CLIENT_PLUGIN_TYPE == 'nacl') { | |
35 this.plugin_.src = 'remoting_client_nacl.nmf'; | |
36 this.plugin_.type = 'application/x-nacl'; | |
37 } else { | |
38 this.plugin_.src = 'about://none'; | |
39 this.plugin_.type = 'application/vnd.chromium.remoting-viewer'; | |
40 } | |
41 | |
42 this.plugin_.width = 0; | |
43 this.plugin_.height = 0; | |
44 this.plugin_.tabIndex = 0; // Required, otherwise focus() doesn't work. | |
45 container.appendChild(this.plugin_); | 29 container.appendChild(this.plugin_); |
46 | 30 |
47 this.onExtensionMessage_ = onExtensionMessage; | 31 this.onExtensionMessage_ = onExtensionMessage; |
48 | 32 |
49 this.desktopWidth = 0; | 33 this.desktopWidth = 0; |
50 this.desktopHeight = 0; | 34 this.desktopHeight = 0; |
51 this.desktopXDpi = 96; | 35 this.desktopXDpi = 96; |
52 this.desktopYDpi = 96; | 36 this.desktopYDpi = 96; |
53 | 37 |
54 /** @param {string} iq The Iq stanza received from the host. */ | 38 /** @param {string} iq The Iq stanza received from the host. */ |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 this.plugin_.addEventListener('message', function(event) { | 93 this.plugin_.addEventListener('message', function(event) { |
110 that.handleMessage_(event.data); | 94 that.handleMessage_(event.data); |
111 }, false); | 95 }, false); |
112 | 96 |
113 if (remoting.settings.CLIENT_PLUGIN_TYPE == 'native') { | 97 if (remoting.settings.CLIENT_PLUGIN_TYPE == 'native') { |
114 window.setTimeout(this.showPluginForClickToPlay_.bind(this), 500); | 98 window.setTimeout(this.showPluginForClickToPlay_.bind(this), 500); |
115 } | 99 } |
116 }; | 100 }; |
117 | 101 |
118 /** | 102 /** |
| 103 * Creates plugin element without adding it to a container. |
| 104 * |
| 105 * @return {remoting.ViewerPlugin} Plugin element |
| 106 */ |
| 107 remoting.ClientPlugin.createPluginElement_ = function() { |
| 108 var plugin = /** @type {remoting.ViewerPlugin} */ |
| 109 document.createElement('embed'); |
| 110 if (remoting.settings.CLIENT_PLUGIN_TYPE == 'pnacl') { |
| 111 plugin.src = 'remoting_client_pnacl.nmf'; |
| 112 plugin.type = 'application/x-pnacl'; |
| 113 } else if (remoting.settings.CLIENT_PLUGIN_TYPE == 'nacl') { |
| 114 plugin.src = 'remoting_client_nacl.nmf'; |
| 115 plugin.type = 'application/x-nacl'; |
| 116 } else { |
| 117 plugin.src = 'about://none'; |
| 118 plugin.type = 'application/vnd.chromium.remoting-viewer'; |
| 119 } |
| 120 plugin.width = 0; |
| 121 plugin.height = 0; |
| 122 plugin.tabIndex = 0; // Required, otherwise focus() doesn't work. |
| 123 return plugin; |
| 124 } |
| 125 |
| 126 /** |
| 127 * Preloads the plugin to make instantiation faster when the user tries |
| 128 * to connect. |
| 129 */ |
| 130 remoting.ClientPlugin.preload = function() { |
| 131 if (remoting.settings.CLIENT_PLUGIN_TYPE != 'pnacl') { |
| 132 return; |
| 133 } |
| 134 |
| 135 var plugin = remoting.ClientPlugin.createPluginElement_(); |
| 136 plugin.addEventListener( |
| 137 'loadend', function() { document.body.removeChild(plugin); }, false); |
| 138 document.body.appendChild(plugin); |
| 139 } |
| 140 |
| 141 /** |
119 * Set of features for which hasFeature() can be used to test. | 142 * Set of features for which hasFeature() can be used to test. |
120 * | 143 * |
121 * @enum {string} | 144 * @enum {string} |
122 */ | 145 */ |
123 remoting.ClientPlugin.Feature = { | 146 remoting.ClientPlugin.Feature = { |
124 INJECT_KEY_EVENT: 'injectKeyEvent', | 147 INJECT_KEY_EVENT: 'injectKeyEvent', |
125 NOTIFY_CLIENT_RESOLUTION: 'notifyClientResolution', | 148 NOTIFY_CLIENT_RESOLUTION: 'notifyClientResolution', |
126 ASYNC_PIN: 'asyncPin', | 149 ASYNC_PIN: 'asyncPin', |
127 PAUSE_VIDEO: 'pauseVideo', | 150 PAUSE_VIDEO: 'pauseVideo', |
128 PAUSE_AUDIO: 'pauseAudio', | 151 PAUSE_AUDIO: 'pauseAudio', |
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 * Undo the CSS rules needed to make the plugin clickable for click-to-play. | 804 * Undo the CSS rules needed to make the plugin clickable for click-to-play. |
782 * @private | 805 * @private |
783 */ | 806 */ |
784 remoting.ClientPlugin.prototype.hidePluginForClickToPlay_ = function() { | 807 remoting.ClientPlugin.prototype.hidePluginForClickToPlay_ = function() { |
785 this.plugin_.style.width = ''; | 808 this.plugin_.style.width = ''; |
786 this.plugin_.style.height = ''; | 809 this.plugin_.style.height = ''; |
787 this.plugin_.style.top = ''; | 810 this.plugin_.style.top = ''; |
788 this.plugin_.style.left = ''; | 811 this.plugin_.style.left = ''; |
789 this.plugin_.style.position = ''; | 812 this.plugin_.style.position = ''; |
790 }; | 813 }; |
OLD | NEW |