Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / devtools / scripts / concatenate_application_code.py
1 #!/usr/bin/env python
2 #
3 # Copyright 2014 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6
7 """
8 Concatenates autostart modules, application modules' module.json descriptors,
9 and the application loader into a single script.
10 Also concatenates all workers' dependencies into individual worker loader scripts.
11 """
12
13 from cStringIO import StringIO
14 from os import path
15 from modular_build import read_file, write_file, bail_error
16 import modular_build
17 import os
18 import sys
19
20 try:
21     import simplejson as json
22 except ImportError:
23     import json
24
25 rjsmin_path = os.path.abspath(os.path.join(
26     os.path.dirname(__file__),
27     "..",
28     "..",
29     "build",
30     "scripts"))
31 sys.path.append(rjsmin_path)
32 import rjsmin
33
34
35 def minify_if_needed(javascript, minify):
36     return rjsmin.jsmin(javascript) if minify else javascript
37
38
39 def concatenate_autostart_modules(descriptors, application_dir, output_dir, output):
40     non_autostart = set()
41     sorted_module_names = descriptors.sorted_modules()
42     for name in sorted_module_names:
43         desc = descriptors.modules[name]
44         name = desc['name']
45         type = descriptors.application[name].get('type')
46         if type == 'autostart':
47             deps = set(desc.get('dependencies', []))
48             non_autostart_deps = deps & non_autostart
49             if len(non_autostart_deps):
50                 bail_error('Non-autostart dependencies specified for the autostarted module "%s": %s' % (name, non_autostart_deps))
51             output.write('\n/* Module %s */\n' % name)
52             modular_build.concatenate_scripts(desc.get('scripts'), path.join(application_dir, name), output_dir, output)
53         elif type != 'worker':
54             non_autostart.add(name)
55
56
57 def concatenate_application_script(application_name, descriptors, application_dir, output_dir, minify):
58     application_loader_name = application_name + '.js'
59     output = StringIO()
60     output.write('/* Runtime.js */\n')
61     output.write(read_file(path.join(application_dir, 'Runtime.js')))
62     output.write('\n/* Autostart modules */\n')
63     concatenate_autostart_modules(descriptors, application_dir, output_dir, output)
64     output.write('/* Application descriptor %s */\n' % (application_name + '.json'))
65     output.write('applicationDescriptor = ')
66     output.write(descriptors.application_json)
67     output.write(';\n/* Module descriptors */\n')
68     output.write('allDescriptors = ')
69     output.write(json.dumps(descriptors.modules.values()))
70     output.write(';\n/* Application loader */\n')
71     output.write(read_file(path.join(application_dir, application_loader_name)))
72
73     write_file(path.join(output_dir, application_loader_name), minify_if_needed(output.getvalue(), minify))
74     output.close()
75
76
77 def concatenate_worker(module_name, descriptors, application_dir, output_dir, minify):
78     descriptor = descriptors.modules[module_name]
79     scripts = descriptor.get('scripts')
80     if not scripts:
81         return
82     worker_dir = path.join(application_dir, module_name)
83     output_file_path = path.join(output_dir, module_name, module_name + '.js')
84
85     output = StringIO()
86     output.write('/* Worker %s */\n' % module_name)
87     output.write('/* Runtime.js */\n')
88     output.write(read_file(path.join(application_dir, 'Runtime.js')))
89     dependencies = descriptors.sorted_dependencies_closure(module_name)
90     dep_descriptors = []
91     for dep_name in dependencies:
92         dep_descriptor = descriptors.modules[dep_name]
93         dep_descriptors.append(dep_descriptor)
94         scripts = dep_descriptor.get('scripts')
95         if scripts:
96             output.write('\n/* Module %s */\n' % dep_name)
97             modular_build.concatenate_scripts(scripts, path.join(application_dir, dep_name), output_dir, output)
98
99     output.write('\n/* Initialize worker */\n')
100     # Tell Runtime we are in the compiled mode.
101     output.write('allDescriptors = ')
102     output.write(json.dumps(dep_descriptors))
103     output.write(';\nRuntime.initializeWorker("%s");' % module_name)
104
105     write_file(output_file_path, minify_if_needed(output.getvalue(), minify))
106     output.close()
107
108
109 def build_application(application_name, loader, application_dir, output_dir, minify):
110     descriptors = loader.load_application(application_name + '.json')
111     concatenate_application_script(application_name, descriptors, application_dir, output_dir, minify)
112     for module in filter(lambda desc: desc.get('type') == 'worker', descriptors.application.values()):
113         concatenate_worker(module['name'], descriptors, application_dir, output_dir, minify)