Commit b3464215 authored by pfeldman's avatar pfeldman Committed by Commit bot

DevTools: split protocol.json into files per domain.

BUG=580337
NOTRY=true

Review-Url: https://codereview.chromium.org/2035653005
Cr-Commit-Position: refs/heads/master@{#397883}
parent b474d37f
......@@ -9,8 +9,11 @@ if (!is_android) {
action("devtools_protocol_constants") {
script = "devtools_protocol_constants_generator.py"
blink_protocol = "//third_party/WebKit/Source/devtools/protocol.json"
deps = [
"//third_party/WebKit/Source/core/inspector:protocol_version",
]
blink_protocol =
"$target_gen_dir/../../../blink/core/inspector/protocol.json"
browser_protocol = "//content/browser/devtools/browser_protocol.json"
inputs = [
blink_protocol,
......
......@@ -10,8 +10,11 @@
'actions': [
{
'action_name': 'devtools_protocol_constants',
'dependencies': [
'//third_party/WebKit/Source/core/inspector:protocol_version'
],
'variables': {
'blink_protocol': '../../../third_party/WebKit/Source/devtools/protocol.json',
'blink_protocol': '<(SHARED_INTERMEDIATE_DIR)/blink/core/inspector/protocol.json',
'browser_protocol': '../../../content/browser/devtools/browser_protocol.json',
'generator': 'devtools_protocol_constants_generator.py',
'package': 'chrome'
......
......@@ -24,7 +24,7 @@ template_h = string.Template("""\
// THIS FILE IS AUTOGENERATED. DO NOT EDIT.
// Generated by
// chrome/browser/devtools/devtools_protocol_constants_generator.py from
// third_party/WebKit/Source/devtools/protocol.json and
// gen/blink/core/inspector/protocol.json and
// content/browser/devtools/browser_protocol.json
#include <string>
......@@ -53,7 +53,7 @@ template_cc = string.Template("""\
// THIS FILE IS AUTOGENERATED. DO NOT EDIT.
// Generated by
// chrome/browser/devtools/devtools_protocol_constants_generator.py from
// third_party/WebKit/Source/devtools/protocol.json and
// gen/blink/core/inspector/protocol.json and
// content/browser/devtools/browser_protocol.json
#include "base/strings/string_number_conversions.h"
......
......@@ -36,11 +36,13 @@ grit("devtools_resources") {
action("gen_devtools_protocol_handler") {
visibility = [ "//content/browser" ]
deps = [
"//third_party/WebKit/Source/core/inspector:protocol_version",
]
script = "//content/browser/devtools/protocol/" +
"devtools_protocol_handler_generator.py"
blink_protocol = "//third_party/WebKit/Source/devtools/protocol.json"
blink_protocol = "$root_gen_dir/blink/core/inspector/protocol.json"
browser_protocol = "browser_protocol.json"
inputs = [
blink_protocol,
......
......@@ -10,8 +10,11 @@
'actions': [
{
'action_name': 'devtools_protocol_handler',
'dependencies': [
'//third_party/WebKit/Source/core/inspector:protocol_version'
],
'variables': {
'blink_protocol': '../../../third_party/WebKit/Source/devtools/protocol.json',
'blink_protocol': '<(SHARED_INTERMEDIATE_DIR)/blink/core/inspector/protocol.json',
'browser_protocol': 'browser_protocol.json',
'generator': 'protocol/devtools_protocol_handler_generator.py',
'output_cc': '<(SHARED_INTERMEDIATE_DIR)/content/browser/devtools/protocol/devtools_protocol_dispatcher.cc',
......
......@@ -20,7 +20,7 @@ header = """\
// THIS FILE IS AUTOGENERATED. DO NOT EDIT.
// Generated by
// content/public/browser/devtools_protocol_handler_generator.py from
// third_party/WebKit/Source/devtools/protocol.json and
// gen/blink/core/inspector/protocol.json and
// content/browser/devtools/browser_protocol.json
"""
......
......@@ -56,9 +56,11 @@ grit("headless_lib_resources_grit") {
action("gen_devtools_client_api") {
script = "//headless/lib/browser/client_api_generator.py"
deps = [
"//third_party/WebKit/Source/core/inspector:protocol_version",
]
inputs = [
"//third_party/WebKit/Source/devtools/protocol.json",
"$root_gen_dir/blink/core/inspector/protocol.json",
]
outputs = [
......
......@@ -5,8 +5,6 @@
import("//third_party/WebKit/Source/bindings/bindings.gni")
import("//third_party/WebKit/Source/core/core.gni")
visibility = [ "//third_party/WebKit/Source/*" ]
action("instrumentation_sources") {
script = "CodeGeneratorInstrumentation.py"
......@@ -32,17 +30,19 @@ action("instrumentation_sources") {
# inspector protocol -----------------------------------------------------------
protocol_file = "../../devtools/protocol.json"
action("protocol_sources") {
script = "../../platform/inspector_protocol/CodeGenerator.py"
deps = [
":protocol_version",
]
sources = [
"../../platform/inspector_protocol/CodeGenerator.py",
"../../platform/inspector_protocol/TypeBuilder_cpp.template",
"../../platform/inspector_protocol/TypeBuilder_h.template",
]
inputs = [
protocol_file,
"../../platform/inspector_protocol/TypeBuilder_h.template",
"../../platform/inspector_protocol/TypeBuilder_cpp.template",
"browser_protocol.json",
"../../platform/v8_inspector/js_protocol.json",
]
outputs = [
"$blink_core_output_dir/inspector/protocol/Accessibility.cpp",
......@@ -100,9 +100,10 @@ action("protocol_sources") {
]
args = [
rebase_path(protocol_file, root_build_dir),
"--domains",
"Accessibility,Animation,ApplicationCache,CacheStorage,Console,CSS,Database,DeviceOrientation,DOM,DOMDebugger,DOMStorage,Emulation,IndexedDB,Input,Inspector,IO,LayerTree,Memory,Network,Page,Rendering,Security,ServiceWorker,Storage,Tracing,Worker",
"--protocol",
rebase_path("browser_protocol.json", root_build_dir),
"--include",
rebase_path("../../platform/v8_inspector/js_protocol.json", root_build_dir),
"--string_type",
"String",
"--export_macro",
......@@ -113,3 +114,23 @@ action("protocol_sources") {
"core/inspector/protocol",
]
}
action("protocol_version") {
script =
"../../platform/inspector_protocol/generate-inspector-protocol-version"
inputs = [
"browser_protocol.json",
]
output_file = "$blink_core_output_dir/inspector/protocol.json"
outputs = [
output_file,
]
args = [
"--o",
rebase_path(output_file, root_build_dir),
rebase_path("browser_protocol.json", root_build_dir),
rebase_path("../../platform/v8_inspector/js_protocol.json", root_build_dir),
]
}
......@@ -17,7 +17,6 @@
# GN version: //third_party/WebKit/Source/core/inspector:instrumentation_sources
'target_name': 'instrumentation_sources',
'type': 'none',
'dependencies': [],
'actions': [
{
'action_name': 'generateInspectorInstrumentation',
......@@ -45,9 +44,10 @@
]
},
{
# GN version: //third_party/WebKit/Source/core:inspector_protocol_sources
# GN version: //third_party/WebKit/Source/core/inspector:protocol_sources
'target_name': 'protocol_sources',
'type': 'none',
'dependencies': ['protocol_version'],
'actions': [
{
'action_name': 'generateInspectorProtocolBackendSources',
......@@ -55,10 +55,12 @@
'<@(jinja_module_files)',
# The python script in action below.
'../../platform/inspector_protocol/CodeGenerator.py',
# Input files for the script.
'../../devtools/protocol.json',
# Source code templates.
'../../platform/inspector_protocol/TypeBuilder_h.template',
'../../platform/inspector_protocol/TypeBuilder_cpp.template',
# Protocol definition
'browser_protocol.json',
'../../platform/v8_inspector/js_protocol.json',
],
'outputs': [
'<(blink_core_output_dir)/inspector/protocol/Accessibility.cpp',
......@@ -117,14 +119,40 @@
'action': [
'python',
'../../platform/inspector_protocol/CodeGenerator.py',
'../../devtools/protocol.json',
'--domains', 'Accessibility,Animation,ApplicationCache,CacheStorage,Console,CSS,Database,DeviceOrientation,DOM,DOMDebugger,DOMStorage,Emulation,IndexedDB,Input,Inspector,IO,LayerTree,Memory,Network,Page,Rendering,Security,ServiceWorker,Storage,Tracing,Worker',
'--protocol', 'browser_protocol.json',
'--include', '../../platform/v8_inspector/js_protocol.json',
'--string_type', 'String',
'--export_macro', 'CORE_EXPORT',
'--output_dir', '<(blink_core_output_dir)/inspector/protocol',
'--output_package', 'core/inspector/protocol',
],
'message': 'Generating Inspector protocol backend sources from protocol.json',
'message': 'Generating Inspector protocol backend sources from json definitions',
},
]
},
{
# GN version: //third_party/WebKit/Source/core/inspector:protocol_version
'target_name': 'protocol_version',
'type': 'none',
'actions': [
{
'action_name': 'generateInspectorProtocolVersion',
'inputs': [
'../../platform/inspector_protocol/generate-inspector-protocol-version',
'browser_protocol.json',
],
'outputs': [
'<(blink_core_output_dir)/inspector/protocol.json',
],
'action': [
'python',
'../../platform/inspector_protocol/generate-inspector-protocol-version',
'--o',
'<@(_outputs)',
'browser_protocol.json',
'../../platform/v8_inspector/js_protocol.json'
],
'message': 'Validate inspector protocol for backwards compatibility and generate version file',
},
]
},
......
......@@ -3,6 +3,7 @@
# found in the LICENSE file.
import("//build/config/features.gni")
import("//third_party/WebKit/Source/core/core.gni")
gypi_values = exec_script("//build/gypi_to_gn.py",
[ rebase_path("devtools.gypi") ],
......@@ -224,9 +225,11 @@ action("supported_css_properties") {
action("frontend_protocol_sources") {
script = "scripts/CodeGeneratorFrontend.py"
deps = [
"../core/inspector:protocol_version",
]
inputs = [
"protocol.json",
"$blink_core_output_dir/inspector/protocol.json",
]
outputs = [
resources_out_dir + "InspectorBackendCommands.js",
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
......@@ -71,7 +71,8 @@ def _CompileDevtoolsFrontend(input_api, output_api):
if (any(devtools_front_end in path for path in local_paths) or
any("protocol.json" in path for path in local_paths) or
any("compile_frontend.py" in path for path in local_paths) or
any("InjectedScriptSource.js" in path for path in local_paths)):
any("InjectedScriptSource.js" in path for path in local_paths) or
any("DebuggerScript.js" in path for path in local_paths)):
lint_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
"scripts", "compile_frontend.py")
out, _ = input_api.subprocess.Popen(
......
......@@ -191,11 +191,14 @@
'actions': [
{
'action_name': 'generateInspectorProtocolFrontendSources',
'dependencies': [
'../core/inspector:protocol_version'
],
'inputs': [
# The python script in action below.
'scripts/CodeGeneratorFrontend.py',
# Input file for the script.
'protocol.json',
'<(SHARED_INTERMEDIATE_DIR)/blink/core/inspector/protocol.json',
],
'outputs': [
'<(PRODUCT_DIR)/resources/inspector/InspectorBackendCommands.js',
......@@ -203,10 +206,10 @@
'action': [
'python',
'scripts/CodeGeneratorFrontend.py',
'protocol.json',
'<(SHARED_INTERMEDIATE_DIR)/blink/core/inspector/protocol.json',
'--output_js_dir', '<(PRODUCT_DIR)/resources/inspector/',
],
'message': 'Generating Inspector protocol frontend sources from protocol.json',
'message': 'Generating Inspector protocol frontend sources from json definitions.',
},
]
},
......
......@@ -122,4 +122,4 @@ WebInspector.InspectorBackendHostedMode.generateCommands = function(schema)
return result.join("\n");
}
WebInspector.InspectorBackendHostedMode.loadFromJSONIfNeeded("../protocol.json");
WebInspector.InspectorBackendHostedMode.loadFromJSONIfNeeded("../inspector.json");
......@@ -53,7 +53,7 @@ except Exception:
# Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html
exc = sys.exc_info()[1]
sys.stderr.write("Failed to parse command-line arguments: %s\n\n" % exc)
sys.stderr.write("Usage: <script> protocol.json --output_js_dir <output_js_dir>\n")
sys.stderr.write("Usage: <script> some.json --output_js_dir <output_js_dir>\n")
exit(1)
......
......@@ -97,7 +97,7 @@ loaded_css_regex = re.compile(r'(?:registerRequiredCSS|WebInspector\.View\.creat
java_build_regex = re.compile(r'^\w+ version "(\d+)\.(\d+)')
errors_found = False
generate_protocol_externs.generate_protocol_externs(protocol_externs_file, path.join(devtools_path, 'protocol.json'))
generate_protocol_externs.generate_protocol_externs(protocol_externs_file, path.join(inspector_path, 'browser_protocol.js'), path.join(v8_inspector_path, 'v8_protocol.js'))
# Based on http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python.
......
......@@ -27,7 +27,12 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import os
import re
try:
import json
except ImportError:
import simplejson as json
type_traits = {
"any": "*",
......@@ -88,13 +93,17 @@ def param_type(domain_name, param):
return "!! Type not found: " + type_id
def generate_protocol_externs(output_path, input_path):
input_file = open(input_path, "r")
def load_schema(file, domains):
input_file = open(file, "r")
json_string = input_file.read()
json_string = json_string.replace(": true", ": True")
json_string = json_string.replace(": false", ": False")
json_api = eval(json_string)["domains"]
parsed_json = json.loads(json_string)
domains.append(parsed_json["domains"])
def generate_protocol_externs(output_path, file1, file2):
domains = []
load_schema(file1, domains)
load_schema(file2, domains)
output_file = open(output_path, "w")
output_file.write(
......@@ -106,14 +115,14 @@ var Protocol = {};
Protocol.Error;
""")
for domain in json_api:
for domain in domains:
domain_name = domain["domain"]
if "types" in domain:
for type in domain["types"]:
type_id = full_qualified_type_id(domain_name, type["id"])
ref_types[type_id] = "%sAgent.%s" % (domain_name, type["id"])
for domain in json_api:
for domain in domains:
domain_name = domain["domain"]
promisified = domain_name in promisified_domains
......@@ -210,7 +219,7 @@ Protocol.Error;
output_file.write("Protocol.Agents = function(agentsMap){this._agentsMap;};\n")
output_file.write("/**\n * @param {string} domain\n * @param {!Object} dispatcher\n */\n")
output_file.write("Protocol.Agents.prototype.registerDispatcher = function(domain, dispatcher){};\n")
for domain in json_api:
for domain in domains:
domain_name = domain["domain"]
uppercase_length = 0
while uppercase_length < len(domain_name) and domain_name[uppercase_length].isupper():
......
......@@ -188,18 +188,18 @@ executable("character_data_generator") {
# Inspector protocol
protocol_file = "../devtools/protocol.json"
action("inspector_protocol_sources") {
script = "inspector_protocol/CodeGenerator.py"
deps = [
":inspector_protocol_version",
]
sources = [
"inspector_protocol/CodeGenerator.py",
"inspector_protocol/TypeBuilder_cpp.template",
"inspector_protocol/TypeBuilder_h.template",
]
inputs = [
protocol_file,
"inspector_protocol/TypeBuilder_h.template",
"inspector_protocol/TypeBuilder_cpp.template",
"v8_inspector/js_protocol.json",
]
outputs = [
"$blink_platform_output_dir/v8_inspector/protocol/Debugger.cpp",
......@@ -213,9 +213,8 @@ action("inspector_protocol_sources") {
]
args = [
rebase_path(protocol_file, root_build_dir),
"--domains",
"Debugger,HeapProfiler,Profiler,Runtime",
"--protocol",
rebase_path("v8_inspector/js_protocol.json", root_build_dir),
"--string_type",
"String16",
"--export_macro",
......@@ -232,18 +231,18 @@ action("inspector_protocol_version") {
script = "inspector_protocol/generate-inspector-protocol-version"
inputs = [
protocol_file,
"v8_inspector/js_protocol.json",
]
output_file =
"$blink_platform_output_dir/inspector_protocol/InspectorProtocolVersion.h"
"$blink_platform_output_dir/v8_inspector/protocol/v8inspector.json"
outputs = [
output_file,
]
args = [
"-o",
"--o",
rebase_path(output_file, root_build_dir),
rebase_path(protocol_file, root_build_dir),
rebase_path("v8_inspector/js_protocol.json", root_build_dir),
]
}
......@@ -294,7 +293,6 @@ group("make_platform_generated") {
":inspector_debugger_script",
":inspector_injected_script",
":inspector_protocol_sources",
":inspector_protocol_version",
":runtime_enabled_features",
]
}
......@@ -322,7 +320,6 @@ component("platform") {
get_target_outputs(":inspector_debugger_script") +
get_target_outputs(":inspector_injected_script") +
get_target_outputs(":inspector_protocol_sources") +
get_target_outputs(":inspector_protocol_version") +
get_target_outputs(":runtime_enabled_features")
configs += [
......
......@@ -33,18 +33,19 @@ sys.path.insert(1, third_party_dir)
import jinja2
cmdline_parser = optparse.OptionParser()
cmdline_parser.add_option("--domains")
cmdline_parser.add_option("--output_dir")
cmdline_parser.add_option("--output_package")
cmdline_parser.add_option("--protocol")
cmdline_parser.add_option("--include")
cmdline_parser.add_option("--string_type")
cmdline_parser.add_option("--export_macro")
generate_domains = set()
cmdline_parser.add_option("--output_dir")
cmdline_parser.add_option("--output_package")
try:
arg_options, arg_values = cmdline_parser.parse_args()
if (len(arg_values) == 0):
raise Exception("At least one plain argument expected (found %s)" % len(arg_values))
protocol_file = arg_options.protocol
if not protocol_file:
raise Exception("Protocol directory must be specified")
include_file = arg_options.include
output_dirname = arg_options.output_dir
if not output_dirname:
raise Exception("Output directory must be specified")
......@@ -57,27 +58,41 @@ try:
export_macro = arg_options.export_macro
if not export_macro:
raise Exception("Export macro must be specified")
output_domains = arg_options.domains
if output_domains and len(output_domains):
for domain in output_domains.split(","):
generate_domains.add(domain)
except Exception:
# Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html
exc = sys.exc_info()[1]
sys.stderr.write("Failed to parse command-line arguments: %s\n\n" % exc)
sys.stderr.write("Usage: <script> --output_dir <output_dir> protocol.json ...\n")
exit(1)
json_api = {"domains": []}
json_timestamp = 0
input_file = open(protocol_file, "r")
json_string = input_file.read()
parsed_json = json.loads(json_string)
# Make gyp / make generatos happy, otherwise make rebuilds world.
def up_to_date():
template_ts = max(
os.path.getmtime(__file__),
os.path.getmtime(os.path.join(templates_dir, "TypeBuilder_h.template")),
os.path.getmtime(os.path.join(templates_dir, "TypeBuilder_cpp.template")),
os.path.getmtime(protocol_file))
for domain in parsed_json["domains"]:
name = domain["domain"]
h_path = os.path.join(output_dirname, name)
cpp_path = os.path.join(output_dirname, name)
if not os.path.exists(h_path) or not os.path.exists(cpp_path):
return False
generated_ts = max(os.path.getmtime(h_path), os.path.getmtime(cpp_path))
if generated_ts < template_ts:
return False
return True
if up_to_date():
sys.exit()
for filename in arg_values:
json_timestamp = max(os.path.getmtime(filename), json_timestamp)
input_file = open(filename, "r")
json_string = input_file.read()
parsed_json = json.loads(json_string)
json_api["domains"] += parsed_json["domains"]
def to_title_case(name):
return name[:1].upper() + name[1:]
......@@ -212,6 +227,7 @@ type_definitions["boolean"] = create_primitive_type_definition("boolean")
type_definitions["object"] = create_object_type_definition()
type_definitions["any"] = create_any_type_definition()
def wrap_array_definition(type):
return {
"return_type": "std::unique_ptr<protocol::Array<%s>>" % type["raw_type"],
......@@ -244,9 +260,6 @@ def create_type_definitions():
else:
type_definitions[domain["domain"] + "." + type["id"]] = create_primitive_type_definition(type["type"])
patch_full_qualified_refs()
create_type_definitions()
def type_definition(name):
return type_definitions[name]
......@@ -275,18 +288,22 @@ def has_disable(commands):
return False
if os.path.exists(__file__):
current_script_timestamp = os.path.getmtime(__file__)
else:
current_script_timestamp = 0
generate_domains = []
json_api = {}
json_api["domains"] = parsed_json["domains"]
for domain in parsed_json["domains"]:
generate_domains.append(domain["domain"])
if include_file:
input_file = open(include_file, "r")
json_string = input_file.read()
parsed_json = json.loads(json_string)
json_api["domains"] += parsed_json["domains"]
def is_up_to_date(file, template):
if not os.path.exists(file):
return False
timestamp = os.path.getmtime(file)
return timestamp > max(os.path.getmtime(module_path + template),
current_script_timestamp, json_timestamp)
patch_full_qualified_refs()
create_type_definitions()
if not os.path.exists(output_dirname):
os.mkdir(output_dirname)
......@@ -303,10 +320,6 @@ def generate(domain):
h_file_name = output_dirname + "/" + class_name + ".h"
cpp_file_name = output_dirname + "/" + class_name + ".cpp"
if (is_up_to_date(cpp_file_name, cpp_template_name) and
is_up_to_date(h_file_name, h_template_name)):
return
template_context = {
"domain": domain,
"join_arrays": join_arrays,
......
......@@ -45,10 +45,18 @@
#
# Adding --show_changes to the command line prints out a list of valid public API changes.
import collections
import copy
import os.path
import optparse
import re
import sys
try:
import json
except ImportError:
import simplejson as json
def list_to_map(items, key):
result = {}
for item in items:
......@@ -56,28 +64,34 @@ def list_to_map(items, key):
result[item[key]] = item
return result
def named_list_to_map(container, name, key):
if name in container:
return list_to_map(container[name], key)
return {}
def removed(reverse):
if reverse:
return "added"
return "removed"
def required(reverse):
if reverse:
return "optional"
return "required"
def compare_schemas(schema_1, schema_2, reverse):
def compare_schemas(d_1, d_2, reverse):
errors = []
types_1 = normalize_types_in_schema(schema_1)
types_2 = normalize_types_in_schema(schema_2)
domains_1 = copy.deepcopy(d_1)
domains_2 = copy.deepcopy(d_2)
types_1 = normalize_types_in_schema(domains_1)
types_2 = normalize_types_in_schema(domains_2)
domains_by_name_1 = list_to_map(schema_1, "domain")
domains_by_name_2 = list_to_map(schema_2, "domain")
domains_by_name_1 = list_to_map(domains_1, "domain")
domains_by_name_2 = list_to_map(domains_2, "domain")
for name in domains_by_name_1:
domain_1 = domains_by_name_1[name]
......@@ -87,6 +101,7 @@ def compare_schemas(schema_1, schema_2, reverse):
compare_domains(domain_1, domains_by_name_2[name], types_1, types_2, errors, reverse)
return errors
def compare_domains(domain_1, domain_2, types_map_1, types_map_2, errors, reverse):
domain_name = domain_1["domain"]
commands_1 = named_list_to_map(domain_1, "commands", "name")
......@@ -107,6 +122,7 @@ def compare_domains(domain_1, domain_2, types_map_1, types_map_2, errors, revers
continue
compare_events(domain_name, event_1, events_2[name], types_map_1, types_map_2, errors, reverse)
def compare_commands(domain_name, command_1, command_2, types_map_1, types_map_2, errors, reverse):
context = domain_name + "." + command_1["name"]
......@@ -119,12 +135,14 @@ def compare_commands(domain_name, command_1, command_2, types_map_1, types_map_2
returns_2 = named_list_to_map(command_2, "returns", "name")
compare_params_list(context, "response parameter", returns_1, returns_2, types_map_1, types_map_2, 0, errors, reverse)
def compare_events(domain_name, event_1, event_2, types_map_1, types_map_2, errors, reverse):
context = domain_name + "." + event_1["name"]
params_1 = named_list_to_map(event_1, "parameters", "name")
params_2 = named_list_to_map(event_2, "parameters", "name")
compare_params_list(context, "parameter", params_1, params_2, types_map_1, types_map_2, 0, errors, reverse)
def compare_params_list(context, kind, params_1, params_2, types_map_1, types_map_2, depth, errors, reverse):
for name in params_1:
param_1 = params_1[name]
......@@ -141,6 +159,7 @@ def compare_params_list(context, kind, params_1, params_2, types_map_1, types_ma
type_2 = extract_type(param_2, types_map_2, errors)
compare_types(context + "." + name, kind, type_1, type_2, types_map_1, types_map_2, depth, errors, reverse)
def compare_types(context, kind, type_1, type_2, types_map_1, types_map_2, depth, errors, reverse):
if depth > 10:
return
......@@ -165,6 +184,7 @@ def compare_types(context, kind, type_1, type_2, types_map_1, types_map_2, depth
item_type_2 = extract_type(type_2["items"], types_map_2, errors)
compare_types(context, kind, item_type_1, item_type_2, types_map_1, types_map_2, depth + 1, errors, reverse)
def extract_type(typed_object, types_map, errors):
if "type" in typed_object:
result = { "id": "<transient>", "type": typed_object["type"] }
......@@ -180,13 +200,15 @@ def extract_type(typed_object, types_map, errors):
types_map[ref] = { "id": "<transient>", "type": "object" }
return types_map[ref]
def normalize_types_in_schema(schema):
def normalize_types_in_schema(domains):
types = {}
for domain in schema:
for domain in domains:
domain_name = domain["domain"]
normalize_types(domain, domain_name, types)
return types
def normalize_types(obj, domain_name, types):
if isinstance(obj, list):
for item in obj:
......@@ -201,12 +223,16 @@ def normalize_types(obj, domain_name, types):
else:
normalize_types(value, domain_name, types)
def load_json(filename):
input_file = open(filename, "r")
def load_schema(file, domains):
if not os.path.isfile(file):
return
input_file = open(file, "r")
json_string = input_file.read()
json_string = re.sub(":\s*true", ": True", json_string)
json_string = re.sub(":\s*false", ": False", json_string)
return eval(json_string)
parsed_json = json.loads(json_string, object_pairs_hook=collections.OrderedDict)
domains += parsed_json["domains"]
return parsed_json["version"]
def self_test():
def create_test_schema_1():
......@@ -392,72 +418,61 @@ def self_test():
compare_schemas(create_test_schema_2(), create_test_schema_1(), True)))
def load_domains_and_baselines(file, domains, baseline_domains):
version = load_schema(os.path.normpath(file), domains)
suffix = "-%s.%s.json" % (version["major"], version["minor"])
baseline_file = file.replace(".json", suffix)
load_schema(os.path.normpath(baseline_file), baseline_domains)
return version
def main():
if not self_test():
sys.stderr.write("Self-test failed")
return 1
if len(sys.argv) < 4 or sys.argv[1] != "-o":
sys.stderr.write("Usage: %s -o OUTPUT_FILE INPUT_FILE [--show-changes]\n" % sys.argv[0])
cmdline_parser = optparse.OptionParser()
cmdline_parser.add_option("--show_changes")
cmdline_parser.add_option("--o")
arg_options, arg_values = cmdline_parser.parse_args()
if len(arg_values) < 1 or not arg_options.o:
sys.stderr.write("Usage: %s --o OUTPUT_FILE [--show_changes] PROTOCOL_FOLDER1 ?PROTOCOL_FOLDER2 \n" % sys.argv[0])
return 1
output_path = sys.argv[2]
output_path = arg_options.o
output_file = open(output_path, "w")
input_path = sys.argv[3]
dir_name = os.path.dirname(input_path)
schema = load_json(input_path)
major = schema["version"]["major"]
minor = schema["version"]["minor"]
version = "%s.%s" % (major, minor)
if len(dir_name) == 0:
dir_name = "."
baseline_path = os.path.normpath(dir_name + "/Inspector-" + version + ".json")
baseline_schema = load_json(baseline_path)
domains = []
baseline_domains = []
version = load_domains_and_baselines(arg_values[0], domains, baseline_domains)
if len(arg_values) > 1:
load_domains_and_baselines(arg_values[1], domains, baseline_domains)
expected_errors = [
"Debugger.globalObjectCleared: event has been removed"
]
errors = compare_schemas(baseline_schema["domains"], schema["domains"], False)
errors = compare_schemas(baseline_domains, domains, False)
unexpected_errors = []
for i in range(len(errors)):
if errors[i] not in expected_errors:
unexpected_errors.append(errors[i])
if len(unexpected_errors) > 0:
sys.stderr.write(" Compatibility with %s: FAILED\n" % version)
sys.stderr.write(" Compatibility checks FAILED\n")
for error in unexpected_errors:
sys.stderr.write( " %s\n" % error)
return 1
if len(sys.argv) > 4 and sys.argv[4] == "--show-changes":
changes = compare_schemas(
load_json(input_path)["domains"], load_json(baseline_path)["domains"], True)
if arg_options.show_changes:
changes = compare_schemas(domains, baseline_domains, True)
if len(changes) > 0:
print " Public changes since %s:" % version
for change in changes:
print " %s" % change
output_file.write("""
#ifndef InspectorProtocolVersion_h
#define InspectorProtocolVersion_h
#include "platform/inspector_protocol/String16.h"
namespace blink {
String inspectorProtocolVersion() { return "%s"; }
int inspectorProtocolVersionMajor() { return %s; }
int inspectorProtocolVersionMinor() { return %s; }
}
#endif // !defined(InspectorProtocolVersion_h)
""" % (version, major, minor))
json.dump({"version": version, "domains": domains}, output_file, indent=4, sort_keys=False, separators=(',', ': '))
output_file.close()
if __name__ == '__main__':
......
# Copyright 2014 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.
{
'variables': {
'blink_platform_output_dir': '<(SHARED_INTERMEDIATE_DIR)/blink/platform',
'jinja_module_files': [
# jinja2/__init__.py contains version string, so sufficient for package
'<(DEPTH)/third_party/jinja2/__init__.py',
'<(DEPTH)/third_party/markupsafe/__init__.py', # jinja2 dep
],
},
'targets': [
{
# GN version: //third_party/WebKit/Source/platform/inspector_protocol_version
'target_name': 'protocol_version',
'type': 'none',
'actions': [
{
'action_name': 'generateInspectorProtocolVersion',
'inputs': [
'generate-inspector-protocol-version',
'../../devtools/protocol.json',
],
'outputs': [
'<(blink_platform_output_dir)/inspector_protocol/InspectorProtocolVersion.h',
],
'action': [
'python',
'generate-inspector-protocol-version',
'-o',
'<@(_outputs)',
'<@(_inputs)'
],
'message': 'Validate inspector protocol for backwards compatibility and generate version file',
}
]
},
], # targets
}
......@@ -53,7 +53,6 @@
'type': 'none',
'hard_dependency': 1,
'dependencies': [
'inspector_protocol/protocol.gyp:protocol_version',
'v8_inspector/v8_inspector.gyp:inspector_debugger_script',
'v8_inspector/v8_inspector.gyp:inspector_injected_script',
'v8_inspector/v8_inspector.gyp:protocol_sources',
......
......@@ -56,6 +56,7 @@
# GN version: //third_party/WebKit/Source/platform:inspector_protocol_sources
'target_name': 'protocol_sources',
'type': 'none',
'dependencies': ['protocol_version'],
'actions': [
{
'action_name': 'generateV8InspectorProtocolBackendSources',
......@@ -63,10 +64,11 @@
'<@(jinja_module_files)',
# The python script in action below.
'../inspector_protocol/CodeGenerator.py',
# Input files for the script.
'../../devtools/protocol.json',
# Source code templates.
'../inspector_protocol/TypeBuilder_h.template',
'../inspector_protocol/TypeBuilder_cpp.template',
# Protocol definitions
'js_protocol.json',
],
'outputs': [
'<(blink_platform_output_dir)/v8_inspector/protocol/Debugger.cpp',
......@@ -81,14 +83,38 @@
'action': [
'python',
'../inspector_protocol/CodeGenerator.py',
'../../devtools/protocol.json',
'--domains', 'Debugger,HeapProfiler,Profiler,Runtime',
'--protocol', 'js_protocol.json',
'--string_type', 'String16',
'--export_macro', 'PLATFORM_EXPORT',
'--output_dir', '<(blink_platform_output_dir)/v8_inspector/protocol',
'--output_package', 'platform/v8_inspector/protocol',
],
'message': 'Generating protocol backend sources from protocol.json',
'message': 'Generating protocol backend sources from json definitions.',
},
]
},
{
# GN version: //third_party/WebKit/Source/core/inspector:protocol_version
'target_name': 'protocol_version',
'type': 'none',
'actions': [
{
'action_name': 'generateV8InspectorProtocolVersion',
'inputs': [
'../inspector_protocol/generate-inspector-protocol-version',
'js_protocol.json',
],
'outputs': [
'<(blink_platform_output_dir)/v8_inspector/protocol.json',
],
'action': [
'python',
'../inspector_protocol/generate-inspector-protocol-version',
'--o',
'<@(_outputs)',
'js_protocol.json',
],
'message': 'Validate v8_inspector protocol for backwards compatibility and generate version file',
},
]
},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment