flutter_flutter/engine/build/scripts/templates/ElementFactory.cpp.tmpl
Adam Barth 73b76dcca9 Rename Sky's custom2 to custom
We've removed the old implementation of custom elements. We can move the new
implementation into the proper place and give the classes their proper name.

R=ojan@chromium.org

Review URL: https://codereview.chromium.org/946083003
2015-02-20 17:35:47 -08:00

86 lines
2.6 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/custom_element_registry.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);
return document.elementRegistry().CreateElement(document, localName);
}
} // namespace blink