blob: 5cc784c7356fbc15f4dba6813240a0f6abe786ef [file] [log] [blame]
#!/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 = ('google.com', 'gstatic.com', 'youtube.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
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)
return 1
domain = config['monitored_domain']
if not domain_is_whitelisted(domain):
print >> sys.stderr ('%s: monitored_domain "%s" not in whitelist' %
(json_file, domain))
return 1
cpp_code += " // " + json_file + ":\n"
cpp_code += quote_and_wrap_text(json_text) + ",\n"
cpp_code += "\n"
cpp_code += CC_FOOTER
with open(sys.argv[-1], 'wb') as f:
f.write(cpp_code)
return 0
if __name__ == '__main__':
sys.exit(main())