| #!/usr/bin/python |
| # Copyright 2013 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import sys |
| import string |
| import json |
| |
| template_h = string.Template("""\ |
| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_CONSTANTS_H_ |
| #define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_CONSTANTS_H_ |
| |
| // THIS FILE IS AUTOGENERATED. DO NOT EDIT. |
| // Generated by |
| // content/browser/devtools/devtools_protocol_constants_generator.py from |
| // third_party/WebKit/Source/devtools/protocol.json and |
| // content/browser/devtools/browser_protocol.json). |
| |
| namespace content { |
| namespace devtools { |
| |
| extern const char kResult[]; |
| $contents |
| |
| } // devtools |
| } // content |
| |
| #endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PROTOCOL_CONSTANTS_H_ |
| """) |
| |
| template_cc = string.Template("""\ |
| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // THIS FILE IS AUTOGENERATED. DO NOT EDIT. |
| // Generated by |
| // content/browser/devtools/devtools_protocol_constants_generator.py from |
| // third_party/WebKit/Source/devtools/protocol.json and |
| // content/browser/devtools/browser_protocol.json). |
| |
| #include "content/browser/devtools/devtools_protocol_constants.h" |
| |
| namespace content { |
| namespace devtools { |
| |
| const char kResult[] = "result"; |
| $contents |
| |
| } // devtools |
| } // content |
| """) |
| |
| def Capitalize(s): |
| return s[:1].capitalize() + s[1:] |
| |
| references = [] |
| |
| def CreateNamespace(domain_name, data, keys, prefixes, name = None): |
| result = {} |
| if name: |
| result["kName"] = name |
| for i, key in enumerate(keys): |
| if key in data: |
| for parameter in data[key]: |
| parameter_name = parameter["name"]; |
| result[prefixes[i] + Capitalize(parameter_name)] = parameter_name |
| if "enum" in parameter: |
| enum_name = Capitalize(parameter_name) |
| result[enum_name] = {} |
| for enum in parameter["enum"]: |
| result[enum_name]["kEnum" + Capitalize(enum)] = enum |
| reference = "" |
| if "$ref" in parameter: |
| reference = parameter["$ref"] |
| if "items" in parameter and "$ref" in parameter["items"]: |
| reference = parameter["items"]["$ref"] |
| if reference: |
| if not "." in reference: |
| reference = domain_name + "." + reference |
| references.append(reference) |
| return result |
| |
| def IsHandledInBrowser(item): |
| return "handlers" in item and "browser" in item["handlers"] |
| |
| def FormatContents(tree, indent, format_string): |
| outer = dict((key, value) for key, value in tree.iteritems() |
| if not isinstance(value, dict)) |
| inner = dict((key, value) for key, value in tree.iteritems() |
| if isinstance(value, dict)) |
| body = "" |
| body += "".join(indent + format_string.format(key, value) |
| for (key, value) in sorted(outer.items())) |
| body += "".join(FormatNamespace(key, value, indent, format_string) |
| for (key, value) in sorted(inner.items())) |
| return body |
| |
| def FormatNamespace(title, tree, indent, format_string): |
| if (not tree): |
| return "" |
| body = '\n' + indent + "namespace " + title + " {\n" |
| body += FormatContents(tree, indent + " ", format_string) |
| body += indent + "} // " + title + "\n" |
| return body |
| |
| def CreateHeader(tree, output_file): |
| contents = FormatContents(tree, "", "extern const char {0}[];\n") |
| output_file.write(template_h.substitute({"contents": contents})) |
| |
| def CreateBody(tree, output_file): |
| contents = FormatContents(tree, "", "const char {0}[] = \"{1}\";\n") |
| output_file.write(template_cc.substitute({"contents": contents})) |
| |
| blink_protocol_data = open(sys.argv[1]).read() |
| browser_protocol_data = open(sys.argv[2]).read() |
| |
| blink_protocol = json.loads(blink_protocol_data) |
| browser_protocol = json.loads(browser_protocol_data) |
| |
| domains = blink_protocol["domains"] + browser_protocol["domains"] |
| |
| namespace_tree = {} |
| |
| for domain in domains: |
| domain_value = {} |
| domain_namespace_name = Capitalize(domain["domain"]) |
| if "commands" in domain: |
| for command in domain["commands"]: |
| if (IsHandledInBrowser(command)): |
| domain_value[command["name"]] = CreateNamespace(domain["domain"], |
| command, ["parameters", "returns"], ["kParam", "kResponse"], |
| domain_namespace_name + "." + command["name"]) |
| |
| if "events" in domain: |
| for event in domain["events"]: |
| if IsHandledInBrowser(event): |
| domain_value[event["name"]] = CreateNamespace(domain["domain"], |
| event, ["parameters"], ["kParam"], |
| domain_namespace_name + "." + event["name"]) |
| if domain_value: |
| namespace_tree[domain_namespace_name] = domain_value |
| |
| while (references): |
| reference = references.pop(); |
| path = reference.split("."); |
| parent_namespace = namespace_tree; |
| for path_segment in path[0:-1]: |
| if path_segment not in parent_namespace: |
| parent_namespace[path_segment] = {} |
| parent_namespace = parent_namespace[path_segment] |
| if (path[-1] not in parent_namespace): |
| try: |
| domain = [d for d in domains if d["domain"] == path[0]][0] |
| ref_type = [t for t in domain["types"] if t["id"] == path[1]][0] |
| parent_namespace[ref_type["id"]] = CreateNamespace(path[0], |
| ref_type, ["properties"], ["kParam"]) |
| except IndexError: |
| sys.stderr.write("Failed to resolve type [{0}].\n".format(reference)) |
| sys.exit(1) |
| |
| for (namespace_name, namespace) in namespace_tree.items(): |
| namespace["kName"] = namespace_name |
| |
| with open(sys.argv[3], "w") as f: |
| CreateBody(namespace_tree, f) |
| |
| with open(sys.argv[4], "w") as f: |
| CreateHeader(namespace_tree, f) |