<!DOCTYPE html>
<!-- Copyright 2012 the V8 project authors. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of Google Inc. nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->

<html lang="en">
<head>
  <meta charset="utf-8"/>
  <title>V8 Tick Processor</title>

  <style type="text/css">
    body {
      font-family: Verdana, Arial, Helvetica, sans-serif;
      font-size: 10pt;
    }
    h4 {
      margin-bottom: 0px;
    }
    p {
      margin-top: 0px;
    }
  </style>

  <script src="splaytree.js"></script>
  <script src="codemap.js"></script>
  <script src="csvparser.js"></script>
  <script src="consarray.js"></script>
  <script src="profile.js"></script>
  <script src="profile_view.js"></script>
  <script src="logreader.js"></script>
  <script src="arguments.js"></script>
  <script src="tickprocessor.js"></script>

  <script type="text/javascript">

var v8log_content;
var textout;

function load_logfile(evt) {
  textout.value = "";
  var f = evt.target.files[0];
  if (f) {
    var reader = new FileReader();
    reader.onload = function(event) {
      v8log_content = event.target.result;
      start_process();
    };
    reader.onerror = function(event) {
      console.error("File could not be read! Code " + event.target.error.code);
    };
    reader.readAsText(f);
  } else {
    alert("Failed to load file");
  }
}

function print(arg) {
  textout.value+=arg+"\n";
}

function start_process() {
  let DEFAULTS = {
    logFileName: 'v8.log',
    platform: 'unix',
    stateFilter: null,
    callGraphSize: 5,
    ignoreUnknown: false,
    separateIc: true,
    targetRootFS: '',
    nm: 'nm'
  };

  var entriesProviders = {
    'unix': UnixCppEntriesProvider,
    'windows': WindowsCppEntriesProvider,
    'mac': MacCppEntriesProvider
  };

  var tickProcessor = new TickProcessor(
    new (entriesProviders[DEFAULTS.platform])(
        DEFAULTS.nm, DEFAULTS.targetRootFS),
    DEFAULTS.separateIc, DEFAULTS.callGraphSize,
    DEFAULTS.ignoreUnknown, DEFAULTS.stateFilter);

  tickProcessor.processLogChunk(v8log_content);
  tickProcessor.printStatistics();
}

function Load() {
  document.getElementById('fileinput').addEventListener(
      'change', load_logfile, false);
  textout = document.getElementById('textout');
}
</script>
</head>
<body onLoad="Load()">

<h3 style="margin-top: 2px;">
  Chrome V8 profiling log processor
</h3>
<p>
Process V8's profiling information log (sampling profiler tick information)
in your browser. Particularly useful if you don't have the V8 shell (d8)
at hand on your system. You still have to run Chrome with the appropriate
<a href="https://code.google.com/p/v8/wiki/ProfilingChromiumWithV8">
  command line flags</a>
to produce the profiling log.
</p>
<h4>Usage:</h4>
<p>
Click on the button and browse to the profiling log file (usually, v8.log).
Process will start automatically and the output will be visible in the below
text area.
</p>
<h4>Limitations and disclaimer:</h4>
<p>
This page offers a subset of the functionalities of the command-line tick
processor utility in the V8 repository. In particular, this page cannot
access the command-line utility that provides library symbol information,
hence the [C++] section of the output stays empty. Also consider that this
web-based tool is provided only for convenience and quick reference, you
should refer to the
<a href="https://code.google.com/p/v8/wiki/V8Profiler">
  command-line</a>
version for full output.
</p>
<p>
<input type="file" id="fileinput" />
</p>
<p>
<textarea name="myTextArea" cols="120" rows="40" wrap="off" id="textout"
          readonly="yes"></textarea>
</p>
<p style="font-style:italic;">
Copyright the V8 Authors - Last change to this page: 12/12/2012
</p>


</body>
</html>
