/**
|
* customElements.define
|
*/
|
(function () {
|
const defineProperty = Object.defineProperty
|
const createElement = document.createElement
|
const classes = new Map()
|
const registry = new Map()
|
|
if ('customElements' in window && customElements && customElements.define) {
|
return
|
}
|
|
function HTMLBuiltIn () {
|
const constructor = this.constructor
|
if (!classes.has(constructor)) {
|
throw new TypeError('Illegal constructor')
|
}
|
const is = classes.get(constructor)
|
const element = createElement.call(document, is)
|
return Object.setPrototypeOf(element, constructor.prototype)
|
}
|
|
defineProperty(HTMLBuiltIn.prototype = HTMLElement.prototype, 'constructor', {
|
value: HTMLBuiltIn
|
})
|
defineProperty(window, 'HTMLElement', {
|
configurable: true,
|
value: HTMLBuiltIn
|
})
|
defineProperty(document, 'createElement', {
|
configurable: true,
|
value: function value (name, options) {
|
const is = options && options.is
|
const Class = is ? registry.get(is) : registry.get(name)
|
return Class ? new Class() : createElement.call(document, name)
|
}
|
})
|
defineProperty(window, 'customElements', {
|
configurable: true,
|
value: {
|
define: function define (is, Class) {
|
if (registry.has(is)) {
|
throw new Error('the name "'.concat(is, '" has already been used with this registry'))
|
}
|
classes.set(Class, is)
|
registry.set(is, Class)
|
}
|
}
|
})
|
})()
|