diff options
Diffstat (limited to 'devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js')
-rw-r--r-- | devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js b/devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js new file mode 100644 index 0000000000..f579ddb1b9 --- /dev/null +++ b/devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js @@ -0,0 +1,146 @@ +/* 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 reloadBrowser(); + 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 reloadBrowser(); + 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 reloadBrowser(); + 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 reloadBrowser(); + 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 reloadBrowser(); + 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 toolbox.destroy(); + await removeTab(tab); +}); + +/** + * 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(); + }); +} |