mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
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
91 lines
2.8 KiB
Cheetah
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
|