flutter_flutter/engine/build/scripts/templates/ElementFactory.cpp.tmpl
Adam Barth 178be1d89d Remove almost all clients of isHTMLElement
This CL is progress towards deleting the concept of an HTMLElement entirely. We
won't actually get all the way there in this CL series, but we're getting
closer. This CL also will let us make custom elements just be Elements instead
of HTMLElements.

R=eseidel@chromium.org

Review URL: https://codereview.chromium.org/942933003
2015-02-20 12:06:15 -08:00

91 lines
2.8 KiB
Cheetah

{% 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/custom/CustomElement.h"
#include "core/dom/custom/CustomElementRegistrationContext.h"
#include "core/dom/Document.h"
#include "core/frame/Settings.h"
#include "gen/sky/platform/RuntimeEnabledFeatures.h"
#include "wtf/HashMap.h"
namespace blink {
using namespace {{namespace}}Names;
typedef PassRefPtr<{{namespace}}Element> (*ConstructorFunction)(
Document&,
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 PassRefPtr<{{namespace}}Element> {{tag|symbol}}Constructor(
Document& document,
bool createdByParser)
{
{% 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 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);
}
PassRefPtr<Element> {{namespace}}ElementFactory::createElement(
const AtomicString& localName,
Document& document,
bool createdByParser)
{
if (!g_constructors)
create{{namespace}}FunctionMap();
if (ConstructorFunction function = g_constructors->get(localName))
return function(document, createdByParser);
if (CustomElement::isValidName(localName))
return document.registrationContext().createCustomTagElement(document, QualifiedName(localName));
return {{fallback_interface}}::create(QualifiedName(localName), document);
}
} // namespace blink