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 The entry point for all ChromeVox2 related code for the | 6 * @fileoverview The entry point for all ChromeVox2 related code for the |
7 * background page. | 7 * background page. |
8 */ | 8 */ |
9 | 9 |
10 goog.provide('Background'); | 10 goog.provide('Background'); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 focus: this.onFocus, | 82 focus: this.onFocus, |
83 hover: this.onEventDefault, | 83 hover: this.onEventDefault, |
84 loadComplete: this.onLoadComplete, | 84 loadComplete: this.onLoadComplete, |
85 menuStart: this.onEventDefault, | 85 menuStart: this.onEventDefault, |
86 menuEnd: this.onEventDefault, | 86 menuEnd: this.onEventDefault, |
87 textChanged: this.onTextOrTextSelectionChanged, | 87 textChanged: this.onTextOrTextSelectionChanged, |
88 textSelectionChanged: this.onTextOrTextSelectionChanged, | 88 textSelectionChanged: this.onTextOrTextSelectionChanged, |
89 valueChanged: this.onValueChanged | 89 valueChanged: this.onValueChanged |
90 }; | 90 }; |
91 | 91 |
| 92 /** |
| 93 * The object that speaks changes to an editable text field. |
| 94 * @type {?cvox.ChromeVoxEditableTextBase} |
| 95 */ |
| 96 this.editableTextHandler_ = null; |
| 97 |
92 chrome.automation.getDesktop(this.onGotDesktop); | 98 chrome.automation.getDesktop(this.onGotDesktop); |
93 | 99 |
94 // Handle messages directed to the Next background page. | 100 // Handle messages directed to the Next background page. |
95 cvox.ExtensionBridge.addMessageListener(function(msg, port) { | 101 cvox.ExtensionBridge.addMessageListener(function(msg, port) { |
96 var target = msg['target']; | 102 var target = msg['target']; |
97 var action = msg['action']; | 103 var action = msg['action']; |
98 | 104 |
99 switch (target) { | 105 switch (target) { |
100 case 'next': | 106 case 'next': |
101 if (action == 'getIsClassicEnabled') { | 107 if (action == 'getIsClassicEnabled') { |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 Dir.FORWARD, | 470 Dir.FORWARD, |
465 AutomationPredicate.focused) || node; | 471 AutomationPredicate.focused) || node; |
466 | 472 |
467 // Fall back to the first leaf node in the document. | 473 // Fall back to the first leaf node in the document. |
468 if (node.role == RoleType.rootWebArea) { | 474 if (node.role == RoleType.rootWebArea) { |
469 node = AutomationUtil.findNodePost(node, | 475 node = AutomationUtil.findNodePost(node, |
470 Dir.FORWARD, | 476 Dir.FORWARD, |
471 AutomationPredicate.leaf); | 477 AutomationPredicate.leaf); |
472 } | 478 } |
473 } | 479 } |
| 480 |
| 481 if (evt.target.role == RoleType.textField) |
| 482 this.createEditableTextHandlerIfNeeded_(evt.target); |
| 483 |
474 this.onEventDefault({target: node, type: 'focus'}); | 484 this.onEventDefault({target: node, type: 'focus'}); |
475 }, | 485 }, |
476 | 486 |
477 /** | 487 /** |
478 * Provides all feedback once a load complete event fires. | 488 * Provides all feedback once a load complete event fires. |
479 * @param {Object} evt | 489 * @param {Object} evt |
480 */ | 490 */ |
481 onLoadComplete: function(evt) { | 491 onLoadComplete: function(evt) { |
482 this.setupChromeVoxVariants_(evt.target.docUrl); | 492 this.setupChromeVoxVariants_(evt.target.docUrl); |
483 | 493 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 return; | 536 return; |
527 | 537 |
528 if (!evt.target.state.focused) | 538 if (!evt.target.state.focused) |
529 return; | 539 return; |
530 | 540 |
531 if (!this.currentRange_) { | 541 if (!this.currentRange_) { |
532 this.onEventDefault(evt); | 542 this.onEventDefault(evt); |
533 this.currentRange_ = cursors.Range.fromNode(evt.target); | 543 this.currentRange_ = cursors.Range.fromNode(evt.target); |
534 } | 544 } |
535 | 545 |
| 546 this.createEditableTextHandlerIfNeeded_(evt.target); |
536 var textChangeEvent = new cvox.TextChangeEvent( | 547 var textChangeEvent = new cvox.TextChangeEvent( |
537 evt.target.value, | 548 evt.target.value, |
538 evt.target.textSelStart, | 549 evt.target.textSelStart, |
539 evt.target.textSelEnd, | 550 evt.target.textSelEnd, |
540 true); // triggered by user | 551 true); // triggered by user |
541 if (!this.editableTextHandler || | |
542 evt.target != this.currentRange_.start.node) { | |
543 this.editableTextHandler = | |
544 new cvox.ChromeVoxEditableTextBase( | |
545 textChangeEvent.value, | |
546 textChangeEvent.start, | |
547 textChangeEvent.end, | |
548 evt.target.state['protected'], | |
549 cvox.ChromeVox.tts); | |
550 | 552 |
551 // Ignore the first text selection changed event which gets fired after | 553 this.editableTextHandler_.changed(textChangeEvent); |
552 // the focus event. | |
553 return; | |
554 } | |
555 | 554 |
556 this.editableTextHandler.changed(textChangeEvent); | |
557 new Output().withBraille( | 555 new Output().withBraille( |
558 this.currentRange_, null, evt.type) | 556 this.currentRange_, null, evt.type) |
559 .go(); | 557 .go(); |
560 }, | 558 }, |
561 | 559 |
562 /** | 560 /** |
563 * Provides all feedback once a value changed event fires. | 561 * Provides all feedback once a value changed event fires. |
564 * @param {Object} evt | 562 * @param {Object} evt |
565 */ | 563 */ |
566 onValueChanged: function(evt) { | 564 onValueChanged: function(evt) { |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 }); | 736 }); |
739 if (!actionNode) | 737 if (!actionNode) |
740 return; | 738 return; |
741 if (actionNode.role === RoleType.inlineTextBox) | 739 if (actionNode.role === RoleType.inlineTextBox) |
742 actionNode = actionNode.parent; | 740 actionNode = actionNode.parent; |
743 actionNode.doDefault(); | 741 actionNode.doDefault(); |
744 if (selectionSpan) { | 742 if (selectionSpan) { |
745 var start = text.getSpanStart(selectionSpan); | 743 var start = text.getSpanStart(selectionSpan); |
746 actionNode.setSelection(position - start, position - start); | 744 actionNode.setSelection(position - start, position - start); |
747 } | 745 } |
| 746 }, |
| 747 |
| 748 /** |
| 749 * Create an editable text handler for the given node if needed. |
| 750 * @param {Object} node |
| 751 */ |
| 752 createEditableTextHandlerIfNeeded_: function(node) { |
| 753 if (!this.editableTextHandler_ || node != this.currentRange_.start.node) { |
| 754 var start = node.textSelStart; |
| 755 var end = node.textSelEnd; |
| 756 if (start > end) { |
| 757 var tempOffset = end; |
| 758 end = start; |
| 759 start = tempOffset; |
| 760 } |
| 761 |
| 762 this.editableTextHandler_ = |
| 763 new cvox.ChromeVoxEditableTextBase( |
| 764 node.value, |
| 765 start, |
| 766 end, |
| 767 node.state.protected, |
| 768 cvox.ChromeVox.tts); |
| 769 } |
748 } | 770 } |
749 }; | 771 }; |
750 | 772 |
751 /** @type {Background} */ | 773 /** @type {Background} */ |
752 global.backgroundObj = new Background(); | 774 global.backgroundObj = new Background(); |
753 | 775 |
754 }); // goog.scope | 776 }); // goog.scope |
OLD | NEW |