Index: third_party/WebKit/LayoutTests/custom-elements/spec/custom-elements-registry/when_defined.html |
diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/custom-elements-registry/when_defined.html b/third_party/WebKit/LayoutTests/custom-elements/spec/custom-elements-registry/when_defined.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..133c512bbfbd7480d2151cdd24975573437469d4 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/custom-elements/spec/custom-elements-registry/when_defined.html |
@@ -0,0 +1,63 @@ |
+<!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> |