scoped-registry-registry-define-get-etc.html (4609B)
1 <!DOCTYPE html> 2 <title>Tests scoped custom element registry methods which get custom element definitions or metadata</title> 3 <meta name="author" title="Benny Powers" href="mailto:bennyp@redhat.com"> 4 <link rel="help" href="https://wicg.github.io/webcomponents/proposals/Scoped-Custom-Element-Registries"> 5 <link rel="help" href="https://github.com/WICG/webcomponents/issues/923"> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 9 <body> 10 11 <script> 12 let definitionCount = 0; 13 function nextCustomElementDefinition() { 14 const log = []; 15 const name = `test-element-${++definitionCount}`; 16 const constructor = class extends HTMLElement { 17 constructor() { 18 super(); 19 log.push(this.id); 20 } 21 }; 22 return {name, constructor, log}; 23 } 24 25 test(t => { 26 const {name, constructor, log} = nextCustomElementDefinition(); 27 const registry = new CustomElementRegistry; 28 registry.define(name, constructor); 29 assert_equals(registry.get(name), constructor); 30 assert_equals(registry.getName(constructor), name); 31 }, 'Custom element registries with a registered custom element return the class in their get method, and the name in their getName method'); 32 33 test(t => { 34 const {name, constructor, log} = nextCustomElementDefinition(); 35 const registry = new CustomElementRegistry; 36 customElements.define(name, constructor) 37 assert_equals(customElements.get(name), constructor); 38 assert_equals(customElements.getName(constructor), name); 39 assert_equals(registry.get(name), undefined); 40 assert_equals(registry.getName(constructor), null); 41 const scopedName = name + '-scoped'; 42 registry.define(scopedName, class extends constructor {}); 43 assert_not_equals(registry.get(scopedName), constructor) 44 }, 'Scoped Custom element registries do not inherit names or classes from the global registry'); 45 46 test(t => { 47 const {name, constructor, log} = nextCustomElementDefinition(); 48 const registry = new CustomElementRegistry; 49 customElements.define(name, constructor) 50 registry.define(name, constructor); 51 assert_equals(customElements.get(name), constructor); 52 assert_equals(customElements.getName(constructor), name); 53 assert_equals(registry.get(name), constructor); 54 assert_equals(registry.getName(constructor), name); 55 }, 'Scoped Custom element registries return the same constructor when it is defined in both'); 56 57 test(t => { 58 const {name, constructor, log} = nextCustomElementDefinition(); 59 const {name:name2, constructor: constructor2} = nextCustomElementDefinition(); 60 const registry = new CustomElementRegistry; 61 customElements.define(name, constructor) 62 registry.define(name, constructor2); 63 assert_equals(customElements.get(name), constructor); 64 assert_equals(customElements.get(name2), undefined); 65 assert_equals(customElements.getName(constructor), name); 66 assert_equals(customElements.getName(constructor2), null); 67 assert_equals(registry.get(name), constructor2); 68 assert_equals(registry.get(name2), undefined); 69 assert_equals(registry.getName(constructor), null); 70 assert_equals(registry.getName(constructor2), name); 71 }, 'Scoped Custom element registries allow registering name that exists in global registry'); 72 73 promise_test(async t => { 74 const {name, constructor, log} = nextCustomElementDefinition(); 75 const registry = new CustomElementRegistry; 76 registry.define(name, constructor); 77 assert_equals(await registry.whenDefined(name), constructor); 78 }, 'Custom element registries with a registered custom element resolve the class in their whenDefined method'); 79 80 promise_test(async t => { 81 const {name, constructor, log} = nextCustomElementDefinition(); 82 const registry = new CustomElementRegistry; 83 customElements.define(name, constructor) 84 registry.define(name, constructor); 85 assert_equals(await customElements.whenDefined(name), constructor); 86 assert_equals(await registry.whenDefined(name), constructor); 87 }, 'Scoped Custom element registries resolve the same constructor from whenDefined when it is defined in both'); 88 89 promise_test(async t => { 90 const {name, constructor, log} = nextCustomElementDefinition(); 91 const registry = new CustomElementRegistry; 92 customElements.define(name, constructor) 93 const scopedName = name + '-scoped'; 94 registry.define(scopedName , class extends constructor {}); 95 const sym = Symbol(); 96 const testPromise = await Promise.race([ 97 registry.whenDefined(name), 98 new Promise(r => requestAnimationFrame(() => r(sym))), 99 ]); 100 assert_equals(testPromise, sym); 101 }, 'Scoped Custom element registry getters do not resolve globally registered classes from whenDefined'); 102 103 </script>