1b122baf563564a1d478804fb882fcba242a9949eChris Craik# Copyright (c) 2014 The Chromium Authors. All rights reserved.
2b122baf563564a1d478804fb882fcba242a9949eChris Craik# Use of this source code is governed by a BSD-style license that can be
3b122baf563564a1d478804fb882fcba242a9949eChris Craik# found in the LICENSE file.
4b122baf563564a1d478804fb882fcba242a9949eChris Craik
5b122baf563564a1d478804fb882fcba242a9949eChris Craikimport codecs
68d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport argparse
7b122baf563564a1d478804fb882fcba242a9949eChris Craikimport os
8b122baf563564a1d478804fb882fcba242a9949eChris Craikimport sys
9b122baf563564a1d478804fb882fcba242a9949eChris Craik
104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairimport tracing_project
118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom py_vulcanize import generate
12b122baf563564a1d478804fb882fcba242a9949eChris Craik
13b122baf563564a1d478804fb882fcba242a9949eChris Craik
144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclairdef Main(argv):
15b122baf563564a1d478804fb882fcba242a9949eChris Craik
168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi  parser = argparse.ArgumentParser(
178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi      usage='%(prog)s <options>',
188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi      epilog=('Produces a standalone HTML import that contains the\n'
198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi              'trace viewer.'))
20b122baf563564a1d478804fb882fcba242a9949eChris Craik
21ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  project = tracing_project.TracingProject()
22b122baf563564a1d478804fb882fcba242a9949eChris Craik  project.AddConfigNameOptionToParser(parser)
23b122baf563564a1d478804fb882fcba242a9949eChris Craik
248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi  parser.add_argument('--no-min', default=False, action='store_true',
258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi                      help='skip minification')
268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi  parser.add_argument('--report-sizes', default=False, action='store_true',
278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi                      help='Explain what makes tracing big.')
288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi  parser.add_argument('--report-deps', default=False, action='store_true',
298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi                      help='Print a dot-formatted deps graph.')
308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi  parser.add_argument('--output',
318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi                      help='Where to put the generated result. If not given, '
328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi                           '$TRACING/tracing/bin/trace_viewer.html is used.')
338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi
348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi  args = parser.parse_args(argv[1:])
35b122baf563564a1d478804fb882fcba242a9949eChris Craik
36ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  tracing_dir = os.path.relpath(
37ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      os.path.join(os.path.dirname(__file__), '..', '..'))
388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi  if args.output:
398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi    output_filename = args.output
40b122baf563564a1d478804fb882fcba242a9949eChris Craik  else:
41b122baf563564a1d478804fb882fcba242a9949eChris Craik    output_filename = os.path.join(
428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi        tracing_dir, 'tracing/bin/trace_viewer_%s.html' % args.config_name)
43b122baf563564a1d478804fb882fcba242a9949eChris Craik
44b122baf563564a1d478804fb882fcba242a9949eChris Craik  with codecs.open(output_filename, 'w', encoding='utf-8') as f:
45b122baf563564a1d478804fb882fcba242a9949eChris Craik    WriteTraceViewer(
46b122baf563564a1d478804fb882fcba242a9949eChris Craik        f,
478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi        config_name=args.config_name,
488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi        minify=not args.no_min,
498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi        report_sizes=args.report_sizes,
508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi        report_deps=args.report_deps)
51b122baf563564a1d478804fb882fcba242a9949eChris Craik
52b122baf563564a1d478804fb882fcba242a9949eChris Craik  return 0
53b122baf563564a1d478804fb882fcba242a9949eChris Craik
54b122baf563564a1d478804fb882fcba242a9949eChris Craik
55b122baf563564a1d478804fb882fcba242a9949eChris Craikdef WriteTraceViewer(output_file,
56b122baf563564a1d478804fb882fcba242a9949eChris Craik                     config_name=None,
57b122baf563564a1d478804fb882fcba242a9949eChris Craik                     minify=False,
58b122baf563564a1d478804fb882fcba242a9949eChris Craik                     report_sizes=False,
59b122baf563564a1d478804fb882fcba242a9949eChris Craik                     report_deps=False,
60b122baf563564a1d478804fb882fcba242a9949eChris Craik                     output_html_head_and_body=True,
61b122baf563564a1d478804fb882fcba242a9949eChris Craik                     extra_search_paths=None,
62b122baf563564a1d478804fb882fcba242a9949eChris Craik                     extra_module_names_to_load=None):
63ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  project = tracing_project.TracingProject()
64b122baf563564a1d478804fb882fcba242a9949eChris Craik  if extra_search_paths:
65b122baf563564a1d478804fb882fcba242a9949eChris Craik    for p in extra_search_paths:
66b122baf563564a1d478804fb882fcba242a9949eChris Craik      project.source_paths.append(p)
67ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  if config_name is None:
68b122baf563564a1d478804fb882fcba242a9949eChris Craik    config_name = project.GetDefaultConfigName()
69b122baf563564a1d478804fb882fcba242a9949eChris Craik
70ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  module_names = [project.GetModuleNameForConfigName(config_name)]
71b122baf563564a1d478804fb882fcba242a9949eChris Craik  if extra_module_names_to_load:
72b122baf563564a1d478804fb882fcba242a9949eChris Craik    module_names += extra_module_names_to_load
734a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair
744a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair  vulcanizer = project.CreateVulcanizer()
754a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair  load_sequence = vulcanizer.CalcLoadSequenceForModuleNames(
76ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      module_names)
77b122baf563564a1d478804fb882fcba242a9949eChris Craik
78b122baf563564a1d478804fb882fcba242a9949eChris Craik  if report_deps:
794a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair    sys.stdout.write(vulcanizer.GetDepsGraphFromModuleNames(module_names))
80b122baf563564a1d478804fb882fcba242a9949eChris Craik
81b122baf563564a1d478804fb882fcba242a9949eChris Craik  generate.GenerateStandaloneHTMLToFile(
82ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      output_file, load_sequence,
83ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      minify=minify, report_sizes=report_sizes,
84ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      output_html_head_and_body=output_html_head_and_body)
85