blob: 460c4efe1373700d9820ba54a1b1ee360a3a0f68 [file] [log] [blame]
// Check that withSourceHook passes URLs, propagates exceptions, and
// properly restores the original source hooks.
load(libdir + 'asserts.js');
// withSourceHook isn't defined if you pass the shell the --fuzzing-safe
// option. Skip this test silently, to avoid spurious failures.
if (typeof withSourceHook != 'function')
quit(0);
var log = '';
// Establish an outermost source hook.
withSourceHook(function (url) {
log += 'o';
assertEq(url, 'outer');
return '(function outer() { 3; })';
}, function () {
log += 'O';
// Verify that withSourceHook propagates exceptions thrown by source hooks.
assertThrowsValue(function () {
// Establish a source hook that throws.
withSourceHook(function (url) {
log += 'm';
assertEq(url, 'middle');
throw 'borborygmus'; // middle
}, function () {
log += 'M';
// Establish an innermost source hook that does not throw,
// and verify that it is in force.
assertEq(withSourceHook(function (url) {
log += 'i';
assertEq(url, 'inner');
return '(function inner() { 1; })';
}, function () {
log += 'I';
return evaluate('(function inner() { 2; })',
{ fileName: 'inner', sourceIsLazy: true })
.toSource();
}),
'(function inner() { 1; })');
// Verify that the source hook that throws has been reinstated.
evaluate('(function middle() { })',
{ fileName: 'middle', sourceIsLazy: true })
.toSource();
});
}, 'borborygmus');
// Verify that the outermost source hook has been restored.
assertEq(evaluate('(function outer() { 4; })',
{ fileName: 'outer', sourceIsLazy: true })
.toSource(),
'(function outer() { 3; })');
});
assertEq(log, 'OMIimo');