fune/docshell/test/unit/test_browsing_context_structured_clone.js
Kris Maglione b732d682a4 Bug 1532795: Part 1 - Support sending BrowsingContexts via structured clone. r=nika
Differential Revision: https://phabricator.services.mozilla.com/D35698

--HG--
extra : rebase_source : 2a519f1787f50e7faf71d02feb12f2cb066a5dd9
2019-07-01 15:24:09 -07:00

62 lines
2.3 KiB
JavaScript

"use strict";
add_task(async function test_BrowsingContext_structured_clone() {
let browser = Services.appShell.createWindowlessBrowser(false);
let frame = browser.document.createElement("iframe");
browser.document.body.appendChild(frame);
let {browsingContext} = frame;
let sch = new StructuredCloneHolder({browsingContext});
let deserialize = () => sch.deserialize({}, true);
// Check that decoding a live browsing context produces the correct
// object.
equal(deserialize().browsingContext, browsingContext,
"Got correct browsing context from StructuredClone deserialize");
// Check that decoding a second time still succeeds.
equal(deserialize().browsingContext, browsingContext,
"Got correct browsing context from second StructuredClone deserialize");
// Destroy the browsing context and make sure that the decode fails
// with a DataCloneError.
//
// Making sure the BrowsingContext is actually destroyed by the time
// we do the second decode is a bit tricky. We obviously have clear
// our local references to it, and give the GC a chance to reap them.
// And we also, of course, have to destroy the frame that it belongs
// to, or its frame loader and window global would hold it alive.
//
// Beyond that, we don't *have* to reload or destroy the parent
// document, but we do anyway just to be safe.
//
// Then comes the tricky bit: The WindowGlobal actors (which keep
// references to their BrowsingContexts) require an IPC round trip to
// be completely destroyed, even though they're in-process, so we make
// a quick trip through the event loop, and then run the CC in order
// to allow their (now snow-white) references to be collected.
frame.remove();
frame = null;
browsingContext = null;
browser.document.location.reload();
browser.close();
Cu.forceGC();
// Give the IPC messages that destroy the actors a chance to be
// processed.
await new Promise(executeSoon);
Cu.forceCC();
// OK. We can be fairly confident that the BrowsingContext object
// stored in our structured clone data has been destroyed. Make sure
// that attempting to decode it again leads to the appropriate error.
Assert.throws(deserialize, e => e.name === "DataCloneError",
"Should get a DataCloneError when trying to decode a dead BrowsingContext");
});