Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 <!DOCTYPE html> | |
| 2 <title>Custom Elements: report the exception</title> | |
| 3 <script src="../../resources/testharness.js"></script> | |
| 4 <script src="../../resources/testharnessreport.js"></script> | |
| 5 <script src="resources/custom-elements-helpers.js"></script> | |
| 6 <body> | |
| 7 <!-- | |
| 8 The custom elements spec has 2 places where it [report the exception]: | |
| 9 | |
| 10 1. In the [create an element for a token], step 7. | |
| 11 This can occur only when [create an element] is invoked from | |
| 12 [create an element for a token] with the synchronous custom elements flag | |
| 13 set; i.e., the document parser. | |
| 14 2. In the [invoke custom element reactions], step 2.1. | |
| 15 | |
| 16 Also it is likely that platform may run different code paths for: | |
| 17 1. When JavaScript throws and the platform rethrows. | |
| 18 2. When the platform throws. | |
| 19 | |
| 20 This test contains 4 tests for the combination of the above 2x2. | |
| 21 | |
| 22 [report the exception]: https://html.spec.whatwg.org/multipage/webappapis.html#r eport-the-exception | |
| 23 [create an element for a token]: https://html.spec.whatwg.org/multipage/syntax.h tml#create-an-element-for-the-token | |
| 24 [create an element]: https://dom.spec.whatwg.org/#concept-create-element | |
| 25 [invoke custom element reactions]: https://html.spec.whatwg.org/multipage/script ing.html#invoke-custom-element-reactions | |
| 26 --> | |
| 27 <template id="common"> | |
|
dominicc (has gone to gerrit)
2016/08/18 23:16:45
Is this worth it?
It's only 4-5 lines of code to
| |
| 28 <script> | |
| 29 'use strict'; | |
| 30 window.errors = []; | |
| 31 window.onerror = function () { | |
| 32 errors.push(Array.prototype.slice.call(arguments)); | |
|
dominicc (has gone to gerrit)
2016/08/18 23:16:45
Instead of pushing everything and digging out 4, w
| |
| 33 return true; // Cancel the error event. | |
| 34 }; | |
| 35 </script> | |
| 36 </template> | |
| 37 <template id="constructor-throws"> | |
| 38 <script> | |
| 39 const rethrowErrorName = 'rethrown'; | |
| 40 const rethrowErrorMessage = 'check this is rethrown'; | |
| 41 | |
| 42 function create_rethrow_error() { | |
| 43 const error = new Error(rethrowErrorMessage); | |
| 44 error.name = rethrowErrorName; | |
| 45 return error; | |
| 46 } | |
| 47 | |
| 48 customElements.define('a-a', class extends HTMLElement { | |
| 49 constructor() { | |
| 50 throw create_rethrow_error(); | |
| 51 } | |
| 52 }); | |
| 53 </script> | |
| 54 </template> | |
| 55 <template id="instantiate"> | |
| 56 <a-a></a-a> | |
| 57 </template> | |
| 58 <script> | |
| 59 'use strict'; | |
| 60 const rethrowErrorName = 'rethrown'; | |
| 61 const rethrowErrorMessage = 'check this is rethrown'; | |
| 62 | |
| 63 function assert_rethrown(error) { | |
| 64 assert_equals(error.name, rethrowErrorName); | |
|
dominicc (has gone to gerrit)
2016/08/18 23:16:45
Can you check that the exact same object is rethro
kojii
2016/08/19 04:57:11
I could not find the spec defining it must be the
| |
| 65 assert_equals(error.message, rethrowErrorMessage); | |
| 66 } | |
| 67 | |
| 68 const common = document.getElementById('common').innerHTML; | |
| 69 const constructor_throws = common | |
| 70 + document.getElementById('constructor-throws').innerHTML; | |
| 71 const instantiate = document.getElementById('instantiate').innerHTML; | |
| 72 | |
| 73 test_with_window(w => { | |
| 74 assert_rethrown(w.errors[0][4]); | |
| 75 }, 'Document parser invokes the constructor that throws', | |
| 76 constructor_throws + instantiate); | |
| 77 | |
| 78 test_with_window(w => { | |
| 79 w.document.body.innerHTML = instantiate; | |
| 80 assert_rethrown(w.errors[0][4]); | |
| 81 }, 'Upgrade reaction invokes the constructor that throws', | |
| 82 constructor_throws); | |
| 83 </script> | |
| 84 | |
| 85 <!-- | |
|
dominicc (has gone to gerrit)
2016/08/18 23:16:45
???
| |
| 86 --> | |
| 87 <template id="constructor-returns-bad-object"> | |
| 88 <script> | |
| 89 customElements.define('a-a', class extends HTMLElement { | |
| 90 constructor() { | |
| 91 super(); | |
| 92 return []; // returning other objects than "this" is invalid. | |
| 93 } | |
| 94 }); | |
| 95 </script> | |
| 96 </template> | |
| 97 <script> | |
| 98 const constructor_returns_bad_object = common | |
| 99 + document.getElementById('constructor-returns-bad-object').innerHTML; | |
| 100 | |
| 101 function assert_type_error(error) { | |
| 102 assert_equals(error.name, 'TypeError'); | |
|
dominicc (has gone to gerrit)
2016/08/18 23:16:45
Can we assert more precisely what these are?
| |
| 103 } | |
| 104 | |
| 105 function assert_invalid_state_dom_error(error) { | |
| 106 assert_equals(error.name, 'InvalidStateError'); | |
| 107 } | |
| 108 | |
| 109 test_with_window(w => { | |
|
dominicc (has gone to gerrit)
2016/08/18 23:16:45
I think Google style says to always use the parens
| |
| 110 // "create an element" 6.1.3, throw a TypeError. | |
| 111 // https://dom.spec.whatwg.org/#concept-create-element | |
| 112 assert_type_error(w.errors[0][4]); | |
|
dominicc (has gone to gerrit)
2016/08/18 23:16:45
I understand what these indices [0][4] are, but th
| |
| 113 }, 'Document parser invokes the constructor that returns a bad object', | |
| 114 constructor_returns_bad_object + instantiate); | |
| 115 | |
| 116 test_with_window(w => { | |
| 117 // "upgrade an element" 10, throw an InvalidStateError DOMException. | |
| 118 // https://html.spec.whatwg.org/multipage/scripting.html#upgrades | |
| 119 w.document.body.innerHTML = instantiate; | |
| 120 assert_invalid_state_dom_error(w.errors[0][4]); | |
| 121 }, 'Upgrade reaction invokes the constructor that returns a bad object', | |
| 122 constructor_returns_bad_object); | |
| 123 </script> | |
| 124 </body> | |
| OLD | NEW |