summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/tasks.window.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/tasks.window.js')
-rw-r--r--testing/web-platform/tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/tasks.window.js106
1 files changed, 106 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/tasks.window.js b/testing/web-platform/tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/tasks.window.js
new file mode 100644
index 0000000000..887adcb739
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/tasks.window.js
@@ -0,0 +1,106 @@
+// An older version of the HTML Standard mandated that document.open() remove
+// all tasks associated with the document on which open() is called. This step
+// has been proposed to be removed. This series of tests ensures that this step
+// is no longer executed.
+//
+// This file comprehensively (but not exhaustively) tests for many queued tasks
+// that may be observable. Each taskTest() call in fact runs two tests: the
+// first one "tasks without document.open()" does not actually run
+// document.open(), just to test that the tested task works ordinarily; the
+// second actually calls document.open() to test if the method call removes
+// that specific task from the queue.
+
+// This is necessary to allow the promise rejection test below.
+setup({
+ allow_uncaught_exception: true
+});
+
+function taskTest(description, testBody) {
+ async_test(t => {
+ const frame = document.body.appendChild(document.createElement("iframe"));
+ // The empty HTML seems to be necessary to cajole Chrome and Safari into
+ // firing a load event asynchronously, which is necessary to make sure the
+ // frame's document doesn't have a parser associated with it.
+ // See: https://crbug.com/569511
+ frame.src = "/common/blank.html";
+ t.add_cleanup(() => frame.remove());
+ frame.onload = t.step_func(() => {
+ // Make sure there is no parser. Firefox seems to have an additional
+ // non-spec-compliant readiness state "uninitialized", so test for the
+ // two known valid readiness states instead.
+ // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1191683
+ assert_in_array(frame.contentDocument.readyState, ["interactive", "complete"]);
+ testBody(t, frame, doc => {});
+ });
+ }, `tasks without document.open() (${description})`);
+
+ async_test(t => {
+ const frame = document.body.appendChild(document.createElement("iframe"));
+ // The empty HTML seems to be necessary to cajole Chrome into firing a load
+ // event, which is necessary to make sure the frame's document doesn't have
+ // a parser associated with it.
+ // See: https://crbug.com/569511
+ frame.src = "/common/blank.html";
+ t.add_cleanup(() => frame.remove());
+ frame.onload = t.step_func(() => {
+ // Make sure there is no parser. Firefox seems to have an additional
+ // non-spec-compliant readiness state "uninitialized", so test for the
+ // two known valid readiness states instead.
+ // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1191683
+ assert_in_array(frame.contentDocument.readyState, ["interactive", "complete"]);
+ testBody(t, frame, doc => doc.open());
+ });
+ }, `document.open() and tasks (${description})`);
+}
+
+taskTest("timeout", (t, frame, open) => {
+ frame.contentWindow.setTimeout(t.step_func_done(), 100);
+ open(frame.contentDocument);
+});
+
+taskTest("window message", (t, frame, open) => {
+ let counter = 0;
+ frame.contentWindow.postMessage(undefined, "*");
+ open(frame.contentDocument);
+ frame.contentWindow.postMessage(undefined, "*");
+ frame.contentWindow.onmessage = t.step_func(e => {
+ assert_equals(e.data, undefined);
+ counter++;
+ assert_less_than_equal(counter, 2);
+ if (counter == 2) {
+ t.done();
+ }
+ });
+});
+
+taskTest("canvas.toBlob()", (t, frame, open) => {
+ const canvas = frame.contentDocument.body.appendChild(frame.contentDocument.createElement("canvas"));
+ canvas.toBlob(t.step_func_done());
+ open(frame.contentDocument);
+});
+
+taskTest("MessagePort", (t, frame, open) => {
+ frame.contentWindow.eval(`({ port1, port2 } = new MessageChannel());`);
+ frame.contentWindow.port2.onmessage = t.step_func_done(ev => {
+ assert_equals(ev.data, "Hello world");
+ });
+ frame.contentWindow.port1.postMessage("Hello world");
+ open(frame.contentDocument);
+});
+
+taskTest("Promise rejection", (t, frame, open) => {
+ // There is currently some ambiguity on which Window object the
+ // unhandledrejection event should be fired on. Here, let's account for that
+ // ambiguity and allow event fired on _any_ global to pass this test.
+ // See:
+ // - https://github.com/whatwg/html/issues/958,
+ // - https://bugs.webkit.org/show_bug.cgi?id=187822
+ const promise = frame.contentWindow.eval("Promise.reject(42);");
+ open(frame.contentDocument);
+ const listener = t.step_func_done(ev => {
+ assert_equals(ev.promise, promise);
+ assert_equals(ev.reason, 42);
+ });
+ frame.contentWindow.onunhandledrejection = listener;
+ window.onunhandledrejection = listener;
+});