michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: /** michael@0: * Check that source maps and breakpoints work with minified javascript. michael@0: */ michael@0: michael@0: var gDebuggee; michael@0: var gClient; michael@0: var gThreadClient; michael@0: michael@0: Components.utils.import('resource:///modules/devtools/SourceMap.jsm'); michael@0: michael@0: function run_test() michael@0: { michael@0: initTestDebuggerServer(); michael@0: gDebuggee = addTestGlobal("test-source-map"); michael@0: gClient = new DebuggerClient(DebuggerServer.connectPipe()); michael@0: gClient.connect(function() { michael@0: attachTestTabAndResume(gClient, "test-source-map", function(aResponse, aTabClient, aThreadClient) { michael@0: gThreadClient = aThreadClient; michael@0: test_minified(); michael@0: }); michael@0: }); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function test_minified() michael@0: { michael@0: let newSourceFired = false; michael@0: michael@0: gClient.addOneTimeListener("newSource", function _onNewSource(aEvent, aPacket) { michael@0: do_check_eq(aEvent, "newSource"); michael@0: do_check_eq(aPacket.type, "newSource"); michael@0: do_check_true(!!aPacket.source); michael@0: michael@0: do_check_eq(aPacket.source.url, "http://example.com/foo.js", michael@0: "The new source should be foo.js"); michael@0: do_check_eq(aPacket.source.url.indexOf("foo.min.js"), -1, michael@0: "The new source should not be the minified file"); michael@0: michael@0: newSourceFired = true; michael@0: }); michael@0: michael@0: gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) { michael@0: do_check_eq(aEvent, "paused"); michael@0: do_check_eq(aPacket.why.type, "debuggerStatement"); michael@0: michael@0: const location = { michael@0: url: "http://example.com/foo.js", michael@0: line: 5 michael@0: }; michael@0: michael@0: gThreadClient.setBreakpoint(location, function (aResponse, bpClient) { michael@0: do_check_true(!aResponse.error); michael@0: testHitBreakpoint(); michael@0: }); michael@0: }); michael@0: michael@0: // This is the original foo.js, which was then minified with uglifyjs version michael@0: // 2.2.5 and the "--mangle" option. michael@0: // michael@0: // (function () { michael@0: // debugger; michael@0: // function foo(n) { michael@0: // var bar = n + n; michael@0: // var unused = null; michael@0: // return bar; michael@0: // } michael@0: // for (var i = 0; i < 10; i++) { michael@0: // foo(i); michael@0: // } michael@0: // }()); michael@0: michael@0: let code = '(function(){debugger;function r(r){var n=r+r;var u=null;return n}for(var n=0;n<10;n++){r(n)}})();\n//# sourceMappingURL=data:text/json,{"file":"foo.min.js","version":3,"sources":["foo.js"],"names":["foo","n","bar","unused","i"],"mappings":"CAAC,WACC,QACA,SAASA,GAAIC,GACX,GAAIC,GAAMD,EAAIA,CACd,IAAIE,GAAS,IACb,OAAOD,GAET,IAAK,GAAIE,GAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3BJ,EAAII"}'; michael@0: michael@0: Components.utils.evalInSandbox(code, gDebuggee, "1.8", michael@0: "http://example.com/foo.min.js", 1); michael@0: } michael@0: michael@0: function testHitBreakpoint(timesHit=0) { michael@0: gClient.addOneTimeListener("paused", function (aEvent, aPacket) { michael@0: ++timesHit; michael@0: michael@0: do_check_eq(aEvent, "paused"); michael@0: do_check_eq(aPacket.why.type, "breakpoint"); michael@0: michael@0: if (timesHit === 10) { michael@0: gThreadClient.resume(() => finishClient(gClient)); michael@0: } else { michael@0: testHitBreakpoint(timesHit); michael@0: } michael@0: }); michael@0: michael@0: gThreadClient.resume(); michael@0: }