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><h1>Inside</h1>"></iframe> | 74 <iframe srcdoc="<button>Inside</button><h1>Inside</h1>"></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 TEST_F('BackgroundTest', 'ModeSwitching', function() { | 510 TEST_F('BackgroundTest', 'ModeSwitching', function() { |
480 this.runWithLoadedTree('<button></button>', function(root) { | 511 this.runWithLoadedTree('<button></button>', function(root) { |
481 var fakeDesktop = {}; | 512 var fakeDesktop = {}; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
534 global.backgroundObj.refreshMode(fakeSubRoot); | 565 global.backgroundObj.refreshMode(fakeSubRoot); |
535 assertEquals('next', global.backgroundObj.mode); | 566 assertEquals('next', global.backgroundObj.mode); |
536 }.bind(this)); | 567 }.bind(this)); |
537 }); | 568 }); |
538 | 569 |
539 TEST_F('BackgroundTest', 'FocusIframe', function() { | 570 TEST_F('BackgroundTest', 'FocusIframe', function() { |
540 this.runWithLoadedTree( function() {/*! | 571 this.runWithLoadedTree( function() {/*! |
541 <iframe tabindex=0 src="data:text/html,<p>Inside</p>"></iframe> | 572 <iframe tabindex=0 src="data:text/html,<p>Inside</p>"></iframe> |
542 <button>outside</button> | 573 <button>outside</button> |
543 */}, function(root) { | 574 */}, function(root) { |
544 var iframe = root.find({role: 'iframe'}); | 575 var iframe = root.find({role: RoleType.iframe}); |
545 var button = root.find({role: 'button'}); | 576 var button = root.find({role: RoleType.button}); |
546 | 577 |
547 assertEquals('iframe', iframe.role); | 578 assertEquals('iframe', iframe.role); |
548 assertEquals('button', button.role); | 579 assertEquals('button', button.role); |
549 | 580 |
550 var didFocus = false; | 581 var didFocus = false; |
551 iframe.focus = function() { | 582 iframe.focus = function() { |
552 didFocus = true; | 583 didFocus = true; |
553 }; | 584 }; |
554 var b = global.backgroundObj; | 585 var b = global.backgroundObj; |
555 b.currentRange_ = cursors.Range.fromNode(button); | 586 b.currentRange_ = cursors.Range.fromNode(button); |
556 b.onGotCommand('previousElement'); | 587 b.onGotCommand('previousElement'); |
557 assertFalse(didFocus); | 588 assertFalse(didFocus); |
558 }.bind(this)); | 589 }.bind(this)); |
559 }); | 590 }); |
560 | 591 |
561 TEST_F('BackgroundTest', 'NoisySlider', function() { | 592 TEST_F('BackgroundTest', 'NoisySlider', function() { |
562 var mockFeedback = this.createMockFeedback(); | 593 var mockFeedback = this.createMockFeedback(); |
563 this.runWithLoadedTree( function() {/*! | 594 this.runWithLoadedTree( function() {/*! |
564 <button id="go">go</button> | 595 <button id="go">go</button> |
565 <div id="slider" tabindex=0 role="slider"></div> | 596 <div id="slider" tabindex=0 role="slider"></div> |
566 <script> | 597 <script> |
567 function update() { | 598 function update() { |
568 var s = document.getElementById('slider'); | 599 var s = document.getElementById('slider'); |
569 s.setAttribute('aria-valuetext', 'noisy'); | 600 s.setAttribute('aria-valuetext', 'noisy'); |
570 setTimeout(update, 500); | 601 setTimeout(update, 500); |
571 } | 602 } |
572 update(); | 603 update(); |
573 </script> | 604 </script> |
574 */}, function(root) { | 605 */}, function(root) { |
575 var go = root.find({role: 'button'}); | 606 var go = root.find({role: RoleType.button}); |
576 var slider = root.find({role: 'slider'}); | 607 var slider = root.find({role: RoleType.slider}); |
577 var focusButton = go.focus.bind(go); | 608 var focusButton = go.focus.bind(go); |
578 var focusSlider = slider.focus.bind(slider); | 609 var focusSlider = slider.focus.bind(slider); |
579 mockFeedback.call(focusButton) | 610 mockFeedback.call(focusButton) |
580 .expectNextSpeechUtteranceIsNot('noisy') | 611 .expectNextSpeechUtteranceIsNot('noisy') |
581 .call(focusSlider) | 612 .call(focusSlider) |
582 .expectSpeech('noisy') | 613 .expectSpeech('noisy') |
583 .expectSpeech('noisy') | 614 .expectSpeech('noisy') |
584 .replay(); | 615 .replay(); |
585 }.bind(this)); | 616 }.bind(this)); |
586 }); | 617 }); |
587 | 618 |
588 TEST_F('BackgroundTest', 'Checkbox', function() { | 619 TEST_F('BackgroundTest', 'Checkbox', function() { |
589 var mockFeedback = this.createMockFeedback(); | 620 var mockFeedback = this.createMockFeedback(); |
590 this.runWithLoadedTree(function() {/*! | 621 this.runWithLoadedTree(function() {/*! |
591 <div id="go" role="checkbox">go</div> | 622 <div id="go" role="checkbox">go</div> |
592 <script> | 623 <script> |
593 var go = document.getElementById('go'); | 624 var go = document.getElementById('go'); |
594 var isChecked = true; | 625 var isChecked = true; |
595 go.addEventListener('click', function(e) { | 626 go.addEventListener('click', function(e) { |
596 if (isChecked) | 627 if (isChecked) |
597 go.setAttribute('aria-checked', true); | 628 go.setAttribute('aria-checked', true); |
598 else | 629 else |
599 go.removeAttribute('aria-checked'); | 630 go.removeAttribute('aria-checked'); |
600 isChecked = !isChecked; | 631 isChecked = !isChecked; |
601 }); | 632 }); |
602 </script> | 633 </script> |
603 */}, function(root) { | 634 */}, function(root) { |
604 var cbx = root.find({role: 'checkBox'}); | 635 var cbx = root.find({role: RoleType.checkBox}); |
605 var click = cbx.doDefault.bind(cbx); | 636 var click = cbx.doDefault.bind(cbx); |
606 mockFeedback.call(click) | 637 mockFeedback.call(click) |
607 .expectSpeech('go') | 638 .expectSpeech('go') |
608 .expectSpeech('Check box') | 639 .expectSpeech('Check box') |
609 .expectSpeech('checked') | 640 .expectSpeech('checked') |
610 .call(click) | 641 .call(click) |
611 .expectSpeech('go') | 642 .expectSpeech('go') |
612 .expectSpeech('Check box') | 643 .expectSpeech('Check box') |
613 .expectSpeech('not checked') | 644 .expectSpeech('not checked') |
614 .replay(); | 645 .replay(); |
615 }); | 646 }); |
616 }); | 647 }); |
617 | 648 |
618 /** Tests navigating into and out of iframes using nextButton */ | 649 /** Tests navigating into and out of iframes using nextButton */ |
619 TEST_F('BackgroundTest', 'ForwardNavigationThroughIframeButtons', function() { | 650 TEST_F('BackgroundTest', 'ForwardNavigationThroughIframeButtons', function() { |
620 var mockFeedback = this.createMockFeedback(); | 651 var mockFeedback = this.createMockFeedback(); |
621 | 652 |
622 var running = false; | 653 var running = false; |
623 var runTestIfIframeIsLoaded = function(rootNode) { | 654 var runTestIfIframeIsLoaded = function(rootNode) { |
624 if (running) | 655 if (running) |
625 return; | 656 return; |
626 | 657 |
627 // Return if the iframe hasn't loaded yet. | 658 // Return if the iframe hasn't loaded yet. |
628 var iframe = rootNode.find({role: 'iframe'}); | 659 var iframe = rootNode.find({role: RoleType.iframe}); |
629 var childDoc = iframe.firstChild; | 660 var childDoc = iframe.firstChild; |
630 if (!childDoc || childDoc.children.length == 0) | 661 if (!childDoc || childDoc.children.length == 0) |
631 return; | 662 return; |
632 | 663 |
633 running = true; | 664 running = true; |
634 var doCmd = this.doCmd.bind(this); | 665 var doCmd = this.doCmd.bind(this); |
635 | 666 |
636 var beforeButton = rootNode.find({role: RoleType.button, | 667 var beforeButton = rootNode.find({role: RoleType.button, |
637 name: 'Before'}); | 668 name: 'Before'}); |
638 beforeButton.focus(); | 669 beforeButton.focus(); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
709 | 740 |
710 TEST_F('BackgroundTest', 'SelectOptionSelected', function() { | 741 TEST_F('BackgroundTest', 'SelectOptionSelected', function() { |
711 var mockFeedback = this.createMockFeedback(); | 742 var mockFeedback = this.createMockFeedback(); |
712 this.runWithLoadedTree(function() {/*! | 743 this.runWithLoadedTree(function() {/*! |
713 <select> | 744 <select> |
714 <option>apple | 745 <option>apple |
715 <option>banana | 746 <option>banana |
716 <option>grapefruit | 747 <option>grapefruit |
717 </select> | 748 </select> |
718 */}, function(root) { | 749 */}, function(root) { |
719 var select = root.find({role: 'popUpButton'}); | 750 var select = root.find({role: RoleType.popUpButton}); |
720 var clickSelect = select.doDefault.bind(select); | 751 var clickSelect = select.doDefault.bind(select); |
721 var lastOption = select.lastChild.lastChild; | 752 var lastOption = select.lastChild.lastChild; |
722 var selectLastOption = lastOption.doDefault.bind(lastOption); | 753 var selectLastOption = lastOption.doDefault.bind(lastOption); |
723 | 754 |
724 mockFeedback.call(clickSelect) | 755 mockFeedback.call(clickSelect) |
725 .expectSpeech('apple') | 756 .expectSpeech('apple') |
726 .expectSpeech('Button') | 757 .expectSpeech('Button') |
727 .call(selectLastOption) | 758 .call(selectLastOption) |
728 .expectNextSpeechUtteranceIsNot('apple') | 759 .expectNextSpeechUtteranceIsNot('apple') |
729 .expectSpeech('grapefruit') | 760 .expectSpeech('grapefruit') |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
766 */}, function(root) { | 797 */}, function(root) { |
767 var nextEditText = this.doCmd('nextEditText'); | 798 var nextEditText = this.doCmd('nextEditText'); |
768 var previousEditText = this.doCmd('previousEditText'); | 799 var previousEditText = this.doCmd('previousEditText'); |
769 mockFeedback.call(nextEditText) | 800 mockFeedback.call(nextEditText) |
770 .expectSpeech('Combo box') | 801 .expectSpeech('Combo box') |
771 .call(previousEditText) | 802 .call(previousEditText) |
772 .expectSpeech('Edit text') | 803 .expectSpeech('Edit text') |
773 .replay(); | 804 .replay(); |
774 }); | 805 }); |
775 }); | 806 }); |
807 | |
808 /** Tests that navigation works when the current object disappears. */ | |
809 TEST_F('BackgroundTest', 'DisappearingObject', function() { | |
810 var mockFeedback = this.createMockFeedback(); | |
811 this.runWithLoadedTree(this.disappearingObjectDoc, function(rootNode) { | |
812 var deleteButton = rootNode.find({role: RoleType.button, | |
813 attributes: { name: 'Delete' }}); | |
814 var pressDelete = deleteButton.doDefault.bind(deleteButton); | |
815 var doCmd = this.doCmd.bind(this); | |
David Tseng
2016/06/01 20:20:25
You don't need to bind; also, let's export this on
dmazzoni
2016/06/01 22:46:56
Done.
| |
816 | |
817 mockFeedback.expectSpeech('start').expectBraille('start'); | |
818 | |
819 mockFeedback.call(doCmd('nextObject')) | |
820 .expectSpeech('Before1') | |
821 .call(doCmd('nextObject')) | |
822 .expectSpeech('Before2') | |
823 .call(doCmd('nextObject')) | |
824 .expectSpeech('Before3') | |
825 .call(doCmd('nextObject')) | |
826 .expectSpeech('Disappearing') | |
827 .call(pressDelete) | |
828 .expectSpeech('Deleted') | |
829 .call(doCmd('nextObject')) | |
830 .expectSpeech('After1') | |
831 .call(doCmd('nextObject')) | |
832 .expectSpeech('After2') | |
833 .call(doCmd('previousObject')) | |
834 .expectSpeech('After1') | |
835 .call(doCmd('previousObject')) | |
836 .expectSpeech('Before3'); | |
837 | |
838 mockFeedback.replay(); | |
839 }); | |
840 }); | |
841 | |
OLD | NEW |