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