The `gBrowser.reloadTab` method was doing a very light reload, which could preserve iframe overriden locations. The new method ensures we load the original HTML content back, this seems to also have an impact on keep-alive which is not longer guaranteed. Only supports reloading the currently selected tab, to better replicate real user scenarios. But also to comply to `BrowserCommands.reload`, which only supports reloading the selected tab. Also tune the har test, now that requests are really cancelled and we may try to fetch reponse content for such request. Differential Revision: https://phabricator.services.mozilla.com/D277433
146 lines
4.9 KiB
JavaScript
146 lines
4.9 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
|
|
|
|
/*
|
|
* Test loading inline scripts from cache:
|
|
* - Load document with inline script
|
|
* - Reload inside debugger with toolbox caching disabled
|
|
* - Reload inside debugger with toolbox caching enabled
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
// Breakpoint position calculations can throw when interrupted by a navigation.
|
|
PromiseTestUtils.allowMatchingRejectionsGlobally(/Resource .*? does not exist/);
|
|
|
|
const server = createTestHTTPServer();
|
|
|
|
let docValue = 1;
|
|
server.registerPathHandler("/inline-cache.html", (request, response) => {
|
|
response.setHeader("Content-Type", "text/html");
|
|
// HTTP should assume cacheable by default.
|
|
// Toolbox defaults to disabling cache for subsequent loads when open.
|
|
response.setHeader("Cache-Control", "public, max-age=3600");
|
|
response.write(`
|
|
<html>
|
|
<head>
|
|
<script>
|
|
let x = ${docValue};
|
|
</script>
|
|
</head>
|
|
</html>
|
|
`);
|
|
});
|
|
|
|
const SOURCE_URL = `http://localhost:${server.identity.primaryPort}/inline-cache.html`;
|
|
|
|
add_task(async function () {
|
|
info("Load document with inline script");
|
|
const tab = await addTab(SOURCE_URL);
|
|
info("Open debugger");
|
|
clearDebuggerPreferences();
|
|
const toolbox = await openToolboxForTab(tab, "jsdebugger");
|
|
const dbg = createDebuggerContext(toolbox);
|
|
await waitForSource(dbg, "inline-cache.html");
|
|
info("Reload tab to ensure debugger finds script");
|
|
await reloadSelectedTab();
|
|
let pageValue = await getPageValue(tab);
|
|
is(pageValue, "let x = 1;", "Content loads from network, has doc value 1");
|
|
await waitForSource(dbg, "inline-cache.html");
|
|
await selectSource(dbg, "inline-cache.html");
|
|
await waitForLoadedSource(dbg, "inline-cache.html");
|
|
let dbgValue = findSourceContent(dbg, "inline-cache.html");
|
|
info(`Debugger text: ${dbgValue.value}`);
|
|
ok(
|
|
dbgValue.value.includes(pageValue),
|
|
"Debugger loads from cache, gets value 1 like page"
|
|
);
|
|
|
|
info("Disable HTTP cache for page");
|
|
await toolbox.commands.targetConfigurationCommand.updateConfiguration({
|
|
cacheDisabled: true,
|
|
});
|
|
makeChanges();
|
|
|
|
info("Reload inside debugger with toolbox caching disabled (attempt 1)");
|
|
await reloadSelectedTab();
|
|
pageValue = await getPageValue(tab);
|
|
is(pageValue, "let x = 2;", "Content loads from network, has doc value 2");
|
|
await waitForLoadedSource(dbg, "inline-cache.html");
|
|
dbgValue = findSourceContent(dbg, "inline-cache.html");
|
|
|
|
info(`Debugger text: ${dbgValue.value}`);
|
|
ok(
|
|
dbgValue.value.includes(pageValue),
|
|
"Debugger loads from network, gets value 2 like page"
|
|
);
|
|
|
|
makeChanges();
|
|
|
|
info("Reload inside debugger with toolbox caching disabled (attempt 2)");
|
|
await reloadSelectedTab();
|
|
pageValue = await getPageValue(tab);
|
|
is(pageValue, "let x = 3;", "Content loads from network, has doc value 3");
|
|
await waitForLoadedSource(dbg, "inline-cache.html");
|
|
dbgValue = findSourceContent(dbg, "inline-cache.html");
|
|
info(`Debugger text: ${dbgValue.value}`);
|
|
ok(
|
|
dbgValue.value.includes(pageValue),
|
|
"Debugger loads from network, gets value 3 like page"
|
|
);
|
|
|
|
info("Enable HTTP cache for page");
|
|
await toolbox.commands.targetConfigurationCommand.updateConfiguration({
|
|
cacheDisabled: false,
|
|
});
|
|
makeChanges();
|
|
|
|
// Even though the HTTP cache is now enabled, Gecko sets the VALIDATE_ALWAYS flag when
|
|
// reloading the page. So, it will always make a request to the server for the main
|
|
// document contents.
|
|
|
|
info("Reload inside debugger with toolbox caching enabled (attempt 1)");
|
|
await reloadSelectedTab();
|
|
pageValue = await getPageValue(tab);
|
|
is(pageValue, "let x = 4;", "Content loads from network, has doc value 4");
|
|
await waitForLoadedSource(dbg, "inline-cache.html");
|
|
dbgValue = findSourceContent(dbg, "inline-cache.html");
|
|
info(`Debugger text: ${dbgValue.value}`);
|
|
ok(
|
|
dbgValue.value.includes(pageValue),
|
|
"Debugger loads from cache, gets value 4 like page"
|
|
);
|
|
|
|
makeChanges();
|
|
|
|
info("Reload inside debugger with toolbox caching enabled (attempt 2)");
|
|
await reloadSelectedTab();
|
|
pageValue = await getPageValue(tab);
|
|
is(pageValue, "let x = 5;", "Content loads from network, has doc value 5");
|
|
await waitForLoadedSource(dbg, "inline-cache.html");
|
|
await waitForSelectedSource(dbg, "inline-cache.html");
|
|
dbgValue = findSourceContent(dbg, "inline-cache.html");
|
|
info(`Debugger text: ${dbgValue.value}`);
|
|
ok(
|
|
dbgValue.value.includes(pageValue),
|
|
"Debugger loads from cache, gets value 5 like page"
|
|
);
|
|
|
|
await closeTabAndToolbox();
|
|
});
|
|
|
|
/**
|
|
* This is meant to simulate the developer editing the inline source and saving.
|
|
* Effectively, we change the source during the test at specific controlled points.
|
|
*/
|
|
function makeChanges() {
|
|
docValue++;
|
|
}
|
|
|
|
function getPageValue(tab) {
|
|
return SpecialPowers.spawn(tab.linkedBrowser, [], function () {
|
|
return content.document.querySelector("script").textContent.trim();
|
|
});
|
|
}
|