1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch# Copyright 2014 The Chromium Authors. All rights reserved.
2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch# found in the LICENSE file.
4197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
5197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch"""Convert PrivateScript's sources to C++ constant strings.
6197021e6b966cfb06891637935ef33fff06433d1Ben MurdochFIXME: We don't want to add more build scripts. Rewrite this script in grit. crbug.com/388121
7197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
8197021e6b966cfb06891637935ef33fff06433d1Ben MurdochUsage:
9197021e6b966cfb06891637935ef33fff06433d1Ben Murdochpython make_private_script_source.py DESTINATION_FILE SOURCE_FILES
10197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch"""
11197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciimport optparse
13197021e6b966cfb06891637935ef33fff06433d1Ben Murdochimport os
14e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)import re
15197021e6b966cfb06891637935ef33fff06433d1Ben Murdochimport sys
16197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
17197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
18e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)# We assume that X.js has a corresponding X.idl in the same directory.
19e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)# If X is a partial interface, this method extracts the base name of the partial interface from X.idl.
20e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)# Otherwise, this method returns None.
21e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)def extract_partial_interface_name(filename):
22e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    basename, ext = os.path.splitext(filename)
23e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    assert ext == '.js'
24e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    # PrivateScriptRunner.js is a special JS script to control private scripts,
25e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    # and doesn't have a corresponding IDL file.
26e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if os.path.basename(basename) == 'PrivateScriptRunner':
27e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return None
28e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    idl_filename = basename + '.idl'
29e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    with open(idl_filename) as f:
30e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        contents = f.read()
31e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        match = re.search(r'partial\s+interface\s+(\w+)\s*{', contents)
32e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return match and match.group(1)
33e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
34e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdochdef main():
367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    parser = optparse.OptionParser()
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    parser.add_option('--for-testing', action="store_true", default=False)
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    options, args = parser.parse_args()
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    output_filename = args[0]
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    input_filenames = args[1:]
42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    source_name, ext = os.path.splitext(os.path.basename(output_filename))
43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    contents = []
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    contents.append('#ifndef %s_h\n' % source_name)
467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    contents.append('#define %s_h\n' % source_name)
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if options.for_testing:
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        for input_filename in input_filenames:
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            class_name, ext = os.path.splitext(os.path.basename(input_filename))
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            with open(input_filename) as input_file:
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                input_text = input_file.read()
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                hex_values = ['0x{0:02x}'.format(ord(char)) for char in input_text]
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                contents.append('const char kSourceOf%s[] = {\n    %s\n};\n\n' % (
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    class_name, ', '.join(hex_values)))
55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    contents.append('struct %s {' % source_name)
56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    contents.append("""
57e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    const char* scriptClassName;
58e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    const char* className;
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    """)
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if options.for_testing:
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        contents.append("""
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        const char* source;
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        size_t size;""")
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    else:
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        contents.append('const char* resourceFile;')
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    contents.append("""
67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch};
68197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch""")
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    contents.append('struct %s k%s[] = {\n' % (source_name, source_name))
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for input_filename in input_filenames:
73e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        script_class_name, ext = os.path.splitext(os.path.basename(input_filename))
74e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        class_name = extract_partial_interface_name(input_filename) or script_class_name
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if options.for_testing:
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            contents.append('    { "%s", "%s", kSourceOf%s, sizeof(kSourceOf%s) },\n' % (script_class_name, class_name, script_class_name, script_class_name))
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        else:
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            contents.append('    { "%s", "%s", "%s.js" },\n' % (script_class_name, class_name, script_class_name))
79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    contents.append('};\n')
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    contents.append('#endif // %s_h\n' % source_name)
81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    with open(output_filename, 'w') as output_file:
82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        output_file.write("".join(contents))
83197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdochif __name__ == '__main__':
86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    sys.exit(main())
87