description('This test exercises the source URL and line number that is embedded in JavaScript exceptions, which is displayed in places like the JavaScript console.'); function exceptionInFunction() { throw Exception(); } var e = undefined; try { // Raises an exception that gets picked up by KJS_CHECKEXCEPTION document.documentElement.innerHTML(foo); } catch (exception) { e = exception; } shouldBe("typeof e.sourceURL", '"string"'); shouldBe("e.line", '12'); e = undefined; try { // Raises an exception that gets picked up by KJS_CHECKEXCEPTIONVALUE document.documentElement.appendChild('').prefix = ''; } catch (exception) { e = exception; } shouldBe("typeof e.sourceURL", '"string"'); shouldBe("e.line", '22'); e = undefined; try { // Raises an exception that gets picked up by KJS_CHECKEXCEPTIONREFERENCE document.documentElement.appendChild('').innerHTML = ''; } catch (exception) { e = exception; } shouldBe("typeof e.sourceURL", '"string"'); shouldBe("e.line", '32'); e = undefined; try { // Raises an exception that gets picked up by KJS_CHECKEXCEPTIONLIST document.getElementById(1()); } catch (exception) { e = exception; } shouldBe("typeof e.sourceURL", '"string"'); shouldBe("e.line", '42'); e = undefined; // Raises an exception inside a function to check that its line number // isn't overwritten in the assignment node. try { var a = exceptionInFunction(); } catch (exception) { e = exception; } shouldBe("typeof e.sourceURL", '"string"'); shouldBe("e.line", '5'); realEval = eval; delete eval; (function(){ try { eval(""); } catch(exception) { e = exception; } })(); eval = realEval; shouldBe("typeof e.sourceURL", '"string"'); shouldBe("e.line", '64'); var firstPropIsGetter = { get getter() { throw {} } }; var secondPropIsGetter = { prop: 1, get getter() { throw {} } }; var firstPropIsSetter = { set setter(a) { throw {} } }; var secondPropIsSetter = { prop: 1, set setter(a) { throw {} } }; try { firstPropIsGetter.getter; } catch(ex) { e = ex; shouldBe("e.line", "74"); } try { secondPropIsGetter.getter; } catch(ex) { e = ex; shouldBe("e.line", "78"); } try { firstPropIsSetter.setter = ''; } catch(ex) { e = ex; shouldBe("e.line", "81"); } try { secondPropIsSetter.setter = ''; } catch(ex) { e = ex; shouldBe("e.line", "85"); }