diff options
Diffstat (limited to 'devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js')
-rw-r--r-- | devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js b/devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js new file mode 100644 index 000000000..f3c4e89a8 --- /dev/null +++ b/devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js @@ -0,0 +1,187 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Test that bogus source maps don't break debugging. + */ + +const TAB_URL = EXAMPLE_URL + "doc_minified_bogus_map.html"; +const JS_URL = EXAMPLE_URL + "code_math_bogus_map.js"; + +// This test causes an error to be logged in the console, which appears in TBPL +// logs, so we are disabling that here. +DevToolsUtils.reportingDisabled = true; + +var gPanel, gDebugger, gFrames, gSources, gPrefs, gOptions; + +function test() { + let options = { + source: JS_URL, + line: 1 + }; + initDebugger(TAB_URL, options).then(([aTab,, aPanel]) => { + gPanel = aPanel; + gDebugger = gPanel.panelWin; + gFrames = gDebugger.DebuggerView.StackFrames; + gSources = gDebugger.DebuggerView.Sources; + gPrefs = gDebugger.Prefs; + gOptions = gDebugger.DebuggerView.Options; + + is(gPrefs.pauseOnExceptions, false, + "The pause-on-exceptions pref should be disabled by default."); + isnot(gOptions._pauseOnExceptionsItem.getAttribute("checked"), "true", + "The pause-on-exceptions menu item should not be checked."); + + checkInitialSource(); + enablePauseOnExceptions() + .then(disableIgnoreCaughtExceptions) + .then(testSetBreakpoint) + .then(reloadPage) + .then(testHitBreakpoint) + .then(enableIgnoreCaughtExceptions) + .then(disablePauseOnExceptions) + .then(() => closeDebuggerAndFinish(gPanel)) + .then(null, aError => { + ok(false, "Got an error: " + aError.message + "\n" + aError.stack); + }); + }); +} + +function checkInitialSource() { + isnot(gSources.selectedItem.attachment.source.url.indexOf("code_math_bogus_map.js"), -1, + "The debugger should show the minified js file."); +} + +function enablePauseOnExceptions() { + let deferred = promise.defer(); + + gDebugger.gThreadClient.addOneTimeListener("resumed", () => { + is(gPrefs.pauseOnExceptions, true, + "The pause-on-exceptions pref should now be enabled."); + + ok(true, "Pausing on exceptions was enabled."); + deferred.resolve(); + }); + + gOptions._pauseOnExceptionsItem.setAttribute("checked", "true"); + gOptions._togglePauseOnExceptions(); + + return deferred.promise; +} + +function disableIgnoreCaughtExceptions() { + let deferred = promise.defer(); + + gDebugger.gThreadClient.addOneTimeListener("resumed", () => { + is(gPrefs.ignoreCaughtExceptions, false, + "The ignore-caught-exceptions pref should now be disabled."); + + ok(true, "Ignore caught exceptions was disabled."); + deferred.resolve(); + }); + + gOptions._ignoreCaughtExceptionsItem.setAttribute("checked", "false"); + gOptions._toggleIgnoreCaughtExceptions(); + + return deferred.promise; +} + +function testSetBreakpoint() { + let deferred = promise.defer(); + let sourceForm = getSourceForm(gSources, JS_URL); + let source = gDebugger.gThreadClient.source(sourceForm); + + source.setBreakpoint({ line: 3, column: 18 }, aResponse => { + ok(!aResponse.error, + "Should be able to set a breakpoint in a js file."); + ok(!aResponse.actualLocation, + "Should be able to set a breakpoint on line 3 and column 18."); + + deferred.resolve(); + }); + + return deferred.promise; +} + +function reloadPage() { + let loaded = waitForSourceAndCaret(gPanel, ".js", 3); + gDebugger.DebuggerController._target.activeTab.reload(); + return loaded.then(() => ok(true, "Page was reloaded and execution resumed.")); +} + +function testHitBreakpoint() { + let deferred = promise.defer(); + + gDebugger.gThreadClient.resume(aResponse => { + ok(!aResponse.error, "Shouldn't get an error resuming."); + is(aResponse.type, "resumed", "Type should be 'resumed'."); + + waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_SCOPES).then(() => { + is(gFrames.itemCount, 2, "Should have two frames."); + + // This is weird, but we need to let the debugger a chance to + // update first + executeSoon(() => { + gDebugger.gThreadClient.resume(() => { + gDebugger.gThreadClient.addOneTimeListener("paused", () => { + gDebugger.gThreadClient.resume(() => { + // We also need to make sure the next step doesn't add a + // "resumed" handler until this is completely finished + executeSoon(() => { + deferred.resolve(); + }); + }); + }); + }); + }); + }); + }); + + return deferred.promise; +} + +function enableIgnoreCaughtExceptions() { + let deferred = promise.defer(); + + gDebugger.gThreadClient.addOneTimeListener("resumed", () => { + is(gPrefs.ignoreCaughtExceptions, true, + "The ignore-caught-exceptions pref should now be enabled."); + + ok(true, "Ignore caught exceptions was enabled."); + deferred.resolve(); + }); + + gOptions._ignoreCaughtExceptionsItem.setAttribute("checked", "true"); + gOptions._toggleIgnoreCaughtExceptions(); + + return deferred.promise; +} + +function disablePauseOnExceptions() { + let deferred = promise.defer(); + + gDebugger.gThreadClient.addOneTimeListener("resumed", () => { + is(gPrefs.pauseOnExceptions, false, + "The pause-on-exceptions pref should now be disabled."); + + ok(true, "Pausing on exceptions was disabled."); + deferred.resolve(); + }); + + gOptions._pauseOnExceptionsItem.setAttribute("checked", "false"); + gOptions._togglePauseOnExceptions(); + + return deferred.promise; +} + +registerCleanupFunction(function () { + gPanel = null; + gDebugger = null; + gFrames = null; + gSources = null; + gPrefs = null; + gOptions = null; + DevToolsUtils.reportingDisabled = false; +}); |