1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/* 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/states.js */
/* import-globals-from ../../mochitest/role.js */
loadScripts(
{ name: "role.js", dir: MOCHITESTS_DIR },
{ name: "states.js", dir: MOCHITESTS_DIR }
);
addAccessibleTask(
`<input id="textbox" value="hello"/>`,
async function (browser, iframeDocAcc, contentDocAcc) {
info(
"Check that the IFRAME and the IFRAME document are accessible initially."
);
let iframeAcc = findAccessibleChildByID(contentDocAcc, DEFAULT_IFRAME_ID);
ok(!isDefunct(iframeAcc), "IFRAME should be accessible");
ok(!isDefunct(iframeDocAcc), "IFRAME document should be accessible");
info("Move the IFRAME under a new hidden root.");
let onEvents = waitForEvent(EVENT_REORDER, contentDocAcc);
await SpecialPowers.spawn(browser, [DEFAULT_IFRAME_ID], id => {
const doc = content.document;
const root = doc.createElement("div");
root.style.display = "none";
doc.body.appendChild(root);
root.appendChild(doc.getElementById(id));
});
await onEvents;
ok(
isDefunct(iframeAcc),
"IFRAME accessible should be defunct when hidden."
);
ok(
isDefunct(iframeDocAcc),
"IFRAME document's accessible should be defunct when the IFRAME is hidden."
);
ok(
!findAccessibleChildByID(contentDocAcc, DEFAULT_IFRAME_ID),
"No accessible for an IFRAME present."
);
ok(
!findAccessibleChildByID(contentDocAcc, DEFAULT_IFRAME_DOC_BODY_ID),
"No accessible for the IFRAME document present."
);
info("Move the IFRAME back under the content document's body.");
onEvents = waitForEvents([
[EVENT_REORDER, contentDocAcc],
[
EVENT_STATE_CHANGE,
event => {
const scEvent = event.QueryInterface(nsIAccessibleStateChangeEvent);
const id = getAccessibleDOMNodeID(event.accessible);
return (
id === DEFAULT_IFRAME_DOC_BODY_ID &&
scEvent.state === STATE_BUSY &&
scEvent.isEnabled === false
);
},
],
]);
await SpecialPowers.spawn(browser, [DEFAULT_IFRAME_ID], id => {
content.document.body.appendChild(content.document.getElementById(id));
});
await onEvents;
iframeAcc = findAccessibleChildByID(contentDocAcc, DEFAULT_IFRAME_ID);
const newiframeDocAcc = iframeAcc.firstChild;
ok(!isDefunct(iframeAcc), "IFRAME should be accessible");
is(iframeAcc.childCount, 1, "IFRAME accessible should have a single child");
ok(!isDefunct(newiframeDocAcc), "IFRAME document should be accessible");
ok(
isDefunct(iframeDocAcc),
"Original IFRAME document accessible should be defunct."
);
isnot(
iframeAcc.firstChild,
iframeDocAcc,
"A new accessible is created for a IFRAME document."
);
is(
iframeAcc.firstChild,
newiframeDocAcc,
"A new accessible for a IFRAME document is the child of the IFRAME accessible"
);
},
{ topLevel: false, iframe: true, remoteIframe: true }
);
|