| Index: create_standalone_js.py
|
| diff --git a/create_standalone_js.py b/create_standalone_js.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ea49e2177d2f37fe51e3a9ef94abd751786bca04
|
| --- /dev/null
|
| +++ b/create_standalone_js.py
|
| @@ -0,0 +1,95 @@
|
| +# 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.
|
| +
|
| +"""Converts gwt-compiled javascript to standalone javascript
|
| +
|
| +gwt-compiled javascript is in the form of an js file that is expected to be
|
| +loaded into its own script tag. This reads such a compiled file and converts it
|
| +to standalone javascript that can be loaded as Chrome does.
|
| +"""
|
| +
|
| +# TODO(cjhopman): The proper way to do this is to write a gwt Linker
|
| +# (gwt.core.ext.Linker) and use that for compilation. See
|
| +# http://crbug.com/437113
|
| +
|
| +import glob
|
| +import optparse
|
| +import os
|
| +import re
|
| +import shutil
|
| +import sys
|
| +
|
| +def ExtractJavascript(content, module):
|
| + """ Extracts javascript from within <script> tags in content. """
|
| + lines = content.split('\n');
|
| + # The generated javascript looks something like:
|
| + #
|
| + # function domdistiller() {
|
| + # ...
|
| + # }
|
| + # domdistiller();<useful code here>
|
| + # <more useful code>
|
| + # <last useful code>;if (domdistiller) domdistiller.onScriptLoad(gwtOnLoad);
|
| + #
|
| + # And so we extract the useful parts and append the correct gwtOnLoad call.
|
| + marker = module + '();'
|
| + for i, l in enumerate(lines):
|
| + if l.startswith(marker):
|
| + return '\n'.join(
|
| + [l[len(marker):]] +
|
| + lines[i + 1:-1] +
|
| + [lines[-1].replace(
|
| + 'if ({0}) {0}.onScriptLoad(gwtOnLoad);'.format(module),
|
| + 'gwtOnLoad(undefined, "{0}", "", 0);'.format(module))
|
| + ])
|
| + raise Exception('Failed to find marker line')
|
| +
|
| +def main(argv):
|
| + parser = optparse.OptionParser()
|
| + parser.add_option('-i', '--infile')
|
| + parser.add_option('-o', '--outfile')
|
| + parser.add_option('--module', help='Name of generated javascript module.')
|
| + parser.add_option('--auto', action='store_true',
|
| + help='Calculate input/output paths based on module name.')
|
| + parser.add_option('--sourcemaps', action='store_true',
|
| + help='Also copy sourcemaps.')
|
| + options, _ = parser.parse_args(argv)
|
| +
|
| + inpath = options.infile
|
| + outpath = options.outfile
|
| + if options.auto:
|
| + inpath = 'war/{0}/{0}.nocache.js'.format(options.module)
|
| + outpath = 'out/{0}.js'.format(options.module)
|
| +
|
| + if inpath:
|
| + infile = open(inpath, 'r')
|
| + else:
|
| + print 'Reading input from stdin'
|
| + infile = sys.stdin
|
| +
|
| + if outpath:
|
| + outfile = open(outpath, 'w')
|
| + else:
|
| + outfile = sys.stdout
|
| +
|
| + compiledJs = infile.read()
|
| + # The compiled js expects to be running in its own iframe. This won't be the
|
| + # case for the standalone js.
|
| + compiledJs = compiledJs.replace('var $wnd = parent', 'var $wnd = window')
|
| + outfile.write(ExtractJavascript(compiledJs, options.module))
|
| + if options.sourcemaps:
|
| + sourcemap = 'debug/{0}/src/{0}.sourcemap'.format(options.module)
|
| + outfile.write('\n')
|
| + outfile.write('//@ sourceMappingURL=%s' % sourcemap)
|
| +
|
| + insourcemap = glob.glob(
|
| + 'war/WEB-INF/deploy/%s/symbolMaps/*sourceMap*' % options.module)[0]
|
| + outsourcemap = 'out/%s' % sourcemap
|
| + shutil.copy(insourcemap, outsourcemap)
|
| +
|
| + return 0
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + sys.exit(main(sys.argv))
|
|
|