// Source.prototype.sourceMapURL can be a string or null. let g = newGlobal({newCompartment: true}); let dbg = new Debugger; let gw = dbg.addDebuggee(g); function getSourceMapURL() { let fw = gw.makeDebuggeeValue(g.f); return fw.script.source.sourceMapURL; } function setSourceMapURL(url) { let fw = gw.makeDebuggeeValue(g.f); fw.script.source.sourceMapURL = url; } // Without a source map g.evaluate("function f(x) { return 2*x; }"); assertEq(getSourceMapURL(), null); // With a source map g.evaluate("function f(x) { return 2*x; }", {sourceMapURL: 'file:///var/foo.js.map'}); assertEq(getSourceMapURL(), 'file:///var/foo.js.map'); // Nested functions let fired = false; dbg.onDebuggerStatement = function (frame) { fired = true; assertEq(frame.script.source.sourceMapURL, 'file:///var/bar.js.map'); }; g.evaluate('(function () { (function () { debugger; })(); })();', {sourceMapURL: 'file:///var/bar.js.map'}); assertEq(fired, true); // Comment pragmas g.evaluate('function f() {}\n' + '//@ sourceMappingURL=file:///var/quux.js.map'); assertEq(getSourceMapURL(), 'file:///var/quux.js.map'); g.evaluate('function f() {}\n' + '/*//@ sourceMappingURL=file:///var/quux.js.map*/'); assertEq(getSourceMapURL(), 'file:///var/quux.js.map'); g.evaluate('function f() {}\n' + '/*\n' + '//@ sourceMappingURL=file:///var/quux.js.map\n' + '*/'); assertEq(getSourceMapURL(), 'file:///var/quux.js.map'); // Spaces are disallowed by the URL spec (they should have been // percent-encoded). g.evaluate('function f() {}\n' + '//@ sourceMappingURL=http://example.com/has illegal spaces.map'); assertEq(getSourceMapURL(), 'http://example.com/has'); // When the URL is missing, we don't set the sourceMapURL and we don't skip the // next line of input. g.evaluate('function f() {}\n' + '//@ sourceMappingURL=\n' + 'function z() {}'); assertEq(getSourceMapURL(), null); assertEq('z' in g, true); // The last comment pragma we see should be the one which sets the source map's // URL. g.evaluate('function f() {}\n' + '//@ sourceMappingURL=http://example.com/foo.js.map\n' + '//@ sourceMappingURL=http://example.com/bar.js.map'); assertEq(getSourceMapURL(), 'http://example.com/bar.js.map'); // With both a comment and the evaluate option. g.evaluate('function f() {}\n' + '//@ sourceMappingURL=http://example.com/foo.js.map', {sourceMapURL: 'http://example.com/bar.js.map'}); assertEq(getSourceMapURL(), 'http://example.com/foo.js.map'); // Make sure setting the sourceMapURL manually works setSourceMapURL('baz.js.map'); assertEq(getSourceMapURL(), 'baz.js.map'); setSourceMapURL(''); assertEq(getSourceMapURL(), 'baz.js.map');