124 lines
4.7 KiB
HTML
124 lines
4.7 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>WebShare Test: is disabled by permissions policy cross-origin</title>
|
|
<link
|
|
rel="help"
|
|
href="https://w3c.github.io/web-share/#permissions-policy"
|
|
/>
|
|
<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>
|
|
</head>
|
|
<body></body>
|
|
<script>
|
|
const crossOrigin = "https://{{hosts[alt][]}}:{{ports[https][0]}}";
|
|
const sameOriginPath = "/web-share/resources/post-message.html";
|
|
const crossOriginSrc = `${crossOrigin}${sameOriginPath}`;
|
|
const shareData = {
|
|
title: "WebShare Test",
|
|
text: "This is a test of the Web Share API",
|
|
url: "https://example.com/",
|
|
};
|
|
|
|
function waitForMessage(message) {
|
|
return new Promise((resolve) => {
|
|
window.addEventListener("message", function listener(event) {
|
|
if (event.data.action !== message) return;
|
|
window.removeEventListener("message", listener);
|
|
resolve(event.data);
|
|
});
|
|
});
|
|
}
|
|
|
|
async function loadIframe(t, src, allowList) {
|
|
const iframe = document.createElement("iframe");
|
|
if (allowList !== undefined) iframe.allow = allowList;
|
|
t.add_cleanup(() => {
|
|
iframe.remove();
|
|
});
|
|
await new Promise((resolve) => {
|
|
iframe.src = src;
|
|
document.body.appendChild(iframe);
|
|
iframe.onload = resolve;
|
|
});
|
|
await waitForMessage("loaded");
|
|
return iframe;
|
|
}
|
|
|
|
promise_test(async (t) => {
|
|
assert_true("share" in navigator, "navigator.share is exposed");
|
|
const iframe = await loadIframe(t, crossOriginSrc);
|
|
const iframeWindow = iframe.contentWindow;
|
|
iframeWindow.postMessage({ action: "share", data: shareData }, "*");
|
|
const data = await waitForMessage("share");
|
|
assert_equals(data.result, "error");
|
|
assert_equals(data.error, "NotAllowedError");
|
|
}, "share() is disabled by default 'self' by permissions policy for cross-origin iframes");
|
|
|
|
promise_test(async (t) => {
|
|
assert_true("share" in navigator, "navigator.share is exposed");
|
|
const iframe = await loadIframe(t, crossOriginSrc, "web-share 'none'");
|
|
const iframeWindow = iframe.contentWindow;
|
|
iframeWindow.postMessage({ action: "share", data: shareData }, "*");
|
|
const data = await waitForMessage("share");
|
|
assert_equals(data.result, "error");
|
|
assert_equals(data.error, "NotAllowedError");
|
|
}, "share() is disabled explicitly by permissions policy for cross-origin iframe");
|
|
|
|
promise_test(async (t) => {
|
|
assert_true("share" in navigator, "navigator.share is exposed");
|
|
const iframe = await loadIframe(t, crossOriginSrc, "web-share 'self'");
|
|
const iframeWindow = iframe.contentWindow;
|
|
iframeWindow.postMessage({ action: "share", data: shareData }, "*");
|
|
const data = await waitForMessage("share");
|
|
assert_equals(data.result, "error");
|
|
assert_equals(data.error, "NotAllowedError");
|
|
}, "share() not allowed, as only allowed to share with self");
|
|
|
|
promise_test(async (t) => {
|
|
assert_true("canShare" in navigator, "navigator.canShare is exposed");
|
|
const iframe = await loadIframe(t, crossOriginSrc);
|
|
const iframeWindow = iframe.contentWindow;
|
|
iframeWindow.postMessage({ action: "canShare", data: shareData }, "*");
|
|
const data = await waitForMessage("canShare");
|
|
assert_equals(data.result, false, "Expected false, as it can't share.");
|
|
}, "canShare() not allowed to share by default permissions policy cross-origin");
|
|
|
|
promise_test(async (t) => {
|
|
assert_true("canShare" in navigator, "navigator.canShare is exposed");
|
|
const iframe = await loadIframe(
|
|
t,
|
|
crossOriginSrc,
|
|
`web-share ${crossOrigin}`
|
|
);
|
|
iframe.contentWindow.postMessage(
|
|
{ action: "canShare", data: shareData },
|
|
"*"
|
|
);
|
|
const data = await waitForMessage("canShare");
|
|
assert_equals(
|
|
data.result,
|
|
true,
|
|
`Expected true, is it can now share on ${origin}.`
|
|
);
|
|
}, "canShare() is allowed by permissions policy to share cross-origin on a particular origin");
|
|
|
|
promise_test(async (t) => {
|
|
assert_true("canShare" in navigator, "navigator.canShare is exposed");
|
|
const iframe = await loadIframe(t, sameOriginPath, "web-share 'self'");
|
|
iframe.contentWindow.postMessage(
|
|
{ action: "canShare", data: shareData },
|
|
"*"
|
|
);
|
|
const data = await waitForMessage("canShare");
|
|
assert_equals(
|
|
data.result,
|
|
true,
|
|
"Expected true, at it can share with self."
|
|
);
|
|
}, "canShare() with self");
|
|
</script>
|
|
</html>
|