77 lines
3.1 KiB
HTML
77 lines
3.1 KiB
HTML
<!DOCTYPE html>
|
|
<meta charset="utf-8">
|
|
<title>Notifications in cross origin iframes</title>
|
|
<link rel="help" href="https://github.com/whatwg/notifications/issues/177">
|
|
<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>
|
|
<script src="resources/helpers.js"></script>
|
|
<script>
|
|
// The syntax below will give us a third party URL.
|
|
// See: https://web-platform-tests.org/writing-tests/server-features.html
|
|
const thirdPartyIframe =
|
|
'https://{{hosts[alt][]}}:{{ports[https][0]}}/notifications/resources/cross-origin-nested-parent.sub.html';
|
|
const promises = new Map();
|
|
|
|
// Firefox and Chrome deny notification permission in a third party partitioned
|
|
// iframe even if the permission is granted for origin of the iframe.
|
|
|
|
// Set up the listeners and then create a third party iframe.
|
|
// The iframe will again create a first party iframe.
|
|
promise_setup(async () => {
|
|
await trySettingPermission("granted");
|
|
|
|
// parent: the third party iframe
|
|
// child: the first party iframe in the third party one (ABA)
|
|
for (const iframe of ["parent", "child"]) {
|
|
// from the iframe window, or the worker opened from there
|
|
for (const worker of ["", "Worker"]) {
|
|
// permission attribute (.permission), or
|
|
// the permission request (.requestPermission())
|
|
for (const type of ["", "Request"]) {
|
|
const sender = iframe + worker + type;
|
|
promises.set(sender, new Promise(r => window.addEventListener("message", ev => {
|
|
if (ev.data.sender === sender) {
|
|
r(ev.data);
|
|
}
|
|
})));
|
|
}
|
|
}
|
|
}
|
|
|
|
const iframe = document.createElement("iframe");
|
|
iframe.src = thirdPartyIframe;
|
|
document.body.append(iframe);
|
|
})
|
|
|
|
promise_test(async t => {
|
|
const result = await promises.get("parent");
|
|
assert_equals(result.permission, "denied", `should deny the permission`);
|
|
assert_false(result.shown, `notification should not be shown`);
|
|
|
|
const parentRequestResult = await promises.get("parentRequest");
|
|
assert_equals(parentRequestResult.permission, "denied", "should deny the permission request");
|
|
}, "third party iframe");
|
|
|
|
promise_test(async t => {
|
|
const result = await promises.get("child");
|
|
assert_equals(result.permission, "granted", `should grant the permission`);
|
|
assert_true(result.shown, `notification should be shown`);
|
|
|
|
const childRequestResult = await promises.get("childRequest");
|
|
assert_equals(childRequestResult.permission, "granted", "should accept the permission request");
|
|
}, "nested first party iframe");
|
|
|
|
promise_test(async t => {
|
|
const result = await promises.get("parentWorker");
|
|
assert_equals(result.permission, "denied", `should deny the permission`);
|
|
assert_false(result.shown, `notification should not be shown`);
|
|
}, "third party worker");
|
|
|
|
promise_test(async t => {
|
|
const result = await promises.get("childWorker");
|
|
assert_equals(result.permission, "granted", `should grant the permission`);
|
|
assert_true(result.shown, `notification should be shown`);
|
|
}, "nested first party worker");
|
|
</script>
|