<!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>
    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>

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>
