browser_take_focus.js (3506B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 /* import-globals-from ../../mochitest/states.js */ 8 loadScripts( 9 { name: "role.js", dir: MOCHITESTS_DIR }, 10 { name: "states.js", dir: MOCHITESTS_DIR } 11 ); 12 13 addAccessibleTask( 14 `<div role="group"><input id="textbox" value="hello"/></div>`, 15 async function (browser, iframeDocAcc, contentDocAcc) { 16 const textbox = findAccessibleChildByID(iframeDocAcc, "textbox"); 17 const iframe = findAccessibleChildByID(contentDocAcc, "default-iframe-id"); 18 const iframeDoc = findAccessibleChildByID( 19 contentDocAcc, 20 "default-iframe-body-id" 21 ); 22 const root = getRootAccessible(document); 23 24 testStates(textbox, STATE_FOCUSABLE, 0, STATE_FOCUSED); 25 26 let onFocus = waitForEvent(EVENT_FOCUS, textbox); 27 textbox.takeFocus(); 28 await onFocus; 29 30 testStates(textbox, STATE_FOCUSABLE | STATE_FOCUSED, 0); 31 32 is( 33 getAccessibleDOMNodeID(contentDocAcc.focusedChild), 34 "textbox", 35 "correct focusedChild from top doc" 36 ); 37 38 is( 39 getAccessibleDOMNodeID(iframeDocAcc.focusedChild), 40 "textbox", 41 "correct focusedChild from iframe" 42 ); 43 44 is( 45 getAccessibleDOMNodeID(root.focusedChild), 46 "textbox", 47 "correct focusedChild from root" 48 ); 49 50 ok(!iframe.focusedChild, "correct focusedChild from iframe (null)"); 51 52 onFocus = waitForEvent(EVENT_FOCUS, iframeDoc); 53 iframeDoc.takeFocus(); 54 await onFocus; 55 56 is( 57 getAccessibleDOMNodeID(contentDocAcc.focusedChild), 58 "default-iframe-body-id", 59 "correct focusedChild of child doc from top doc" 60 ); 61 is( 62 getAccessibleDOMNodeID(iframe.focusedChild), 63 "default-iframe-body-id", 64 "correct focusedChild of child doc from iframe" 65 ); 66 is( 67 getAccessibleDOMNodeID(root.focusedChild), 68 "default-iframe-body-id", 69 "correct focusedChild of child doc from root" 70 ); 71 }, 72 { topLevel: false, iframe: true, remoteIframe: true } 73 ); 74 75 function focusURLBar() { 76 info("Focusing the URL bar"); 77 const focused = waitForEvent( 78 EVENT_FOCUS, 79 event => event.accessible.role == ROLE_ENTRY 80 ); 81 gURLBar.focus(); 82 return focused; 83 } 84 85 /** 86 * Test takeFocus on web content when focus is in the browser UI. 87 */ 88 addAccessibleTask( 89 ` 90 <button id="outerButton">outerButton</button> 91 <iframe src="data:text/html,<body id='innerDoc'><button id='innerButton'>innerButton</button>"></iframe> 92 `, 93 async function testFocusContentWhileUiFocused(browser, docAcc) { 94 await focusURLBar(); 95 info("Focusing docAcc"); 96 let focused = waitForEvent(EVENT_FOCUS, docAcc); 97 docAcc.takeFocus(); 98 await focused; 99 100 await focusURLBar(); 101 info("Focusing outerButton"); 102 const outerButton = findAccessibleChildByID(docAcc, "outerButton"); 103 focused = waitForEvent(EVENT_FOCUS, outerButton); 104 outerButton.takeFocus(); 105 await focused; 106 107 await focusURLBar(); 108 info("Focusing innerButton"); 109 const innerButton = findAccessibleChildByID(docAcc, "outerButton"); 110 focused = waitForEvent(EVENT_FOCUS, innerButton); 111 innerButton.takeFocus(); 112 await focused; 113 114 await focusURLBar(); 115 info("Focusing outerButton"); 116 focused = waitForEvent(EVENT_FOCUS, outerButton); 117 outerButton.takeFocus(); 118 await focused; 119 }, 120 { chrome: true, topLevel: true, iframe: true, remoteIframe: true } 121 );