summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/x-frame-options/support/nested.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/x-frame-options/support/nested.py')
-rw-r--r--testing/web-platform/tests/x-frame-options/support/nested.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/testing/web-platform/tests/x-frame-options/support/nested.py b/testing/web-platform/tests/x-frame-options/support/nested.py
new file mode 100644
index 0000000000..78c8c18466
--- /dev/null
+++ b/testing/web-platform/tests/x-frame-options/support/nested.py
@@ -0,0 +1,39 @@
+def main(request, response):
+ origin = request.GET.first(b"origin");
+ value = request.GET.first(b"value");
+ # This is used to solve the race condition we have for postMessages
+ shouldSucceed = request.GET.first(b"loadShouldSucceed", b"false");
+ return ([(b"Content-Type", b"text/html")],
+ b"""<!DOCTYPE html>
+<title>XFO.</title>
+<body>
+<script>
+ var gotMessage = false;
+ window.addEventListener("message", e => {
+ gotMessage = true;
+ window.parent.postMessage(e.data, "*");
+ });
+
+ var i = document.createElement("iframe");
+ i.src = "%s/x-frame-options/support/xfo.py?value=%s";
+ i.onload = _ => {
+ // Why two rAFs? Because that seems to be enough to stop the
+ // load event from racing with the onmessage event.
+ requestAnimationFrame(_ => {
+ requestAnimationFrame(_ => {
+ // The race condition problem we have is it is possible
+ // that the sub iframe is loaded before the postMessage is
+ // dispatched, as a result, the "Failed" message is sent
+ // out. So the way we fixed is we simply let the timeout
+ // to happen if we expect the "Loaded" postMessage to be
+ // sent
+ if (!gotMessage && %s != true) {
+ window.parent.postMessage("Failed", "*");
+ }
+ });
+ });
+ };
+ document.body.appendChild(i);
+</script>
+ """ % (origin, value, shouldSucceed))
+