blob: 133c512bbfbd7480d2151cdd24975573437469d4 [file] [log] [blame]
<!DOCTYPE html>
<title>Custom Elements: CustomElementsRegistry.whenDefined</title>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
(() => {
// https://html.spec.whatwg.org/multipage/scripting.html#dom-customelementsregistry-whendefined
// Use window from iframe to isolate the test.
function setup() {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const testWindow = iframe.contentWindow;
const customElements = testWindow.customElements;
if (!customElements)
return Promise.reject('This test requires window.customElements');
if (!('whenDefined' in customElements))
return Promise.reject('This test requires window.customElements.whenDefined');
return Promise.resolve(customElements);
}
const kNameToBeDefined = 'x-foo';
const kNameNotDefined = 'x-bar';
let beforeDefined = false;
let notDefined = true;
let afterDefined = false;
promise_test(() => setup()
.then(customElements => {
// 4. If map does not contain an entry with key name, create an entry in
// map with key name and whose value is a new promise.
const promiseBeforeDefined = customElements.whenDefined(kNameToBeDefined);
promiseBeforeDefined.then(() => beforeDefined = true);
// 5. Let promise be the value of the entry in map with key name.
// 6. Return promise
assert_equals(promiseBeforeDefined,
customElements.whenDefined(kNameToBeDefined),
'There is only one promise defined before.');
const promiseNotDefined = customElements.whenDefined(kNameNotDefined);
promiseNotDefined.then(() => notDefined = false);
assert_not_equals(promiseBeforeDefined, promiseNotDefined,
'whenDefined() returns different promises for different names.');
customElements.define(kNameToBeDefined, class {});
// 3. If this CustomElementsRegistry contains an entry with name name,
// then return a new promise resolved with undefined and abort these
// steps.
const promiseAfterDefined = customElements.whenDefined(kNameToBeDefined);
promiseAfterDefined.then(() => afterDefined = true);
assert_not_equals(promiseBeforeDefined, promiseAfterDefined,
'When name is defined, we should have a new promise.');
assert_not_equals(promiseAfterDefined,
customElements.whenDefined(kNameToBeDefined),
'Once name is defined, whenDefined() always returns a new promise.');
return customElements;
}).then(customElements => {
assert_true(beforeDefined, 'promise before defined should be resolved.');
assert_true(afterDefined, 'promise after defined should be resolved.');
assert_true(notDefined, 'promise for not defined name should not be resolved.');
}).catch(reason => { throw reason }));
})();
</script>
</body>