tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>