Html程序  |  157行  |  3.81 KB

<!DOCTYPE HTML>
<html>
<!--
Copyright (c) 2011 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<head>
<title>Simple Embedded Viewer</title>
<script src="/src/base.js"></script>
<style>
  .view {
    overflow: hidden;
    position: absolute;
    top: 40px;
    bottom: 0;
    left: 0;
    right: 0;
  }

</style>
</head>
<body>
  <div class="header">
  <select id="trace_file">
  </select>
  </div>

  <div class="main">
    <div class="view">
    </div>
  </div>

  <script>
  base.require('tracing.timeline_view');
  base.require('tracing.importer');
  base.require('cc');
  base.require('tcmalloc');
  </script>
  <script>
  'use strict';

  var timelineViewEl;

  function loadTraces(filenames, onTracesLoaded) {
    var traces = [];
    for (var i = 0; i < filenames.length; i++) {
      traces.push(undefined);
    }
    var numTracesPending = filenames.length;

    filenames.forEach(function(filename, i) {
      getAsync(filename, function(trace) {
        traces[i] = trace;
        numTracesPending--;
        if (numTracesPending == 0)
          onTracesLoaded(filenames, traces);
      });
    });
  }

  function getAsync(url, cb) {
    var req = new XMLHttpRequest();
    req.open('GET', url, true);
    req.onreadystatechange = function(aEvt) {
      if (req.readyState == 4) {
        window.setTimeout(function() {
          if (req.status == 200) {
            cb(req.responseText);
          } else {
            console.log('Failed to load ' + url);
          }
        }, 0);
      }
    };
    req.send(null);
  }

  function createViewFromTraces(filenames, traces) {
    var m = new tracing.TraceModel();
    m.importTraces(traces, true);

    timelineViewEl.model = m;
    timelineViewEl.tabIndex = 1;
    if (timelineViewEl.timeline)
      timelineViewEl.timeline.focusElement = timelineViewEl;
    timelineViewEl.viewTitle = filenames;
  }

  function onSelectionChange() {
    var select = document.querySelector('#trace_file');
    window.location.hash = '#' + select[select.selectedIndex].value;
  }

  function onHashChange() {
    var file = window.location.hash.substr(1);
    var select = document.querySelector('#trace_file');
    if (select[select.selectedIndex].value != file) {
      for (var i = 0; i < select.children.length; i++) {
        if (select.children[i].value == file) {
          select.selectedIndex = i;
          break;
        }
      }
    }
    reload();
  }

  function cleanFilename(file) {
    function upcase(letter) {
      return ' ' + letter.toUpperCase();
    }

    return file.replace(/_/g, ' ')
               .replace(/\.[^\.]*$/, '')
               .replace(/ ([a-z])/g, upcase)
               .replace(/^[a-z]/, upcase);
  }

  function reload() {
    var file = window.location.hash.substr(1);
    var filenames = ['../test_data/' + file];
    loadTraces(filenames, createViewFromTraces);
  }

  window.addEventListener('hashchange', onHashChange);

  function onLoad() {
    timelineViewEl = document.querySelector('.view');
    ui.decorate(timelineViewEl, tracing.TimelineView);

    getAsync('/json/examples', function(data) {
      var select = document.querySelector('#trace_file');
      var files = JSON.parse(data);

      for (var i = 0; i < files.length; ++i) {
        var opt = document.createElement('option');
        opt.value = files[i];
        opt.textContent = cleanFilename(files[i]);
        select.appendChild(opt);
      }
      select.selectedIndex = 0;
      select.onchange = onSelectionChange;

      if (!window.location.hash) {
        // This will trigger an onHashChange so no need to reload directly.
        window.location.hash = '#' + select[select.selectedIndex].value;
      } else {
        onHashChange();
      }
    });
  }
  window.addEventListener('load', onLoad);
  </script>
</body>
</html>