Index: Source/build/scripts/make_event_factory.py |
diff --git a/Source/build/scripts/make_event_factory.py b/Source/build/scripts/make_event_factory.py |
index 1bd736bc4402a842f89fa093903b059e53a097aa..01a3c2c1d32f73c28adec5c5ab29e796d669d6a9 100755 |
--- a/Source/build/scripts/make_event_factory.py |
+++ b/Source/build/scripts/make_event_factory.py |
@@ -29,14 +29,24 @@ |
import os.path |
import sys |
-import shutil |
-from in_file import InFile |
-import name_macros |
+import in_generator |
+import license |
import name_utilities |
import template_expander |
+HEADER_TEMPLATE = """%(license)s |
+ |
+#ifndef %(namespace)s%(suffix)sHeaders_h |
+#define %(namespace)s%(suffix)sHeaders_h |
+%(base_header_for_suffix)s |
+%(includes)s |
+ |
+#endif // %(namespace)s%(suffix)sHeaders_h |
+""" |
+ |
+ |
def case_insensitive_matching(name): |
return (name == ('HTMLEvents') |
or name == 'Event' |
@@ -45,7 +55,8 @@ def case_insensitive_matching(name): |
or name.startswith('CustomEvent') |
or name.startswith('MouseEvent')) |
-class EventFactoryWriter(name_macros.Writer): |
+ |
+class EventFactoryWriter(in_generator.Writer): |
defaults = { |
'ImplementedAs': None, |
'Conditional': None, |
@@ -65,9 +76,71 @@ class EventFactoryWriter(name_macros.Writer): |
def __init__(self, in_file_path): |
super(EventFactoryWriter, self).__init__(in_file_path) |
- if self.namespace == 'EventTarget': |
- return |
- self._outputs[(self.namespace + self.suffix + ".cpp")] = self.generate_implementation |
+ self.namespace = self.in_file.parameters['namespace'].strip('"') |
+ self.suffix = self.in_file.parameters['suffix'].strip('"') |
+ self._validate_entries() |
+ self._outputs = {(self.namespace + self.suffix + "Headers.h"): self.generate_headers_header, |
+ (self.namespace + self.suffix + ".cpp"): self.generate_implementation, |
+ } |
+ |
+ def _validate_entries(self): |
+ # If there is more than one entry with the same script name, only the first one will ever |
+ # be hit in practice, and so we'll silently ignore any properties requested for the second |
+ # (like RuntimeEnabled - see crbug.com/332588). |
+ entries_by_script_name = dict() |
+ for entry in self.in_file.name_dictionaries: |
+ script_name = name_utilities.script_name(entry) |
+ if script_name in entries_by_script_name: |
+ self._fatal('Multiple entries with script_name=%(script_name)s: %(name1)s %(name2)s' % { |
+ 'script_name': script_name, |
+ 'name1': entry['name'], |
+ 'name2': entries_by_script_name[script_name]['name']}) |
+ entries_by_script_name[script_name] = entry |
+ |
+ def _fatal(self, message): |
+ print 'FATAL ERROR: ' + message |
+ exit(1) |
+ |
+ def _headers_header_include_path(self, entry): |
+ if entry['ImplementedAs']: |
+ path = os.path.dirname(entry['name']) |
+ if len(path): |
+ path += '/' |
+ path += entry['ImplementedAs'] |
+ else: |
+ path = entry['name'] |
+ return path + '.h' |
+ |
+ def _headers_header_includes(self, entries): |
+ includes = dict() |
+ for entry in entries: |
+ cpp_name = name_utilities.cpp_name(entry) |
+ # Avoid duplicate includes. |
+ if cpp_name in includes: |
+ continue |
+ if self.suffix == 'Modules': |
+ subdir_name = 'modules' |
+ else: |
+ subdir_name = 'core' |
+ include = '#include "%(path)s"\n#include "bindings/%(subdir_name)s/v8/V8%(script_name)s.h"' % { |
+ 'path': self._headers_header_include_path(entry), |
+ 'script_name': name_utilities.script_name(entry), |
+ 'subdir_name': subdir_name, |
+ } |
+ includes[cpp_name] = self.wrap_with_condition(include, entry['Conditional']) |
+ return includes.values() |
+ |
+ def generate_headers_header(self): |
+ base_header_for_suffix = '' |
+ if self.suffix: |
+ base_header_for_suffix = '\n#include "core/%(namespace)sHeaders.h"\n' % {'namespace': self.namespace} |
+ return HEADER_TEMPLATE % { |
+ 'license': license.license_for_generated_cpp(), |
+ 'namespace': self.namespace, |
+ 'suffix': self.suffix, |
+ 'base_header_for_suffix': base_header_for_suffix, |
+ 'includes': '\n'.join(self._headers_header_includes(self.in_file.name_dictionaries)), |
+ } |
@template_expander.use_jinja('EventFactory.cpp.tmpl', filters=filters) |
def generate_implementation(self): |
@@ -79,4 +152,4 @@ class EventFactoryWriter(name_macros.Writer): |
if __name__ == "__main__": |
- name_macros.Maker(EventFactoryWriter).main(sys.argv) |
+ in_generator.Maker(EventFactoryWriter).main(sys.argv) |