/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; /* import-globals-from ../../mochitest/role.js */ loadScripts({ name: "role.js", dir: MOCHITESTS_DIR }); const iframeSrc = `data:text/html, Inner Iframe `; addAccessibleTask( ` `, async function (browser, accDoc) { // ID of the iframe that is being tested const id = "inner-iframe"; let iframe = findAccessibleChildByID(accDoc, id); /* ================= Initial tree check =================================== */ let tree = { role: ROLE_DOCUMENT, children: [], }; testAccessibleTree(iframe, tree); /* ================= Write iframe document ================================ */ let reorderEventPromise = waitForEvent(EVENT_REORDER, id); await invokeContentTask(browser, [id], contentId => { let docNode = content.document.getElementById("iframe").contentDocument; let newHTMLNode = docNode.createElement("html"); let newBodyNode = docNode.createElement("body"); let newTextNode = docNode.createTextNode("New Wave"); newBodyNode.id = contentId; newBodyNode.appendChild(newTextNode); newHTMLNode.appendChild(newBodyNode); docNode.replaceChild(newHTMLNode, docNode.documentElement); }); await reorderEventPromise; tree = { role: ROLE_DOCUMENT, children: [ { role: ROLE_TEXT_LEAF, name: "New Wave", }, ], }; testAccessibleTree(iframe, tree); /* ================= Replace iframe HTML element ========================== */ reorderEventPromise = waitForEvent(EVENT_REORDER, id); await invokeContentTask(browser, [id], contentId => { let docNode = content.document.getElementById("iframe").contentDocument; // We can't use open/write/close outside of iframe document because of // security error. let script = docNode.createElement("script"); script.textContent = ` document.open(); document.write('hello'); document.close();`; docNode.body.appendChild(script); }); await reorderEventPromise; tree = { role: ROLE_DOCUMENT, children: [ { role: ROLE_TEXT_LEAF, name: "hello", }, ], }; testAccessibleTree(iframe, tree); /* ================= Replace iframe body ================================== */ reorderEventPromise = waitForEvent(EVENT_REORDER, id); await invokeContentTask(browser, [id], contentId => { let docNode = content.document.getElementById("iframe").contentDocument; let newBodyNode = docNode.createElement("body"); let newTextNode = docNode.createTextNode("New Hello"); newBodyNode.id = contentId; newBodyNode.appendChild(newTextNode); newBodyNode.setAttribute("role", "application"); docNode.documentElement.replaceChild(newBodyNode, docNode.body); }); await reorderEventPromise; tree = { role: ROLE_APPLICATION, children: [ { role: ROLE_TEXT_LEAF, name: "New Hello", }, ], }; testAccessibleTree(iframe, tree); /* ================= Open iframe document ================================= */ reorderEventPromise = waitForEvent(EVENT_REORDER, id); await invokeContentTask(browser, [id], contentId => { // Open document. let docNode = content.document.getElementById("iframe").contentDocument; let script = docNode.createElement("script"); script.textContent = ` function closeMe() { document.write('Works?'); document.close(); } window.closeMe = closeMe; document.open(); document.write('');`; docNode.body.appendChild(script); }); await reorderEventPromise; tree = { role: ROLE_DOCUMENT, children: [], }; testAccessibleTree(iframe, tree); /* ================= Close iframe document ================================ */ reorderEventPromise = waitForEvent(EVENT_REORDER, id); await invokeContentTask(browser, [], () => { // Write and close document. let docNode = content.document.getElementById("iframe").contentDocument; docNode.write("Works?"); docNode.close(); }); await reorderEventPromise; tree = { role: ROLE_DOCUMENT, children: [ { role: ROLE_TEXT_LEAF, name: "Works?", }, ], }; testAccessibleTree(iframe, tree); /* ================= Remove HTML from iframe document ===================== */ reorderEventPromise = waitForEvent(EVENT_REORDER, iframe); await invokeContentTask(browser, [], () => { // Remove HTML element. let docNode = content.document.getElementById("iframe").contentDocument; docNode.firstChild.remove(); }); let event = await reorderEventPromise; ok( event.accessible instanceof nsIAccessibleDocument, "Reorder should happen on the document" ); tree = { role: ROLE_DOCUMENT, children: [], }; testAccessibleTree(iframe, tree); /* ================= Insert HTML to iframe document ======================= */ reorderEventPromise = waitForEvent(EVENT_REORDER, id); await invokeContentTask(browser, [id], contentId => { // Insert HTML element. let docNode = content.document.getElementById("iframe").contentDocument; let html = docNode.createElement("html"); let body = docNode.createElement("body"); let text = docNode.createTextNode("Haha"); body.appendChild(text); body.id = contentId; html.appendChild(body); docNode.appendChild(html); }); await reorderEventPromise; tree = { role: ROLE_DOCUMENT, children: [ { role: ROLE_TEXT_LEAF, name: "Haha", }, ], }; testAccessibleTree(iframe, tree); /* ================= Remove body from iframe document ===================== */ reorderEventPromise = waitForEvent(EVENT_REORDER, iframe); await invokeContentTask(browser, [], () => { // Remove body element. let docNode = content.document.getElementById("iframe").contentDocument; docNode.documentElement.removeChild(docNode.body); }); event = await reorderEventPromise; ok( event.accessible instanceof nsIAccessibleDocument, "Reorder should happen on the document" ); tree = { role: ROLE_DOCUMENT, children: [], }; testAccessibleTree(iframe, tree); /* ================ Insert element under document element while body missed */ reorderEventPromise = waitForEvent(EVENT_REORDER, iframe); await invokeContentTask(browser, [], () => { let docNode = content.document.getElementById("iframe").contentDocument; let inputNode = (content.window.inputNode = docNode.createElement("input")); docNode.documentElement.appendChild(inputNode); }); event = await reorderEventPromise; ok( event.accessible instanceof nsIAccessibleDocument, "Reorder should happen on the document" ); tree = { DOCUMENT: [{ ENTRY: [] }], }; testAccessibleTree(iframe, tree); reorderEventPromise = waitForEvent(EVENT_REORDER, iframe); await invokeContentTask(browser, [], () => { let docEl = content.document.getElementById("iframe").contentDocument .documentElement; // Remove aftermath of this test before next test starts. docEl.firstChild.remove(); }); // Make sure reorder event was fired and that the input was removed. await reorderEventPromise; tree = { role: ROLE_DOCUMENT, children: [], }; testAccessibleTree(iframe, tree); /* ================= Insert body to iframe document ======================= */ reorderEventPromise = waitForEvent(EVENT_REORDER, id); await invokeContentTask(browser, [id], contentId => { // Write and close document. let docNode = content.document.getElementById("iframe").contentDocument; // Insert body element. let body = docNode.createElement("body"); let text = docNode.createTextNode("Yo ho ho i butylka roma!"); body.appendChild(text); body.id = contentId; docNode.documentElement.appendChild(body); }); await reorderEventPromise; tree = { role: ROLE_DOCUMENT, children: [ { role: ROLE_TEXT_LEAF, name: "Yo ho ho i butylka roma!", }, ], }; testAccessibleTree(iframe, tree); /* ================= Change source ======================================== */ reorderEventPromise = waitForEvent(EVENT_REORDER, "iframe"); await invokeSetAttribute( browser, "iframe", "src", `data:text/html,` ); event = await reorderEventPromise; tree = { INTERNAL_FRAME: [{ DOCUMENT: [{ ENTRY: [] }] }], }; testAccessibleTree(event.accessible, tree); iframe = findAccessibleChildByID(event.accessible, id); /* ================= Replace iframe body on ARIA role body ================ */ reorderEventPromise = waitForEvent(EVENT_REORDER, id); await invokeContentTask(browser, [id], contentId => { let docNode = content.document.getElementById("iframe").contentDocument; let newBodyNode = docNode.createElement("body"); let newTextNode = docNode.createTextNode("New Hello"); newBodyNode.appendChild(newTextNode); newBodyNode.setAttribute("role", "application"); newBodyNode.id = contentId; docNode.documentElement.replaceChild(newBodyNode, docNode.body); }); await reorderEventPromise; tree = { role: ROLE_APPLICATION, children: [ { role: ROLE_TEXT_LEAF, name: "New Hello", }, ], }; testAccessibleTree(iframe, tree); }, { iframe: true, remoteIframe: true } );