blob: e7c30661ab0c5f68b79971e27b2c3fe4abd84f68 [file] [log] [blame]
<!doctype html>
<html>
<head>
<title>Notification permission behaviour in different contexts</title>
<script src="../resources/permissions-helper.js"></script>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
</head>
<body>
<script>
const secondOrigin = 'http://127.0.0.1:8080';
const secondOriginPath = 'http://127.0.0.1:8080/notifications/resources/iframe-permission-helper.html';
// Creates an iframe to read the notification permission values. It will
// return a Promise that will be resolved with them once ready. This
// implementation works for both same-origin and cross-origin iframes, and
// properly cleans up after itself.
function GetPermissionValuesFromIframe(sameOrigin) {
let resolver = null;
function messageEventHandler(event) {
window.removeEventListener('message', messageEventHandler);
iframe.parentElement.removeChild(iframe);
resolver(event.data);
}
window.addEventListener('message', messageEventHandler);
const iframe = document.createElement('iframe');
iframe.src = sameOrigin ? 'resources/iframe-permission-helper.html'
: secondOriginPath;
// Start loading the iframe by adding it to the document.
document.body.appendChild(iframe);
return new Promise(resolve => { resolver = resolve; });
}
// TODO(peter): Remove `push-messaging` as a separate update here once we
// treat that and `notifications` the same.
function SetCurrentOriginPermission(value) {
return Promise.all([
PermissionsHelper.setPermission('notifications', value),
PermissionsHelper.setPermission('push-messaging', value)
]);
}
function SetCrossOriginPermission(requestingOrigin, value) {
for (const permission of ['notifications', 'push-messaging']) {
testRunner.setPermission(permission, value, requestingOrigin, requestingOrigin);
testRunner.setPermission(permission, value, requestingOrigin, location.origin);
}
}
// Top-level document tests.
promise_test(test => {
return SetCurrentOriginPermission('granted')
.then(() => Notification.requestPermission())
.then(permission => assert_equals(permission, 'granted'))
.then(() => assert_equals(Notification.permission, 'granted'))
.then(() => navigator.permissions.query({ name: 'notifications' }))
.then(permission => assert_equals(permission.state, 'granted'))
.then(() => navigator.permissions.query({ name: 'push', userVisibleOnly: true }))
.then(permission => assert_equals(permission.state, 'granted'));
}, 'Top-level document notification `granted` permission behaviour');
promise_test(test => {
return SetCurrentOriginPermission('denied')
.then(() => Notification.requestPermission())
.then(permission => assert_equals(permission, 'denied'))
.then(() => assert_equals(Notification.permission, 'denied'))
.then(() => navigator.permissions.query({ name: 'notifications' }))
.then(permission => assert_equals(permission.state, 'denied'))
.then(() => navigator.permissions.query({ name: 'push', userVisibleOnly: true }))
.then(permission => assert_equals(permission.state, 'denied'));
}, 'Top-level document notification `denied` permission behaviour');
promise_test(test => {
return SetCurrentOriginPermission('prompt')
.then(() => Notification.requestPermission())
.then(permission => assert_equals(permission, 'default'))
.then(() => assert_equals(Notification.permission, 'default'))
.then(() => navigator.permissions.query({ name: 'notifications' }))
.then(permission => assert_equals(permission.state, 'prompt'))
.then(() => navigator.permissions.query({ name: 'push', userVisibleOnly: true }))
.then(permission => assert_equals(permission.state, 'prompt'));
}, 'Top-level document notification `default` permission behaviour');
// Same-origin iframe tests.
promise_test(test => {
return SetCurrentOriginPermission('granted')
.then(() => GetPermissionValuesFromIframe(true /* sameOrigin */))
.then(values => {
assert_equals(values.notificationPermission, 'granted');
assert_equals(values.notificationRequestPermission, 'granted');
assert_equals(values.permissionApiNotificationPermission, 'granted');
assert_equals(values.permissionApiPushPermission, 'granted');
});
}, 'Same-origin iframe notification `granted` permission behaviour');
promise_test(test => {
return SetCurrentOriginPermission('denied')
.then(() => GetPermissionValuesFromIframe(true /* sameOrigin */))
.then(values => {
assert_equals(values.notificationPermission, 'denied');
assert_equals(values.notificationRequestPermission, 'denied');
assert_equals(values.permissionApiNotificationPermission, 'denied');
assert_equals(values.permissionApiPushPermission, 'denied');
});
}, 'Same-origin iframe notification `denied` permission behaviour');
promise_test(test => {
return SetCurrentOriginPermission('prompt')
.then(() => GetPermissionValuesFromIframe(true /* sameOrigin */))
.then(values => {
assert_equals(values.notificationPermission, 'default');
assert_equals(values.notificationRequestPermission, 'default');
assert_equals(values.permissionApiNotificationPermission, 'prompt');
assert_equals(values.permissionApiPushPermission, 'prompt');
});
}, 'Same-origin iframe notification `default` permission behaviour');
// Cross-origin iframe tests.
promise_test(test => {
SetCrossOriginPermission(secondOrigin, 'granted');
return GetPermissionValuesFromIframe(false /* sameOrigin */)
.then(values => {
assert_equals(values.notificationPermission, 'granted');
assert_equals(values.notificationRequestPermission, 'granted');
assert_equals(values.permissionApiNotificationPermission, 'granted');
assert_equals(values.permissionApiPushPermission, 'granted');
});
}, 'Cross-origin iframe notification `granted` permission behaviour');
promise_test(test => {
SetCrossOriginPermission(secondOrigin, 'denied');
return GetPermissionValuesFromIframe(false /* sameOrigin */)
.then(values => {
assert_equals(values.notificationPermission, 'denied');
assert_equals(values.notificationRequestPermission, 'denied');
assert_equals(values.permissionApiNotificationPermission, 'denied');
assert_equals(values.permissionApiPushPermission, 'denied');
});
}, 'Cross-origin iframe notification `denied` permission behaviour');
promise_test(test => {
SetCrossOriginPermission(secondOrigin, 'prompt');
return GetPermissionValuesFromIframe(false /* sameOrigin */)
.then(values => {
assert_equals(values.notificationPermission, 'denied');
assert_equals(values.notificationRequestPermission, 'denied');
assert_equals(values.permissionApiNotificationPermission, 'denied');
assert_equals(values.permissionApiPushPermission, 'denied');
});
}, 'Cross-origin iframe notification `default` permission behaviour');
</script>
</body>
</html>