1#!/usr/bin/env python 2# Copyright 2014 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6 7"""Takes the JSON files in components/domain_reliability/baked_in_configs and 8encodes their contents as an array of C strings that gets compiled in to Chrome 9and loaded at runtime.""" 10 11 12import json 13import os 14import sys 15 16 17# A whitelist of domains that the script will accept when baking configs in to 18# Chrome, to ensure incorrect ones are not added accidentally. Subdomains of 19# whitelist entries are also allowed (e.g. maps.google.com, ssl.gstatic.com). 20DOMAIN_WHITELIST = ('google.com', 'gstatic.com', 'youtube.com') 21 22 23CC_HEADER = """// Copyright (C) 2014 The Chromium Authors. All rights reserved. 24// Use of this source code is governed by a BSD-style license that can be 25// found in the LICENSE file. 26 27// AUTOGENERATED FILE. DO NOT EDIT. 28// 29// (Update configs in components/domain_reliability/baked_in_configs and list 30// configs in components/domain_reliability.gypi instead.) 31 32#include "components/domain_reliability/baked_in_configs.h" 33 34#include <stdlib.h> 35 36namespace domain_reliability { 37 38const char* const kBakedInJsonConfigs[] = { 39""" 40 41 42CC_FOOTER = """ NULL 43}; 44 45} // namespace domain_reliability 46""" 47 48 49def domain_is_whitelisted(domain): 50 return any(domain == e or domain.endswith('.' + e) for e in DOMAIN_WHITELIST) 51 52 53def quote_and_wrap_text(text, width=79, prefix=' "', suffix='"'): 54 max_length = width - len(prefix) - len(suffix) 55 output = prefix 56 line_length = 0 57 for c in text: 58 if c == "\"": 59 c = "\\\"" 60 elif c == "\n": 61 c = "\\n" 62 elif c == "\\": 63 c = "\\\\" 64 if line_length + len(c) > max_length: 65 output += suffix + "\n" + prefix 66 line_length = 0 67 output += c 68 line_length += len(c) 69 output += suffix 70 return output 71 72 73def main(): 74 if len(sys.argv) < 3: 75 print >> sys.stderr, ('Usage: %s <JSON files...> <output C++ file>' % 76 sys.argv[0]) 77 print >> sys.stderr, sys.modules[__name__].__doc__ 78 return 1 79 80 cpp_code = CC_HEADER 81 for json_file in sys.argv[1:-1]: 82 with open(json_file, 'r') as f: 83 json_text = f.read() 84 config = json.loads(json_text) 85 if 'monitored_domain' not in config: 86 print >> sys.stderr ('%s: no monitored_domain found' % json_file) 87 return 1 88 domain = config['monitored_domain'] 89 if not domain_is_whitelisted(domain): 90 print >> sys.stderr ('%s: monitored_domain "%s" not in whitelist' % 91 (json_file, domain)) 92 return 1 93 cpp_code += " // " + json_file + ":\n" 94 cpp_code += quote_and_wrap_text(json_text) + ",\n" 95 cpp_code += "\n" 96 cpp_code += CC_FOOTER 97 98 with open(sys.argv[-1], 'wb') as f: 99 f.write(cpp_code) 100 101 return 0 102 103 104if __name__ == '__main__': 105 sys.exit(main()) 106