158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#!/usr/bin/env python
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# found in the LICENSE file.
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import os
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import subprocess
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import sys
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import tempfile
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)from string import Template
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)_TEMPLATE = """<!DOCTYPE html>
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)<meta charset="utf-8">
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)<link rel="stylesheet" href="../visualizer/static/index.css">
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)<link rel="stylesheet"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  href="../visualizer/static/third_party/jqTree/jqtree.css">
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)<script src="../../../third_party/flot/jquery.min.js"></script>
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)<script src="../../../third_party/flot/jquery.flot.min.js"></script>
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)<script src="../../../third_party/flot/jquery.flot.stack.min.js"></script>
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)<script src="../visualizer/static/third_party/jqTree/tree.jquery.js"></script>
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)<script src="../visualizer/static/utility.js"></script>
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)<script src="../visualizer/static/profiler.js"></script>
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)<script src="../visualizer/static/graph-view.js"></script>
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)<script src="../visualizer/static/dropdown-view.js"></script>
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)<script src="../visualizer/static/menu-view.js"></script>
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)<script type="text/javascript">
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  $(function() {
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  var data = $DATA;
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  var profiler = new Profiler(data);
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  var graphView = new GraphView(profiler);
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  var dropdownView = new DropdownView(profiler);
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  var menuView = new MenuView(profiler);
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  profiler.reparse();
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)});
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)</script>
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)<body>
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  <h2>Deep Memory Profiler Visualizer</h2>
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  <div id="graph-div"></div>
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  <div id="info-div">
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    <div id="category-menu"></div>
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    <div id="subs-dropdown"></div>
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  </div>
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)</body>
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)"""
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)def main(argv):
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  # Read json data.
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  with open(argv[1]) as data_file:
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    data = data_file.read()
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  # Fill in the template of index.js.
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  dmprof_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  html_dir = os.path.join(dmprof_path, 'graphs')
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if not os.path.exists(html_dir):
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    os.mkdir(html_dir)
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  html_handle, html_path = tempfile.mkstemp('.html', 'graph', html_dir)
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  html_file = os.fdopen(html_handle, 'w')
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  html_file.write(Template(_TEMPLATE).safe_substitute({ 'DATA': data }))
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  html_file.close()
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  # Open index page in chrome automatically if permitted.
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if sys.platform.startswith('linux'):
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    try:
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      subprocess.call(['xdg-open', html_path])
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    except OSError, exception:
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      print >> sys.stderr, 'xdg-open failed:', exception
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      print 'generated html file is at ' + html_path
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  else:
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    print 'generated html file is at ' + html_path
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)if __name__ == '__main__':
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  sys.exit(main(sys.argv))
81