blob: b8a7d6444f415d4734383df4cc3ed7ae472c7f45 [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/content/test/data/mojo_web_test_helper_test.mojom.js"></script>
<body>
<script>
function frameLoaded(frame) {
return new Promise(resolve => {
let eventHandler = e => {
frame.removeEventListener('load', eventHandler);
resolve();
};
frame.addEventListener('load', eventHandler);
});
}
promise_test(async () => {
let frame = document.createElement("iframe");
let promise = frameLoaded(frame);
document.body.appendChild(frame);
await promise;
// Save a reference to the Mojo object from the child frame so that we can
// make calls to it after the context has been destroyed.
let frameMojo = frame.contentWindow.Mojo;
document.body.removeChild(frame);
let helper = new content.mojom.MojoWebTestHelperPtr;
frameMojo.bindInterface(content.mojom.MojoWebTestHelper.name,
mojo.makeRequest(helper).handle);
try {
let reply = await helper.reverse("hello world.");
assert_unreached();
} catch (e) {
// Connection failure expected.
}
}, "Mojo object is safe to use after its frame has been detached");
promise_test(async () => {
let frame = document.createElement("iframe");
let promise = frameLoaded(frame);
document.body.appendChild(frame);
await promise;
// Save a reference to the MojoInterfaceInterceptor constructor from the child
// frame so that we can be used after the context has been destroyed.
let frameMojoInterfaceInterceptor =
frame.contentWindow.MojoInterfaceInterceptor;
document.body.removeChild(frame);
let interceptor = new frameMojoInterfaceInterceptor(
content.mojom.MojoWebTestHelper.name);
try {
interceptor.start();
assert_unreached();
} catch (e) {
// Failure expected.
}
}, "MojoInterfaceInterceptor constructor is safe to use after its frame has been detached");
promise_test(async () => {
let frame = document.createElement("iframe");
let promise = frameLoaded(frame);
document.body.appendChild(frame);
await promise;
// Create the interceptor while the frame is attached so that it is associated
// with the frame's execution context.
let interceptor = new frame.contentWindow.MojoInterfaceInterceptor(
content.mojom.MojoWebTestHelper.name);
document.body.removeChild(frame);
try {
interceptor.start();
assert_unreached();
} catch (e) {
// Failure expected.
}
}, "MojoInterfaceInterceptor can't be started after its frame has been detached");
promise_test(async () => {
let frame = document.createElement("iframe");
let promise = frameLoaded(frame);
document.body.appendChild(frame);
await promise;
// Create the interceptor and start it while the frame is attached.
let interceptor = new frame.contentWindow.MojoInterfaceInterceptor(
content.mojom.MojoWebTestHelper.name);
interceptor.start();
document.body.removeChild(frame);
// stop() will succeed because it is implicitly called when the execution
// context is destroyed.
interceptor.stop();
}, "MojoInterfaceInterceptor is stopped on frame destruction");
</script>
</body>