| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """ |
| Generate event interfaces .json5 file (e.g. event_interface_names.json5). |
| |
| The event interfaces .json5 file contains a list of all Event interfaces, i.e., |
| all interfaces that inherit from Event, including Event itself, |
| together with certain extended attributes. |
| |
| Paths are in POSIX format, and relative to the repository root. |
| |
| This list is used to generate `EventFactory` and `event_interface_names`. |
| The .json5 format is documented in build/scripts/json5_generator.py. |
| """ |
| |
| import json |
| import optparse |
| import os |
| |
| import web_idl |
| |
| |
| def parse_options(): |
| parser = optparse.OptionParser() |
| parser.add_option("--web_idl_database", |
| type="string", |
| help="filepath of the input database") |
| parser.add_option( |
| "--component", |
| type="string", |
| help="component to be processed, e.g. 'core' or 'modules'") |
| parser.add_option( |
| "--export-macro", |
| type="string", |
| help="C++ export macro, e.g. 'CORE_EXPORT' or 'MODULES_EXPORT'") |
| parser.add_option("--suffix", |
| type="string", |
| default="", |
| help="'metadata.suffix' entry in the output .json5 file") |
| parser.add_option("--output", |
| type="string", |
| help="filepath of the output .json5 file") |
| options, args = parser.parse_args() |
| |
| required_option_names = [ |
| "web_idl_database", |
| "component", |
| "export_macro", |
| "output", |
| ] |
| for required_option_name in required_option_names: |
| if getattr(options, required_option_name) is None: |
| parser.error( |
| "--{} is a required option.".format(required_option_name)) |
| |
| return options, args |
| |
| |
| def main(): |
| options, args = parse_options() |
| |
| web_idl_database = web_idl.file_io.read_pickle_file( |
| options.web_idl_database) |
| |
| metadata = { |
| "namespace": "event_interface_names", |
| "suffix": options.suffix, |
| "export": options.export_macro, |
| } |
| data = [] |
| event_interface = web_idl_database.find("Event") |
| for interface in sorted(web_idl_database.interfaces, |
| key=lambda x: x.identifier): |
| if interface.components[0] != options.component: |
| continue |
| if event_interface not in interface.inclusive_inherited_interfaces: |
| continue |
| entry = { |
| "name": |
| interface.identifier, |
| "interfaceHeaderDir": |
| os.path.dirname(interface.code_generator_info.blink_headers[0]), |
| } |
| runtime_enabled_values = interface.extended_attributes.values_of( |
| "RuntimeEnabled") |
| if runtime_enabled_values: |
| assert len(runtime_enabled_values) == 1 |
| entry["RuntimeEnabled"] = runtime_enabled_values[0] |
| data.append(entry) |
| event_interface_names = { |
| "metadata": metadata, |
| "data": data, |
| } |
| |
| with open(options.output, mode="w") as file_obj: |
| file_obj.write(json.dumps(event_interface_names, indent=2)) |
| |
| |
| if __name__ == '__main__': |
| main() |