| Index: third_party/WebKit/LayoutTests/custom-elements/spec/report-the-exception.html
|
| diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/report-the-exception.html b/third_party/WebKit/LayoutTests/custom-elements/spec/report-the-exception.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c3f293e992c0292d44f5f026821159ff28c64e5a
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/custom-elements/spec/report-the-exception.html
|
| @@ -0,0 +1,156 @@
|
| +<!DOCTYPE html>
|
| +<title>Custom Elements: report the exception</title>
|
| +<script src="../../resources/testharness.js"></script>
|
| +<script src="../../resources/testharnessreport.js"></script>
|
| +<script src="resources/custom-elements-helpers.js"></script>
|
| +<body>
|
| +<!--
|
| +The spec has two places where it says to [report the exception]:
|
| +
|
| +1. In [create an element for a token], step 7.
|
| + This can occur only when [create an element] is invoked from
|
| + [create an element for a token] with the synchronous custom elements flag
|
| + set. The document parser uses this algorithm.
|
| +2. In [invoke custom element reactions], step 2.1.
|
| +
|
| +There are different code paths when:
|
| +1. Author script throws an exception that is rethrown.
|
| +2. The user agent throws an exception.
|
| +
|
| +This test contains 4 tests for the combination of the above 2x2.
|
| +
|
| +[create an element]: https://dom.spec.whatwg.org/#concept-create-element
|
| +[create an element for a token]: https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token
|
| +[invoke custom element reactions]: https://html.spec.whatwg.org/multipage/scripting.html#invoke-custom-element-reactions
|
| +[report the exception]: https://html.spec.whatwg.org/multipage/webappapis.html#report-the-exception
|
| +-->
|
| +<template id="constructor-throws">
|
| + <script>
|
| +'use strict';
|
| +window.errors = [];
|
| +// https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-attributes:handler-onerror
|
| +window.onerror = function (event, source, lineno, colno, error) {
|
| + errors.push({
|
| + event: event,
|
| + source: source,
|
| + lineno: lineno,
|
| + colno: colno,
|
| + error: error
|
| + });
|
| + return true; // Cancel the error event.
|
| +};
|
| +
|
| +const rethrowErrorName = 'rethrown';
|
| +const rethrowErrorMessage = 'check this is rethrown';
|
| +
|
| +customElements.define('a-a', class extends HTMLElement {
|
| + constructor() {
|
| + const error = new Error(rethrowErrorMessage);
|
| + error.name = rethrowErrorName;
|
| + throw error;
|
| + }
|
| +});
|
| + </script>
|
| +</template>
|
| +<template id="instantiate">
|
| + <a-a></a-a>
|
| +</template>
|
| +<script>
|
| +'use strict';
|
| +const rethrowErrorName = 'rethrown';
|
| +const rethrowErrorMessage = 'check this is rethrown';
|
| +
|
| +function assert_not_muted_error_event(error) {
|
| + assert_not_equals(error, undefined, 'should fire error event');
|
| + // Report an error, 6. If script has muted errors, ...
|
| + // https://html.spec.whatwg.org/multipage/webappapis.html#report-the-error
|
| + assert_false(error.event === 'Script error.'
|
| + && error.source === '' && error.lineno === 0 && error.colno === 0
|
| + && error.error === null,
|
| + 'the error should not be muted.');
|
| + assert_false(!error.event, 'event (1st arg) should not be null');
|
| + assert_false(!error.source, 'source (2nd arg) should not be null');
|
| + // The spec doesn't define valid values for lineno/colno.
|
| + assert_false(!error.error, 'error (5th arg) should not be null');
|
| +}
|
| +
|
| +function assert_rethrown_error_event(error) {
|
| + assert_not_muted_error_event(error);
|
| + assert_equals(error.error.name, rethrowErrorName);
|
| + assert_equals(error.error.message, rethrowErrorMessage);
|
| +}
|
| +
|
| +const constructor_throws =
|
| + document.getElementById('constructor-throws').innerHTML;
|
| +const instantiate = document.getElementById('instantiate').innerHTML;
|
| +
|
| +test_with_window((w) => {
|
| + assert_rethrown_error_event(w.errors[0]);
|
| +}, 'Document parser invokes the constructor that throws',
|
| + constructor_throws + instantiate);
|
| +
|
| +test_with_window((w) => {
|
| + w.document.body.innerHTML = instantiate;
|
| + assert_rethrown_error_event(w.errors[0]);
|
| +}, 'Upgrade reaction invokes the constructor that throws',
|
| + constructor_throws);
|
| +</script>
|
| +
|
| +<!--
|
| +Test when JavaScript returns without throwing errors, but the result is invalid
|
| +and thus UA should [report the exception].
|
| +-->
|
| +<template id="constructor-returns-bad-object">
|
| + <script>
|
| +'use strict';
|
| +window.errors = [];
|
| +// https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-attributes:handler-onerror
|
| +window.onerror = function (event, source, lineno, colno, error) {
|
| + errors.push({
|
| + event: event,
|
| + source: source,
|
| + lineno: lineno,
|
| + colno: colno,
|
| + error: error
|
| + });
|
| + return true; // Cancel the error event.
|
| +};
|
| +
|
| +customElements.define('a-a', class extends HTMLElement {
|
| + constructor() {
|
| + super();
|
| + return []; // returning objects other than "this" is invalid.
|
| + }
|
| +});
|
| + </script>
|
| +</template>
|
| +<script>
|
| +const constructor_returns_bad_object =
|
| + document.getElementById('constructor-returns-bad-object').innerHTML;
|
| +
|
| +function assert_type_error_event(error) {
|
| + assert_not_muted_error_event(error);
|
| + assert_equals(error.error.name, 'TypeError');
|
| +}
|
| +
|
| +function assert_invalid_state_dom_error_event(error) {
|
| + assert_not_muted_error_event(error);
|
| + assert_equals(error.error.name, 'InvalidStateError');
|
| +}
|
| +
|
| +test_with_window((w) => {
|
| + // "create an element" 6.1.3, throw a TypeError.
|
| + // https://dom.spec.whatwg.org/#concept-create-element
|
| + assert_type_error_event(w.errors[0]);
|
| +}, 'Document parser invokes the constructor that returns a bad object',
|
| + constructor_returns_bad_object + instantiate);
|
| +
|
| +test_with_window((w) => {
|
| + // "upgrade an element" 10, throw an InvalidStateError DOMException.
|
| + // https://html.spec.whatwg.org/multipage/scripting.html#upgrades
|
| + w.document.body.innerHTML = instantiate;
|
| + assert_invalid_state_dom_error_event(w.errors[0]);
|
| +}, 'Upgrade reaction invokes the constructor that returns a bad object',
|
| + constructor_returns_bad_object);
|
| +</script>
|
| +</body>
|
|
|