Skip to content

Commit

Permalink
Add layout test coverage for the Permissions API
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=245239

Reviewed by Sihui Liu.

Previously, Permissions API functionality was only being tested in macOS wk2
because the permission state being queried for was that of the Notifications API,
which is available only on macOS. This patch adds test coverage for all wk2 platforms
by querying for the permission state of the Geolocation API, which is available on
all wk2 platforms.

* LayoutTests/http/tests/permissions/permission-status-onchange-event-dedicated-worker-expected.txt: Renamed from LayoutTests/http/tests/permissions/worker-permission-status-onchange-event-expected.txt.
* LayoutTests/http/tests/permissions/permission-status-onchange-event-dedicated-worker.html: Renamed from LayoutTests/http/tests/permissions/worker-permission-status-onchange-event.html.
* LayoutTests/http/tests/permissions/permission-status-onchange-event-dedicated-worker.js: Renamed from LayoutTests/http/tests/permissions/worker-permission-status-onchange-event.js.
(onmessage):
* LayoutTests/http/tests/permissions/permission-status-onchange-event-service-worker-expected.txt: Copied from LayoutTests/http/tests/permissions/service-worker-permission-status-onchange-event-expected.txt.
* LayoutTests/http/tests/permissions/permission-status-onchange-event-service-worker.html: Renamed from LayoutTests/http/tests/permissions/service-worker-permission-status-onchange-event.html.
* LayoutTests/http/tests/permissions/permission-status-onchange-event-service-worker.js: Renamed from LayoutTests/http/tests/permissions/service-worker-permission-status-onchange-event.js.
(self.onmessage):
* LayoutTests/http/tests/permissions/permission-status-onchange-event-shared-worker-expected.txt: Renamed from LayoutTests/http/tests/permissions/shared-worker-permission-status-onchange-event-expected.txt.
* LayoutTests/http/tests/permissions/permission-status-onchange-event-shared-worker.html: Renamed from LayoutTests/http/tests/permissions/shared-worker-permission-status-onchange-event.html.
* LayoutTests/http/tests/permissions/permission-status-onchange-event-shared-worker.js: Renamed from LayoutTests/http/tests/permissions/shared-worker-permission-status-onchange-event.js.
(port.onmessage):
(onconnect):
* LayoutTests/http/tests/permissions/permission-status-onchange-event-window-expected.txt: Added.
* LayoutTests/http/tests/permissions/permission-status-onchange-event-window.html: Added.
* LayoutTests/http/tests/permissions/permissions-query-dedicated-workers-expected.txt: Copied from LayoutTests/http/tests/permissions/service-worker-permission-status-onchange-event-expected.txt.
* LayoutTests/http/tests/permissions/permissions-query-dedicated-workers.html: Added.
* LayoutTests/http/tests/permissions/permissions-query-dedicated-workers.js: Added.
(onmessage):
* LayoutTests/http/tests/permissions/permissions-query-service-worker-expected.txt: Copied from LayoutTests/http/tests/permissions/service-worker-permission-status-onchange-event-expected.txt.
* LayoutTests/http/tests/permissions/permissions-query-service-worker.html: Added.
* LayoutTests/http/tests/permissions/permissions-query-service-worker.js: Added.
(self.onmessage):
* LayoutTests/http/tests/permissions/permissions-query-shared-worker-expected.txt: Renamed from LayoutTests/http/tests/permissions/service-worker-permission-status-onchange-event-expected.txt.
* LayoutTests/http/tests/permissions/permissions-query-shared-worker.html: Added.
* LayoutTests/http/tests/permissions/permissions-query-shared-worker.js: Added.
(port.onmessage):
(onconnect):
* LayoutTests/http/tests/permissions/permissions-query-window-expected.txt: Added.
* LayoutTests/http/tests/permissions/permissions-query-window.html: Added.
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::queryPermission):

Canonical link: https://commits.webkit.org/254562@main
  • Loading branch information
RupinMittal authored and szewai committed Sep 16, 2022
1 parent 8c822fa commit 4a97e14
Show file tree
Hide file tree
Showing 23 changed files with 361 additions and 15 deletions.
Expand Up @@ -3,10 +3,8 @@ This test checks that the Permissions API change event works for dedicated worke
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


No permission state is set
PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
Permission has been granted
PASS message.data is "granted"
PASS receivedPostMessageResponse became true
PASS successfullyParsed is true
Expand Down
Expand Up @@ -15,14 +15,13 @@
expectedData = null;
receivedPostMessageResponse = false;

var worker = new Worker('worker-permission-status-onchange-event.js');
var worker = new Worker('permission-status-onchange-event-dedicated-worker.js');
worker.onmessage = function(message) {
window.message = message;
shouldBeEqualToString("message.data", expectedData);
receivedPostMessageResponse = true;
}

debug("No permission state is set");
receivedPostMessageResponse = false;
expectedData = "prompt";
worker.postMessage(1);
Expand All @@ -31,7 +30,6 @@
receivedPostMessageResponse = false;
expectedData = "granted";
testRunner.setGeolocationPermission(true);
debug("Permission has been granted");
await shouldBecomeEqual("receivedPostMessageResponse", "true");
finishJSTest();
})();
Expand Down
Expand Up @@ -3,10 +3,8 @@ This test checks that the Permissions API change event works for service workers
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


No permission state is set
PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
Permission has been granted
PASS message.data is "granted"
PASS receivedPostMessageResponse became true
PASS successfullyParsed is true
Expand Down
Expand Up @@ -15,14 +15,13 @@
expectedData = null;
receivedPostMessageResponse = false;

navigator.serviceWorker.register('service-worker-permission-status-onchange-event.js');
navigator.serviceWorker.register('permission-status-onchange-event-service-worker.js');
navigator.serviceWorker.addEventListener('message', (message) => {
window.message = message;
shouldBeEqualToString("message.data", expectedData);
receivedPostMessageResponse = true;
});

debug("No permission state is set");
receivedPostMessageResponse = false;
expectedData = "prompt";
navigator.serviceWorker.ready.then((registration) => {
Expand All @@ -33,7 +32,6 @@
receivedPostMessageResponse = false;
expectedData = "granted";
testRunner.setGeolocationPermission(true);
debug("Permission has been granted");
await shouldBecomeEqual("receivedPostMessageResponse", "true");
finishJSTest();
})();
Expand Down
Expand Up @@ -3,10 +3,8 @@ This test checks that the Permissions API change event works for shared workers
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


No permission state is set
PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
Permission has been granted
PASS message.data is "granted"
PASS receivedPostMessageResponse became true
PASS successfullyParsed is true
Expand Down
Expand Up @@ -15,14 +15,13 @@
expectedData = null;
receivedPostMessageResponse = false;

var worker = new SharedWorker('shared-worker-permission-status-onchange-event.js');
var worker = new SharedWorker('permission-status-onchange-event-shared-worker.js');
worker.port.onmessage = function(message) {
window.message = message;
shouldBeEqualToString("message.data", expectedData);
receivedPostMessageResponse = true;
}

debug("No permission state is set");
receivedPostMessageResponse = false;
expectedData = "prompt";
worker.port.postMessage(1);
Expand All @@ -31,7 +30,6 @@
receivedPostMessageResponse = false;
expectedData = "granted";
testRunner.setGeolocationPermission(true);
debug("Permission has been granted");
await shouldBecomeEqual("receivedPostMessageResponse", "true");
finishJSTest();
})();
Expand Down
@@ -0,0 +1,12 @@
This test checks that the Permissions API on-change event works in window contexts.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS permissionStatusState is "prompt"
PASS permissionStatusState is "granted"
PASS onChangeCalled became true
PASS successfullyParsed is true

TEST COMPLETE

@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<script src="/resources/js-test-pre.js"></script>
<script src="/resources/notifications-test-pre.js"></script>
</head>
<body>
<script>

description("This test checks that the Permissions API on-change event works in window contexts.")

jsTestIsAsync = true;

navigator.permissions.query({ name: "geolocation" }).then((permissionStatus)=>{
permissionStatusState = permissionStatus.state;
shouldBeEqualToString("permissionStatusState", "prompt");

onChangeCalled = false;
permissionStatus.onchange = () => {
permissionStatusState = permissionStatus.state;
shouldBeEqualToString("permissionStatusState", "granted");
onChangeCalled = true;
};

testRunner.setGeolocationPermission(true);
shouldBecomeEqual("onChangeCalled", "true", () => {
finishJSTest();
});
});

</script>
<script src="/resources/js-test-post.js"></script>
</body>
</html>
@@ -0,0 +1,15 @@
This test checks that Permissions::query() works for dedicated workers

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
PASS message.data is "granted"
PASS receivedPostMessageResponse became true
PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
PASS successfullyParsed is true

TEST COMPLETE

@@ -0,0 +1,60 @@
<!DOCTYPE html>
<html>
<head>
<script src="/resources/js-test-pre.js"></script>
<script src="/resources/notifications-test-pre.js"></script>
</head>
<body>
<script>

description("This test checks that Permissions::query() works for dedicated workers")

jsTestIsAsync = true;

var expectedData = null;
var receivedPostMessageResponse = true;

var worker = new Worker('permissions-query-dedicated-workers.js');
worker.onmessage = function(message) {
window.message = message;
shouldBeEqualToString("message.data", expectedData);
receivedPostMessageResponse = true;
}

async function defaultTest()
{
receivedPostMessageResponse = false;
expectedData = "prompt";
worker.postMessage(1);
await shouldBecomeEqual("receivedPostMessageResponse", "true");
}

async function grantTest()
{
receivedPostMessageResponse = false;
expectedData = "granted";
testRunner.setGeolocationPermission(true);
worker.postMessage(2);
await shouldBecomeEqual("receivedPostMessageResponse", "true");
}

async function denyTest()
{
receivedPostMessageResponse = false;
expectedData = "prompt";
testRunner.setGeolocationPermission(false);
worker.postMessage(3);
await shouldBecomeEqual("receivedPostMessageResponse", "true");
}

(async function () {
await defaultTest();
await grantTest();
await denyTest();
finishJSTest();
})();

</script>
<script src="/resources/js-test-post.js"></script>
</body>
</html>
@@ -0,0 +1,5 @@
onmessage = function(e) {
navigator.permissions.query({ name: "geolocation" }).then((status) => {
postMessage(status.state);
});
}
@@ -0,0 +1,15 @@
This test checks that Permissions::query() works for service workers

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
PASS message.data is "granted"
PASS receivedPostMessageResponse became true
PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
PASS successfullyParsed is true

TEST COMPLETE

@@ -0,0 +1,66 @@
<!DOCTYPE html>
<html>
<head>
<script src="/resources/js-test-pre.js"></script>
<script src="/resources/notifications-test-pre.js"></script>
</head>
<body>
<script>

description("This test checks that Permissions::query() works for service workers")

jsTestIsAsync = true;

var expectedData = null;
var receivedPostMessageResponse = true;

navigator.serviceWorker.register('permissions-query-service-worker.js');
navigator.serviceWorker.addEventListener('message', (message) => {
window.message = message;
shouldBeEqualToString("message.data", expectedData);
receivedPostMessageResponse = true;
});

async function defaultTest()
{
receivedPostMessageResponse = false;
expectedData = "prompt";
navigator.serviceWorker.ready.then((registration) => {
registration.active.postMessage(1);
});
await shouldBecomeEqual("receivedPostMessageResponse", "true");
}

async function grantTest()
{
receivedPostMessageResponse = false;
expectedData = "granted";
testRunner.setGeolocationPermission(true);
navigator.serviceWorker.ready.then((registration) => {
registration.active.postMessage(2);
});
await shouldBecomeEqual("receivedPostMessageResponse", "true");
}

async function denyTest()
{
receivedPostMessageResponse = false;
expectedData = "prompt";
testRunner.setGeolocationPermission(false);
navigator.serviceWorker.ready.then((registration) => {
registration.active.postMessage(3);
});
await shouldBecomeEqual("receivedPostMessageResponse", "true");
}

(async function () {
await defaultTest();
await grantTest();
await denyTest();
finishJSTest();
})();

</script>
<script src="/resources/js-test-post.js"></script>
</body>
</html>
@@ -0,0 +1,5 @@
self.onmessage = (event) => {
navigator.permissions.query({ name: "geolocation" }).then((status) => {
event.source.postMessage(status.state);
});
};
@@ -0,0 +1,15 @@
This test checks that Permissions::query() works for shared workers

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
PASS message.data is "granted"
PASS receivedPostMessageResponse became true
PASS message.data is "prompt"
PASS receivedPostMessageResponse became true
PASS successfullyParsed is true

TEST COMPLETE

0 comments on commit 4a97e14

Please sign in to comment.