summaryrefslogtreecommitdiffstats
path: root/test/wpt/tests/common/object-association.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-21 20:56:19 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-21 20:56:19 +0000
commit0b6210cd37b68b94252cb798598b12974a20e1c1 (patch)
treee371686554a877842d95aa94f100bee552ff2a8e /test/wpt/tests/common/object-association.js
parentInitial commit. (diff)
downloadnode-undici-0b6210cd37b68b94252cb798598b12974a20e1c1.tar.xz
node-undici-0b6210cd37b68b94252cb798598b12974a20e1c1.zip
Adding upstream version 5.28.2+dfsg1+~cs23.11.12.3.upstream/5.28.2+dfsg1+_cs23.11.12.3upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'test/wpt/tests/common/object-association.js')
-rw-r--r--test/wpt/tests/common/object-association.js74
1 files changed, 74 insertions, 0 deletions
diff --git a/test/wpt/tests/common/object-association.js b/test/wpt/tests/common/object-association.js
new file mode 100644
index 0000000..669c17c
--- /dev/null
+++ b/test/wpt/tests/common/object-association.js
@@ -0,0 +1,74 @@
+"use strict";
+
+// This is for testing whether an object (e.g., a global property) is associated with Window, or
+// with Document. Recall that Window and Document are 1:1 except when doing a same-origin navigation
+// away from the initial about:blank. In that case the Window object gets reused for the new
+// Document.
+//
+// So:
+// - If something is per-Window, then it should maintain its identity across an about:blank
+// navigation.
+// - If something is per-Document, then it should be recreated across an about:blank navigation.
+
+window.testIsPerWindow = propertyName => {
+ runTests(propertyName, assert_equals, "must not");
+};
+
+window.testIsPerDocument = propertyName => {
+ runTests(propertyName, assert_not_equals, "must");
+};
+
+function runTests(propertyName, equalityOrInequalityAsserter, mustOrMustNotReplace) {
+ async_test(t => {
+ const iframe = document.createElement("iframe");
+ document.body.appendChild(iframe);
+ const frame = iframe.contentWindow;
+
+ const before = frame[propertyName];
+ assert_implements(before, `window.${propertyName} must be implemented`);
+
+ iframe.onload = t.step_func_done(() => {
+ const after = frame[propertyName];
+ equalityOrInequalityAsserter(after, before);
+ });
+
+ iframe.src = "/common/blank.html";
+ }, `Navigating from the initial about:blank ${mustOrMustNotReplace} replace window.${propertyName}`);
+
+ // Per spec, discarding a browsing context should not change any of the global objects.
+ test(() => {
+ const iframe = document.createElement("iframe");
+ document.body.appendChild(iframe);
+ const frame = iframe.contentWindow;
+
+ const before = frame[propertyName];
+ assert_implements(before, `window.${propertyName} must be implemented`);
+
+ iframe.remove();
+
+ const after = frame[propertyName];
+ assert_equals(after, before, `window.${propertyName} should not change after iframe.remove()`);
+ }, `Discarding the browsing context must not change window.${propertyName}`);
+
+ // Per spec, document.open() should not change any of the global objects. In historical versions
+ // of the spec, it did, so we test here.
+ async_test(t => {
+ const iframe = document.createElement("iframe");
+
+ iframe.onload = t.step_func_done(() => {
+ const frame = iframe.contentWindow;
+ const before = frame[propertyName];
+ assert_implements(before, `window.${propertyName} must be implemented`);
+
+ frame.document.open();
+
+ const after = frame[propertyName];
+ assert_equals(after, before);
+
+ frame.document.close();
+ });
+
+ iframe.src = "/common/blank.html";
+ document.body.appendChild(iframe);
+ }, `document.open() must not replace window.${propertyName}`);
+}