| {% from "templates/macros.tmpl" import license, source_files_for_generated_file %} |
| {{ license() }} |
| |
| {{source_files_for_generated_file(template_file, input_files)}} |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_{{namespace|upper}}_ELEMENT_TYPE_HELPERS_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_CORE_{{namespace|upper}}_ELEMENT_TYPE_HELPERS_H_ |
| |
| #include "{{base_element_header}}" |
| #include "third_party/blink/renderer/core/{{namespace|lower}}_names.h" |
| #include "third_party/blink/renderer/platform/runtime_enabled_features.h" |
| |
| namespace blink { |
| // Type checking. |
| {% for tag in tags|sort if not tag.multipleTagNames and not tag.noTypeHelpers %} |
| class {{tag.interface}}; |
| // Catch unnecessary runtime check of type known at compile time. |
| void Is{{tag.interface}}(const {{tag.interface}}&); |
| void Is{{tag.interface}}(const {{tag.interface}}*); |
| |
| inline bool Is{{tag.interface}}(const {{namespace}}Element& element) { |
| {% if tag.runtimeEnabled %} |
| if (!RuntimeEnabledFeatures::{{tag.runtimeEnabled}}Enabled()) |
| return false; |
| {% endif %} |
| return element.HasTagName({{cpp_namespace}}::{{tag|symbol}}Tag); |
| } |
| inline bool Is{{tag.interface}}(const {{namespace}}Element* element) { |
| return element && Is{{tag.interface}}(*element); |
| } |
| inline bool Is{{tag.interface}}(const Node& node) { |
| return node.Is{{namespace}}Element() && Is{{tag.interface}}(To<{{namespace}}Element>(node)); |
| } |
| inline bool Is{{tag.interface}}(const Node* node) { |
| return node && Is{{tag.interface}}(*node); |
| } |
| template <> |
| inline bool IsElementOfType<const {{tag.interface}}>(const Node& node) { |
| return Is{{tag.interface}}(node); |
| } |
| template <> |
| inline bool IsElementOfType<const {{tag.interface}}>(const {{namespace}}Element& element) { |
| return Is{{tag.interface}}(element); |
| } |
| |
| {% endfor %} |
| // Using macros because the types are forward-declared and we don't want to use |
| // reinterpret_cast in the casting functions above. reinterpret_cast would be |
| // unsafe due to multiple inheritence. |
| |
| // TODO(abhijeet@igalia.com): Remove below type casting macros. |
| {% for tag in tags|sort if not tag.multipleTagNames and not tag.noTypeHelpers %} |
| template <> |
| struct DowncastTraits<{{tag.interface}}> { |
| static bool AllowFrom(const Element& element) { |
| {% if tag.runtimeEnabled %} |
| if (!RuntimeEnabledFeatures::{{tag.runtimeEnabled}}Enabled()) |
| return false; |
| {% endif %} |
| return element.HasTagName({{cpp_namespace}}::{{tag|symbol}}Tag); |
| } |
| static bool AllowFrom(const Node& node) { |
| return node.Is{{namespace}}Element() && IsA<{{tag.interface}}>(To<{{namespace}}Element>(node)); |
| } |
| }; |
| #define To{{tag.interface}}(x) blink::To<blink::{{tag.interface}}>(x) |
| #define To{{tag.interface}}OrNull(x) blink::DynamicTo<blink::{{tag.interface}}>(x) |
| |
| {% endfor %} |
| |
| {% if namespace == "HTML" %} |
| |
| enum class HTMLElementType { |
| {% for element in elements|sort %}k{{element}}, |
| {% endfor %} |
| }; |
| |
| // Tag checking. |
| // tagName is the local name for an html element in lowercase |
| // The corresponding HTMLElement type for the tag name will be returned |
| // Do NOT use this function with SVG tag names and SVGElements |
| // If tagName is an undefined html tag name HTMLUnknownElement is returned |
| HTMLElementType htmlElementTypeForTag(const AtomicString& tagName); |
| |
| {% endif %} |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_CORE_{{namespace|upper}}_ELEMENT_TYPE_HELPERS_H_ |