File: ElementFactory.cpp.tmpl

package info (click to toggle)
chromium-browser 37.0.2062.120-1~deb7u1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,707,260 kB
  • sloc: cpp: 8,976,677; ansic: 3,473,199; python: 586,578; asm: 449,013; xml: 184,195; java: 142,924; sh: 118,496; perl: 81,467; makefile: 27,557; yacc: 10,506; objc: 8,886; tcl: 3,186; cs: 2,252; lex: 2,213; sql: 1,198; pascal: 1,170; lisp: 790; awk: 407; ruby: 155; php: 83; sed: 52; exp: 11
file content (108 lines) | stat: -rw-r--r-- 3,890 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
{% 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/ContextFeatures.h"
#include "core/dom/custom/CustomElement.h"
#include "core/dom/custom/CustomElementRegistrationContext.h"
#include "core/dom/Document.h"
#include "core/frame/Settings.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "wtf/HashMap.h"

namespace WebCore {

using namespace {{namespace}}Names;

typedef PassRefPtrWillBeRawPtr<{{namespace}}Element> (*ConstructorFunction)(
    Document&,
    {% if namespace == 'HTML' %}
    HTMLFormElement*,
    {% endif %}
    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 PassRefPtrWillBeRawPtr<{{namespace}}Element> {{tag|symbol}}Constructor(
    Document& document,
    {% if namespace == 'HTML' %}
    HTMLFormElement* formElement,
    {% endif %}
    bool createdByParser)
{
    {% if tag.contextConditional %}
    if (!ContextFeatures::{{tag.contextConditional}}Enabled(&document))
        return {{fallback_interface}}::create({{tag|symbol}}Tag, document);
    {% endif %}
    {% 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 namespace == 'HTML' and tag.constructorNeedsFormElement %}, formElement{% endif -%}
        {%- 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);
}

PassRefPtrWillBeRawPtr<{{namespace}}Element> {{namespace}}ElementFactory::create{{namespace}}Element(
    const AtomicString& localName,
    Document& document,
    {% if namespace == 'HTML' %}
    HTMLFormElement* formElement,
    {% endif %}
    bool createdByParser)
{
    if (!g_constructors)
        create{{namespace}}FunctionMap();
    if (ConstructorFunction function = g_constructors->get(localName))
        return function(document, {% if namespace == 'HTML' %}formElement, {% endif %}createdByParser);

    if (document.registrationContext() && CustomElement::isValidName(localName)) {
        RefPtrWillBeRawPtr<Element> element = document.registrationContext()->createCustomTagElement(document, QualifiedName(nullAtom, localName, {{namespace_prefix}}NamespaceURI));
        ASSERT_WITH_SECURITY_IMPLICATION(element->is{{namespace}}Element());
        return static_pointer_cast<{{namespace}}Element>(element.release());
    }

    return {{fallback_interface}}::create(QualifiedName(nullAtom, localName, {{namespace_prefix}}NamespaceURI), document);
}

} // namespace WebCore