OLD | NEW |
---|---|
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <title>Custom Elements: defineElement</title> | 2 <title>Custom Elements: defineElement</title> |
3 <link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#cus tomelementsregistry"> | 3 <link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#cus tomelementsregistry"> |
4 <meta name="author" title="Dominic Cooney" href="mailto:dominicc@chromium.org"> | 4 <meta name="author" title="Dominic Cooney" href="mailto:dominicc@chromium.org"> |
5 <script src="../../resources/testharness.js"></script> | 5 <script src="../../resources/testharness.js"></script> |
6 <script src="../../resources/testharnessreport.js"></script> | 6 <script src="../../resources/testharnessreport.js"></script> |
7 <script src="resources/custom-elements-helpers.js"></script> | 7 <script src="resources/custom-elements-helpers.js"></script> |
8 <body> | 8 <body> |
9 <script> | 9 <script> |
10 // TODO(dominicc): Merge these tests with | 10 // TODO(dominicc): Merge these tests with |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
343 } | 343 } |
344 assert_throws({ name: 'observedAttributes throws' }, () => { | 344 assert_throws({ name: 'observedAttributes throws' }, () => { |
345 w.customElements.define('a-a', X); | 345 w.customElements.define('a-a', X); |
346 }, 'Exception from Get(constructor, observedAttributes) should be rethrown'); | 346 }, 'Exception from Get(constructor, observedAttributes) should be rethrown'); |
347 }, 'Rethrow any exceptions thrown while getting observedAttributes'); | 347 }, 'Rethrow any exceptions thrown while getting observedAttributes'); |
348 | 348 |
349 // 14.9.3 If observedAttributesIterable is not undefined, then set observedAttri butes | 349 // 14.9.3 If observedAttributesIterable is not undefined, then set observedAttri butes |
350 // to the result of converting observedAttributesIterable to a sequence<D OMString>. | 350 // to the result of converting observedAttributesIterable to a sequence<D OMString>. |
351 // Rethrow any exceptions. | 351 // Rethrow any exceptions. |
352 test_with_window((w) => { | 352 test_with_window((w) => { |
353 let invocations = []; | |
354 let element = w.document.createElement('a-a'); | |
355 element.setAttribute('a', '1'); | |
356 element.setAttribute('b', '2'); | |
357 let constructor = function () {}; | |
358 constructor.prototype.attributeChangedCallback = function () { | |
359 invocations.push(arguments[0]); | |
360 }; | |
361 constructor.observedAttributes = {[Symbol.iterator]: | |
362 function* () { yield 'a'; } | |
363 }; | |
364 w.customElements.define('a-a', constructor); | |
365 w.document.body.appendChild(element); | |
366 assert_array_equals(invocations, ['a'], 'attributeChangedCllback should be inv oked once for "a"'); | |
367 }, 'ObservedAttributes'); | |
dominicc (has gone to gerrit)
2016/09/12 05:31:44
Could you write prose here? Like observed attribut
| |
368 | |
369 test_with_window((w) => { | |
370 let constructor = function () {}; | |
371 constructor.prototype.attributeChangedCallback = function () { }; | |
372 constructor.observedAttributes = {[Symbol.iterator]: 1}; | |
373 assert_throws(TypeError.prototype, () => { | |
374 w.customElements.define('a-a', constructor); | |
375 }, 'converting value that is not an object should throw TypeError'); | |
376 }, 'Converting observedAttributes to sequence<DOMString>, not an object'); | |
dominicc (has gone to gerrit)
2016/09/12 05:31:44
Maybe write
... non-object observedAttributes ...
| |
377 | |
378 test_with_window((w) => { | |
353 class X extends w.HTMLElement{ | 379 class X extends w.HTMLElement{ |
354 constructor() { super(); } | 380 constructor() { super(); } |
355 attributeChangedCallback() {} | 381 attributeChangedCallback() {} |
356 static get observedAttributes() { return new RegExp(); } | 382 static get observedAttributes() { return new RegExp(); } |
357 } | 383 } |
358 assert_throws(TypeError.prototype, () => { | 384 assert_throws(TypeError.prototype, () => { |
359 w.customElements.define('a-a', X); | 385 w.customElements.define('a-a', X); |
360 }, 'converting RegExp to sequence<DOMString> should throw TypeError'); | 386 }, 'converting RegExp should throw TypeError'); |
361 }, 'exception thrown while converting observedAttributes to ' + | 387 }, 'Converting observedAttributes to sequence<DOMString>, regular expression'); |
362 'sequence<DOMString> should be rethrown'); | 388 |
389 test_with_window((w) => { | |
390 let constructor = function () {}; | |
391 constructor.prototype.attributeChangedCallback = function () { }; | |
392 constructor.observedAttributes = {}; | |
393 assert_throws(TypeError.prototype, () => { | |
394 w.customElements.define('a-a', constructor); | |
395 }, 'If iterator method is undefined, it should throw TypeError'); | |
396 }, 'Converting observedAttributes to sequence<DOMString>, iterator method not de fined'); | |
363 | 397 |
364 // 14.9.2 test Get(constructor, observedAttributes) does not throw if | 398 // 14.9.2 test Get(constructor, observedAttributes) does not throw if |
365 // attributeChangedCallback is undefined. | 399 // attributeChangedCallback is undefined. |
366 test_with_window((w) => { | 400 test_with_window((w) => { |
367 let observedAttributes_invoked = false; | 401 let observedAttributes_invoked = false; |
368 let X = (function () {}).bind({}); | 402 let X = (function () {}).bind({}); |
369 Object.defineProperty(X, 'observedAttributes', { | 403 Object.defineProperty(X, 'observedAttributes', { |
370 get() { observedAttributes_invoked = true; } | 404 get() { observedAttributes_invoked = true; } |
371 }); | 405 }); |
372 assert_false( observedAttributes_invoked, 'Get(constructor, observedAttributes ) should not be invoked'); | 406 assert_false( observedAttributes_invoked, 'Get(constructor, observedAttributes ) should not be invoked'); |
(...skipping 30 matching lines...) Expand all Loading... | |
403 // step 2 | 437 // step 2 |
404 test_with_window((w) => { | 438 test_with_window((w) => { |
405 let invalid_name = 'annotation-xml'; | 439 let invalid_name = 'annotation-xml'; |
406 assert_throws_dom_exception(w, 'SYNTAX_ERR', () => { | 440 assert_throws_dom_exception(w, 'SYNTAX_ERR', () => { |
407 w.customElements.define(invalid_name, class extends HTMLElement {}); | 441 w.customElements.define(invalid_name, class extends HTMLElement {}); |
408 }, 'defining author-defined custom element constructor should pass this ' + | 442 }, 'defining author-defined custom element constructor should pass this ' + |
409 'step without throwing TypeError'); | 443 'step without throwing TypeError'); |
410 }, 'Invalid constructor'); | 444 }, 'Invalid constructor'); |
411 </script> | 445 </script> |
412 </body> | 446 </body> |
OLD | NEW |