summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js')
-rw-r--r--devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js136
1 files changed, 136 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js b/devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js
new file mode 100644
index 0000000000..d5fadff145
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js
@@ -0,0 +1,136 @@
+/* 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/>. */
+
+/* import-globals-from ../head.js */
+
+/**
+ * This second test will focus on v1/removed-original.js which is an original source mapped file.
+ * This source is mapped to replaced-bundle.js.
+ * In the first reload (v2), this original source is removed and another original file: v2/new-original.js
+ * will replace the content of the removed-original.js in the replaced-bundle.js generated file.
+ * And finally, in the second reload (v3) everything is removed, both original and generated source.
+ *
+ * Note that great care is done to ensure that new-original replaces removed-original with the
+ * exact same breakable lines and columns. So that the breakpoint isn't simply removed
+ * because the location is no longer breakable.
+ */
+
+"use strict";
+
+addIntegrationTask(async function testReloadingRemovedOriginalSources(
+ testServer,
+ testUrl,
+ { isCompressed }
+) {
+ info(" # Test reloading a source that is replaced and then removed");
+ testServer.backToFirstVersion();
+
+ const dbg = await initDebuggerWithAbsoluteURL(testUrl, "removed-original.js");
+
+ info("Add initial breakpoint");
+ await selectSource(dbg, "removed-original.js");
+ await addBreakpoint(dbg, "removed-original.js", 4);
+
+ // Assert the precise behavior of the breakpoint before reloading
+ invokeInTab("removedOriginal");
+ await waitForPaused(dbg);
+ const replacedSource = findSource(dbg, "removed-original.js");
+ assertPausedAtSourceAndLine(dbg, replacedSource.id, 4);
+ assertTextContentOnLine(dbg, 4, 'console.log("Removed original");');
+ await assertBreakpoint(dbg, 4);
+
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "One breakpoint exists on the server"
+ );
+
+ let breakpoint = dbg.selectors.getBreakpointsList()[0];
+ is(breakpoint.location.source.url, replacedSource.url);
+ is(breakpoint.location.line, 4);
+ if (isCompressed) {
+ is(breakpoint.generatedLocation.line, 1);
+ is(breakpoint.generatedLocation.column, 992);
+ } else {
+ is(breakpoint.generatedLocation.line, 80);
+ }
+ info(
+ "Assert that the breakpoint snippet is originaly set to the to-be-removed original source content"
+ );
+ assertBreakpointSnippet(dbg, 1, `console.log("Removed original");`);
+
+ await resume(dbg);
+
+ info(
+ "Reload, which should remove the original file and a add a new original file which will replace its content in the generated file"
+ );
+ const syncBp = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ testServer.switchToNextVersion();
+ const onReloaded = reload(dbg, "new-original.js");
+ await syncBp;
+
+ // Assert the new breakpoint being created after reload
+ // For now, the current behavior of the debugger is that:
+ // the breakpoint is still hit based on the generated source/bundle file
+ // and the UI updates itself to mention the new original file.
+ await waitForPaused(dbg);
+ const newSource = findSource(dbg, "new-original.js");
+ assertPausedAtSourceAndLine(dbg, newSource.id, 4);
+ assertTextContentOnLine(dbg, 4, 'console.log("New original");');
+ await assertBreakpoint(dbg, 4);
+
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "One breakpoint exists on the server"
+ );
+
+ breakpoint = dbg.selectors.getBreakpointsList()[0];
+ is(breakpoint.location.source.url, newSource.url);
+ is(breakpoint.location.line, 4);
+ if (isCompressed) {
+ is(breakpoint.generatedLocation.line, 1);
+ is(breakpoint.generatedLocation.column, 992);
+ } else {
+ is(breakpoint.generatedLocation.line, 80);
+ }
+ info(
+ "Assert that the breakpoint snippet changed to the new original source content"
+ );
+ assertBreakpointSnippet(dbg, 1, `console.log("New original");`);
+
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ info(
+ "Reload a last time to remove both original and generated sources entirely"
+ );
+ testServer.switchToNextVersion();
+ await reload(dbg);
+
+ // Let some time for breakpoint syncing to be buggy and recreated unexpected breakpoint
+ await wait(1000);
+ info("Assert that sources and breakpoints are gone and we aren't paused");
+ ok(
+ !sourceExists(dbg, "removed-original.js"),
+ "removed-original is not present"
+ );
+ ok(!sourceExists(dbg, "new-original.js"), "new-original is not present");
+ ok(
+ !sourceExists(dbg, "replaced-bundle.js"),
+ "replaced-bundle is not present"
+ );
+ assertNotPaused(dbg);
+ is(dbg.selectors.getBreakpointCount(), 0, "We no longer have any breakpoint");
+ // The breakpoint for the removed source still exists, atm this difficult to fix
+ // as the frontend never loads the source.
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "One breakpoint still exists on the server"
+ );
+});