4 Copyright (c) 2011 The Chromium Authors. All rights reserved.
5 Use of this source code is governed by a BSD-style license that can be
6 found in the LICENSE file.
9 <title>Simple Embedded Viewer</title>
10 <script src="/base/__init__.js"></script>
17 display: -webkit-flex;
18 -webkit-flex-direction: column;
21 -webkit-flex: 1 1 auto;
34 <select id="trace_file">
41 base.require('tracing.timeline_view');
42 base.require('tracing.importer');
44 base.require('tcmalloc');
45 base.require('system_stats');
53 function loadTraces(filenames, onTracesLoaded) {
55 for (var i = 0; i < filenames.length; i++) {
56 traces.push(undefined);
58 var numTracesPending = filenames.length;
60 filenames.forEach(function(filename, i) {
61 getAsync(filename, function(trace) {
64 if (numTracesPending == 0)
65 onTracesLoaded(filenames, traces);
70 function getAsync(url, cb) {
71 var req = new XMLHttpRequest();
72 var is_binary = /[.]gz$/.test(url) || /[.]zip$/.test(url);
73 req.overrideMimeType('text/plain; charset=x-user-defined');
74 req.open('GET', url, true);
76 req.responseType = 'arraybuffer';
77 req.onreadystatechange = function(aEvt) {
78 if (req.readyState == 4) {
79 window.setTimeout(function() {
80 if (req.status == 200) {
81 cb(is_binary ? req.response : req.responseText);
83 console.log('Failed to load ' + url);
91 function createViewFromTraces(filenames, traces) {
92 var m = new tracing.TraceModel();
93 var p = m.importTracesWithProgressDialog(traces, true);
96 timelineViewEl.model = m;
97 timelineViewEl.tabIndex = 1;
98 if (timelineViewEl.timeline)
99 timelineViewEl.timeline.focusElement = timelineViewEl;
100 timelineViewEl.viewTitle = filenames;
103 var overlay = new base.ui.Overlay();
104 overlay.textContent = base.normalizeException(err).message;
105 overlay.title = 'Import error';
106 overlay.visible = true;
110 function onSelectionChange() {
111 var select = document.querySelector('#trace_file');
112 window.location.hash = '#' + select[select.selectedIndex].value;
115 function onHashChange() {
116 var file = window.location.hash.substr(1);
117 var select = document.querySelector('#trace_file');
118 if (select[select.selectedIndex].value != file) {
119 for (var i = 0; i < select.children.length; i++) {
120 if (select.children[i].value == file) {
121 select.selectedIndex = i;
129 function cleanFilename(file) {
130 function upcase(letter) {
131 return ' ' + letter.toUpperCase();
134 return file.replace(/_/g, ' ')
135 .replace(/\.[^\.]*$/, '')
136 .replace(/ ([a-z])/g, upcase)
137 .replace(/^[a-z]/, upcase);
141 var file = window.location.hash.substr(1);
142 var filenames = ['../test_data/' + file];
143 loadTraces(filenames, createViewFromTraces);
146 window.addEventListener('hashchange', onHashChange);
149 timelineViewEl = document.querySelector('x-timeline-view');
150 base.ui.decorate(timelineViewEl, tracing.TimelineView);
152 getAsync('/json/examples', function(data) {
153 var select = document.querySelector('#trace_file');
154 var files = JSON.parse(data);
156 for (var i = 0; i < files.length; ++i) {
157 var opt = document.createElement('option');
158 opt.value = files[i];
159 opt.textContent = cleanFilename(files[i]);
160 select.appendChild(opt);
162 select.selectedIndex = 0;
163 select.onchange = onSelectionChange;
165 if (!window.location.hash) {
166 // This will trigger an onHashChange so no need to reload directly.
167 window.location.hash = '#' + select[select.selectedIndex].value;
173 window.addEventListener('load', onLoad);