OLD | NEW |
1 {% from "macros.tmpl" import license %} | 1 {% from "macros.tmpl" import license %} |
2 {{ license() }} | 2 {{ license() }} |
3 | 3 |
4 #include "{{namespace}}ElementFactory.h" | 4 #include "{{namespace}}ElementFactory.h" |
5 | 5 |
6 #include "{{namespace}}Names.h" | 6 #include "{{namespace}}Names.h" |
7 {% for tag in tags|groupby('interface') %} | 7 {% for tag in tags|groupby('interface') %} |
8 #include "core/{{namespace|lower}}/{{tag[0]}}.h" | 8 #include "core/{{namespace|lower}}/{{tag[0]}}.h" |
9 {% endfor %} | 9 {% endfor %} |
10 {% if fallback_interface %} | 10 {% if fallback_interface %} |
11 #include "core/{{namespace|lower}}/{{fallback_interface}}.h" | 11 #include "core/{{namespace|lower}}/{{fallback_interface}}.h" |
12 {% endif %} | 12 {% endif %} |
13 {% if namespace == 'HTML' %} | 13 {% if namespace == 'HTML' %} |
14 #include "core/dom/custom/CustomElement.h" | 14 #include "core/dom/custom/CustomElement.h" |
15 {% endif %} | 15 {% endif %} |
16 #include "core/dom/custom/V0CustomElement.h" | 16 #include "core/dom/custom/V0CustomElement.h" |
17 #include "core/dom/custom/V0CustomElementRegistrationContext.h" | 17 #include "core/dom/custom/V0CustomElementRegistrationContext.h" |
18 #include "core/dom/Document.h" | 18 #include "core/dom/Document.h" |
19 #include "core/frame/Settings.h" | 19 #include "core/frame/Settings.h" |
20 #include "platform/RuntimeEnabledFeatures.h" | 20 #include "platform/RuntimeEnabledFeatures.h" |
21 #include "wtf/HashMap.h" | 21 #include "wtf/HashMap.h" |
22 | 22 |
23 namespace blink { | 23 namespace blink { |
24 | 24 |
25 using namespace {{namespace}}Names; | 25 using namespace {{namespace}}Names; |
26 | 26 |
27 typedef {{namespace}}Element* (*ConstructorFunction)( | 27 typedef {{namespace}}Element* (*ConstructorFunction)( |
28 Document&, | 28 Document&, |
29 {% if namespace == 'HTML' %} | |
30 HTMLFormElement*, | |
31 {% endif %} | |
32 CreateElementFlags); | 29 CreateElementFlags); |
33 | 30 |
34 typedef HashMap<AtomicString, ConstructorFunction> FunctionMap; | 31 typedef HashMap<AtomicString, ConstructorFunction> FunctionMap; |
35 | 32 |
36 static FunctionMap* g_constructors = 0; | 33 static FunctionMap* g_constructors = 0; |
37 | 34 |
38 {% for tag in tags|sort if not tag.noConstructor %} | 35 {% for tag in tags|sort if not tag.noConstructor %} |
39 static {{namespace}}Element* {{tag|symbol}}Constructor( | 36 static {{namespace}}Element* {{tag|symbol}}Constructor( |
40 Document& document, | 37 Document& document, |
41 {% if namespace == 'HTML' %} | |
42 HTMLFormElement* formElement, | |
43 {% endif %} | |
44 CreateElementFlags flags) { | 38 CreateElementFlags flags) { |
45 {% if tag.runtimeEnabled %} | 39 {% if tag.runtimeEnabled %} |
46 if (!RuntimeEnabledFeatures::{{tag.runtimeEnabled}}Enabled()) | 40 if (!RuntimeEnabledFeatures::{{tag.runtimeEnabled}}Enabled()) |
47 return {{fallback_interface}}::create({{tag|symbol}}Tag, document); | 41 return {{fallback_interface}}::create({{tag|symbol}}Tag, document); |
48 {% endif %} | 42 {% endif %} |
49 return {{tag.interface}}::create( | 43 return {{tag.interface}}::create( |
50 {%- if tag.multipleTagNames %}{{tag|symbol}}Tag, {% endif -%} | 44 {%- if tag.multipleTagNames %}{{tag|symbol}}Tag, {% endif -%} |
51 document | 45 document |
52 {%- if namespace == 'HTML' and tag.constructorNeedsFormElement %}, formEle
ment{% endif -%} | |
53 {%- if tag.constructorNeedsCreatedByParser %}, flags & CreatedByParser{% e
ndif -%} | 46 {%- if tag.constructorNeedsCreatedByParser %}, flags & CreatedByParser{% e
ndif -%} |
54 ); | 47 ); |
55 } | 48 } |
56 {% endfor %} | 49 {% endfor %} |
57 | 50 |
58 struct Create{{namespace}}FunctionMapData { | 51 struct Create{{namespace}}FunctionMapData { |
59 const QualifiedName& tag; | 52 const QualifiedName& tag; |
60 ConstructorFunction func; | 53 ConstructorFunction func; |
61 }; | 54 }; |
62 | 55 |
63 static void create{{namespace}}FunctionMap() { | 56 static void create{{namespace}}FunctionMap() { |
64 ASSERT(!g_constructors); | 57 ASSERT(!g_constructors); |
65 g_constructors = new FunctionMap; | 58 g_constructors = new FunctionMap; |
66 // Empty array initializer lists are illegal [dcl.init.aggr] and will not | 59 // Empty array initializer lists are illegal [dcl.init.aggr] and will not |
67 // compile in MSVC. If tags list is empty, add check to skip this. | 60 // compile in MSVC. If tags list is empty, add check to skip this. |
68 static const Create{{namespace}}FunctionMapData data[] = { | 61 static const Create{{namespace}}FunctionMapData data[] = { |
69 {% for tag in tags|sort if not tag.noConstructor %} | 62 {% for tag in tags|sort if not tag.noConstructor %} |
70 { {{tag|symbol}}Tag, {{tag|symbol}}Constructor }, | 63 { {{tag|symbol}}Tag, {{tag|symbol}}Constructor }, |
71 {% endfor %} | 64 {% endfor %} |
72 }; | 65 }; |
73 for (size_t i = 0; i < WTF_ARRAY_LENGTH(data); i++) | 66 for (size_t i = 0; i < WTF_ARRAY_LENGTH(data); i++) |
74 g_constructors->set(data[i].tag.localName(), data[i].func); | 67 g_constructors->set(data[i].tag.localName(), data[i].func); |
75 } | 68 } |
76 | 69 |
77 {{namespace}}Element* {{namespace}}ElementFactory::create{{namespace}}Element( | 70 {{namespace}}Element* {{namespace}}ElementFactory::create{{namespace}}Element( |
78 const AtomicString& localName, | 71 const AtomicString& localName, |
79 Document& document, | 72 Document& document, |
80 {% if namespace == 'HTML' %} | |
81 HTMLFormElement* formElement, | |
82 {% endif %} | |
83 CreateElementFlags flags) { | 73 CreateElementFlags flags) { |
84 if (!g_constructors) | 74 if (!g_constructors) |
85 create{{namespace}}FunctionMap(); | 75 create{{namespace}}FunctionMap(); |
86 if (ConstructorFunction function = g_constructors->get(localName)) | 76 if (ConstructorFunction function = g_constructors->get(localName)) |
87 return function(document, {% if namespace == 'HTML' %}formElement, {% endif
%}flags); | 77 return function(document, flags); |
88 | 78 |
89 {% if namespace == 'HTML' %} | 79 {% if namespace == 'HTML' %} |
90 // createElement handles custom element creation itself in order to | 80 // createElement handles custom element creation itself in order to |
91 // transmit exceptions. | 81 // transmit exceptions. |
92 // TODO(dominicc): When the HTML parser can pass an error | 82 // TODO(dominicc): When the HTML parser can pass an error |
93 // reporting ExceptionState, and "v0" custom elements have been | 83 // reporting ExceptionState, and "v0" custom elements have been |
94 // removed, consolidate custom element creation into one place. | 84 // removed, consolidate custom element creation into one place. |
95 if (flags != CreatedByCreateElement && CustomElement::shouldCreateCustomElemen
t(localName)) { | 85 if (flags != CreatedByCreateElement && CustomElement::shouldCreateCustomElemen
t(localName)) { |
96 QualifiedName tagName(nullAtom, localName, HTMLNames::xhtmlNamespaceURI); | 86 QualifiedName tagName(nullAtom, localName, HTMLNames::xhtmlNamespaceURI); |
97 if (flags & AsynchronousCustomElements) | 87 if (flags & AsynchronousCustomElements) |
98 return CustomElement::createCustomElementAsync(document, tagName); | 88 return CustomElement::createCustomElementAsync(document, tagName); |
99 return CustomElement::createCustomElementSync(document, tagName); | 89 return CustomElement::createCustomElementSync(document, tagName); |
100 } | 90 } |
101 {% endif %} | 91 {% endif %} |
102 | 92 |
103 if (document.registrationContext() && | 93 if (document.registrationContext() && |
104 V0CustomElement::isValidName(localName)) { | 94 V0CustomElement::isValidName(localName)) { |
105 Element* element = document.registrationContext()->createCustomTagElement( | 95 Element* element = document.registrationContext()->createCustomTagElement( |
106 document, QualifiedName(nullAtom, localName, {{namespace_prefix}}Namespa
ceURI)); | 96 document, QualifiedName(nullAtom, localName, {{namespace_prefix}}Namespa
ceURI)); |
107 SECURITY_DCHECK(element->is{{namespace}}Element()); | 97 SECURITY_DCHECK(element->is{{namespace}}Element()); |
108 return to{{namespace}}Element(element); | 98 return to{{namespace}}Element(element); |
109 } | 99 } |
110 | 100 |
111 return {{fallback_interface}}::create(QualifiedName(nullAtom, localName, {{nam
espace_prefix}}NamespaceURI), document); | 101 return {{fallback_interface}}::create(QualifiedName(nullAtom, localName, {{nam
espace_prefix}}NamespaceURI), document); |
112 } | 102 } |
113 | 103 |
114 } // namespace blink | 104 } // namespace blink |
OLD | NEW |