{% 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 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 {{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