Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(166)

Side by Side Diff: chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js

Issue 2132123002: Complete table support in ChromeVox Next. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 ChromeVox commands. 6 * @fileoverview ChromeVox commands.
7 */ 7 */
8 8
9 goog.provide('CommandHandler'); 9 goog.provide('CommandHandler');
10 10
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 if (!ChromeVoxState.instance.currentRange_) 191 if (!ChromeVoxState.instance.currentRange_)
192 return true; 192 return true;
193 193
194 // Next/compat commands hereafter. 194 // Next/compat commands hereafter.
195 if (ChromeVoxState.instance.mode == ChromeVoxMode.CLASSIC) return true; 195 if (ChromeVoxState.instance.mode == ChromeVoxMode.CLASSIC) return true;
196 196
197 var current = ChromeVoxState.instance.currentRange_; 197 var current = ChromeVoxState.instance.currentRange_;
198 var dir = Dir.FORWARD; 198 var dir = Dir.FORWARD;
199 var pred = null; 199 var pred = null;
200 var predErrorMsg = undefined; 200 var predErrorMsg = undefined;
201 var rootPred = AutomationPredicate.root;
201 var speechProps = {}; 202 var speechProps = {};
202 switch (command) { 203 switch (command) {
203 case 'nextCharacter': 204 case 'nextCharacter':
204 speechProps['phoneticCharacters'] = true; 205 speechProps['phoneticCharacters'] = true;
205 current = current.move(cursors.Unit.CHARACTER, Dir.FORWARD); 206 current = current.move(cursors.Unit.CHARACTER, Dir.FORWARD);
206 break; 207 break;
207 case 'previousCharacter': 208 case 'previousCharacter':
208 speechProps['phoneticCharacters'] = true; 209 speechProps['phoneticCharacters'] = true;
209 current = current.move(cursors.Unit.CHARACTER, Dir.BACKWARD); 210 current = current.move(cursors.Unit.CHARACTER, Dir.BACKWARD);
210 break; 211 break;
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 new cursors.Cursor(root.focusObject, root.focusOffset)); 460 new cursors.Cursor(root.focusObject, root.focusOffset));
460 var o = new Output() 461 var o = new Output()
461 .format('@end_selection') 462 .format('@end_selection')
462 .withSpeechAndBraille(sel, sel, Output.EventType.NAVIGATE) 463 .withSpeechAndBraille(sel, sel, Output.EventType.NAVIGATE)
463 .go(); 464 .go();
464 } 465 }
465 ChromeVoxState.instance.pageSel_ = null; 466 ChromeVoxState.instance.pageSel_ = null;
466 return false; 467 return false;
467 } 468 }
468 break; 469 break;
470 case 'fullyDescribe':
471 var o = new Output();
472 o.withContextFirst()
473 .withRichSpeechAndBraille(current, null, Output.EventType.NAVIGATE)
474 .go();
475 return false;
476
477 // Table commands.
478 case 'previousRow':
479 dir = Dir.BACKWARD;
480 var tableOpts = {row: true, dir: dir};
481 pred = AutomationPredicate.makeTableCellPredicate(
482 current.start.node, tableOpts);
483 predErrorMsg = 'no_cell_above';
484 rootPred = AutomationPredicate.table;
485 break;
486 case 'previousCol':
487 dir = Dir.BACKWARD;
488 var tableOpts = {col: true, dir: dir};
489 pred = AutomationPredicate.makeTableCellPredicate(
490 current.start.node, tableOpts);
491 predErrorMsg = 'no_cell_left';
492 rootPred = AutomationPredicate.row;
493 break;
494 case 'nextRow':
495 dir = Dir.FORWARD;
496 var tableOpts = {row: true, dir: dir};
497 pred = AutomationPredicate.makeTableCellPredicate(
498 current.start.node, tableOpts);
499 predErrorMsg = 'no_cell_below';
500 rootPred = AutomationPredicate.table;
501 break;
502 case 'nextCol':
503 dir = Dir.FORWARD;
504 var tableOpts = {col: true, dir: dir};
505 pred = AutomationPredicate.makeTableCellPredicate(
506 current.start.node, tableOpts);
507 predErrorMsg = 'no_cell_right';
508 rootPred = AutomationPredicate.row;
509 break;
510 case 'goToRowFirstCell':
511 case 'goToRowLastCell':
512 var node = current.start.node;
513 while (node && node.role != RoleType.row)
514 node = node.parent;
515 if (!node)
516 break;
517 var end = AutomationUtil.findNodePost(node,
518 command == 'goToRowLastCell' ? Dir.BACKWARD : Dir.FORWARD,
519 AutomationPredicate.leaf);
520 if (end)
521 current = cursors.Range.fromNode(end);
522 break;
523 case 'goToColFirstCell':
524 dir = Dir.FORWARD;
525 var node = current.start.node;
526 while (node && node.role != RoleType.table)
527 node = node.parent;
528 if (!node || !node.firstChild)
529 return false;
530 var tableOpts = {col: true, dir: dir, end: true};
531 pred = AutomationPredicate.makeTableCellPredicate(
532 current.start.node, tableOpts);
533 current = cursors.Range.fromNode(node.firstChild);
534 // Should not be outputted.
535 predErrorMsg = 'no_cell_above';
536 rootPred = AutomationPredicate.table;
537 break;
538 case 'goToColLastCell':
539 dir = Dir.BACKWARD;
540 var node = current.start.node;
541 while (node && node.role != RoleType.table)
542 node = node.parent;
543 if (!node || !node.lastChild)
544 return false;
545 var tableOpts = {col: true, dir: dir, end: true};
546 pred = AutomationPredicate.makeTableCellPredicate(
547 current.start.node, tableOpts);
548 current = cursors.Range.fromNode(node.lastChild);
549 // Should not be outputted.
550 predErrorMsg = 'no_cell_below';
551 rootPred = AutomationPredicate.table;
552 break;
553 case 'goToFirstCell':
554 case 'goToLastCell':
555 node = current.start.node;
556 while (node && node.role != RoleType.table)
557 node = node.parent;
558 if (!node)
559 break;
560 var end = AutomationUtil.findNodePost(node,
561 command == 'goToLastCell' ? Dir.BACKWARD : Dir.FORWARD,
562 AutomationPredicate.leaf);
563 if (end)
564 current = cursors.Range.fromNode(end);
565 break;
469 default: 566 default:
470 return true; 567 return true;
471 } 568 }
472 569
473 if (pred) { 570 if (pred) {
474 var bound = current.getBound(dir).node; 571 var bound = current.getBound(dir).node;
475 if (bound) { 572 if (bound) {
476 var node = AutomationUtil.findNextNode( 573 var node = AutomationUtil.findNextNode(
477 bound, dir, pred, {skipInitialAncestry: true}); 574 bound, dir, pred, {skipInitialAncestry: true});
478 575
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 break; 640 break;
544 } 641 }
545 if (announcement) { 642 if (announcement) {
546 cvox.ChromeVox.tts.speak( 643 cvox.ChromeVox.tts.speak(
547 announcement, cvox.QueueMode.FLUSH, 644 announcement, cvox.QueueMode.FLUSH,
548 cvox.AbstractTts.PERSONALITY_ANNOTATION); 645 cvox.AbstractTts.PERSONALITY_ANNOTATION);
549 } 646 }
550 }; 647 };
551 648
552 }); // goog.scope 649 }); // goog.scope
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698