// 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');