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 /** | 5 /** |
| 6 * @fileoverview Handles braille input keys when the user is typing or editing | 6 * @fileoverview Handles braille input keys when the user is typing or editing |
| 7 * text in an input field. This class cooperates with the Braille IME | 7 * text in an input field. This class cooperates with the Braille IME |
| 8 * that is built into Chrome OS to do the actual text editing. | 8 * that is built into Chrome OS to do the actual text editing. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 68 * @private | 68 * @private |
| 69 */ | 69 */ |
| 70 this.pendingCells_ = []; | 70 this.pendingCells_ = []; |
| 71 /** | 71 /** |
| 72 * @type {cvox.BrailleInputHandler.EntryState_} | 72 * @type {cvox.BrailleInputHandler.EntryState_} |
| 73 * @private | 73 * @private |
| 74 */ | 74 */ |
| 75 this.entryState_ = null; | 75 this.entryState_ = null; |
| 76 | 76 |
| 77 this.translatorManager_.addChangeListener( | 77 this.translatorManager_.addChangeListener( |
| 78 this.clearEntryState_.bind(this)); | 78 this.commitAndClearEntryState_.bind(this)); |
| 79 }; | 79 }; |
| 80 | 80 |
| 81 /** | 81 /** |
| 82 * The ID of the Braille IME extension built into Chrome OS. | 82 * The ID of the Braille IME extension built into Chrome OS. |
| 83 * @const {string} | 83 * @const {string} |
| 84 * @private | 84 * @private |
| 85 */ | 85 */ |
| 86 cvox.BrailleInputHandler.IME_EXTENSION_ID_ = | 86 cvox.BrailleInputHandler.IME_EXTENSION_ID_ = |
| 87 'jddehjeebkoimngcbdkaahpobgicbffp'; | 87 'jddehjeebkoimngcbdkaahpobgicbffp'; |
| 88 | 88 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 144 return this.onBrailleDots_(/** @type {number} */(event.brailleDots)); | 144 return this.onBrailleDots_(/** @type {number} */(event.brailleDots)); |
| 145 } | 145 } |
| 146 // Any other braille command cancels the pending cells. | 146 // Any other braille command cancels the pending cells. |
| 147 this.pendingCells_.length = 0; | 147 this.pendingCells_.length = 0; |
| 148 if (event.command === cvox.BrailleKeyCommand.STANDARD_KEY) { | 148 if (event.command === cvox.BrailleKeyCommand.STANDARD_KEY) { |
| 149 if (event.standardKeyCode === 'Backspace' && | 149 if (event.standardKeyCode === 'Backspace' && |
| 150 !event.altKey && !event.ctrlKey && !event.shiftKey && | 150 !event.altKey && !event.ctrlKey && !event.shiftKey && |
| 151 this.onBackspace_()) { | 151 this.onBackspace_()) { |
| 152 return true; | 152 return true; |
| 153 } else { | 153 } else { |
| 154 this.clearEntryState_(); | 154 this.commitAndClearEntryState_(); |
| 155 this.sendKeyEventPair_(event); | 155 this.sendKeyEventPair_(event); |
| 156 return true; | 156 return true; |
| 157 } | 157 } |
| 158 } | 158 } |
| 159 return false; | 159 return false; |
| 160 }, | 160 }, |
| 161 | 161 |
| 162 /** | 162 /** |
| 163 * Returns how the value of the currently displayed content should be | 163 * Returns how the value of the currently displayed content should be |
| 164 * expanded given the current input state. | 164 * expanded given the current input state. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 202 this.pendingCells_.push(dots); | 202 this.pendingCells_.push(dots); |
| 203 return true; | 203 return true; |
| 204 } | 204 } |
| 205 if (!this.inputContext_) { | 205 if (!this.inputContext_) { |
| 206 return false; | 206 return false; |
| 207 } | 207 } |
| 208 // Avoid accumulating cells forever when typing without moving the cursor | 208 // Avoid accumulating cells forever when typing without moving the cursor |
| 209 // by flushing the input when we see a blank cell. | 209 // by flushing the input when we see a blank cell. |
| 210 // Note that this might switch to contracted if appropriate. | 210 // Note that this might switch to contracted if appropriate. |
| 211 if (this.entryState_ && this.entryState_.lastCellIsBlank()) { | 211 if (this.entryState_ && this.entryState_.lastCellIsBlank()) { |
| 212 this.clearEntryState_(); | 212 this.commitAndClearEntryState_(); |
| 213 } | 213 } |
| 214 if (!this.entryState_) { | 214 if (!this.entryState_) { |
| 215 this.entryState_ = this.createEntryState_(); | 215 this.entryState_ = this.createEntryState_(); |
| 216 if (!this.entryState_) { | 216 if (!this.entryState_) { |
| 217 return false; | 217 return false; |
| 218 } | 218 } |
| 219 } | 219 } |
| 220 this.entryState_.appendCell(dots); | 220 this.entryState_.appendCell(dots); |
| 221 return true; | 221 return true; |
| 222 }, | 222 }, |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 243 * translator available yet). | 243 * translator available yet). |
| 244 * @private | 244 * @private |
| 245 */ | 245 */ |
| 246 createEntryState_: function() { | 246 createEntryState_: function() { |
| 247 var translator = this.translatorManager_.getDefaultTranslator(); | 247 var translator = this.translatorManager_.getDefaultTranslator(); |
| 248 if (!translator) { | 248 if (!translator) { |
| 249 return null; | 249 return null; |
| 250 } | 250 } |
| 251 var uncontractedTranslator = | 251 var uncontractedTranslator = |
| 252 this.translatorManager_.getUncontractedTranslator(); | 252 this.translatorManager_.getUncontractedTranslator(); |
| 253 var useComposition = false; | |
| 253 if (uncontractedTranslator) { | 254 if (uncontractedTranslator) { |
| 254 var textBefore = this.currentTextBefore_; | 255 var textBefore = this.currentTextBefore_; |
| 255 var textAfter = this.currentTextAfter_; | 256 var textAfter = this.currentTextAfter_; |
| 256 if (this.inAlwaysUncontractedContext_() || | 257 if (this.inAlwaysUncontractedContext_() || |
| 257 (textBefore.length > 0 && /\S$/.test(textBefore)) || | 258 (textBefore.length > 0 && /\S$/.test(textBefore)) || |
| 258 (textAfter.length > 0 && /^\S/.test(textAfter))) { | 259 (textAfter.length > 0 && /^\S/.test(textAfter))) { |
| 259 translator = uncontractedTranslator; | 260 translator = uncontractedTranslator; |
| 261 } else { | |
| 262 useComposition = true; | |
| 260 } | 263 } |
| 261 } | 264 } |
| 262 | 265 |
| 263 return new cvox.BrailleInputHandler.EditsEntryState_(this, translator); | 266 useComposition = false; |
|
David Tseng
2015/03/30 17:13:44
This looks wrong.
| |
| 267 if (useComposition) { | |
| 268 return new cvox.BrailleInputHandler.CompositionEntryState_( | |
| 269 this, translator); | |
| 270 } else { | |
| 271 return new cvox.BrailleInputHandler.EditsEntryState_( | |
| 272 this, translator); | |
| 273 } | |
| 264 }, | 274 }, |
| 265 | 275 |
| 266 /** | 276 /** |
| 277 * Commits the current entry state and clears it, if any. | |
| 278 * @private | |
| 279 */ | |
| 280 commitAndClearEntryState_: function() { | |
| 281 if (this.entryState_) { | |
| 282 this.entryState_.commit(); | |
| 283 this.clearEntryState_(); | |
| 284 } | |
| 285 }, | |
| 286 | |
| 287 /** | |
| 267 * Clears the current entry state without comitting it. | 288 * Clears the current entry state without comitting it. |
| 268 * @private | 289 * @private |
| 269 */ | 290 */ |
| 270 clearEntryState_: function() { | 291 clearEntryState_: function() { |
| 271 if (this.entryState_) { | 292 if (this.entryState_) { |
| 272 this.entryState_.inputHandler_ = null; | 293 this.entryState_.inputHandler_ = null; |
| 273 this.entryState_ = null; | 294 this.entryState_ = null; |
| 274 } | 295 } |
| 275 }, | 296 }, |
| 276 | 297 |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 488 // Delete all previous expected changes and ignore this one. | 509 // Delete all previous expected changes and ignore this one. |
| 489 this.pendingTextsBefore_.splice(0, i + 1); | 510 this.pendingTextsBefore_.splice(0, i + 1); |
| 490 return; | 511 return; |
| 491 } | 512 } |
| 492 } | 513 } |
| 493 // There was an actual text change (or cursor movement) that we hadn't | 514 // There was an actual text change (or cursor movement) that we hadn't |
| 494 // caused ourselves, reset any pending input. | 515 // caused ourselves, reset any pending input. |
| 495 this.inputHandler_.clearEntryState_(); | 516 this.inputHandler_.clearEntryState_(); |
| 496 }, | 517 }, |
| 497 | 518 |
| 519 /** | |
| 520 * Makes sure the current text is permanently added to the edit field. | |
| 521 * After this call, this object should be abandoned. | |
| 522 */ | |
| 523 commit: function() { | |
| 524 }, | |
| 525 | |
| 498 /** @return {boolean} */ | 526 /** @return {boolean} */ |
| 499 lastCellIsBlank: function() { | 527 lastCellIsBlank: function() { |
| 500 return this.cells_[this.cells_.length - 1] === 0; | 528 return this.cells_[this.cells_.length - 1] === 0; |
| 501 }, | 529 }, |
| 502 | 530 |
| 503 /** | 531 /** |
| 504 * Updates the translated text based on the current cells and sends the | 532 * Updates the translated text based on the current cells and sends the |
| 505 * delta to the IME. | 533 * delta to the IME. |
| 506 * @private | 534 * @private |
| 507 */ | 535 */ |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 575 } | 603 } |
| 576 // Send the replace operation to be performed asynchronously by the IME. | 604 // Send the replace operation to be performed asynchronously by the IME. |
| 577 this.inputHandler_.postImeMessage_( | 605 this.inputHandler_.postImeMessage_( |
| 578 {type: 'replaceText', | 606 {type: 'replaceText', |
| 579 contextID: this.inputHandler_.inputContext_.contextID, | 607 contextID: this.inputHandler_.inputContext_.contextID, |
| 580 deleteBefore: deleteLength, | 608 deleteBefore: deleteLength, |
| 581 newText: toInsert}); | 609 newText: toInsert}); |
| 582 } | 610 } |
| 583 } | 611 } |
| 584 }; | 612 }; |
| 613 | |
| 614 /** | |
| 615 * Entry state that uses the IME composition API to update the edit field. | |
| 616 * @param {!cvox.BrailleInputHandler} inputHandler | |
| 617 * @param {!cvox.LibLouis.Translator} translator | |
| 618 * @constructor | |
| 619 * @private | |
| 620 * @extends {cvox.BrailleInputHandler.EntryState_} | |
| 621 */ | |
| 622 cvox.BrailleInputHandler.CompositionEntryState_ = function( | |
| 623 inputHandler, translator) { | |
| 624 cvox.BrailleInputHandler.EntryState_.call(this, inputHandler, translator); | |
| 625 }; | |
| 626 | |
| 627 cvox.BrailleInputHandler.CompositionEntryState_.prototype = { | |
| 628 __proto__: cvox.BrailleInputHandler.EntryState_, | |
| 629 | |
| 630 /** @override */ | |
| 631 commit: function() { | |
| 632 this.inputHandler_.postImeMessage_( | |
| 633 {type: 'commitComposition', | |
| 634 contextID: this.inputHandler_.inputContext_.contextID}); | |
| 635 }, | |
| 636 | |
| 637 /** @override */ | |
| 638 sendTextChange_: function(newText) { | |
| 639 var currentTextBefore = this.inputHandler_.currentTextBefore_; | |
| 640 var oldText = this.text_; | |
| 641 this.pendingTextsBefore_.push(currentTextBefore.substring( | |
| 642 0, currentTextBefore.length - oldText.length) + newText); | |
| 643 this.inputHandler_.postImeMessage_( | |
| 644 {type: 'setComposition', | |
| 645 contextID: this.inputHandler_.inputContext_.contextID, | |
| 646 text: newText}); | |
| 647 } | |
| 648 }; | |
| OLD | NEW |