Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
const { RootMessageHandler } = ChromeUtils.importESModule(
"chrome://remote/content/shared/messagehandler/RootMessageHandler.sys.mjs"
);
add_task(async function test_tab_is_removed() {
const sessionId = "realms";
const browsingContext = tab.linkedBrowser.browsingContext;
const contextDescriptor = {
type: ContextDescriptorType.TopBrowsingContext,
id: browsingContext.browserId,
};
const rootMessageHandler = createRootMessageHandler(sessionId);
const onRealmCreated = rootMessageHandler.once("realm-created");
// Add a new session data item to get window global handlers created
await rootMessageHandler.addSessionDataItem({
moduleName: "command",
category: "browser_realms",
contextDescriptor,
values: [true],
});
const realmCreatedEvent = await onRealmCreated;
const createdRealmId = realmCreatedEvent.realmInfo.realm;
is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map");
const onRealmDestroyed = rootMessageHandler.once("realm-destroyed");
gBrowser.removeTab(tab);
const realmDestroyedEvent = await onRealmDestroyed;
is(
realmDestroyedEvent.realm,
createdRealmId,
"Received a correct realm id in realm-destroyed event"
);
is(rootMessageHandler.realms.size, 0, "The realm map is cleaned up");
rootMessageHandler.destroy();
});
add_task(async function test_same_origin_navigation() {
const sessionId = "realms";
const browsingContext = tab.linkedBrowser.browsingContext;
const contextDescriptor = {
type: ContextDescriptorType.TopBrowsingContext,
id: browsingContext.browserId,
};
const rootMessageHandler = createRootMessageHandler(sessionId);
const onRealmCreated = rootMessageHandler.once("realm-created");
// Add a new session data item to get window global handlers created
await rootMessageHandler.addSessionDataItem({
moduleName: "command",
category: "browser_realms",
contextDescriptor,
values: [true],
});
const realmCreatedEvent = await onRealmCreated;
const createdRealmId = realmCreatedEvent.realmInfo.realm;
is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map");
const onRealmDestroyed = rootMessageHandler.once("realm-destroyed");
const onNewRealmCreated = rootMessageHandler.once("realm-created");
// Navigate to another page with the same origin
await loadURL(
tab.linkedBrowser,
);
const realmDestroyedEvent = await onRealmDestroyed;
is(
realmDestroyedEvent.realm,
createdRealmId,
"Received a correct realm id in realm-destroyed event"
);
await onNewRealmCreated;
is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map");
gBrowser.removeTab(tab);
rootMessageHandler.destroy();
});
add_task(async function test_cross_origin_navigation() {
const sessionId = "realms";
const browsingContext = tab.linkedBrowser.browsingContext;
const contextDescriptor = {
type: ContextDescriptorType.TopBrowsingContext,
id: browsingContext.browserId,
};
const rootMessageHandler = createRootMessageHandler(sessionId);
const onRealmCreated = rootMessageHandler.once("realm-created");
// Add a new session data item to get window global handlers created
await rootMessageHandler.addSessionDataItem({
moduleName: "command",
category: "browser_realms",
contextDescriptor,
values: [true],
});
const realmCreatedEvent = await onRealmCreated;
const createdRealmId = realmCreatedEvent.realmInfo.realm;
is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map");
const onRealmDestroyed = rootMessageHandler.once("realm-destroyed");
const onNewRealmCreated = rootMessageHandler.once("realm-created");
// Navigate to another page with the different origin
await loadURL(
tab.linkedBrowser,
);
const realmDestroyedEvent = await onRealmDestroyed;
is(
realmDestroyedEvent.realm,
createdRealmId,
"Received a correct realm id in realm-destroyed event"
);
await onNewRealmCreated;
is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map");
gBrowser.removeTab(tab);
rootMessageHandler.destroy();
});