Skip to content

Commit

Permalink
Bug 1750958 [wpt PR 32449] - WebKit export of https://bugs.webkit.org…
Browse files Browse the repository at this point in the history
…/show_bug.cgi?id=232387, a=testonly

Automatic update from web-platform-tests
WebKit export of https://bugs.webkit.org/show_bug.cgi?id=232387 (#32449)

--

wpt-commits: 26926987909aaaa5ffac76adf733c5867d8f04ea
wpt-pr: 32449
  • Loading branch information
shvaikalesh authored and moz-wptsync-bot committed Feb 5, 2022
1 parent 11cab40 commit abf2a59
Show file tree
Hide file tree
Showing 9 changed files with 217 additions and 43 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Cross-realm EventListener throws TypeError of its associated Realm</title>
<link rel="help" href="https://webidl.spec.whatwg.org/#ref-for-prepare-to-run-script">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<iframe name="eventListenerGlobalObject" src="resources/empty-document.html"></iframe>

<script>
setup({ allow_uncaught_exception: true });

test_onload(() => {
const eventTarget = new EventTarget;
const eventListener = new eventListenerGlobalObject.Object;

eventTarget.addEventListener("foo", eventListener);
assert_reports_exception(eventListenerGlobalObject.TypeError, () => { eventTarget.dispatchEvent(new Event("foo")); });
}, "EventListener is cross-realm plain object without 'handleEvent' property");

test_onload(() => {
const eventTarget = new EventTarget;
const eventListener = new eventListenerGlobalObject.Object;
eventListener.handleEvent = {};

eventTarget.addEventListener("foo", eventListener);
assert_reports_exception(eventListenerGlobalObject.TypeError, () => { eventTarget.dispatchEvent(new Event("foo")); });
}, "EventListener is cross-realm plain object with non-callable 'handleEvent' property");

test_onload(() => {
const eventTarget = new EventTarget;
const { proxy, revoke } = Proxy.revocable(() => {}, {});
revoke();

const eventListener = new eventListenerGlobalObject.Object;
eventListener.handleEvent = proxy;

eventTarget.addEventListener("foo", eventListener);
assert_reports_exception(eventListenerGlobalObject.TypeError, () => { eventTarget.dispatchEvent(new Event("foo")); });
}, "EventListener is cross-realm plain object with revoked Proxy as 'handleEvent' property");

test_onload(() => {
const eventTarget = new EventTarget;
const { proxy, revoke } = eventListenerGlobalObject.Proxy.revocable({}, {});
revoke();

eventTarget.addEventListener("foo", proxy);
assert_reports_exception(eventListenerGlobalObject.TypeError, () => { eventTarget.dispatchEvent(new Event("foo")); });
}, "EventListener is cross-realm non-callable revoked Proxy");

test_onload(() => {
const eventTarget = new EventTarget;
const { proxy, revoke } = eventListenerGlobalObject.Proxy.revocable(() => {}, {});
revoke();

eventTarget.addEventListener("foo", proxy);
assert_reports_exception(eventListenerGlobalObject.TypeError, () => { eventTarget.dispatchEvent(new Event("foo")); });
}, "EventListener is cross-realm callable revoked Proxy");

function test_onload(fn, desc) {
async_test(t => { window.addEventListener("load", t.step_func_done(fn)); }, desc);
}

function assert_reports_exception(expectedConstructor, fn) {
let error;
const onErrorHandler = event => { error = event.error; };

eventListenerGlobalObject.addEventListener("error", onErrorHandler);
fn();
eventListenerGlobalObject.removeEventListener("error", onErrorHandler);

assert_equals(typeof error, "object");
assert_equals(error.constructor, expectedConstructor);
}
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<!DOCTYPE html>
<meta charset="utf-8">
<body>
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>TreeWalker: NodeFilter from detached iframe works as expected</title>
<link rel="help" href="https://dom.spec.whatwg.org/#ref-for-call-a-user-objects-operation%E2%91%A0">
<title>TreeWalker: NodeFilter from detached iframe doesn't get called</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<body>
<div></div>

<script>
const t = async_test();

Expand All @@ -16,8 +17,13 @@
iframe.remove();

assert_equals(iframe.contentWindow, null);
assert_equals(nodeIterator.nextNode(), document.body);
assert_true(nodeIterator.dummyFilterCalled);

let errorWasThrown = false;
try { nodeIterator.nextNode(); }
catch { errorWasThrown = true; }

assert_true(errorWasThrown);
assert_false(nodeIterator.dummyFilterCalled);
});

document.body.append(iframe);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,60 @@
<!DOCTYPE html>
<title>TreeWalker: cross-realm NodeFilter throws TypeError of current realm</title>
<meta charset="utf-8">
<title>TreeWalker: cross-realm NodeFilter throws TypeError of its associated Realm</title>
<link rel="help" href="https://webidl.spec.whatwg.org/#ref-for-prepare-to-run-script">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://webidl.spec.whatwg.org/#call-a-user-objects-operation">

<body id="treeWalkerRoot">
<div></div>
<iframe name="nodeFilterGlobalObject" src="support/empty-document.html"></iframe>

<div id="treeWalkerRoot">
<div class="firstChild"></div>
</div>

<script>
const iframe = document.createElement("iframe");
iframe.src = "support/TreeWalker-acceptNode-filter-cross-realm-subframe.html";
iframe.onload = () => {
for (const testCase of iframe.contentWindow.testCases) {
test(t => {
assert_equals(testCase.actual.constructor, testCase.expected);
}, testCase.description);
}
};
document.body.append(iframe);
test_onload(() => {
const nodeFilter = new nodeFilterGlobalObject.Object;

const walker = document.createTreeWalker(treeWalkerRoot, NodeFilter.SHOW_ELEMENT, nodeFilter);
assert_throws_js(nodeFilterGlobalObject.TypeError, () => { walker.firstChild(); });
}, "NodeFilter is cross-realm plain object without 'acceptNode' property");

test_onload(() => {
const nodeFilter = new nodeFilterGlobalObject.Object;
nodeFilter.acceptNode = {};

const walker = document.createTreeWalker(treeWalkerRoot, NodeFilter.SHOW_ELEMENT, nodeFilter);
assert_throws_js(nodeFilterGlobalObject.TypeError, () => { walker.firstChild(); });
}, "NodeFilter is cross-realm plain object with non-callable 'acceptNode' property");

test_onload(() => {
const { proxy, revoke } = Proxy.revocable(() => {}, {});
revoke();

const nodeFilter = new nodeFilterGlobalObject.Object;
nodeFilter.acceptNode = proxy;

const walker = document.createTreeWalker(treeWalkerRoot, NodeFilter.SHOW_ELEMENT, nodeFilter);
assert_throws_js(nodeFilterGlobalObject.TypeError, () => { walker.firstChild(); });
}, "NodeFilter is cross-realm plain object with revoked Proxy as 'acceptNode' property");

test_onload(() => {
const { proxy, revoke } = nodeFilterGlobalObject.Proxy.revocable({}, {});
revoke();

const walker = document.createTreeWalker(treeWalkerRoot, NodeFilter.SHOW_ELEMENT, proxy);
assert_throws_js(nodeFilterGlobalObject.TypeError, () => { walker.firstChild(); });
}, "NodeFilter is cross-realm non-callable revoked Proxy");

test_onload(() => {
const { proxy, revoke } = nodeFilterGlobalObject.Proxy.revocable(() => {}, {});
revoke();

const walker = document.createTreeWalker(treeWalkerRoot, NodeFilter.SHOW_ELEMENT, proxy);
assert_throws_js(nodeFilterGlobalObject.TypeError, () => { walker.firstChild(); });
}, "NodeFilter is cross-realm callable revoked Proxy");

function test_onload(fn, desc) {
async_test(t => { window.addEventListener("load", t.step_func_done(fn)); }, desc);
}
</script>

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<!DOCTYPE html>
<meta charset="utf-8">
<body>
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Cross-realm XPathNSResolver throws TypeError of its associated Realm</title>
<link rel="help" href="https://webidl.spec.whatwg.org/#ref-for-prepare-to-run-script">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/invalid_namespace_test.js"></script>

<iframe name="resolverGlobalObject" src="resources/empty-document.html"></iframe>

<script>
setup({ allow_uncaught_exception: true });

const iframeLoaded = new Promise(resolve => { window.addEventListener("load", resolve); });

promise_test(async t => {
await iframeLoaded;
const resolver = new resolverGlobalObject.Object;

return promise_rejects_js(t, resolverGlobalObject.TypeError,
invalid_namespace_test(t, resolver, resolverGlobalObject)
);
}, "XPathNSResolver is cross-realm plain object without 'lookupNamespaceURI' property");

promise_test(async t => {
await iframeLoaded;
const resolver = new resolverGlobalObject.Object;
resolver.lookupNamespaceURI = {};

return promise_rejects_js(t, resolverGlobalObject.TypeError,
invalid_namespace_test(t, resolver, resolverGlobalObject)
);
}, "XPathNSResolver is cross-realm plain object with non-callable 'lookupNamespaceURI' property");

promise_test(async t => {
await iframeLoaded;
const { proxy, revoke } = Proxy.revocable(() => {}, {});
revoke();

const resolver = new resolverGlobalObject.Object;
resolver.lookupNamespaceURI = proxy;

return promise_rejects_js(t, resolverGlobalObject.TypeError,
invalid_namespace_test(t, resolver, resolverGlobalObject)
);
}, "XPathNSResolver is cross-realm plain object with revoked Proxy as 'lookupNamespaceURI' property");

promise_test(async t => {
await iframeLoaded;
const { proxy, revoke } = resolverGlobalObject.Proxy.revocable({}, {});
revoke();

return promise_rejects_js(t, resolverGlobalObject.TypeError,
invalid_namespace_test(t, proxy, resolverGlobalObject)
);
}, "XPathNSResolver is cross-realm non-callable revoked Proxy");

promise_test(async t => {
await iframeLoaded;
const { proxy, revoke } = resolverGlobalObject.Proxy.revocable(() => {}, {});
revoke();

return promise_rejects_js(t, resolverGlobalObject.TypeError,
invalid_namespace_test(t, proxy, resolverGlobalObject)
);
}, "XPathNSResolver is cross-realm callable revoked Proxy");
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<!DOCTYPE html>
<meta charset="utf-8">
<body>
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
"use strict";
setup({ allow_uncaught_exception: true });

const invalid_namespace_test = (t, resolver) => {
const invalid_namespace_test = (t, resolver, resolverWindow = window) => {
const result = new Promise((resolve, reject) => {
const handler = event => {
reject(event.error);
};

window.addEventListener("error", handler);
resolverWindow.addEventListener("error", handler);
t.add_cleanup(() => {
window.removeEventListener("error", handler);
resolverWindow.removeEventListener("error", handler);
});

t.step_timeout(resolve, 0);
Expand Down

0 comments on commit abf2a59

Please sign in to comment.