| Index: Source/build/scripts/templates/ElementFactory.cpp.tmpl
|
| diff --git a/Source/build/scripts/templates/ElementFactory.cpp.tmpl b/Source/build/scripts/templates/ElementFactory.cpp.tmpl
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6f2bd4e682abf66f281923edaff8bb47ca53a15b
|
| --- /dev/null
|
| +++ b/Source/build/scripts/templates/ElementFactory.cpp.tmpl
|
| @@ -0,0 +1,92 @@
|
| +{% from "macros.tmpl" import license -%}
|
| +{{ license() }}
|
| +
|
| +#include "config.h"
|
| +#include "{{namespace}}ElementFactory.h"
|
| +
|
| +#include "RuntimeEnabledFeatures.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/page/Settings.h"
|
| +#include "wtf/HashMap.h"
|
| +
|
| +namespace WebCore {
|
| +
|
| +using namespace {{namespace}}Names;
|
| +
|
| +typedef PassRefPtr<{{namespace}}Element> (*ConstructorFunction)(const QualifiedName&, Document&, HTMLFormElement*, bool createdByParser);
|
| +typedef HashMap<StringImpl*, ConstructorFunction> FunctionMap;
|
| +
|
| +static FunctionMap* g_constructors = 0;
|
| +
|
| +{%- for tag in tags|sort if not tag.mapToTagName and not tag.noConstructor %}
|
| +static PassRefPtr<{{namespace}}Element> {{tag|symbol}}Constructor(const QualifiedName& tagName, Document& document, HTMLFormElement* formElement, bool createdByParser)
|
| +{
|
| +{%- if tag.wrapperOnlyIfMediaIsAvailable %}
|
| + Settings* settings = document.settings();
|
| + if (!RuntimeEnabledFeatures::mediaEnabled() || (settings && !settings->mediaEnabled()))
|
| + return 0;
|
| +{%- endif %}
|
| +{%- if tag.contextConditional %}
|
| + if (!ContextFeatures::{{tag.contextConditional}}Enabled(&document))
|
| + return 0;
|
| +{%- endif %}
|
| + return {{tag|interface}}::create(tagName, document
|
| +{%- if tag.constructorNeedsFormElement %}, formElement{% endif -%}
|
| +{%- if tag.constructorNeedsCreatedByParser %}, createdByParser{% endif -%}
|
| + );
|
| +}
|
| +{%- endfor %}
|
| +
|
| +{%- for tag in tags|sort if tag.mapToTagName %}
|
| +static PassRefPtr<HTMLElement> {{tag|symbol}}Constructor(const QualifiedName& tagName, Document& document, HTMLFormElement* formElement, bool createdByParser)
|
| +{
|
| + return {{tag.mapToTagName}}Constructor(QualifiedName(tagName.prefix(), {{tag.mapToTagName}}Tag.localName(), tagName.namespaceURI()), document, formElement, createdByParser);
|
| +}
|
| +{%- endfor %}
|
| +
|
| +static void addTag(const QualifiedName& tag, ConstructorFunction func)
|
| +{
|
| + g_constructors->set(tag.localName().impl(), func);
|
| +}
|
| +
|
| +static void createFunctionMap()
|
| +{
|
| + ASSERT(!g_constructors);
|
| + g_constructors = new FunctionMap;
|
| +{%- for tag in tags|sort if not tag.noConstructor %}
|
| + addTag({{tag|symbol}}Tag, {{tag|symbol}}Constructor);
|
| +{%- endfor %}
|
| +}
|
| +
|
| +PassRefPtr<{{namespace}}Element> {{namespace}}ElementFactory::create{{namespace}}Element(const QualifiedName& qName, Document* document, HTMLFormElement* formElement, bool createdByParser)
|
| +{
|
| + if (!document)
|
| + return 0;
|
| +
|
| + if (CustomElement::isValidName(qName.localName()) && document->registrationContext()) {
|
| + RefPtr<Element> element = document->registrationContext()->createCustomTagElement(*document, qName, createdByParser ? CustomElementRegistrationContext::CreatedByParser : CustomElementRegistrationContext::NotCreatedByParser);
|
| + ASSERT_WITH_SECURITY_IMPLICATION(element->is{{namespace}}Element());
|
| + return static_pointer_cast<{{namespace}}Element>(element.release());
|
| + }
|
| +
|
| + if (!g_constructors)
|
| + createFunctionMap();
|
| + if (ConstructorFunction function = g_constructors->get(qName.localName().impl())) {
|
| + if (PassRefPtr<{{namespace}}Element> element = function(qName, *document, formElement, createdByParser))
|
| + return element;
|
| + }
|
| +
|
| + return {{fallback_interface}}::create(qName, *document);
|
| +}
|
| +
|
| +} // namespace WebCore
|
|
|