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 * Enumeration of possible states during pairing. The value associated with | 6 * Enumeration of possible states during pairing. The value associated with |
7 * each state maps to a localized string in the global variable | 7 * each state maps to a localized string in the global variable |
8 * |loadTimeData|. | 8 * |loadTimeData|. |
9 * @enum {string} | 9 * @enum {string} |
10 */ | 10 */ |
11 var BluetoothPairingEventType = { | 11 var BluetoothPairingEventType = { |
12 CONNECTING: 'bluetoothStartConnecting', | 12 CONNECTING: 'bluetoothStartConnecting', |
13 ENTER_PIN_CODE: 'bluetoothEnterPinCode', | 13 ENTER_PIN_CODE: 'bluetoothEnterPinCode', |
14 ENTER_PASSKEY: 'bluetoothEnterPasskey', | 14 ENTER_PASSKEY: 'bluetoothEnterPasskey', |
15 REMOTE_PIN_CODE: 'bluetoothRemotePinCode', | 15 REMOTE_PIN_CODE: 'bluetoothRemotePinCode', |
16 REMOTE_PASSKEY: 'bluetoothRemotePasskey', | 16 REMOTE_PASSKEY: 'bluetoothRemotePasskey', |
17 CONFIRM_PASSKEY: 'bluetoothConfirmPasskey', | 17 CONFIRM_PASSKEY: 'bluetoothConfirmPasskey', |
18 CONNECT_FAILED: 'bluetoothConnectFailed', | 18 CONNECT_FAILED: 'bluetoothConnectFailed', |
19 CANCELED: 'bluetoothPairingCanceled', | 19 CANCELED: 'bluetoothPairingCanceled', |
20 DISMISSED: 'bluetoothPairingDismissed', // pairing dismissed (succeeded or | 20 DISMISSED: 'bluetoothPairingDismissed', // pairing dismissed (succeeded or |
21 // canceled). | 21 // canceled). |
22 NOOP: '' // Update device but do not show or update the dialog. | 22 NOOP: '' // Update device but do not show or update the dialog. |
23 }; | 23 }; |
24 | 24 |
25 /** | 25 /** |
26 * @typedef {{pairing: (BluetoothPairingEventType|undefined), | 26 * @typedef {{pairing: (BluetoothPairingEventType|undefined), |
27 * device: !chrome.bluetooth.Device, | 27 * device: !chrome.bluetooth.Device, |
28 * pincode: (string|undefined), | 28 * pincode: (string|undefined), |
29 * passkey: (number|undefined), | 29 * passkey: (number|undefined), |
30 * enteredKey: (number|undefined)}} | 30 * enteredKey: (number|undefined)}} |
31 */ | 31 */ |
(...skipping 28 matching lines...) Expand all Loading... |
60 | 60 |
61 cr.define('options', function() { | 61 cr.define('options', function() { |
62 /** @const */ var Page = cr.ui.pageManager.Page; | 62 /** @const */ var Page = cr.ui.pageManager.Page; |
63 /** @const */ var PageManager = cr.ui.pageManager.PageManager; | 63 /** @const */ var PageManager = cr.ui.pageManager.PageManager; |
64 | 64 |
65 /** | 65 /** |
66 * List of IDs for conditionally visible elements in the dialog. | 66 * List of IDs for conditionally visible elements in the dialog. |
67 * @type {Array<string>} | 67 * @type {Array<string>} |
68 * @const | 68 * @const |
69 */ | 69 */ |
70 var ELEMENTS = ['bluetooth-pairing-passkey-display', | 70 var ELEMENTS = [ |
71 'bluetooth-pairing-passkey-entry', | 71 'bluetooth-pairing-passkey-display', 'bluetooth-pairing-passkey-entry', |
72 'bluetooth-pairing-pincode-entry', | 72 'bluetooth-pairing-pincode-entry', 'bluetooth-pair-device-connect-button', |
73 'bluetooth-pair-device-connect-button', | 73 'bluetooth-pair-device-cancel-button', |
74 'bluetooth-pair-device-cancel-button', | 74 'bluetooth-pair-device-accept-button', |
75 'bluetooth-pair-device-accept-button', | 75 'bluetooth-pair-device-reject-button', |
76 'bluetooth-pair-device-reject-button', | 76 'bluetooth-pair-device-dismiss-button' |
77 'bluetooth-pair-device-dismiss-button']; | 77 ]; |
78 | 78 |
79 /** | 79 /** |
80 * Encapsulated handling of the Bluetooth device pairing page. | 80 * Encapsulated handling of the Bluetooth device pairing page. |
81 * @constructor | 81 * @constructor |
82 * @extends {cr.ui.pageManager.Page} | 82 * @extends {cr.ui.pageManager.Page} |
83 */ | 83 */ |
84 function BluetoothPairing() { | 84 function BluetoothPairing() { |
85 Page.call(this, 'bluetoothPairing', | 85 Page.call( |
86 loadTimeData.getString('bluetoothOptionsPageTabTitle'), | 86 this, 'bluetoothPairing', |
87 'bluetooth-pairing'); | 87 loadTimeData.getString('bluetoothOptionsPageTabTitle'), |
| 88 'bluetooth-pairing'); |
88 } | 89 } |
89 | 90 |
90 cr.addSingletonGetter(BluetoothPairing); | 91 cr.addSingletonGetter(BluetoothPairing); |
91 | 92 |
92 BluetoothPairing.prototype = { | 93 BluetoothPairing.prototype = { |
93 __proto__: Page.prototype, | 94 __proto__: Page.prototype, |
94 | 95 |
95 /** | 96 /** |
96 * Device pairing event. | 97 * Device pairing event. |
97 * @type {?BluetoothPairingEvent} | 98 * @type {?BluetoothPairingEvent} |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 var filtered = value.replace(/[^0-9]/g, ''); | 170 var filtered = value.replace(/[^0-9]/g, ''); |
170 if (filtered != value) | 171 if (filtered != value) |
171 inputField.value = filtered; | 172 inputField.value = filtered; |
172 $('bluetooth-pair-device-connect-button').disabled = | 173 $('bluetooth-pair-device-connect-button').disabled = |
173 inputField.value.length == 0; | 174 inputField.value.length == 0; |
174 }; | 175 }; |
175 $('bluetooth-pincode').oninput = function() { | 176 $('bluetooth-pincode').oninput = function() { |
176 $('bluetooth-pair-device-connect-button').disabled = | 177 $('bluetooth-pair-device-connect-button').disabled = |
177 $('bluetooth-pincode').value.length == 0; | 178 $('bluetooth-pincode').value.length == 0; |
178 }; | 179 }; |
179 $('bluetooth-passkey').addEventListener('keydown', | 180 $('bluetooth-passkey') |
180 this.keyDownEventHandler_.bind(this)); | 181 .addEventListener('keydown', this.keyDownEventHandler_.bind(this)); |
181 $('bluetooth-pincode').addEventListener('keydown', | 182 $('bluetooth-pincode') |
182 this.keyDownEventHandler_.bind(this)); | 183 .addEventListener('keydown', this.keyDownEventHandler_.bind(this)); |
183 $('bluetooth-pairing-close-button').addEventListener('click', | 184 $('bluetooth-pairing-close-button') |
184 this.onClose_.bind(this)); | 185 .addEventListener('click', this.onClose_.bind(this)); |
185 }, | 186 }, |
186 | 187 |
187 /** @override */ | 188 /** @override */ |
188 didClosePage: function() { | 189 didClosePage: function() { |
189 if (this.event_ && | 190 if (this.event_ && |
190 this.event_.pairing != BluetoothPairingEventType.DISMISSED && | 191 this.event_.pairing != BluetoothPairingEventType.DISMISSED && |
191 this.event_.pairing != BluetoothPairingEventType.CONNECT_FAILED) { | 192 this.event_.pairing != BluetoothPairingEventType.CONNECT_FAILED) { |
192 this.event_.pairing = BluetoothPairingEventType.CANCELED; | 193 this.event_.pairing = BluetoothPairingEventType.CANCELED; |
193 var options = { | 194 var options = { |
194 device: this.event_.device, | 195 device: this.event_.device, |
195 response: chrome.bluetoothPrivate.PairingResponse.CANCEL | 196 response: chrome.bluetoothPrivate.PairingResponse.CANCEL |
196 }; | 197 }; |
197 chrome.bluetoothPrivate.setPairingResponse(options); | 198 chrome.bluetoothPrivate.setPairingResponse(options); |
198 } | 199 } |
199 }, | 200 }, |
200 | 201 |
201 /** | 202 /** |
202 * Override to prevent showing the overlay if the Bluetooth device details | 203 * Override to prevent showing the overlay if the Bluetooth device details |
203 * have not been specified. Prevents showing an empty dialog if the user | 204 * have not been specified. Prevents showing an empty dialog if the user |
204 * quits and restarts Chrome while in the process of pairing with a device. | 205 * quits and restarts Chrome while in the process of pairing with a device. |
205 * @return {boolean} True if the overlay can be displayed. | 206 * @return {boolean} True if the overlay can be displayed. |
206 */ | 207 */ |
207 canShowPage: function() { | 208 canShowPage: function() { |
208 return !!(this.event_ && this.event_.device.address && | 209 return !!( |
209 this.event_.pairing); | 210 this.event_ && this.event_.device.address && this.event_.pairing); |
210 }, | 211 }, |
211 | 212 |
212 /** | 213 /** |
213 * Sets input focus on the passkey or pincode field if appropriate. | 214 * Sets input focus on the passkey or pincode field if appropriate. |
214 */ | 215 */ |
215 didShowPage: function() { | 216 didShowPage: function() { |
216 if (!$('bluetooth-pincode').hidden) | 217 if (!$('bluetooth-pincode').hidden) |
217 $('bluetooth-pincode').focus(); | 218 $('bluetooth-pincode').focus(); |
218 else if (!$('bluetooth-passkey').hidden) | 219 else if (!$('bluetooth-passkey').hidden) |
219 $('bluetooth-passkey').focus(); | 220 $('bluetooth-passkey').focus(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 } | 269 } |
269 } | 270 } |
270 | 271 |
271 // Update the pairing instructions. | 272 // Update the pairing instructions. |
272 var instructionsEl = assert($('bluetooth-pairing-instructions')); | 273 var instructionsEl = assert($('bluetooth-pairing-instructions')); |
273 this.clearElement_(instructionsEl); | 274 this.clearElement_(instructionsEl); |
274 this.dismissible_ = opt_notDismissible !== true; | 275 this.dismissible_ = opt_notDismissible !== true; |
275 var message = loadTimeData.getString(this.event_.pairing); | 276 var message = loadTimeData.getString(this.event_.pairing); |
276 assert(typeof this.event_.device.name == 'string'); | 277 assert(typeof this.event_.device.name == 'string'); |
277 message = message.replace( | 278 message = message.replace( |
278 '%1', /** @type {string} */(this.event_.device.name)); | 279 '%1', /** @type {string} */ (this.event_.device.name)); |
279 instructionsEl.textContent = message; | 280 instructionsEl.textContent = message; |
280 | 281 |
281 // Update visibility of dialog elements. | 282 // Update visibility of dialog elements. |
282 if (this.event_.passkey) { | 283 if (this.event_.passkey) { |
283 this.updatePasskey_(String(this.event_.passkey)); | 284 this.updatePasskey_(String(this.event_.passkey)); |
284 if (this.event_.pairing == BluetoothPairingEventType.CONFIRM_PASSKEY) { | 285 if (this.event_.pairing == BluetoothPairingEventType.CONFIRM_PASSKEY) { |
285 // Confirming a match between displayed passkeys. | 286 // Confirming a match between displayed passkeys. |
286 this.displayElements_(['bluetooth-pairing-passkey-display', | 287 this.displayElements_([ |
287 'bluetooth-pair-device-accept-button', | 288 'bluetooth-pairing-passkey-display', |
288 'bluetooth-pair-device-reject-button']); | 289 'bluetooth-pair-device-accept-button', |
| 290 'bluetooth-pair-device-reject-button' |
| 291 ]); |
289 $('bluetooth-pair-device-accept-button').disabled = false; | 292 $('bluetooth-pair-device-accept-button').disabled = false; |
290 } else { | 293 } else { |
291 // Remote entering a passkey. | 294 // Remote entering a passkey. |
292 this.displayElements_(['bluetooth-pairing-passkey-display', | 295 this.displayElements_([ |
293 'bluetooth-pair-device-cancel-button']); | 296 'bluetooth-pairing-passkey-display', |
| 297 'bluetooth-pair-device-cancel-button' |
| 298 ]); |
294 } | 299 } |
295 } else if (this.event_.pincode) { | 300 } else if (this.event_.pincode) { |
296 this.updatePasskey_(String(this.event_.pincode)); | 301 this.updatePasskey_(String(this.event_.pincode)); |
297 this.displayElements_(['bluetooth-pairing-passkey-display', | 302 this.displayElements_([ |
298 'bluetooth-pair-device-cancel-button']); | 303 'bluetooth-pairing-passkey-display', |
299 } else if (this.event_.pairing == | 304 'bluetooth-pair-device-cancel-button' |
300 BluetoothPairingEventType.ENTER_PIN_CODE) { | 305 ]); |
| 306 } else if ( |
| 307 this.event_.pairing == BluetoothPairingEventType.ENTER_PIN_CODE) { |
301 // Prompting the user to enter a PIN code. | 308 // Prompting the user to enter a PIN code. |
302 this.displayElements_(['bluetooth-pairing-pincode-entry', | 309 this.displayElements_([ |
303 'bluetooth-pair-device-connect-button', | 310 'bluetooth-pairing-pincode-entry', |
304 'bluetooth-pair-device-cancel-button']); | 311 'bluetooth-pair-device-connect-button', |
| 312 'bluetooth-pair-device-cancel-button' |
| 313 ]); |
305 $('bluetooth-pincode').value = ''; | 314 $('bluetooth-pincode').value = ''; |
306 } else if (this.event_.pairing == | 315 } else if ( |
307 BluetoothPairingEventType.ENTER_PASSKEY) { | 316 this.event_.pairing == BluetoothPairingEventType.ENTER_PASSKEY) { |
308 // Prompting the user to enter a passkey. | 317 // Prompting the user to enter a passkey. |
309 this.displayElements_(['bluetooth-pairing-passkey-entry', | 318 this.displayElements_([ |
310 'bluetooth-pair-device-connect-button', | 319 'bluetooth-pairing-passkey-entry', |
311 'bluetooth-pair-device-cancel-button']); | 320 'bluetooth-pair-device-connect-button', |
| 321 'bluetooth-pair-device-cancel-button' |
| 322 ]); |
312 $('bluetooth-passkey').value = ''; | 323 $('bluetooth-passkey').value = ''; |
313 } else if (this.event_.pairing == BluetoothPairingEventType.CONNECTING) { | 324 } else if (this.event_.pairing == BluetoothPairingEventType.CONNECTING) { |
314 // Starting the pairing process. | 325 // Starting the pairing process. |
315 this.displayElements_(['bluetooth-pair-device-cancel-button']); | 326 this.displayElements_(['bluetooth-pair-device-cancel-button']); |
316 } else { | 327 } else { |
317 // Displaying an error message. | 328 // Displaying an error message. |
318 this.displayElements_(['bluetooth-pair-device-dismiss-button']); | 329 this.displayElements_(['bluetooth-pair-device-dismiss-button']); |
319 } | 330 } |
320 // User is required to enter a passkey or pincode before the connect | 331 // User is required to enter a passkey or pincode before the connect |
321 // button can be enabled. The 'oninput' methods for the input fields | 332 // button can be enabled. The 'oninput' methods for the input fields |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 | 390 |
380 /** | 391 /** |
381 * Formats an element for displaying the passkey or PIN code. | 392 * Formats an element for displaying the passkey or PIN code. |
382 * @param {string} key Passkey or PIN to display. | 393 * @param {string} key Passkey or PIN to display. |
383 */ | 394 */ |
384 updatePasskey_: function(key) { | 395 updatePasskey_: function(key) { |
385 var passkeyEl = assert($('bluetooth-pairing-passkey-display')); | 396 var passkeyEl = assert($('bluetooth-pairing-passkey-display')); |
386 var keyClass = | 397 var keyClass = |
387 (this.event_.pairing == BluetoothPairingEventType.REMOTE_PASSKEY || | 398 (this.event_.pairing == BluetoothPairingEventType.REMOTE_PASSKEY || |
388 this.event_.pairing == BluetoothPairingEventType.REMOTE_PIN_CODE) ? | 399 this.event_.pairing == BluetoothPairingEventType.REMOTE_PIN_CODE) ? |
389 'bluetooth-keyboard-button' : | 400 'bluetooth-keyboard-button' : |
390 'bluetooth-passkey-char'; | 401 'bluetooth-passkey-char'; |
391 this.clearElement_(passkeyEl); | 402 this.clearElement_(passkeyEl); |
392 // Passkey should always have 6 digits. | 403 // Passkey should always have 6 digits. |
393 key = '000000'.substring(0, 6 - key.length) + key; | 404 key = '000000'.substring(0, 6 - key.length) + key; |
394 var progress = this.event_.enteredKey; | 405 var progress = this.event_.enteredKey; |
395 for (var i = 0; i < key.length; i++) { | 406 for (var i = 0; i < key.length; i++) { |
396 var keyEl = document.createElement('span'); | 407 var keyEl = document.createElement('span'); |
397 keyEl.textContent = key.charAt(i); | 408 keyEl.textContent = key.charAt(i); |
398 keyEl.className = keyClass; | 409 keyEl.className = keyClass; |
399 if (progress != undefined) { | 410 if (progress != undefined) { |
400 if (i < progress) | 411 if (i < progress) |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 /** | 533 /** |
523 * Connect request completion callback. | 534 * Connect request completion callback. |
524 * @param {string} address | 535 * @param {string} address |
525 * @param {chrome.bluetoothPrivate.ConnectResultType} result | 536 * @param {chrome.bluetoothPrivate.ConnectResultType} result |
526 */ | 537 */ |
527 BluetoothPairing.connectCompleted_ = function(address, result) { | 538 BluetoothPairing.connectCompleted_ = function(address, result) { |
528 var message; | 539 var message; |
529 if (chrome.runtime.lastError) { | 540 if (chrome.runtime.lastError) { |
530 var errorMessage = chrome.runtime.lastError.message; | 541 var errorMessage = chrome.runtime.lastError.message; |
531 if (errorMessage != 'Connect failed') { | 542 if (errorMessage != 'Connect failed') { |
532 console.error('bluetoothPrivate.connect: Unexpected error for: ' + | 543 console.error( |
533 address + ': ' + errorMessage); | 544 'bluetoothPrivate.connect: Unexpected error for: ' + address + |
| 545 ': ' + errorMessage); |
534 } | 546 } |
535 } | 547 } |
536 switch (result) { | 548 switch (result) { |
537 case chrome.bluetoothPrivate.ConnectResultType.SUCCESS: | 549 case chrome.bluetoothPrivate.ConnectResultType.SUCCESS: |
538 case chrome.bluetoothPrivate.ConnectResultType.ALREADY_CONNECTED: | 550 case chrome.bluetoothPrivate.ConnectResultType.ALREADY_CONNECTED: |
539 BluetoothPairing.dismissDialog(); | 551 BluetoothPairing.dismissDialog(); |
540 return; | 552 return; |
541 case chrome.bluetoothPrivate.ConnectResultType.UNKNOWN_ERROR: | 553 case chrome.bluetoothPrivate.ConnectResultType.UNKNOWN_ERROR: |
542 message = 'bluetoothConnectUnknownError'; | 554 message = 'bluetoothConnectUnknownError'; |
543 break; | 555 break; |
(...skipping 30 matching lines...) Expand all Loading... |
574 var overlay = PageManager.getTopmostVisiblePage(); | 586 var overlay = PageManager.getTopmostVisiblePage(); |
575 var dialog = BluetoothPairing.getInstance(); | 587 var dialog = BluetoothPairing.getInstance(); |
576 if (overlay == dialog && dialog.dismissible_) { | 588 if (overlay == dialog && dialog.dismissible_) { |
577 if (dialog.event_) | 589 if (dialog.event_) |
578 dialog.event_.pairing = BluetoothPairingEventType.DISMISSED; | 590 dialog.event_.pairing = BluetoothPairingEventType.DISMISSED; |
579 PageManager.closeOverlay(); | 591 PageManager.closeOverlay(); |
580 } | 592 } |
581 }; | 593 }; |
582 | 594 |
583 // Export | 595 // Export |
584 return { | 596 return {BluetoothPairing: BluetoothPairing}; |
585 BluetoothPairing: BluetoothPairing | |
586 }; | |
587 }); | 597 }); |
OLD | NEW |