blob: 399068a940627466317d619c6b0a4c96d72b45d5 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>window-onerror</title>
<style>
#result {
width: 100px;
height:100px;
background-color:#0047AB;
}
</style>
</head>
<body>
<div id="result"></div>
<script>
function expect(condition, message) {
if (!condition) {
document.querySelector('#result').style.display = 'none';
const fullMessage = `failed expectation at:
${new Error().stack}
${typeof message === 'undefined' ? '' : 'with message: ' + message}`;
console.error(fullMessage);
}
}
let windowOnErrorWasCalled = false;
// No need to set this to null, but there was a regression at one point where
// doing so would result in an erroneous JS error, so add this line in to get
// some extra test coverage.
window.onerror = null;
window.onerror = (message, filename, lineno, colno, error) => {
// We allow anything that ends with "myCoolMessage" to pass, Chrome/Firefox behavior differs here
// (Chrome: "Uncaught Error: myCoolMessage", Firefox: "Error: myCoolMessage").
expect(/.*myCoolMessage/.test(message), message);
// Allow any filename that ends with "window-onerror.html", in order to not couple too heavily to
// the implementation of layout_tests.
expect(/.*window-onerror.html/.test(filename), filename);
expect(lineno === 89, lineno);
// The value of the column number is not standard across major browsers.
// Chrome: 1 without devtools open, 7 with devtools open.
// Edge: Always 1.
// Firefox: Always 7.
// Safari: 18.
expect(colno === 1 || colno === 7 || colno === 18, colno);
expect(typeof error === 'object', typeof error);
expect(String(error) === 'Error: myCoolMessage', String(error));
windowOnErrorWasCalled = true;
};
// Make sure that when an event handler is added for the 'error' event via
// addEventListener, it assumes the usual function signature of just the event
// object.
let windowErrorEventHandlerCalled = false;
window.addEventListener('error', (errorEvent) => {
expect(errorEvent.type == 'error', errorEvent.type);
// Check the same parameters as above in the onerror attribute event handler,
// just make sure they are passed through as an event object instead of
// expanded.
expect(/.*myCoolMessage/.test(errorEvent.message), errorEvent.message);
expect(/.*window-onerror.html/.test(errorEvent.filename),
errorEvent.filename);
expect(errorEvent.lineno === 89, errorEvent.lineno);
expect(errorEvent.colno === 1 || errorEvent.colno === 7 ||
errorEvent.colno === 18, errorEvent.colno);
expect(typeof errorEvent.error === 'object', typeof errorEvent.error);
expect(String(errorEvent.error) === 'Error: myCoolMessage',
String(errorEvent.error));
windowErrorEventHandlerCalled = true;
});
if (window.testRunner) {
window.testRunner.waitUntilDone();
}
setTimeout(() => {
expect(windowOnErrorWasCalled);
expect(windowErrorEventHandlerCalled);
if (window.testRunner) {
window.testRunner.notifyDone();
}
}, 1);
throw new Error('myCoolMessage');
</script>
</body>
</html>