| OLD | NEW |
| (Empty) |
| 1 <!DOCTYPE html> | |
| 2 <html> | |
| 3 <head> | |
| 4 <title>Custom Elements: Upgrading custom elements should enqueue attributeChange
d and connected callbacks</title> | |
| 5 <meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> | |
| 6 <meta name="assert" content="Upgrading custom elements should enqueue attributeC
hanged and connected callbacksml"> | |
| 7 <meta name="help" content="https://html.spec.whatwg.org/#upgrades"> | |
| 8 <script src="/resources/testharness.js"></script> | |
| 9 <script src="/resources/testharnessreport.js"></script> | |
| 10 <script src="../resources/custom-elements-helpers.js"></script> | |
| 11 </head> | |
| 12 <body> | |
| 13 <div id="log"></div> | |
| 14 <script> | |
| 15 setup({allow_uncaught_exception:true}); | |
| 16 | |
| 17 test_with_window(function (contentWindow) { | |
| 18 const contentDocument = contentWindow.document; | |
| 19 contentDocument.write('<test-element id="some" title="This is a test">'); | |
| 20 | |
| 21 const undefinedElement = contentDocument.querySelector('test-element'); | |
| 22 assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLEle
ment.prototype); | |
| 23 | |
| 24 let log = []; | |
| 25 class TestElement extends contentWindow.HTMLElement { | |
| 26 constructor() { | |
| 27 super(); | |
| 28 log.push(create_constructor_log(this)); | |
| 29 } | |
| 30 attributeChangedCallback(...args) { | |
| 31 log.push(create_attribute_changed_callback_log(this, ...args)); | |
| 32 } | |
| 33 static get observedAttributes() { return ['id', 'title']; } | |
| 34 } | |
| 35 contentWindow.customElements.define('test-element', TestElement); | |
| 36 assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype
); | |
| 37 | |
| 38 assert_equals(log.length, 3); | |
| 39 assert_constructor_log_entry(log[0], undefinedElement); | |
| 40 assert_attribute_log_entry(log[1], {name: 'id', oldValue: null, newValue: 's
ome', namespace: null}); | |
| 41 assert_attribute_log_entry(log[2], {name: 'title', oldValue: null, newValue:
'This is a test', namespace: null}); | |
| 42 }, 'Upgrading a custom element must enqueue attributeChangedCallback on each att
ribute'); | |
| 43 | |
| 44 test_with_window(function (contentWindow) { | |
| 45 const contentDocument = contentWindow.document; | |
| 46 contentDocument.write('<test-element id="some" title="This is a test" class=
"foo">'); | |
| 47 | |
| 48 const undefinedElement = contentDocument.querySelector('test-element'); | |
| 49 assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLEle
ment.prototype); | |
| 50 | |
| 51 let log = []; | |
| 52 class TestElement extends contentWindow.HTMLElement { | |
| 53 constructor() { | |
| 54 super(); | |
| 55 log.push(create_constructor_log(this)); | |
| 56 } | |
| 57 attributeChangedCallback(...args) { | |
| 58 log.push(create_attribute_changed_callback_log(this, ...args)); | |
| 59 } | |
| 60 static get observedAttributes() { return ['class', 'id']; } | |
| 61 } | |
| 62 contentWindow.customElements.define('test-element', TestElement); | |
| 63 assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype
); | |
| 64 | |
| 65 assert_equals(log.length, 3); | |
| 66 assert_constructor_log_entry(log[0], undefinedElement); | |
| 67 assert_attribute_log_entry(log[1], {name: 'id', oldValue: null, newValue: 's
ome', namespace: null}); | |
| 68 assert_attribute_log_entry(log[2], {name: 'class', oldValue: null, newValue:
'foo', namespace: null}); | |
| 69 }, 'Upgrading a custom element not must enqueue attributeChangedCallback on unob
served attributes'); | |
| 70 | |
| 71 test_with_window(function (contentWindow) { | |
| 72 const contentDocument = contentWindow.document; | |
| 73 contentDocument.write('<test-element id="some" title="This is a test" class=
"foo">'); | |
| 74 | |
| 75 const undefinedElement = contentDocument.querySelector('test-element'); | |
| 76 assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLEle
ment.prototype); | |
| 77 | |
| 78 let log = []; | |
| 79 class TestElement extends contentWindow.HTMLElement { | |
| 80 constructor() { | |
| 81 super(); | |
| 82 log.push(create_constructor_log(this)); | |
| 83 } | |
| 84 connectedCallback(...args) { | |
| 85 log.push(create_connected_callback_log(this, ...args)); | |
| 86 } | |
| 87 } | |
| 88 contentWindow.customElements.define('test-element', TestElement); | |
| 89 assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype
); | |
| 90 | |
| 91 assert_equals(log.length, 2); | |
| 92 assert_constructor_log_entry(log[0], undefinedElement); | |
| 93 assert_connected_log_entry(log[1], undefinedElement); | |
| 94 }, 'Upgrading a custom element must enqueue connectedCallback if the element in
the document'); | |
| 95 | |
| 96 test_with_window(function (contentWindow) { | |
| 97 const contentDocument = contentWindow.document; | |
| 98 contentDocument.write('<test-element id="some" title="This is a test" class=
"foo">'); | |
| 99 | |
| 100 const undefinedElement = contentDocument.querySelector('test-element'); | |
| 101 assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLEle
ment.prototype); | |
| 102 | |
| 103 let log = []; | |
| 104 class TestElement extends contentWindow.HTMLElement { | |
| 105 constructor() { | |
| 106 super(); | |
| 107 log.push(create_constructor_log(this)); | |
| 108 } | |
| 109 connectedCallback(...args) { | |
| 110 log.push(create_connected_callback_log(this, ...args)); | |
| 111 } | |
| 112 attributeChangedCallback(...args) { | |
| 113 log.push(create_attribute_changed_callback_log(this, ...args)); | |
| 114 } | |
| 115 static get observedAttributes() { return ['class', 'id']; } | |
| 116 } | |
| 117 contentWindow.customElements.define('test-element', TestElement); | |
| 118 assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype
); | |
| 119 | |
| 120 assert_equals(log.length, 4); | |
| 121 assert_constructor_log_entry(log[0], undefinedElement); | |
| 122 assert_attribute_log_entry(log[1], {name: 'id', oldValue: null, newValue: 's
ome', namespace: null}); | |
| 123 assert_attribute_log_entry(log[2], {name: 'class', oldValue: null, newValue:
'foo', namespace: null}); | |
| 124 assert_connected_log_entry(log[3], undefinedElement); | |
| 125 }, 'Upgrading a custom element must enqueue attributeChangedCallback before conn
ectedCallback'); | |
| 126 | |
| 127 test_with_window(function (contentWindow) { | |
| 128 const contentDocument = contentWindow.document; | |
| 129 contentDocument.write('<test-element id="some" title="This is a test" class=
"foo">'); | |
| 130 | |
| 131 const undefinedElement = contentDocument.querySelector('test-element'); | |
| 132 assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLEle
ment.prototype); | |
| 133 | |
| 134 let log = []; | |
| 135 class TestElement extends contentWindow.HTMLElement { | |
| 136 constructor() { | |
| 137 super(); | |
| 138 log.push(create_constructor_log(this)); | |
| 139 throw 'Exception thrown as a part of test'; | |
| 140 } | |
| 141 connectedCallback(...args) { | |
| 142 log.push(create_connected_callback_log(this, ...args)); | |
| 143 } | |
| 144 attributeChangedCallback(...args) { | |
| 145 log.push(create_attribute_changed_callback_log(this, ...args)); | |
| 146 } | |
| 147 static get observedAttributes() { return ['class', 'id']; } | |
| 148 } | |
| 149 contentWindow.customElements.define('test-element', TestElement); | |
| 150 assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype
); | |
| 151 | |
| 152 assert_equals(log.length, 1); | |
| 153 assert_constructor_log_entry(log[0], undefinedElement); | |
| 154 }, 'Upgrading a custom element must not invoke attributeChangedCallback and conn
ectedCallback when the element failed to upgrade'); | |
| 155 | |
| 156 </script> | |
| 157 </body> | |
| 158 </html> | |
| OLD | NEW |