<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="/components/webcomponentsjs/webcomponents.js"></script>
<link rel="import" href="/components/polymer/polymer.html">
<link rel="import" href="/tracing/base/timing.html">
<link rel="import" href="/tracing/base/xhr.html">
<link rel="import" href="/tracing/importer/import.html">
<link rel="import" href="/tracing/ui/extras/full_config.html">
<link rel="import" href="/tracing/ui/timeline_view.html">
<style>
html,
body {
height: 100%;
}
body {
-webkit-flex-direction: column;
display: -webkit-flex;
margin: 0;
padding: 0;
}
body > tr-ui-timeline-view {
-webkit-flex: 1 1 auto;
min-height: 0;
}
body > tr-ui-timeline-view:focus {
outline: none;
}
</style>
</head>
<body>
<tr-ui-timeline-view>
<track-view-container id='track_view_container'></track-view-container>
</tr-ui-timeline-view>
<script>
'use strict';
var Timing = tr.b.Timing;
var timelineViewEl;
var selectEl;
function loadTraces(filenames, onTracesLoaded) {
var loadTracesMakedTimer = Timing.mark('TraceImport', 'loadTraces');
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) {
loadTracesMakedTimer.end();
onTracesLoaded(filenames, traces);
}
});
});
}
function getAsync(url, cb) {
return tr.b.getAsync(url).then(cb);
}
function createViewFromTraces(filenames, traces) {
var createViewFromTracesTimer = Timing.mark(
'TraceImport', 'createViewFromTraces');
var m = new tr.Model();
var trackDetailedModelStatsEl =
tr.b.findDeepElementMatching(document.body,
'#track-detailed-model-stats');
var importOptions = new tr.importer.ImportOptions();
importOptions.trackDetailedModelStats = trackDetailedModelStatsEl.checked;
var i = new tr.importer.Import(m, importOptions);
var p = i.importTracesWithProgressDialog(traces);
p.then(
function() {
timelineViewEl.model = m;
timelineViewEl.updateDocumentFavicon();
timelineViewEl.globalMode = true;
timelineViewEl.viewTitle = '';
createViewFromTracesTimer.end();
},
function(err) {
var overlay = new tr.ui.b.Overlay();
overlay.textContent = tr.b.normalizeException(err).message;
overlay.title = 'Import error';
overlay.visible = true;
createViewFromTracesTimer.end();
});
}
function onSelectionChange() {
window.location.hash = '#' + selectEl[selectEl.selectedIndex].value;
}
function onHashChange() {
var file = window.location.hash.substr(1);
if (selectEl[selectEl.selectedIndex].value != file) {
for (var i = 0; i < selectEl.children.length; i++) {
if (selectEl.children[i].value === file) {
selectEl.selectedIndex = i;
break;
}
}
}
reload();
}
function cleanFilename(file) {
var m = /\/tracing\/test_data\/(.+)/.exec(file);
var rest = m[1];
function upcase(letter) {
return ' ' + letter.toUpperCase();
}
return rest.replace(/_/g, ' ')
.replace(/\.[^\.]*$/, '')
.replace(/ ([a-z])/g, upcase)
.replace(/^[a-z]/, upcase);
}
function reload() {
loadTraces([window.location.hash.substr(1)], createViewFromTraces);
}
window.addEventListener('hashchange', onHashChange);
function onLoad() {
var onLoadTimer = Timing.mark('TraceImport', 'onLoad');
timelineViewEl = document.querySelector('tr-ui-timeline-view');
timelineViewEl.globalMode = true;
selectEl = document.createElement('select');
timelineViewEl.leftControls.appendChild(selectEl);
getAsync('/tracing/test_data/__file_list__', function(data) {
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]);
selectEl.appendChild(opt);
}
selectEl.selectedIndex = 0;
selectEl.onchange = onSelectionChange;
if (!window.location.hash) {
// This will trigger an onHashChange so no need to reload directly.
window.location.hash = '#' + selectEl[selectEl.selectedIndex].value;
} else {
onHashChange();
}
}).then(onLoadTimer.end.call(this));
var trackDetailedModelStatsEl = tr.ui.b.createCheckBox(
this, 'trackDetailedModelStats',
'traceViewer.trackDetailedModelStats', false,
'Detailed file size stats',
onHashChange);
trackDetailedModelStatsEl.id = 'track-detailed-model-stats';
timelineViewEl.leftControls.appendChild(trackDetailedModelStatsEl);
}
window.addEventListener('load', onLoad);
</script>
</body>
</html>