/*
 * THIS FILE WAS AUTOMATICALLY GENERATED, DO NOT EDIT.
 *
 * This file was generated by the dom/make_names.pl script.
 *
 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "config.h"
#include "JSHTMLElementWrapperFactory.h"

#include "JSHTMLAnchorElement.h"
#include "JSHTMLAppletElement.h"
#include "JSHTMLAreaElement.h"
#include "JSHTMLBaseElement.h"
#include "JSHTMLUnknownElement.h"
#include "JSHTMLQuoteElement.h"
#include "JSHTMLBodyElement.h"
#include "JSHTMLBRElement.h"
#include "JSHTMLButtonElement.h"
#include "JSHTMLCanvasElement.h"
#include "JSHTMLTableCaptionElement.h"
#include "JSHTMLTableColElement.h"
#include "JSHTMLDataElement.h"
#include "JSHTMLModElement.h"
#include "JSHTMLDirectoryElement.h"
#include "JSHTMLDivElement.h"
#include "JSHTMLDListElement.h"
#include "JSHTMLEmbedElement.h"
#include "JSHTMLFieldSetElement.h"
#include "JSHTMLFontElement.h"
#include "JSHTMLFormElement.h"
#include "JSHTMLFrameElement.h"
#include "JSHTMLFrameSetElement.h"
#include "JSHTMLHeadingElement.h"
#include "JSHTMLHeadElement.h"
#include "JSHTMLHRElement.h"
#include "JSHTMLHtmlElement.h"
#include "JSHTMLIFrameElement.h"
#include "JSHTMLImageElement.h"
#include "JSHTMLInputElement.h"
#include "JSHTMLKeygenElement.h"
#include "JSHTMLLabelElement.h"
#include "JSHTMLLegendElement.h"
#include "JSHTMLLIElement.h"
#include "JSHTMLLinkElement.h"
#include "JSHTMLPreElement.h"
#include "JSHTMLMapElement.h"
#include "JSHTMLMarqueeElement.h"
#include "JSHTMLMenuElement.h"
#include "JSHTMLMetaElement.h"
#include "JSHTMLObjectElement.h"
#include "JSHTMLOListElement.h"
#include "JSHTMLOptGroupElement.h"
#include "JSHTMLOptionElement.h"
#include "JSHTMLOutputElement.h"
#include "JSHTMLParagraphElement.h"
#include "JSHTMLParamElement.h"
#include "JSHTMLPictureElement.h"
#include "JSHTMLProgressElement.h"
#include "JSHTMLScriptElement.h"
#include "JSHTMLSelectElement.h"
#include "JSHTMLSlotElement.h"
#include "JSHTMLSourceElement.h"
#include "JSHTMLSpanElement.h"
#include "JSHTMLStyleElement.h"
#include "JSHTMLTableElement.h"
#include "JSHTMLTableSectionElement.h"
#include "JSHTMLTableCellElement.h"
#include "JSHTMLTemplateElement.h"
#include "JSHTMLTextAreaElement.h"
#include "JSHTMLTimeElement.h"
#include "JSHTMLTitleElement.h"
#include "JSHTMLTableRowElement.h"
#include "JSHTMLUListElement.h"
#include "JSHTMLUnknownElement.h"
#include "HTMLAnchorElement.h"
#include "HTMLElement.h"
#include "HTMLAppletElement.h"
#include "HTMLAreaElement.h"
#include "HTMLBaseElement.h"
#include "HTMLBDIElement.h"
#include "HTMLUnknownElement.h"
#include "HTMLQuoteElement.h"
#include "HTMLBodyElement.h"
#include "HTMLBRElement.h"
#include "HTMLButtonElement.h"
#include "HTMLCanvasElement.h"
#include "HTMLTableCaptionElement.h"
#include "HTMLTableColElement.h"
#include "HTMLDataElement.h"
#include "HTMLModElement.h"
#include "HTMLDirectoryElement.h"
#include "HTMLDivElement.h"
#include "HTMLDListElement.h"
#include "HTMLEmbedElement.h"
#include "HTMLFieldSetElement.h"
#include "HTMLFontElement.h"
#include "HTMLFormElement.h"
#include "HTMLFrameElement.h"
#include "HTMLFrameSetElement.h"
#include "HTMLHeadingElement.h"
#include "HTMLHeadElement.h"
#include "HTMLHRElement.h"
#include "HTMLHtmlElement.h"
#include "HTMLIFrameElement.h"
#include "HTMLImageElement.h"
#include "HTMLInputElement.h"
#include "HTMLKeygenElement.h"
#include "HTMLLabelElement.h"
#include "HTMLLegendElement.h"
#include "HTMLLIElement.h"
#include "HTMLLinkElement.h"
#include "HTMLPreElement.h"
#include "HTMLMapElement.h"
#include "HTMLMarqueeElement.h"
#include "HTMLMenuElement.h"
#include "HTMLMetaElement.h"
#include "HTMLObjectElement.h"
#include "HTMLOListElement.h"
#include "HTMLOptGroupElement.h"
#include "HTMLOptionElement.h"
#include "HTMLOutputElement.h"
#include "HTMLParagraphElement.h"
#include "HTMLParamElement.h"
#include "HTMLPictureElement.h"
#include "HTMLProgressElement.h"
#include "RubyTextElement.h"
#include "RubyElement.h"
#include "HTMLScriptElement.h"
#include "HTMLSelectElement.h"
#include "HTMLSlotElement.h"
#include "HTMLSourceElement.h"
#include "HTMLSpanElement.h"
#include "HTMLStyleElement.h"
#include "HTMLTableElement.h"
#include "HTMLTableSectionElement.h"
#include "HTMLTableCellElement.h"
#include "HTMLTemplateElement.h"
#include "HTMLTextAreaElement.h"
#include "HTMLTimeElement.h"
#include "HTMLTitleElement.h"
#include "HTMLTableRowElement.h"
#include "HTMLUListElement.h"
#include "HTMLWBRElement.h"
#include "HTMLUnknownElement.h"

#include "HTMLNames.h"

#include "Document.h"
#include "RuntimeEnabledFeatures.h"
#include "Settings.h"
#include <wtf/NeverDestroyed.h>
#include <wtf/StdLibExtras.h>

#if ENABLE(ATTACHMENT_ELEMENT)
#include "HTMLAttachmentElement.h"
#include "JSHTMLAttachmentElement.h"
#endif

#if ENABLE(DATALIST_ELEMENT)
#include "HTMLDataListElement.h"
#include "JSHTMLDataListElement.h"
#endif

#if ENABLE(DETAILS_ELEMENT)
#include "HTMLDetailsElement.h"
#include "HTMLSummaryElement.h"
#include "JSHTMLDetailsElement.h"
#endif

#if ENABLE(METER_ELEMENT)
#include "HTMLMeterElement.h"
#include "JSHTMLMeterElement.h"
#endif

#if ENABLE(VIDEO)
#include "HTMLAudioElement.h"
#include "HTMLVideoElement.h"
#include "JSHTMLAudioElement.h"
#include "JSHTMLVideoElement.h"
#endif

#if ENABLE(VIDEO_TRACK)
#include "HTMLTrackElement.h"
#include "JSHTMLTrackElement.h"
#endif

using namespace JSC;

namespace WebCore {

using namespace HTMLNames;

typedef JSDOMObject* (*CreateHTMLElementWrapperFunction)(JSDOMGlobalObject*, Ref<HTMLElement>&&);

static JSDOMObject* createHTMLAnchorElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLAnchorElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLAppletElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLAppletElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLAreaElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLAreaElement>(globalObject, WTFMove(element));
}

#if ENABLE(ATTACHMENT_ELEMENT)

static JSDOMObject* createHTMLAttachmentElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    if (element->isHTMLUnknownElement())
        return createWrapper<HTMLUnknownElement>(globalObject, WTFMove(element));
    return createWrapper<HTMLAttachmentElement>(globalObject, WTFMove(element));
}

#endif

#if ENABLE(VIDEO)

static JSDOMObject* createHTMLAudioElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    if (element->isHTMLUnknownElement())
        return createWrapper<HTMLUnknownElement>(globalObject, WTFMove(element));
    return createWrapper<HTMLAudioElement>(globalObject, WTFMove(element));
}

#endif

static JSDOMObject* createHTMLBaseElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLBaseElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLUnknownElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLUnknownElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLQuoteElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLQuoteElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLBodyElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLBodyElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLBRElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLBRElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLButtonElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLButtonElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLCanvasElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLCanvasElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTableCaptionElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTableCaptionElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTableColElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTableColElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLDataElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLDataElement>(globalObject, WTFMove(element));
}

#if ENABLE(DATALIST_ELEMENT)

static JSDOMObject* createHTMLDataListElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLDataListElement>(globalObject, WTFMove(element));
}

#endif

static JSDOMObject* createHTMLModElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLModElement>(globalObject, WTFMove(element));
}

#if ENABLE(DETAILS_ELEMENT)

static JSDOMObject* createHTMLDetailsElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLDetailsElement>(globalObject, WTFMove(element));
}

#endif

static JSDOMObject* createHTMLDirectoryElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLDirectoryElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLDivElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLDivElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLDListElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLDListElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLEmbedElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLEmbedElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLFieldSetElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLFieldSetElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLFontElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLFontElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLFormElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLFormElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLFrameElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLFrameElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLFrameSetElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLFrameSetElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLHeadingElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLHeadingElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLHeadElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLHeadElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLHRElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLHRElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLHtmlElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLHtmlElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLIFrameElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLIFrameElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLImageElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLImageElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLInputElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLInputElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLKeygenElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLKeygenElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLLabelElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLLabelElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLLegendElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLLegendElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLLIElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLLIElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLLinkElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLLinkElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLPreElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLPreElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLMapElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLMapElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLMarqueeElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLMarqueeElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLMenuElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLMenuElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLMetaElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLMetaElement>(globalObject, WTFMove(element));
}

#if ENABLE(METER_ELEMENT)

static JSDOMObject* createHTMLMeterElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLMeterElement>(globalObject, WTFMove(element));
}

#endif

static JSDOMObject* createHTMLObjectElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLObjectElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLOListElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLOListElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLOptGroupElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLOptGroupElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLOptionElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLOptionElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLOutputElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLOutputElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLParagraphElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLParagraphElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLParamElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLParamElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLPictureElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLPictureElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLProgressElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLProgressElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLScriptElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLScriptElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLSelectElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLSelectElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLSlotElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLSlotElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLSourceElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLSourceElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLSpanElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLSpanElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLStyleElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLStyleElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTableElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTableElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTableSectionElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTableSectionElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTableCellElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTableCellElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTemplateElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTemplateElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTextAreaElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTextAreaElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTimeElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTimeElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTitleElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTitleElement>(globalObject, WTFMove(element));
}

static JSDOMObject* createHTMLTableRowElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLTableRowElement>(globalObject, WTFMove(element));
}

#if ENABLE(VIDEO_TRACK)

static JSDOMObject* createHTMLTrackElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    if (element->isHTMLUnknownElement())
        return createWrapper<HTMLUnknownElement>(globalObject, WTFMove(element));
    return createWrapper<HTMLTrackElement>(globalObject, WTFMove(element));
}

#endif

static JSDOMObject* createHTMLUListElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    return createWrapper<HTMLUListElement>(globalObject, WTFMove(element));
}

#if ENABLE(VIDEO)

static JSDOMObject* createHTMLVideoElementWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    if (element->isHTMLUnknownElement())
        return createWrapper<HTMLUnknownElement>(globalObject, WTFMove(element));
    return createWrapper<HTMLVideoElement>(globalObject, WTFMove(element));
}

#endif


static NEVER_INLINE void populateHTMLWrapperMap(HashMap<AtomicStringImpl*, CreateHTMLElementWrapperFunction>& map)
{
    struct TableEntry {
        const QualifiedName& name;
        CreateHTMLElementWrapperFunction function;
    };

    static const TableEntry table[] = {
        { aTag, createHTMLAnchorElementWrapper },
        { abbrTag, createHTMLElementWrapper },
        { acronymTag, createHTMLElementWrapper },
        { addressTag, createHTMLElementWrapper },
        { appletTag, createHTMLAppletElementWrapper },
        { areaTag, createHTMLAreaElementWrapper },
        { articleTag, createHTMLElementWrapper },
        { asideTag, createHTMLElementWrapper },
#if ENABLE(ATTACHMENT_ELEMENT)
        { attachmentTag, createHTMLAttachmentElementWrapper },
#endif
#if ENABLE(VIDEO)
        { audioTag, createHTMLAudioElementWrapper },
#endif
        { bTag, createHTMLElementWrapper },
        { baseTag, createHTMLBaseElementWrapper },
        { basefontTag, createHTMLElementWrapper },
        { bdiTag, createHTMLElementWrapper },
        { bdoTag, createHTMLElementWrapper },
        { bgsoundTag, createHTMLUnknownElementWrapper },
        { bigTag, createHTMLElementWrapper },
        { blockquoteTag, createHTMLQuoteElementWrapper },
        { bodyTag, createHTMLBodyElementWrapper },
        { brTag, createHTMLBRElementWrapper },
        { buttonTag, createHTMLButtonElementWrapper },
        { canvasTag, createHTMLCanvasElementWrapper },
        { captionTag, createHTMLTableCaptionElementWrapper },
        { centerTag, createHTMLElementWrapper },
        { citeTag, createHTMLElementWrapper },
        { codeTag, createHTMLElementWrapper },
        { colTag, createHTMLTableColElementWrapper },
        { colgroupTag, createHTMLTableColElementWrapper },
        { commandTag, createHTMLUnknownElementWrapper },
        { dataTag, createHTMLDataElementWrapper },
#if ENABLE(DATALIST_ELEMENT)
        { datalistTag, createHTMLDataListElementWrapper },
#endif
        { ddTag, createHTMLElementWrapper },
        { delTag, createHTMLModElementWrapper },
#if ENABLE(DETAILS_ELEMENT)
        { detailsTag, createHTMLDetailsElementWrapper },
#endif
        { dfnTag, createHTMLElementWrapper },
        { dirTag, createHTMLDirectoryElementWrapper },
        { divTag, createHTMLDivElementWrapper },
        { dlTag, createHTMLDListElementWrapper },
        { dtTag, createHTMLElementWrapper },
        { emTag, createHTMLElementWrapper },
        { embedTag, createHTMLEmbedElementWrapper },
        { fieldsetTag, createHTMLFieldSetElementWrapper },
        { figcaptionTag, createHTMLElementWrapper },
        { figureTag, createHTMLElementWrapper },
        { fontTag, createHTMLFontElementWrapper },
        { footerTag, createHTMLElementWrapper },
        { formTag, createHTMLFormElementWrapper },
        { frameTag, createHTMLFrameElementWrapper },
        { framesetTag, createHTMLFrameSetElementWrapper },
        { h1Tag, createHTMLHeadingElementWrapper },
        { h2Tag, createHTMLHeadingElementWrapper },
        { h3Tag, createHTMLHeadingElementWrapper },
        { h4Tag, createHTMLHeadingElementWrapper },
        { h5Tag, createHTMLHeadingElementWrapper },
        { h6Tag, createHTMLHeadingElementWrapper },
        { headTag, createHTMLHeadElementWrapper },
        { headerTag, createHTMLElementWrapper },
        { hgroupTag, createHTMLElementWrapper },
        { hrTag, createHTMLHRElementWrapper },
        { htmlTag, createHTMLHtmlElementWrapper },
        { iTag, createHTMLElementWrapper },
        { iframeTag, createHTMLIFrameElementWrapper },
        { imageTag, createHTMLUnknownElementWrapper },
        { imgTag, createHTMLImageElementWrapper },
        { inputTag, createHTMLInputElementWrapper },
        { insTag, createHTMLModElementWrapper },
        { kbdTag, createHTMLElementWrapper },
        { keygenTag, createHTMLKeygenElementWrapper },
        { labelTag, createHTMLLabelElementWrapper },
        { layerTag, createHTMLElementWrapper },
        { legendTag, createHTMLLegendElementWrapper },
        { liTag, createHTMLLIElementWrapper },
        { linkTag, createHTMLLinkElementWrapper },
        { listingTag, createHTMLPreElementWrapper },
        { mainTag, createHTMLElementWrapper },
        { mapTag, createHTMLMapElementWrapper },
        { markTag, createHTMLElementWrapper },
        { marqueeTag, createHTMLMarqueeElementWrapper },
        { menuTag, createHTMLMenuElementWrapper },
        { metaTag, createHTMLMetaElementWrapper },
#if ENABLE(METER_ELEMENT)
        { meterTag, createHTMLMeterElementWrapper },
#endif
        { navTag, createHTMLElementWrapper },
        { nobrTag, createHTMLElementWrapper },
        { noembedTag, createHTMLElementWrapper },
        { noframesTag, createHTMLElementWrapper },
        { nolayerTag, createHTMLElementWrapper },
        { noscriptTag, createHTMLElementWrapper },
        { objectTag, createHTMLObjectElementWrapper },
        { olTag, createHTMLOListElementWrapper },
        { optgroupTag, createHTMLOptGroupElementWrapper },
        { optionTag, createHTMLOptionElementWrapper },
        { outputTag, createHTMLOutputElementWrapper },
        { pTag, createHTMLParagraphElementWrapper },
        { paramTag, createHTMLParamElementWrapper },
        { pictureTag, createHTMLPictureElementWrapper },
        { plaintextTag, createHTMLElementWrapper },
        { preTag, createHTMLPreElementWrapper },
        { progressTag, createHTMLProgressElementWrapper },
        { qTag, createHTMLQuoteElementWrapper },
        { rbTag, createHTMLElementWrapper },
        { rpTag, createHTMLElementWrapper },
        { rtTag, createHTMLElementWrapper },
        { rtcTag, createHTMLElementWrapper },
        { rubyTag, createHTMLElementWrapper },
        { sTag, createHTMLElementWrapper },
        { sampTag, createHTMLElementWrapper },
        { scriptTag, createHTMLScriptElementWrapper },
        { sectionTag, createHTMLElementWrapper },
        { selectTag, createHTMLSelectElementWrapper },
        { slotTag, createHTMLSlotElementWrapper },
        { smallTag, createHTMLElementWrapper },
        { sourceTag, createHTMLSourceElementWrapper },
        { spanTag, createHTMLSpanElementWrapper },
        { strikeTag, createHTMLElementWrapper },
        { strongTag, createHTMLElementWrapper },
        { styleTag, createHTMLStyleElementWrapper },
        { subTag, createHTMLElementWrapper },
#if ENABLE(DETAILS_ELEMENT)
        { summaryTag, createHTMLElementWrapper },
#endif
        { supTag, createHTMLElementWrapper },
        { tableTag, createHTMLTableElementWrapper },
        { tbodyTag, createHTMLTableSectionElementWrapper },
        { tdTag, createHTMLTableCellElementWrapper },
        { templateTag, createHTMLTemplateElementWrapper },
        { textareaTag, createHTMLTextAreaElementWrapper },
        { tfootTag, createHTMLTableSectionElementWrapper },
        { thTag, createHTMLTableCellElementWrapper },
        { theadTag, createHTMLTableSectionElementWrapper },
        { timeTag, createHTMLTimeElementWrapper },
        { titleTag, createHTMLTitleElementWrapper },
        { trTag, createHTMLTableRowElementWrapper },
#if ENABLE(VIDEO_TRACK)
        { trackTag, createHTMLTrackElementWrapper },
#endif
        { ttTag, createHTMLElementWrapper },
        { uTag, createHTMLElementWrapper },
        { ulTag, createHTMLUListElementWrapper },
        { varTag, createHTMLElementWrapper },
#if ENABLE(VIDEO)
        { videoTag, createHTMLVideoElementWrapper },
#endif
        { wbrTag, createHTMLElementWrapper },
        { xmpTag, createHTMLPreElementWrapper },
    };

    for (unsigned i = 0; i < WTF_ARRAY_LENGTH(table); ++i)
        map.add(table[i].name.localName().impl(), table[i].function);
}

JSDOMObject* createJSHTMLWrapper(JSDOMGlobalObject* globalObject, Ref<HTMLElement>&& element)
{
    static NeverDestroyed<HashMap<AtomicStringImpl*, CreateHTMLElementWrapperFunction>> functions;
    if (functions.get().isEmpty())
        populateHTMLWrapperMap(functions);
    if (auto function = functions.get().get(element->localName().impl()))
        return function(globalObject, WTFMove(element));
#if ENABLE(CUSTOM_ELEMENTS)
    if (element->isCustomElementUpgradeCandidate())
        return createWrapper<HTMLElement>(globalObject, WTFMove(element));
#endif
    return createWrapper<HTMLUnknownElement>(globalObject, WTFMove(element));
}

}
