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 // Include test fixture. | 5 // Include test fixture. |
6 GEN_INCLUDE(['../../testing/chromevox_next_e2e_test_base.js', | 6 GEN_INCLUDE(['../../testing/chromevox_next_e2e_test_base.js', |
7 '../../testing/assert_additions.js']); | 7 '../../testing/assert_additions.js']); |
8 | 8 |
9 GEN_INCLUDE(['../../testing/mock_feedback.js']); | 9 GEN_INCLUDE(['../../testing/mock_feedback.js']); |
10 | 10 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 <option> banana</option> | 67 <option> banana</option> |
68 </select> | 68 </select> |
69 */}, | 69 */}, |
70 | 70 |
71 iframesDoc: function() {/*! | 71 iframesDoc: function() {/*! |
72 <p>start</p> | 72 <p>start</p> |
73 <button>Before</button> | 73 <button>Before</button> |
74 <iframe srcdoc="<button>Inside</button>"></iframe> | 74 <iframe srcdoc="<button>Inside</button>"></iframe> |
75 <button>After</button> | 75 <button>After</button> |
76 */}, | 76 */}, |
| 77 |
| 78 disappearingObjectDoc: function() {/*! |
| 79 <p>start</p> |
| 80 <article> |
| 81 <p>Before1</p> |
| 82 <p>Before2</p> |
| 83 <p>Before3</p> |
| 84 </article> |
| 85 <article> |
| 86 <p id="disappearing">Disappearing</p> |
| 87 </article> |
| 88 <article> |
| 89 <p>After1</p> |
| 90 <p>After2</p> |
| 91 <p>After3</p> |
| 92 </article> |
| 93 </div> |
| 94 <div id="live" aria-live="polite"></div> |
| 95 <div id="delete" role="button">Delete</div> |
| 96 <script> |
| 97 document.getElementById('delete').addEventListener('click', function() { |
| 98 var d = document.getElementById('disappearing'); |
| 99 d.parentElement.removeChild(d); |
| 100 document.getElementById('live').innerText = 'Deleted'; |
| 101 }); |
| 102 </script> |
| 103 */}, |
77 }; | 104 }; |
78 | 105 |
79 /** Tests that ChromeVox classic is in this context. */ | 106 /** Tests that ChromeVox classic is in this context. */ |
80 SYNC_TEST_F('BackgroundTest', 'ClassicNamespaces', function() { | 107 SYNC_TEST_F('BackgroundTest', 'ClassicNamespaces', function() { |
81 assertEquals('object', typeof(cvox)); | 108 assertEquals('object', typeof(cvox)); |
82 assertEquals('function', typeof(cvox.ChromeVoxBackground)); | 109 assertEquals('function', typeof(cvox.ChromeVoxBackground)); |
83 }); | 110 }); |
84 | 111 |
85 /** Tests that ChromeVox next is in this context. */ | 112 /** Tests that ChromeVox next is in this context. */ |
86 SYNC_TEST_F('BackgroundTest', 'NextNamespaces', function() { | 113 SYNC_TEST_F('BackgroundTest', 'NextNamespaces', function() { |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 .expectSpeech('a') | 259 .expectSpeech('a') |
233 .expectSpeech('Link'); | 260 .expectSpeech('Link'); |
234 mockFeedback.replay(); | 261 mockFeedback.replay(); |
235 }); | 262 }); |
236 }); | 263 }); |
237 | 264 |
238 TEST_F('BackgroundTest', 'AriaLabel', function() { | 265 TEST_F('BackgroundTest', 'AriaLabel', function() { |
239 var mockFeedback = this.createMockFeedback(); | 266 var mockFeedback = this.createMockFeedback(); |
240 this.runWithLoadedTree('<a aria-label="foo" href="a">a</a>', | 267 this.runWithLoadedTree('<a aria-label="foo" href="a">a</a>', |
241 function(rootNode) { | 268 function(rootNode) { |
242 rootNode.find({role: 'link'}).focus(); | 269 rootNode.find({role: RoleType.link}).focus(); |
243 mockFeedback.expectSpeech('foo') | 270 mockFeedback.expectSpeech('foo') |
244 .expectSpeech('Link') | 271 .expectSpeech('Link') |
245 .expectBraille('foo lnk'); | 272 .expectBraille('foo lnk'); |
246 mockFeedback.replay(); | 273 mockFeedback.replay(); |
247 } | 274 } |
248 ); | 275 ); |
249 }); | 276 }); |
250 | 277 |
251 TEST_F('BackgroundTest', 'ShowContextMenu', function() { | 278 TEST_F('BackgroundTest', 'ShowContextMenu', function() { |
252 var mockFeedback = this.createMockFeedback(); | 279 var mockFeedback = this.createMockFeedback(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 <p>Some more text</p> | 313 <p>Some more text</p> |
287 <input type="text" id ="text" value="Edit me"> | 314 <input type="text" id ="text" value="Edit me"> |
288 <script> | 315 <script> |
289 document.getElementById('btn1').addEventListener('click', function() { | 316 document.getElementById('btn1').addEventListener('click', function() { |
290 document.getElementById('btn2').focus(); | 317 document.getElementById('btn2').focus(); |
291 }, false); | 318 }, false); |
292 </script> | 319 </script> |
293 */}, | 320 */}, |
294 function(rootNode) { | 321 function(rootNode) { |
295 var button1 = rootNode.find({role: RoleType.button, | 322 var button1 = rootNode.find({role: RoleType.button, |
296 name: 'Click me'}); | 323 attributes: { name: 'Click me' }}); |
297 var textField = rootNode.find( | 324 var textField = rootNode.find( |
298 {role: RoleType.textField}); | 325 {role: RoleType.textField}); |
299 mockFeedback.expectBraille('start') | 326 mockFeedback.expectBraille('start') |
300 .call(button1.focus.bind(button1)) | 327 .call(button1.focus.bind(button1)) |
301 .expectBraille(/^Click me btn/) | 328 .expectBraille(/^Click me btn/) |
302 .call(route.bind(null, 5)) | 329 .call(route.bind(null, 5)) |
303 .expectBraille(/Focus me btn/) | 330 .expectBraille(/Focus me btn/) |
304 .call(textField.focus.bind(textField)) | 331 .call(textField.focus.bind(textField)) |
305 .expectBraille('Edit me ed', {startIndex: 0}) | 332 .expectBraille('Edit me ed', {startIndex: 0}) |
306 .call(route.bind(null, 3)) | 333 .call(route.bind(null, 3)) |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 }); | 470 }); |
444 | 471 |
445 TEST_F('BackgroundTest', 'ActiveOrInactive', function() { | 472 TEST_F('BackgroundTest', 'ActiveOrInactive', function() { |
446 var mockFeedback = this.createMockFeedback(); | 473 var mockFeedback = this.createMockFeedback(); |
447 this.runWithLoadedTree(function() {/*! | 474 this.runWithLoadedTree(function() {/*! |
448 <a href="a">a</a> | 475 <a href="a">a</a> |
449 <button>b</button> | 476 <button>b</button> |
450 <input type="text"></input> | 477 <input type="text"></input> |
451 */}, | 478 */}, |
452 function(rootNode) { | 479 function(rootNode) { |
453 var focusButton = function() { rootNode.find({role: 'button'}).focus(); }; | 480 var focusButton = function() { |
| 481 rootNode.find({role: RoleType.button}).focus(); |
| 482 }; |
454 var on = function() { cvox.ChromeVox.isActive = true; }; | 483 var on = function() { cvox.ChromeVox.isActive = true; }; |
455 var off = function() { cvox.ChromeVox.isActive = false; }; | 484 var off = function() { cvox.ChromeVox.isActive = false; }; |
456 | 485 |
457 function focusThen(toFocus, then) { | 486 function focusThen(toFocus, then) { |
458 toFocus.addEventListener('focus', function innerFocus(e) { | 487 toFocus.addEventListener('focus', function innerFocus(e) { |
459 if (e.target != toFocus) | 488 if (e.target != toFocus) |
460 return; | 489 return; |
461 rootNode.removeEventListener('focus', innerFocus, true); | 490 rootNode.removeEventListener('focus', innerFocus, true); |
462 then && then(); | 491 then && then(); |
463 }, true); | 492 }, true); |
464 toFocus.focus(); | 493 toFocus.focus(); |
465 } | 494 } |
466 | 495 |
467 mockFeedback.call(focusButton) | 496 mockFeedback.call(focusButton) |
468 .expectSpeech('b').expectSpeech('Button') | 497 .expectSpeech('b').expectSpeech('Button') |
469 .call(off) | 498 .call(off) |
470 .call(focusThen.bind(this, rootNode.find({ role: 'link' }), on)) | 499 .call(focusThen.bind(this, rootNode.find( |
471 .call(focusThen.bind(this, rootNode.find({ role: 'textField' }))) | 500 { role: RoleType.link }), on)) |
| 501 .call(focusThen.bind(this, rootNode.find( |
| 502 { role: RoleType.textField }))) |
472 .expectNextSpeechUtteranceIsNot('a') | 503 .expectNextSpeechUtteranceIsNot('a') |
473 .expectSpeech('Edit text'); | 504 .expectSpeech('Edit text'); |
474 | 505 |
475 mockFeedback.replay(); | 506 mockFeedback.replay(); |
476 } | 507 } |
477 ); | 508 ); |
478 }); | 509 }); |
479 | 510 |
480 TEST_F('BackgroundTest', 'ModeSwitching', function() { | 511 TEST_F('BackgroundTest', 'ModeSwitching', function() { |
481 this.runWithLoadedTree('<button></button>', function(root) { | 512 this.runWithLoadedTree('<button></button>', function(root) { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 global.backgroundObj.refreshMode(fakeSubRoot); | 566 global.backgroundObj.refreshMode(fakeSubRoot); |
536 assertEquals('next', global.backgroundObj.mode); | 567 assertEquals('next', global.backgroundObj.mode); |
537 }.bind(this)); | 568 }.bind(this)); |
538 }); | 569 }); |
539 | 570 |
540 TEST_F('BackgroundTest', 'FocusIframe', function() { | 571 TEST_F('BackgroundTest', 'FocusIframe', function() { |
541 this.runWithLoadedTree( function() {/*! | 572 this.runWithLoadedTree( function() {/*! |
542 <iframe tabindex=0 src="data:text/html,<p>Inside</p>"></iframe> | 573 <iframe tabindex=0 src="data:text/html,<p>Inside</p>"></iframe> |
543 <button>outside</button> | 574 <button>outside</button> |
544 */}, function(root) { | 575 */}, function(root) { |
545 var iframe = root.find({role: 'iframe'}); | 576 var iframe = root.find({role: RoleType.iframe}); |
546 var button = root.find({role: 'button'}); | 577 var button = root.find({role: RoleType.button}); |
547 | 578 |
548 assertEquals('iframe', iframe.role); | 579 assertEquals('iframe', iframe.role); |
549 assertEquals('button', button.role); | 580 assertEquals('button', button.role); |
550 | 581 |
551 var didFocus = false; | 582 var didFocus = false; |
552 iframe.focus = function() { | 583 iframe.focus = function() { |
553 didFocus = true; | 584 didFocus = true; |
554 }; | 585 }; |
555 var b = global.backgroundObj; | 586 var b = global.backgroundObj; |
556 b.currentRange_ = cursors.Range.fromNode(button); | 587 b.currentRange_ = cursors.Range.fromNode(button); |
557 b.onGotCommand('previousElement'); | 588 b.onGotCommand('previousElement'); |
558 assertFalse(didFocus); | 589 assertFalse(didFocus); |
559 }.bind(this)); | 590 }.bind(this)); |
560 }); | 591 }); |
561 | 592 |
562 TEST_F('BackgroundTest', 'NoisySlider', function() { | 593 TEST_F('BackgroundTest', 'NoisySlider', function() { |
563 var mockFeedback = this.createMockFeedback(); | 594 var mockFeedback = this.createMockFeedback(); |
564 this.runWithLoadedTree( function() {/*! | 595 this.runWithLoadedTree( function() {/*! |
565 <button id="go">go</button> | 596 <button id="go">go</button> |
566 <div id="slider" tabindex=0 role="slider"></div> | 597 <div id="slider" tabindex=0 role="slider"></div> |
567 <script> | 598 <script> |
568 function update() { | 599 function update() { |
569 var s = document.getElementById('slider'); | 600 var s = document.getElementById('slider'); |
570 s.setAttribute('aria-valuetext', 'noisy'); | 601 s.setAttribute('aria-valuetext', 'noisy'); |
571 setTimeout(update, 500); | 602 setTimeout(update, 500); |
572 } | 603 } |
573 update(); | 604 update(); |
574 </script> | 605 </script> |
575 */}, function(root) { | 606 */}, function(root) { |
576 var go = root.find({role: 'button'}); | 607 var go = root.find({role: RoleType.button}); |
577 var slider = root.find({role: 'slider'}); | 608 var slider = root.find({role: RoleType.slider}); |
578 var focusButton = go.focus.bind(go); | 609 var focusButton = go.focus.bind(go); |
579 var focusSlider = slider.focus.bind(slider); | 610 var focusSlider = slider.focus.bind(slider); |
580 mockFeedback.call(focusButton) | 611 mockFeedback.call(focusButton) |
581 .expectNextSpeechUtteranceIsNot('noisy') | 612 .expectNextSpeechUtteranceIsNot('noisy') |
582 .call(focusSlider) | 613 .call(focusSlider) |
583 .expectSpeech('noisy') | 614 .expectSpeech('noisy') |
584 .expectSpeech('noisy') | 615 .expectSpeech('noisy') |
585 .replay(); | 616 .replay(); |
586 }.bind(this)); | 617 }.bind(this)); |
587 }); | 618 }); |
588 | 619 |
589 TEST_F('BackgroundTest', 'Checkbox', function() { | 620 TEST_F('BackgroundTest', 'Checkbox', function() { |
590 var mockFeedback = this.createMockFeedback(); | 621 var mockFeedback = this.createMockFeedback(); |
591 this.runWithLoadedTree(function() {/*! | 622 this.runWithLoadedTree(function() {/*! |
592 <div id="go" role="checkbox">go</div> | 623 <div id="go" role="checkbox">go</div> |
593 <script> | 624 <script> |
594 var go = document.getElementById('go'); | 625 var go = document.getElementById('go'); |
595 var isChecked = true; | 626 var isChecked = true; |
596 go.addEventListener('click', function(e) { | 627 go.addEventListener('click', function(e) { |
597 if (isChecked) | 628 if (isChecked) |
598 go.setAttribute('aria-checked', true); | 629 go.setAttribute('aria-checked', true); |
599 else | 630 else |
600 go.removeAttribute('aria-checked'); | 631 go.removeAttribute('aria-checked'); |
601 isChecked = !isChecked; | 632 isChecked = !isChecked; |
602 }); | 633 }); |
603 </script> | 634 </script> |
604 */}, function(root) { | 635 */}, function(root) { |
605 var cbx = root.find({role: 'checkBox'}); | 636 var cbx = root.find({role: RoleType.checkBox}); |
606 var click = cbx.doDefault.bind(cbx); | 637 var click = cbx.doDefault.bind(cbx); |
607 mockFeedback.call(click) | 638 mockFeedback.call(click) |
608 .expectSpeech('go') | 639 .expectSpeech('go') |
609 .expectSpeech('Check box') | 640 .expectSpeech('Check box') |
610 .expectSpeech('checked') | 641 .expectSpeech('checked') |
611 .call(click) | 642 .call(click) |
612 .expectSpeech('go') | 643 .expectSpeech('go') |
613 .expectSpeech('Check box') | 644 .expectSpeech('Check box') |
614 .expectSpeech('not checked') | 645 .expectSpeech('not checked') |
615 .replay(); | 646 .replay(); |
616 }); | 647 }); |
617 }); | 648 }); |
618 | 649 |
619 /** Tests navigating into and out of iframes.. */ | 650 /** Tests navigating into and out of iframes.. */ |
620 TEST_F('BackgroundTest', 'DISABLED_ForwardNavigationThroughIframes', function()
{ | 651 TEST_F('BackgroundTest', 'DISABLED_ForwardNavigationThroughIframes', function()
{ |
621 var mockFeedback = this.createMockFeedback(); | 652 var mockFeedback = this.createMockFeedback(); |
622 | 653 |
623 var runTestIfIframeIsLoaded = function(rootNode) { | 654 var runTestIfIframeIsLoaded = function(rootNode) { |
624 // Return if the iframe hasn't loaded yet. | 655 // Return if the iframe hasn't loaded yet. |
625 var iframe = rootNode.find({role: 'iframe'}); | 656 var iframe = rootNode.find({role: RoleType.iframe}); |
626 var childDoc = iframe.firstChild; | 657 var childDoc = iframe.firstChild; |
627 if (childDoc && childDoc.children.length == 0) { | 658 if (childDoc && childDoc.children.length == 0) { |
628 return; | 659 return; |
629 } | 660 } |
630 | 661 |
631 var doCmd = this.doCmd.bind(this); | 662 var doCmd = this.doCmd.bind(this); |
632 | 663 |
633 mockFeedback.expectSpeech('start').expectBraille('start'); | 664 mockFeedback.expectSpeech('start').expectBraille('start'); |
634 | 665 |
635 mockFeedback.call(doCmd('nextButton')) | 666 mockFeedback.call(doCmd('nextButton')) |
(...skipping 19 matching lines...) Expand all Loading... |
655 | 686 |
656 TEST_F('BackgroundTest', 'SelectOptionSelected', function() { | 687 TEST_F('BackgroundTest', 'SelectOptionSelected', function() { |
657 var mockFeedback = this.createMockFeedback(); | 688 var mockFeedback = this.createMockFeedback(); |
658 this.runWithLoadedTree(function() {/*! | 689 this.runWithLoadedTree(function() {/*! |
659 <select> | 690 <select> |
660 <option>apple | 691 <option>apple |
661 <option>banana | 692 <option>banana |
662 <option>grapefruit | 693 <option>grapefruit |
663 </select> | 694 </select> |
664 */}, function(root) { | 695 */}, function(root) { |
665 var select = root.find({role: 'popUpButton'}); | 696 var select = root.find({role: RoleType.popUpButton}); |
666 var clickSelect = select.doDefault.bind(select); | 697 var clickSelect = select.doDefault.bind(select); |
667 var lastOption = select.lastChild.lastChild; | 698 var lastOption = select.lastChild.lastChild; |
668 var selectLastOption = lastOption.doDefault.bind(lastOption); | 699 var selectLastOption = lastOption.doDefault.bind(lastOption); |
669 | 700 |
670 mockFeedback.call(clickSelect) | 701 mockFeedback.call(clickSelect) |
671 .expectSpeech('apple') | 702 .expectSpeech('apple') |
672 .expectSpeech('Button') | 703 .expectSpeech('Button') |
673 .call(selectLastOption) | 704 .call(selectLastOption) |
674 .expectNextSpeechUtteranceIsNot('apple') | 705 .expectNextSpeechUtteranceIsNot('apple') |
675 .expectSpeech('grapefruit') | 706 .expectSpeech('grapefruit') |
676 .replay(); | 707 .replay(); |
677 }); | 708 }); |
678 }); | 709 }); |
| 710 |
| 711 /** Tests that navigation works when the current object disappears. */ |
| 712 TEST_F('BackgroundTest', 'DisappearingObject', function() { |
| 713 var mockFeedback = this.createMockFeedback(); |
| 714 this.runWithLoadedTree(this.disappearingObjectDoc, function(rootNode) { |
| 715 var deleteButton = rootNode.find({role: RoleType.button, |
| 716 attributes: { name: 'Delete' }}); |
| 717 var pressDelete = deleteButton.doDefault.bind(deleteButton); |
| 718 var doCmd = this.doCmd.bind(this); |
| 719 |
| 720 mockFeedback.expectSpeech('start').expectBraille('start'); |
| 721 |
| 722 mockFeedback.call(doCmd('nextObject')) |
| 723 .expectSpeech('Before1') |
| 724 .call(doCmd('nextObject')) |
| 725 .expectSpeech('Before2') |
| 726 .call(doCmd('nextObject')) |
| 727 .expectSpeech('Before3') |
| 728 .call(doCmd('nextObject')) |
| 729 .expectSpeech('Disappearing') |
| 730 .call(pressDelete) |
| 731 .expectSpeech('Deleted') |
| 732 .call(doCmd('nextObject')) |
| 733 .expectSpeech('After1') |
| 734 .call(doCmd('nextObject')) |
| 735 .expectSpeech('After2') |
| 736 .call(doCmd('previousObject')) |
| 737 .expectSpeech('After1') |
| 738 .call(doCmd('previousObject')) |
| 739 .expectSpeech('Article') |
| 740 .call(doCmd('previousObject')) |
| 741 .expectSpeech('Before3'); |
| 742 |
| 743 mockFeedback.replay(); |
| 744 }); |
| 745 }); |
| 746 |
OLD | NEW |