• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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