blob: c01bd9a2cecc1abdbe19536a16c18a04479fadbd [file] [log] [blame]
<!DOCTYPE html>
<title>Element#requestFullscreen() works properly with a tree of cross-origin iframes</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<body>
<script>
promise_test(async function(t)
{
t.add_cleanup(() => { document.exitFullscreen() });
let fullscreen_events = [];
document.onfullscreenchange = () => { fullscreen_events.push(true); };
document.onfullscreenerror = () => { fullscreen_events.push(false); };
iframe_to_fullscreen = "D";
let iframes = [
{
"name": "A",
"src": "http://{{hosts[alt][www]}}:{{ports[http][0]}}/fullscreen/api/resources/recursive-iframe-fullscreen.html",
"allow_fullscreen": true,
},
{
"name": "B",
"src": "http://{{hosts[][www]}}:{{ports[http][0]}}/fullscreen/api/resources/recursive-iframe-fullscreen.html",
"allow_fullscreen": true,
},
{
"name": "C",
"src": "http://{{hosts[alt][www1]}}:{{ports[http][0]}}/fullscreen/api/resources/recursive-iframe-fullscreen.html",
"allow_fullscreen": true,
},
{
"name": "D",
"src": "http://{{hosts[alt][www1]}}:{{ports[http][0]}}/fullscreen/api/resources/recursive-iframe-fullscreen.html",
"allow_fullscreen": true,
},
{
"name": "E",
"src": "http://{{hosts[][www1]}}:{{ports[http][0]}}/fullscreen/api/resources/recursive-iframe-fullscreen.html",
"allow_fullscreen": true,
}
];
let expected_events = {
"A": [true],
"B": [true],
"C": [true],
"D": [true],
"E": [],
}
function ready() {
return new Promise((resolve) => {
window.addEventListener("message", function ready_listener(e) {
if (e.data.action == "ready") {
window.removeEventListener("message", ready_listener);
resolve();
}
});
})
}
let child_frame = document.createElement("iframe");
child_frame.allow = iframes[0].allow_fullscreen ? "fullscreen" : "";
child_frame.name = iframes[0].name;
child_frame.style.width = "100%";
child_frame.style.height = "100%";
child_frame.src = iframes[0].src;
document.body.appendChild(child_frame);
await ready();
for (let sub_frame of iframes.slice(1)) {
child_frame.contentWindow.postMessage({"action": "addIframe", "iframe": sub_frame}, "*");
await ready();
}
child_frame.contentWindow.postMessage(
{"action": "requestFullscreen", "fullscreen": {"name": iframe_to_fullscreen}}, "*");
await ready();
function test_report(report) {
let expected = expected_events[report.frame];
assert_equals(report.events.length, expected.length, "Number of events");
report.events.forEach((value, i) => {
assert_equals(value, expected[i], "Event type matches");
})
if (report.events.length) {
assert_false(report.fullscreenElementIsNull, "Event fired, fullscreenElement is set");
} else {
assert_true(report.fullscreenElementIsNull, "No event fired, fullscreenElement is null");
}
}
let reports = new Promise(resolve => {
let report_count = 0;
window.addEventListener('message', e => {
if (e.data.action == "report" && e.data.report.api == "fullscreen") {
report_count++;
test_report(e.data.report);
if (report_count == iframes.length) {
resolve();
}
}
});
});
child_frame.contentWindow.postMessage({"action": "requestReport"}, "*");
await reports;
assert_equals(fullscreen_events.length, 1, "1 event in the top-level document");
assert_true(fullscreen_events[0], "Top level document event type is correct")
}, "Element#requestFullscreen() works properly with a tree of cross-origin iframes");
</script>