<!DOCTYPE html>
<title>Custom Elements: create an element inside a template </title>
<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/custom-elements-helpers.js"></script>
<iframe id="iframe"></iframe>
<script>
'use strict';
// A document`s browsing context only afffects the look up result of custom element definition
// https://html.spec.whatwg.org/#look-up-a-custom-element-definition
// There are two places where we need to look up a custom element definition:
// 1. creating an element
// https://dom.spec.whatwg.org/#concept-create-element
// 2. trying to upgrade an element
// https://html.spec.whatwg.org/#concept-try-upgrade
// The previous observation leads to the following behaviours:
// 1. an element in a document without browsing context should not be upgraded
// 2. a custom element cannot be created in a document without browsing context
// 3. an already "defined" custom element should remain "defined" after being inserted
// into a document without browsing context
test_with_window(w => {
let doc_without_browsing_context = w.document.implementation.createHTMLDocument();
let element = doc_without_browsing_context.createElement('a-a');
w.customElements.define('a-a', class extends w.HTMLElement {});
doc_without_browsing_context.body.appendChild(element);
assert_true(element.matches(':not(:defined)'));
w.document.body.appendChild(element);
assert_true(element.matches(':defined'));
}, 'An element should not upgraded in a document without browsing context');
test_with_window(w => {
let doc_without_browsing_context = w.document.implementation.createHTMLDocument();
w.customElements.define('b-b', class extends w.HTMLElement {});
let e1 = doc_without_browsing_context.createElement('b-b');
assert_true(e1.matches(':not(:defined)'));
let e2 = w.document.createElement('b-b');
assert_true(e2.matches(':defined'));
}, 'Custom element should not be created in a document without browsing context');
test_with_window(w => {
w.customElements.define('a-a', class extends w.HTMLElement {});
let element = w.document.createElement('a-a');
assert_true(element.matches(':defined'));
let doc_without_browsing_context = w.document.implementation.createHTMLDocument();
doc_without_browsing_context.body.appendChild(element);
let inserted_element = doc_without_browsing_context.body.querySelector('a-a');
assert_true(inserted_element.matches(':defined'));
}, 'Inserting an already defined custom element into a document without browsing context ' +
'should not change its state');
</script>