| <!DOCTYPE html> |
| <script src="../../../resources/js-test-pre.js"></script> |
| <script> |
| |
| if (typeof testRunner !== 'undefined') |
| testRunner.dumpAsText(); |
| |
| // ES6 polyfill |
| if (!String.prototype.contains) { |
| String.prototype.contains = function(substring) { |
| var startIndex = arguments[1] || 0; |
| return this.indexOf(substring, startIndex) >= startIndex; |
| }; |
| } |
| |
| function innerFunction() { |
| document.appendChild(document); |
| } |
| |
| function outerFunction() { |
| innerFunction(); |
| } |
| |
| var e; |
| |
| try { |
| outerFunction(); |
| } catch (ex) { |
| e = ex; |
| } |
| |
| shouldBeTrue('"stack" in e'); |
| shouldBeEqualToString('typeof e.stack', 'string'); |
| shouldBeTrue('e.stack.contains("innerFunction")'); |
| shouldBeTrue('e.stack.contains("outerFunction")'); |
| |
| shouldBeEqualToString('Object.prototype.toString.call(e)', '[object DOMException]'); |
| shouldBeEqualToString('e.name', 'HierarchyRequestError'); |
| shouldBeEqualToString('e.message', 'The operation would yield an incorrect node tree.'); |
| shouldBe('e.code', '3'); |
| |
| e.stack = 42; |
| // Don't use shouldBe because the FAIL case still happens on JSC and we don't want the output |
| // to depend on the path. |
| shouldBeTrue('e.stack === 42'); |
| |
| </script> |
| <script src="../../../resources/js-test-post.js"></script> |