Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 'use strict'; | 5 'use strict'; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * @fileoverview Braille hardware keyboard input method. | 8 * @fileoverview Braille hardware keyboard input method. |
| 9 * | 9 * |
| 10 * This method is automatically enabled when a braille display is connected | 10 * This method is automatically enabled when a braille display is connected |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 */ | 123 */ |
| 124 engineID_: '', | 124 engineID_: '', |
| 125 | 125 |
| 126 /** | 126 /** |
| 127 * The port used to communicate with ChromeVox. | 127 * The port used to communicate with ChromeVox. |
| 128 * @type {Port} port_ | 128 * @type {Port} port_ |
| 129 * @private | 129 * @private |
| 130 */ | 130 */ |
| 131 port_: null, | 131 port_: null, |
| 132 | 132 |
| 133 // state of the current composition, if any. This is kep here so that | |
| 134 // the composition can be committed on key presses. | |
| 135 | |
| 136 /** @type {number} */ | |
|
David Tseng
2015/03/30 17:13:44
nit: @private; also, perhaps combine these two mem
| |
| 137 compositionContextID_: 0, | |
| 138 | |
| 139 /** @type {string} */ | |
| 140 compositionText_: '', | |
| 141 | |
| 133 /** | 142 /** |
| 134 * Registers event listeners in the chrome IME API. | 143 * Registers event listeners in the chrome IME API. |
| 135 */ | 144 */ |
| 136 init: function() { | 145 init: function() { |
| 137 chrome.input.ime.onActivate.addListener(this.onActivate_.bind(this)); | 146 chrome.input.ime.onActivate.addListener(this.onActivate_.bind(this)); |
| 138 chrome.input.ime.onDeactivated.addListener(this.onDeactivated_.bind(this)); | 147 chrome.input.ime.onDeactivated.addListener(this.onDeactivated_.bind(this)); |
| 139 chrome.input.ime.onFocus.addListener(this.onFocus_.bind(this)); | 148 chrome.input.ime.onFocus.addListener(this.onFocus_.bind(this)); |
| 140 chrome.input.ime.onBlur.addListener(this.onBlur_.bind(this)); | 149 chrome.input.ime.onBlur.addListener(this.onBlur_.bind(this)); |
| 141 chrome.input.ime.onInputContextUpdate.addListener( | 150 chrome.input.ime.onInputContextUpdate.addListener( |
| 142 this.onInputContextUpdate_.bind(this)); | 151 this.onInputContextUpdate_.bind(this)); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 210 | 219 |
| 211 /** | 220 /** |
| 212 * Called by the system when this IME is active and a key event is generated. | 221 * Called by the system when this IME is active and a key event is generated. |
| 213 * @param {string} engineID Engine ID, should be 'braille'. | 222 * @param {string} engineID Engine ID, should be 'braille'. |
| 214 * @param {!ChromeKeyboardEvent} event The keyboard event. | 223 * @param {!ChromeKeyboardEvent} event The keyboard event. |
| 215 * @private | 224 * @private |
| 216 */ | 225 */ |
| 217 onKeyEvent_: function(engineID, event) { | 226 onKeyEvent_: function(engineID, event) { |
| 218 var result = this.processKey_(event); | 227 var result = this.processKey_(event); |
| 219 if (result !== undefined) { | 228 if (result !== undefined) { |
| 220 chrome.input.ime.keyEventHandled(event.requestId, result); | 229 this.keyEventHandled_(event.requestId, event.type, result); |
| 221 } | 230 } |
| 222 }, | 231 }, |
| 223 | 232 |
| 224 /** | 233 /** |
| 225 * Called when chrome ends the current text input session. | 234 * Called when chrome ends the current text input session. |
| 226 * @param {string} engineID Engine ID, should be 'braille'. | 235 * @param {string} engineID Engine ID, should be 'braille'. |
| 227 * @private | 236 * @private |
| 228 */ | 237 */ |
| 229 onReset_: function(engineID) { | 238 onReset_: function(engineID) { |
| 230 this.log_('onReset', engineID); | 239 this.log_('onReset', engineID); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 * @type {{contextID: number, deleteBefore: number, | 358 * @type {{contextID: number, deleteBefore: number, |
| 350 * newText: string}} | 359 * newText: string}} |
| 351 */ | 360 */ |
| 352 (message); | 361 (message); |
| 353 this.replaceText_(message.contextID, message.deleteBefore, | 362 this.replaceText_(message.contextID, message.deleteBefore, |
| 354 message.newText); | 363 message.newText); |
| 355 break; | 364 break; |
| 356 case 'keyEventHandled': | 365 case 'keyEventHandled': |
| 357 message = | 366 message = |
| 358 /** @type {{requestId: string, result: boolean}} */ (message); | 367 /** @type {{requestId: string, result: boolean}} */ (message); |
| 359 chrome.input.ime.keyEventHandled(message.requestId, message.result); | 368 this.keyEventHandled_(message.requestId, 'keydown', message.result); |
| 369 break; | |
| 370 case 'setComposition': | |
| 371 message = | |
| 372 /** @type {{contextID: number, text: string}} */ (message); | |
| 373 this.setComposition_(message.contextID, message.text); | |
| 374 break; | |
| 375 case 'commitComposition': | |
| 376 message = | |
| 377 /** @type {{contextID: number}} */ (message); | |
| 378 this.commitComposition_(message.contextID); | |
| 360 break; | 379 break; |
| 361 default: | 380 default: |
| 362 console.error('Unknown message from ChromeVox: ' + | 381 console.error('Unknown message from ChromeVox: ' + |
| 363 JSON.stringify(message)); | 382 JSON.stringify(message)); |
| 364 break; | 383 break; |
| 365 } | 384 } |
| 366 }, | 385 }, |
| 367 | 386 |
| 368 /** | 387 /** |
| 369 * Handles a disconnect event from the ChromeVox side. | 388 * Handles a disconnect event from the ChromeVox side. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 423 // deleteSurroundingText works correctly. | 442 // deleteSurroundingText works correctly. |
| 424 chrome.input.ime.deleteSurroundingText( | 443 chrome.input.ime.deleteSurroundingText( |
| 425 {engineID: this.engineID_, contextID: contextID, | 444 {engineID: this.engineID_, contextID: contextID, |
| 426 offset: 0, length: 0}, deleteText); | 445 offset: 0, length: 0}, deleteText); |
| 427 } else { | 446 } else { |
| 428 addText(); | 447 addText(); |
| 429 } | 448 } |
| 430 }, | 449 }, |
| 431 | 450 |
| 432 /** | 451 /** |
| 452 * Responds to an asynchronous key event, indicating whether it was handled | |
| 453 * or not. If it wasn't handled, any outstanding composition text is | |
| 454 * committed before sending the response to the IME API. | |
| 455 * @param {string} requestId Key even request id. | |
|
David Tseng
2015/03/30 17:13:44
nit: Key event
| |
| 456 * @param {string} type Type of key event being responded to. | |
| 457 * @param {boolean} response Wether the IME handled theevent. | |
|
David Tseng
2015/03/30 17:13:44
nit: whether ... the event
| |
| 458 */ | |
| 459 keyEventHandled_: function(requestId, type, response) { | |
| 460 if (!response && type === 'keydown' && this.compositionText_) { | |
| 461 this.commitComposition_(); | |
| 462 this.sendToChromeVox_({type: 'reset'}); | |
| 463 } | |
| 464 chrome.input.ime.keyEventHandled(requestId, response); | |
| 465 }, | |
| 466 | |
| 467 /** | |
| 468 * Calls the correspnding IME API function and stores the current | |
|
David Tseng
2015/03/30 17:13:44
nit: corresponding
| |
| 469 * composition. | |
| 470 * @param {number} contextID | |
| 471 * @param {string} text | |
| 472 */ | |
| 473 setComposition_: function(contextID, text) { | |
| 474 chrome.input.ime.setComposition({contextID: contextID, | |
| 475 text: text, | |
| 476 cursor: text.length}); | |
| 477 this.compositionContextID_ = contextID; | |
| 478 this.compositionText_ = text; | |
| 479 }, | |
| 480 | |
| 481 /** | |
| 482 * Commits the last set composition if it mathces the given context id. | |
|
David Tseng
2015/03/30 17:13:44
nit: matches
| |
| 483 * @param {number=} opt_contextID | |
| 484 */ | |
| 485 commitComposition_: function(opt_contextID) { | |
| 486 if (opt_contextID === undefined || | |
|
David Tseng
2015/03/30 17:13:44
Why is this optional?
| |
| 487 opt_contextID === this.compositionContextID_) { | |
| 488 chrome.input.ime.commitText({contextID: this.compositionContextID_, | |
| 489 text: this.compositionText_}); | |
| 490 } | |
| 491 this.compositionText_ = ''; | |
| 492 this.compositionContextID_ = 0; | |
| 493 }, | |
| 494 | |
| 495 /** | |
| 433 * Updates the menu items for this IME. | 496 * Updates the menu items for this IME. |
| 434 */ | 497 */ |
| 435 updateMenuItems_: function() { | 498 updateMenuItems_: function() { |
| 436 // TODO(plundblad): Localize when translations available. | 499 // TODO(plundblad): Localize when translations available. |
| 437 chrome.input.ime.setMenuItems( | 500 chrome.input.ime.setMenuItems( |
| 438 {engineID: this.engineID_, | 501 {engineID: this.engineID_, |
| 439 items: [ | 502 items: [ |
| 440 { | 503 { |
| 441 id: this.USE_STANDARD_KEYBOARD_ID, | 504 id: this.USE_STANDARD_KEYBOARD_ID, |
| 442 label: 'Use standard keyboard for braille', | 505 label: 'Use standard keyboard for braille', |
| 443 style: 'check', | 506 style: 'check', |
| 444 visible: true, | 507 visible: true, |
| 445 checked: this.useStandardKeyboard_, | 508 checked: this.useStandardKeyboard_, |
| 446 enabled: true | 509 enabled: true |
| 447 } | 510 } |
| 448 ] | 511 ] |
| 449 }); | 512 }); |
| 450 } | 513 } |
| 451 }; | 514 }; |
| OLD | NEW |