mirror of
https://github.com/servo/servo.git
synced 2025-08-13 01:15:34 +01:00
Update web-platform-tests to revision 122a4672fa0dc554a6e7528fa3487fd907c792ee
This commit is contained in:
parent
fb1123495f
commit
93d826f7ba
301 changed files with 4775 additions and 1769 deletions
|
@ -0,0 +1,21 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<body>
|
||||
<script>
|
||||
promise_test(async () => {
|
||||
var portal = document.createElement("portal");
|
||||
portal.src = "resources/portal-activate-inside-portal.html";
|
||||
let waitForMessage = new Promise((resolve, reject) => {
|
||||
var bc = new BroadcastChannel("portals-activate-inside-portal");
|
||||
bc.onmessage = e => {
|
||||
bc.close();
|
||||
resolve(e.data);
|
||||
}
|
||||
document.body.appendChild(portal);
|
||||
});
|
||||
var error = await waitForMessage;
|
||||
assert_equals(error, "InvalidStateError");
|
||||
}, "activating a nested portal should throw an error");
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
promise_test(async t => {
|
||||
let waitForMessage = new Promise((resolve, reject) => {
|
||||
var bc = new BroadcastChannel("portals-activate-twice");
|
||||
bc.onmessage = e => {
|
||||
resolve(e.data);
|
||||
}
|
||||
});
|
||||
window.open("resources/portal-activate-twice-window-1.html");
|
||||
let error = await waitForMessage;
|
||||
assert_equals(error, "InvalidStateError");
|
||||
}, "Calling activate when a portal is already activating should fail");
|
||||
|
||||
promise_test(async t => {
|
||||
let waitForMessage = new Promise((resolve, reject) => {
|
||||
var bc = new BroadcastChannel("portals-activate-twice");
|
||||
bc.onmessage = e => {
|
||||
resolve(e.data);
|
||||
}
|
||||
});
|
||||
window.open("resources/portal-activate-twice-window-2.html");
|
||||
let error = await waitForMessage;
|
||||
assert_equals(error, "InvalidStateError");
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Tests that a portal can adopt its predecessor</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
async_test(function(t) {
|
||||
var bc = new BroadcastChannel("portal-test");
|
||||
bc.onmessage = t.step_func_done(function(e) {
|
||||
assert_equals(e.data, "passed");
|
||||
bc.close();
|
||||
});
|
||||
window.open("resources/portals-adopt-predecessor.html");
|
||||
}, "Tests that a portal can adopt its predecessor.");
|
||||
</script>
|
|
@ -0,0 +1,131 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Test postMessage on HTMLPortalElement</title>
|
||||
<meta name="timeout" content="long">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<body>
|
||||
<script>
|
||||
const sameOriginUrl = "resources/portal-post-message-portal.html"
|
||||
const crossOriginUrl = "http://{{hosts[alt][www]}}:{{ports[http][0]}}/portals/resources/portal-post-message-cross-origin-portal.sub.html"
|
||||
|
||||
async function createAndInsertPortal(portalSrc) {
|
||||
var portal = document.createElement("portal");
|
||||
portal.src = portalSrc;
|
||||
document.body.append(portal);
|
||||
|
||||
var loadPromise = new Promise((resolve, reject) => {
|
||||
var bc = new BroadcastChannel("portals-post-message");
|
||||
bc.onmessage = e => {
|
||||
bc.close();
|
||||
resolve();
|
||||
};
|
||||
});
|
||||
await loadPromise;
|
||||
return portal;
|
||||
}
|
||||
|
||||
function postMessage(portal, ...postMessageArgs) {
|
||||
return new Promise((resolve, reject) => {
|
||||
portal.postMessage(...postMessageArgs);
|
||||
var bc = new BroadcastChannel("portals-post-message");
|
||||
bc.onmessage = e => {
|
||||
bc.close();
|
||||
resolve(e.data);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
promise_test(async () => {
|
||||
var portal = await createAndInsertPortal(sameOriginUrl);
|
||||
var message = "test message";
|
||||
var {origin, data} = await postMessage(portal, message, "*");
|
||||
assert_equals(data, message);
|
||||
assert_equals(origin, window.location.origin);
|
||||
}, "postMessage message received by portalHost");
|
||||
|
||||
promise_test(async () => {
|
||||
var portal = await createAndInsertPortal(crossOriginUrl);
|
||||
var message = "test message";
|
||||
var {origin, data} = await postMessage(portal, message, "*");
|
||||
assert_equals(data, message);
|
||||
assert_equals(origin, window.location.origin);
|
||||
}, "postMessage message received by portalHost in cross-origin portal");
|
||||
|
||||
promise_test(async () => {
|
||||
var portal = await createAndInsertPortal(sameOriginUrl);
|
||||
var message = "test message";
|
||||
var {data} = await postMessage(portal, message);
|
||||
assert_equals(data, message);
|
||||
var {data} = await postMessage(portal, message, "/");
|
||||
assert_equals(data, message);
|
||||
var {data} = await postMessage(portal, message,
|
||||
"http://{{host}}:{{ports[http][0]}}");
|
||||
assert_equals(data, message);
|
||||
}, "postMessage received by portal host in same-origin portal for multiple valid target origins");
|
||||
|
||||
promise_test(async () => {
|
||||
var portal = await createAndInsertPortal(crossOriginUrl);
|
||||
var message = "test message";
|
||||
var {data} = await postMessage(portal, message,
|
||||
"http://{{hosts[alt][www]}}:{{ports[http][0]}}");
|
||||
assert_equals(data, message);
|
||||
}, "postMessage received by portal host in cross-origin portal when target origin is specified");
|
||||
|
||||
promise_test(async t => {
|
||||
var portal = document.createElement("portal");
|
||||
return promise_rejects(t, "InvalidStateError",
|
||||
postMessage(portal, "test message"));
|
||||
}, "cannot call postMessage on portal without portal browsing context");
|
||||
|
||||
async function waitForMessage(channelName) {
|
||||
var bc = new BroadcastChannel(channelName);
|
||||
return new Promise((resolve, reject) => {
|
||||
bc.onmessage = e => {
|
||||
bc.close();
|
||||
resolve(e.data);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
promise_test(async t => {
|
||||
window.open("resources/portal-post-message-before-activate-window.html");
|
||||
let {postMessageTS, activateTS} = await waitForMessage(
|
||||
"portals-post-message-before-activate");
|
||||
assert_less_than_equal(postMessageTS, activateTS);
|
||||
}, "postMessage before activate should work and preserve order");
|
||||
|
||||
promise_test(async t => {
|
||||
window.open("resources/portal-post-message-during-activate-window.html");
|
||||
let error = await waitForMessage("portals-post-message-during-activate");
|
||||
assert_equals(error, "InvalidStateError");
|
||||
}, "postMessage during activate throws error");
|
||||
|
||||
promise_test(async t => {
|
||||
window.open("resources/portal-post-message-after-activate-window.html");
|
||||
let error = await waitForMessage("portals-post-message-after-activate");
|
||||
assert_equals(error, "InvalidStateError");
|
||||
}, "postMessage after activate throws error");
|
||||
|
||||
// TODO(adithyas): Use async_test instead of promise_test (for tests that
|
||||
// use a timeout) once we implement postMessage in the other direction and
|
||||
// no longer need to use broadcast channel.
|
||||
const TIMEOUT_DURATION_MS = 1000;
|
||||
|
||||
promise_test(async t => {
|
||||
var portal = await createAndInsertPortal(crossOriginUrl);
|
||||
return new Promise((resolve, reject) => {
|
||||
postMessage(portal, "test").then(() => { reject("message delivered"); });
|
||||
t.step_timeout(resolve, TIMEOUT_DURATION_MS);
|
||||
});
|
||||
}, "message should not be delivered to cross-origin portal when targetOrigin is not specified");
|
||||
|
||||
promise_test(async t => {
|
||||
var portal = await createAndInsertPortal(sameOriginUrl);
|
||||
return new Promise((resolve, reject) => {
|
||||
postMessage(portal, "test", "http://differentorigin.com:8002").then(
|
||||
() => { reject("message delivered"); });
|
||||
t.step_timeout(resolve, TIMEOUT_DURATION_MS);
|
||||
});
|
||||
}, "message should not be delivered to portal when targetOrigin does not match");
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,17 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
var portal = document.createElement("portal");
|
||||
portal.src = "simple-portal.html";
|
||||
var bc = new BroadcastChannel("simple-portal");
|
||||
bc.onmessage = () => {
|
||||
bc.close();
|
||||
portal.activate().catch(e => {
|
||||
var bc2 = new BroadcastChannel("portals-activate-inside-portal");
|
||||
bc2.postMessage(e.name);
|
||||
bc2.close();
|
||||
});
|
||||
}
|
||||
document.body.appendChild(portal);
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,20 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
var portal = document.createElement("portal");
|
||||
portal.src = "simple-portal.html"
|
||||
|
||||
var bc = new BroadcastChannel("simple-portal");
|
||||
bc.onmessage = () => {
|
||||
bc.close();
|
||||
portal.activate();
|
||||
portal.activate().catch(e => {
|
||||
var bc2 = new BroadcastChannel("portals-activate-twice");
|
||||
bc2.postMessage(e.name, "*");
|
||||
bc2.close();
|
||||
});
|
||||
}
|
||||
|
||||
document.body.append(portal);
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,33 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
var portal1 = document.createElement("portal");
|
||||
portal1.src = "simple-portal.html"
|
||||
var portal2 = document.createElement("portal");
|
||||
portal2.src = "simple-portal.html"
|
||||
|
||||
var bc = new BroadcastChannel("simple-portal");
|
||||
var waitForPortalsToLoad = new Promise((resolve, reject) => {
|
||||
var count = 0;
|
||||
bc.onmessage = () => {
|
||||
count++;
|
||||
if (count == 2) {
|
||||
bc.close();
|
||||
resolve();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
waitForPortalsToLoad.then(() => {
|
||||
portal1.activate();
|
||||
portal2.activate().catch(e => {
|
||||
var bc2 = new BroadcastChannel("portals-activate-twice");
|
||||
bc2.postMessage(e.name, "*");
|
||||
bc2.close();
|
||||
});
|
||||
});
|
||||
|
||||
document.body.append(portal1);
|
||||
document.body.append(portal2);
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,25 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
var portal = document.createElement("portal");
|
||||
portal.src = "portal-post-message-portal.html";
|
||||
document.body.appendChild(portal);
|
||||
|
||||
var bc = new BroadcastChannel("portals-post-message");
|
||||
bc.onmessage = () => {
|
||||
bc.close();
|
||||
portal.activate().then(() => {
|
||||
error = "";
|
||||
try {
|
||||
portal.postMessage("message");
|
||||
}
|
||||
catch(err) {
|
||||
error = err.name;
|
||||
}
|
||||
bc = new BroadcastChannel("portals-post-message-after-activate");
|
||||
bc.postMessage(error);
|
||||
bc.close();
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
<script>
|
||||
var postMessagePromise = new Promise((resolve, reject) => {
|
||||
window.portalHost.addEventListener("message", () => {
|
||||
resolve(performance.now());
|
||||
});
|
||||
});
|
||||
|
||||
var activatePromise = new Promise((resolve, reject) => {
|
||||
window.onportalactivate = () => {
|
||||
resolve(performance.now());
|
||||
}
|
||||
});
|
||||
|
||||
var bc = new BroadcastChannel("portal");
|
||||
bc.postMessage("loaded");
|
||||
bc.close();
|
||||
|
||||
Promise.all([postMessagePromise, activatePromise])
|
||||
.then(values => {
|
||||
bc = new BroadcastChannel("portals-post-message-before-activate");
|
||||
bc.postMessage({
|
||||
postMessageTS: values[0],
|
||||
activateTS: values[1]
|
||||
});
|
||||
bc.close();
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
var portal = document.createElement("portal");
|
||||
portal.src = "portal-post-message-before-activate-portal.html";
|
||||
document.body.appendChild(portal);
|
||||
|
||||
var bc = new BroadcastChannel("portal");
|
||||
bc.onmessage = () => {
|
||||
portal.postMessage("message");
|
||||
portal.activate();
|
||||
bc.close();
|
||||
}
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,21 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
let forwardingIframe = document.createElement('iframe');
|
||||
let channelName = new URL(location).searchParams.get('broadcastchannel');
|
||||
forwardingIframe.src =
|
||||
`http://{{host}}:{{ports[http][0]}}/portals/resources/portal-forward-with-broadcast.html?broadcastchannel=portals-post-message`;
|
||||
forwardingIframe.onload = () => {
|
||||
forwardingIframe.contentWindow.postMessage("loaded", "*");
|
||||
}
|
||||
document.body.appendChild(forwardingIframe);
|
||||
|
||||
window.portalHost.addEventListener("message", e => {
|
||||
var message = {
|
||||
origin: e.origin,
|
||||
data: e.data
|
||||
};
|
||||
forwardingIframe.contentWindow.postMessage(message, "*");
|
||||
});
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,23 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
var portal = document.createElement("portal");
|
||||
portal.src = "portal-post-message-portal.html";
|
||||
document.body.appendChild(portal);
|
||||
|
||||
var bc = new BroadcastChannel("portals-post-message");
|
||||
bc.onmessage = () => {
|
||||
bc.close();
|
||||
portal.activate();
|
||||
error = "";
|
||||
try {
|
||||
portal.postMessage("message");
|
||||
} catch (err) {
|
||||
error = err.name;
|
||||
}
|
||||
bc = new BroadcastChannel("portals-post-message-during-activate");
|
||||
bc.postMessage(error);
|
||||
bc.close();
|
||||
}
|
||||
</script>
|
||||
</body>
|
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<script>
|
||||
var bc = new BroadcastChannel("portals-post-message");
|
||||
bc.postMessage("loaded");
|
||||
bc.close();
|
||||
window.portalHost.addEventListener("message", e => {
|
||||
var message = {
|
||||
origin: e.origin,
|
||||
data: e.data
|
||||
};
|
||||
bc = new BroadcastChannel("portals-post-message");
|
||||
bc.postMessage(message);
|
||||
bc.close();
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<script>
|
||||
window.onportalactivate = function(e) {
|
||||
var portal = e.adoptPredecessor();
|
||||
document.body.appendChild(portal);
|
||||
|
||||
if (portal instanceof HTMLPortalElement) {
|
||||
var bc_adopted = new BroadcastChannel("portal-adopted");
|
||||
bc_adopted.postMessage("adopted");
|
||||
bc_adopted.close();
|
||||
}
|
||||
}
|
||||
|
||||
var bc_loaded = new BroadcastChannel("portal-loaded");
|
||||
bc_loaded.postMessage("loaded");
|
||||
bc_loaded.close();
|
||||
</script>
|
|
@ -0,0 +1,20 @@
|
|||
<!doctype html>
|
||||
<body>
|
||||
<portal src="portals-adopt-predecessor-portal.html"></portal>
|
||||
</body>
|
||||
<script>
|
||||
var bc_loaded = new BroadcastChannel("portal-loaded");
|
||||
bc_loaded.onmessage = function(e) {
|
||||
document.querySelector("portal").activate();
|
||||
bc_loaded.close();
|
||||
|
||||
var bc_adopted = new BroadcastChannel("portal-adopted");
|
||||
bc_adopted.onmessage = function(e) {
|
||||
bc_adopted.close();
|
||||
|
||||
var bc_test = new BroadcastChannel("portal-test");
|
||||
bc_test.postMessage("passed");
|
||||
bc_test.close();
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
<script>
|
||||
var bc = new BroadcastChannel("simple-portal");
|
||||
bc.postMessage("loaded");
|
||||
bc.close();
|
||||
</script>
|
||||
</body>
|
Loading…
Add table
Add a link
Reference in a new issue