| #!/usr/bin/env python |
| # 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. |
| |
| |
| """Takes the JSON files in components/domain_reliability/baked_in_configs and |
| encodes their contents as an array of C strings that gets compiled in to Chrome |
| and loaded at runtime.""" |
| |
| |
| import json |
| import os |
| import sys |
| |
| |
| # A whitelist of domains that the script will accept when baking configs in to |
| # Chrome, to ensure incorrect ones are not added accidentally. Subdomains of |
| # whitelist entries are also allowed (e.g. maps.google.com, ssl.gstatic.com). |
| DOMAIN_WHITELIST = ('2mdn.net', 'admob.com', 'doubleclick.net', 'ggpht.com', |
| 'google.cn', 'google.co.uk', 'google.com', 'google.com.au', |
| 'google.de', 'google.fr', 'google.it', 'google.jp', |
| 'google.org', 'google.ru', 'googleadservices.com', |
| 'googleapis.com', 'googlesyndication.com', |
| 'googleusercontent.com', 'googlevideo.com', 'gstatic.com', |
| 'gvt1.com', 'youtube.com', 'ytimg.com') |
| |
| |
| CC_HEADER = """// Copyright (C) 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. |
| |
| // AUTOGENERATED FILE. DO NOT EDIT. |
| // |
| // (Update configs in components/domain_reliability/baked_in_configs and list |
| // configs in components/domain_reliability.gypi instead.) |
| |
| #include "components/domain_reliability/baked_in_configs.h" |
| |
| #include <stdlib.h> |
| |
| namespace domain_reliability { |
| |
| const char* const kBakedInJsonConfigs[] = { |
| """ |
| |
| |
| CC_FOOTER = """ NULL |
| }; |
| |
| } // namespace domain_reliability |
| """ |
| |
| |
| def domain_is_whitelisted(domain): |
| return any(domain == e or domain.endswith('.' + e) for e in DOMAIN_WHITELIST) |
| |
| |
| def quote_and_wrap_text(text, width=79, prefix=' "', suffix='"'): |
| max_length = width - len(prefix) - len(suffix) |
| output = prefix |
| line_length = 0 |
| for c in text: |
| if c == "\"": |
| c = "\\\"" |
| elif c == "\n": |
| c = "\\n" |
| elif c == "\\": |
| c = "\\\\" |
| if line_length + len(c) > max_length: |
| output += suffix + "\n" + prefix |
| line_length = 0 |
| output += c |
| line_length += len(c) |
| output += suffix |
| return output |
| |
| |
| def main(): |
| if len(sys.argv) < 3: |
| print >> sys.stderr, ('Usage: %s <JSON files...> <output C++ file>' % |
| sys.argv[0]) |
| print >> sys.stderr, sys.modules[__name__].__doc__ |
| return 1 |
| |
| cpp_code = CC_HEADER |
| found_invalid_config = False |
| for json_file in sys.argv[1:-1]: |
| with open(json_file, 'r') as f: |
| json_text = f.read() |
| config = json.loads(json_text) |
| if 'monitored_domain' not in config: |
| print >> sys.stderr, ('%s: no monitored_domain found' % json_file) |
| found_invalid_config = True |
| continue |
| domain = config['monitored_domain'] |
| if not domain_is_whitelisted(domain): |
| print >> sys.stderr, ('%s: monitored_domain "%s" not in whitelist' % |
| (json_file, domain)) |
| found_invalid_config = True |
| continue |
| cpp_code += " // " + json_file + ":\n" |
| cpp_code += quote_and_wrap_text(json_text) + ",\n" |
| cpp_code += "\n" |
| cpp_code += CC_FOOTER |
| |
| if found_invalid_config: |
| return 1 |
| |
| with open(sys.argv[-1], 'wb') as f: |
| f.write(cpp_code) |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |