| /* -*- js-indent-level: 4; indent-tabs-mode: nil -*- */ |
| // Source.prototype.displayURL can be a string or null. |
| |
| let g = newGlobal('new-compartment'); |
| let dbg = new Debugger; |
| let gw = dbg.addDebuggee(g); |
| |
| function getDisplayURL() { |
| let fw = gw.makeDebuggeeValue(g.f); |
| return fw.script.source.displayURL; |
| } |
| |
| // Without a source url |
| g.evaluate("function f(x) { return 2*x; }"); |
| assertEq(getDisplayURL(), null); |
| |
| // With a source url |
| g.evaluate("function f(x) { return 2*x; }", {displayURL: 'file:///var/foo.js'}); |
| assertEq(getDisplayURL(), 'file:///var/foo.js'); |
| |
| // Nested functions |
| let fired = false; |
| dbg.onDebuggerStatement = function (frame) { |
| fired = true; |
| assertEq(frame.script.source.displayURL, 'file:///var/bar.js'); |
| }; |
| g.evaluate('(function () { (function () { debugger; })(); })();', |
| {displayURL: 'file:///var/bar.js'}); |
| assertEq(fired, true); |
| |
| // Comment pragmas |
| g.evaluate('function f() {}\n' + |
| '//# sourceURL=file:///var/quux.js'); |
| assertEq(getDisplayURL(), 'file:///var/quux.js'); |
| |
| g.evaluate('function f() {}\n' + |
| '/*//# sourceURL=file:///var/quux.js*/'); |
| assertEq(getDisplayURL(), 'file:///var/quux.js'); |
| |
| g.evaluate('function f() {}\n' + |
| '/*\n' + |
| '//# sourceURL=file:///var/quux.js\n' + |
| '*/'); |
| assertEq(getDisplayURL(), 'file:///var/quux.js'); |
| |
| // Spaces are disallowed by the URL spec (they should have been |
| // percent-encoded). |
| g.evaluate('function f() {}\n' + |
| '//# sourceURL=http://example.com/has illegal spaces'); |
| assertEq(getDisplayURL(), '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' + |
| '//# sourceURL=\n' + |
| 'function z() {}'); |
| assertEq(getDisplayURL(), null); |
| assertEq('z' in g, true); |
| |
| // The last comment pragma we see should be the one which sets the displayURL. |
| g.evaluate('function f() {}\n' + |
| '//# sourceURL=http://example.com/foo.js\n' + |
| '//# sourceURL=http://example.com/bar.js'); |
| assertEq(getDisplayURL(), 'http://example.com/bar.js'); |
| |
| // With both a comment and the evaluate option. |
| g.evaluate('function f() {}\n' + |
| '//# sourceURL=http://example.com/foo.js', |
| {displayURL: 'http://example.com/bar.js'}); |
| assertEq(getDisplayURL(), 'http://example.com/foo.js'); |
| |
| |
| // Bug 981987 reported that we hadn't set sourceURL yet when firing onNewScript |
| // from the Function constructor. |
| var capturedScript; |
| var capturedDisplayURL; |
| var capturedSourceMapURL; |
| dbg.onNewScript = function (script) { |
| capturedScript = script; |
| capturedDisplayURL = script.source.displayURL; |
| capturedSourceMapURL = script.source.sourceMapURL; |
| dbg.onNewScript = undefined; |
| }; |
| var fun = gw.makeDebuggeeValue(g.Function('//# sourceURL=munge.js\n//# sourceMappingURL=grunge.map\n')); |
| assertEq(capturedScript, fun.script); |
| |
| assertEq(capturedDisplayURL, fun.script.source.displayURL); |
| assertEq(capturedDisplayURL, 'munge.js'); |
| |
| assertEq(capturedSourceMapURL, fun.script.source.sourceMapURL); |
| assertEq(capturedSourceMapURL, 'grunge.map'); |