1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
{% from "macros.tmpl" import license %}
{{ license() }}
#include "config.h"
#include "{{namespace}}ElementFactory.h"
#include "{{namespace}}Names.h"
{% for tag in tags|sort %}
#include "core/{{namespace|lower}}/{{tag.interface}}.h"
{% endfor %}
{% if fallback_interface %}
#include "core/{{namespace|lower}}/{{fallback_interface}}.h"
{% endif %}
#include "core/dom/ContextFeatures.h"
#include "core/dom/custom/CustomElement.h"
#include "core/dom/custom/CustomElementRegistrationContext.h"
#include "core/dom/Document.h"
#include "core/frame/Settings.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "wtf/HashMap.h"
namespace WebCore {
using namespace {{namespace}}Names;
typedef PassRefPtrWillBeRawPtr<{{namespace}}Element> (*ConstructorFunction)(
Document&,
{% if namespace == 'HTML' %}
HTMLFormElement*,
{% endif %}
bool createdByParser);
typedef HashMap<AtomicString, ConstructorFunction> FunctionMap;
static FunctionMap* g_constructors = 0;
{% for tag in tags|sort if not tag.noConstructor %}
{% filter enable_conditional(tag.Conditional) %}
static PassRefPtrWillBeRawPtr<{{namespace}}Element> {{tag|symbol}}Constructor(
Document& document,
{% if namespace == 'HTML' %}
HTMLFormElement* formElement,
{% endif %}
bool createdByParser)
{
{% if tag.contextConditional %}
if (!ContextFeatures::{{tag.contextConditional}}Enabled(&document))
return {{fallback_interface}}::create({{tag|symbol}}Tag, document);
{% endif %}
{% if tag.runtimeEnabled %}
if (!RuntimeEnabledFeatures::{{tag.runtimeEnabled}}Enabled())
return {{fallback_interface}}::create({{tag|symbol}}Tag, document);
{% endif %}
return {{tag.interface}}::create(
{%- if tag.multipleTagNames %}{{tag|symbol}}Tag, {% endif -%}
document
{%- if namespace == 'HTML' and tag.constructorNeedsFormElement %}, formElement{% endif -%}
{%- if tag.constructorNeedsCreatedByParser %}, createdByParser{% endif -%}
);
}
{% endfilter %}
{% endfor %}
struct Create{{namespace}}FunctionMapData {
const QualifiedName& tag;
ConstructorFunction func;
};
static void create{{namespace}}FunctionMap()
{
ASSERT(!g_constructors);
g_constructors = new FunctionMap;
// Empty array initializer lists are illegal [dcl.init.aggr] and will not
// compile in MSVC. If tags list is empty, add check to skip this.
static const Create{{namespace}}FunctionMapData data[] = {
{% for tag in tags|sort if not tag.noConstructor %}
{% filter enable_conditional(tag.Conditional) %}
{ {{tag|symbol}}Tag, {{tag|symbol}}Constructor },
{% endfilter %}
{% endfor %}
};
for (size_t i = 0; i < WTF_ARRAY_LENGTH(data); i++)
g_constructors->set(data[i].tag.localName(), data[i].func);
}
PassRefPtrWillBeRawPtr<{{namespace}}Element> {{namespace}}ElementFactory::create{{namespace}}Element(
const AtomicString& localName,
Document& document,
{% if namespace == 'HTML' %}
HTMLFormElement* formElement,
{% endif %}
bool createdByParser)
{
if (!g_constructors)
create{{namespace}}FunctionMap();
if (ConstructorFunction function = g_constructors->get(localName))
return function(document, {% if namespace == 'HTML' %}formElement, {% endif %}createdByParser);
if (document.registrationContext() && CustomElement::isValidName(localName)) {
RefPtrWillBeRawPtr<Element> element = document.registrationContext()->createCustomTagElement(document, QualifiedName(nullAtom, localName, {{namespace_prefix}}NamespaceURI));
ASSERT_WITH_SECURITY_IMPLICATION(element->is{{namespace}}Element());
return static_pointer_cast<{{namespace}}Element>(element.release());
}
return {{fallback_interface}}::create(QualifiedName(nullAtom, localName, {{namespace_prefix}}NamespaceURI), document);
}
} // namespace WebCore
|