Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
// Test the TargetCommand's reload method
//
// Note that we reload against main process,
// but this is hard/impossible to test as it reloads the test script itself
// and so stops its execution.
// Load a page with a JS script that change its value everytime we load it
// (that's to see if the reload loads from cache or not)
const TEST_URL = URL_ROOT + "incremental-js-value-script.sjs";
add_task(async function () {
info(" ### Test reloading a Tab");
// Load "?setup" to reinitialize the sjs state if necessary.
const tab = await addTab(TEST_URL + "?setup");
// Now navigate to actual test URL.
const onLoaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
BrowserTestUtils.startLoadingURIString(gBrowser.selectedBrowser, TEST_URL);
await onLoaded;
// Create a TargetCommand for a given test tab
const commands = await CommandsFactory.forTab(tab);
const targetCommand = commands.targetCommand;
// We have to start listening in order to ensure having a targetFront available
await targetCommand.startListening();
const firstJSValue = await getContentVariable();
is(firstJSValue, "1", "Got an initial value for the JS variable");
const onReloaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
await targetCommand.reloadTopLevelTarget();
info("Wait for the tab to be reloaded");
await onReloaded;
const secondJSValue = await getContentVariable();
is(
secondJSValue,
"1",
"The first reload didn't bypass the cache, so the JS Script is the same and we got the same value"
);
const onSecondReloaded = BrowserTestUtils.browserLoaded(
gBrowser.selectedBrowser
);
await targetCommand.reloadTopLevelTarget(true);
info("Wait for the tab to be reloaded");
await onSecondReloaded;
// The value is 3 and not 2, because we got a HTTP request, but it returned 304 and the browser fetched his cached content
const thirdJSValue = await getContentVariable();
is(
thirdJSValue,
"3",
"The second reload did bypass the cache, so the JS Script is different and we got a new value"
);
BrowserTestUtils.removeTab(tab);
await commands.destroy();
});
add_task(async function () {
info(" ### Test reloading an Add-on");
const extension = ExtensionTestUtils.loadExtension({
useAddonManager: "temporary",
background() {
const { browser } = this;
browser.test.log("background script executed");
},
});
await extension.startup();
const commands = await CommandsFactory.forAddon(extension.id);
const targetCommand = commands.targetCommand;
// We have to start listening in order to ensure having a targetFront available
await targetCommand.startListening();
// Observe the new document being reported while reloading
const reloadedTargets = [];
await commands.resourceCommand.watchResources(
[commands.resourceCommand.TYPES.DOCUMENT_EVENT],
{
onAvailable(resources) {
for (const resource of resources) {
if (resource.name == "dom-complete") {
reloadedTargets.push(
resource.targetFront.isFallbackExtensionDocument
);
}
}
},
ignoreExistingResources: true,
}
);
const targets = await targetCommand.getAllTargets(targetCommand.ALL_TYPES);
for (const targetFront of targets) {
is(
targetFront.addonId,
extension.id,
`Target ${targetFront.actorID} has the right addonId attribute`
);
}
await targetCommand.reloadTopLevelTarget();
info("Wait for next dom-loading DOCUMENT_EVENT");
await waitFor(() => reloadedTargets.length == 1);
// We only get a new background document
// (the fallback stays alive)
Assert.deepEqual(reloadedTargets, [false], "All the targets got reloaded");
await commands.destroy();
await extension.unload();
});
function getContentVariable() {
return SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
return content.wrappedJSObject.jsValue;
});
}