#!/usr/bin/env python # Copyright 2015 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. """Embeds standalone JavaScript snippets in C++ code. The script requires the devtools/front_end/toolbox/OverridesUI.js file from WebKit that lists the preset network conditions to be passed in as the only argument. The list of network conditions will be written to a C-style string to be parsed with JSONReader. """ import optparse import re import subprocess import sys import cpp_source UNLIMITED_THROUGHPUT = ('WebInspector.OverridesSupport' '.NetworkThroughputUnlimitedValue') def quotizeKeys(s, keys): """Returns the string s with each instance of each key wrapped in quotes. Args: s: a string containing keys that need to be wrapped in quotes. keys: an iterable of keys to be wrapped in quotes in the string. """ for key in keys: s = re.sub('%s: ' % key, '"%s": ' % key, s) return s def evaluateMultiplications(s): """Returns the string s with each bare multiplication evaluated. Since the source is JavaScript, which includes bare arithmetic, and the output must be JSON format, we must evaluate all expressions. Args: s: a string containing bare multiplications that need to be evaluated. """ def evaluateBinaryMultiplication(match): return str(float(match.group(1)) * float(match.group(2))) return re.sub('([0-9\.]+) \* ([0-9\.]+)', evaluateBinaryMultiplication, s) def main(): parser = optparse.OptionParser() parser.add_option( '', '--directory', type='string', default='.', help='Path to directory where the cc/h files should be created') options, args = parser.parse_args() networks = '[' file_name = args[0] inside_list = False with open(file_name, 'r') as f: for line in f: if not inside_list: if 'WebInspector.OverridesUI._networkConditionsPresets = [' in line: inside_list = True else: if line.strip() == '];': inside_list = False continue line = line.replace(UNLIMITED_THROUGHPUT, "-1") networks += line.strip() output_dir = 'chrome/test/chromedriver/chrome' networks += ']' networks = quotizeKeys(networks, ['id', 'title', 'throughput', 'latency']) networks = evaluateMultiplications(networks) cpp_source.WriteSource('network_list', output_dir, options.directory, {'kNetworks': networks}) clang_format = ['clang-format', '-i'] subprocess.Popen(clang_format + ['%s/network_list.cc' % output_dir]) subprocess.Popen(clang_format + ['%s/network_list.h' % output_dir]) if __name__ == '__main__': sys.exit(main())