import HTMLElement from '../html-element/HTMLElement.js';
import NodeList from '../node/NodeList.js';
import HTMLCollection from '../element/HTMLCollection.js';
/**
* HTML Unknown Element.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLUnknownElement.
*/
export default class HTMLUnknownElement extends HTMLElement {
constructor() {
super(...arguments);
this._customElementDefineCallback = null;
}
/**
* Connects this element to another element.
*
* @param parentNode Parent node.
*/
_connectToNode(parentNode = null) {
const tagName = this.tagName;
// This element can potentially be a custom element that has not been defined yet
// Therefore we need to register a callback for when it is defined in CustomElementRegistry and replace it with the registered element (see #404)
if (tagName.includes('-')) {
const callbacks = this.ownerDocument.defaultView.customElements._callbacks;
if (parentNode && !this._customElementDefineCallback) {
const callback = () => {
if (this.parentNode) {
const newElement = this.ownerDocument.createElement(tagName);
newElement.childNodes = this.childNodes;
newElement.children = this.children;
newElement.isConnected = this.isConnected;
newElement._rootNode = this._rootNode;
newElement._formNode = this._formNode;
newElement._selectNode = this._selectNode;
newElement._textAreaNode = this._textAreaNode;
newElement._observers = this._observers;
newElement._isValue = this._isValue;
newElement._attributes = this._attributes;
this.childNodes = new NodeList();
this.children = new HTMLCollection();
this._rootNode = null;
this._formNode = null;
this._selectNode = null;
this._textAreaNode = null;
this._observers = [];
this._isValue = null;
this._attributes = {};
for (let i = 0, max = this.parentNode.childNodes.length; i < max; i++) {
if (this.parentNode.childNodes[i] === this) {
this.parentNode.childNodes[i] = newElement;
break;
}
}
if (this.parentNode.children) {
for (let i = 0, max = this.parentNode.children.length; i < max; i++) {
if (this.parentNode.children[i] === this) {
this.parentNode.children[i] = newElement;
break;
}
}
}
if (newElement.isConnected && newElement.connectedCallback) {
newElement.connectedCallback();
}
}
};
callbacks[tagName] = callbacks[tagName] || [];
callbacks[tagName].push(callback);
this._customElementDefineCallback = callback;
}
else if (!parentNode && callbacks[tagName] && this._customElementDefineCallback) {
const index = callbacks[tagName].indexOf(this._customElementDefineCallback);
if (index !== -1) {
callbacks[tagName].splice(index, 1);
}
if (!callbacks[tagName].length) {
delete callbacks[tagName];
}
this._customElementDefineCallback = null;
}
}
super._connectToNode(parentNode);
}
}
//# sourceMappingURL=HTMLUnknownElement.js.map