blob: 27f572c2ad5cf95b9fe788accdad21235919b70c [file] [log] [blame]
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
function onModelLoaded() {
viewer.globalMode = true;
viewer.model = model;
}
function clearTimeline() {
viewer.model = undefined;
}
function onImportFail() {
var overlay = new tr.ui.b.Overlay();
overlay.textContent = tr.b.normalizeException(err).message;
overlay.title = 'Import error';
overlay.visible = true;
console.log('import failed');
}
function updateTimeline(events) {
model = new tr.Model();
var importer = new tr.importer.Import(model);
var p = importer.importTracesWithProgressDialog([events]);
p.then(onModelLoaded, onImportFail);
}
function registerForMessages() {
window.addEventListener("message", onMessage, false);
}
function fetchUri(uri, onLoad, onError) {
var xhr = new XMLHttpRequest();
xhr.open('GET', uri, true);
xhr.responseType = 'text';
xhr.addEventListener("load", onLoad);
xhr.addEventListener("error", onError);
xhr.send();
console.log('GET ' + uri);
}
var traceObject;
var pendingRequests;
function gotReponse() {
pendingRequests--;
if (pendingRequests == 0) {
console.log("Got all timeline parts");
updateTimeline(traceObject);
}
}
function fetchTimelineOnLoad(event) {
var xhr = event.target;
var response = JSON.parse(xhr.responseText);
var result = response['result'];
var newStackFrames = result['stackFrames']; // Map.
var newTraceEvents = result['traceEvents']; // List.
// Merge in timeline events.
traceObject.traceEvents = traceObject.traceEvents.concat(newTraceEvents);
for (var key in newStackFrames) {
if (newStackFrames.hasOwnProperty(key)) {
traceObject.stackFrames[key] = newStackFrames[key];
}
}
gotReponse();
}
function fetchTimelineOnError(event) {
var xhr = event.target;
console.log(xhr.statusText);
gotReponse();
}
function fetchTimeline(vmAddress, isolateIds) {
// Reset combined timeline.
traceObject = {
'stackFrames': {},
'traceEvents': []
};
pendingRequests = 1 + isolateIds.length;
var parser = document.createElement('a');
parser.href = vmAddress;
var requestUri = 'http://' +
parser.hostname +
':' +
parser.port +
'/_getVMTimeline';
fetchUri(requestUri, fetchTimelineOnLoad, fetchTimelineOnError);
for (var i = 0; i < isolateIds.length; i++) {
var isolateId = isolateIds[i];
var requestUri = 'http://' +
parser.hostname +
':' +
parser.port +
'/_getCpuProfileTimeline?tags=VMUser&isolateId=' +
isolateId;
fetchUri(requestUri, fetchTimelineOnLoad, fetchTimelineOnError);
}
}
function onMessage(event) {
var request = JSON.parse(event.data);
var method = request['method'];
var params = request['params'];
switch (method) {
case 'refresh':
fetchTimeline(params['vmAddress'], params['isolateIds']);
break;
case 'clear':
clearTimeline();
break;
default:
console.log('Unknown method:' + method + '.');
}
}
document.addEventListener('DOMContentLoaded', function() {
var container = document.createElement('track-view-container');
container.id = 'track_view_container';
viewer = document.createElement('tr-ui-timeline-view');
viewer.track_view_container = container;
viewer.appendChild(container);
viewer.id = 'trace-viewer';
viewer.globalMode = true;
document.body.appendChild(viewer);
registerForMessages();
});
console.log('loaded');