Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Unified Diff: third_party/WebKit/LayoutTests/custom-elements/spec/report-the-exception.html

Issue 2244203002: Fix "report the exception" in Custom Elements V1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Took approach 7 and cleanup Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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>

Powered by Google App Engine
This is Rietveld 408576698