blob: 7f38b01457cccdf578bb42d59b7ebd1a0669b768 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2013 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.
-->
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/model/event_set.html">
<link rel="import" href="/model/location.html">
<link rel="import" href="/model/model.html">
<link rel="import" href="/ui/timeline_track_view.html">
<link rel="import" href="/ui/timeline_viewport.html">
<link rel="import" href="/ui/tracks/drawing_container.html">
<link rel="import" href="/ui/tracks/slice_track.html">
<script>
'use strict';
tr.b.unittest.testSuite(function() {
var Location = tr.model.Location;
var Model = tr.Model;
test('memoization', function() {
var vp = new tr.ui.TimelineViewport(document.createElement('div'));
var slice = { guid: 1 };
vp.modelTrackContainer = {
addEventsToTrackMap: function(eventToTrackMap) {
eventToTrackMap.addEvent(slice, 'track');
},
addEventListener: function() {}
};
assert.isUndefined(vp.trackForEvent(slice));
vp.rebuildEventToTrackMap();
assert.equal(vp.trackForEvent(slice), 'track');
});
test('shiftedSelection', function() {
var model = new tr.Model();
var p1 = model.getOrCreateProcess(1);
var t1 = p1.getOrCreateThread(1);
t1.sliceGroup.pushSlice(
new tr.model.ThreadSlice('', 'a', 0, 1, {}, 3));
t1.sliceGroup.pushSlice(
new tr.model.ThreadSlice('', 'a', 0, 5, {}, 1));
var viewport = new tr.ui.TimelineViewport();
var track = new tr.ui.tracks.SliceTrack(viewport);
viewport.modelTrackContainer = track;
track.slices = t1.sliceGroup.slices;
viewport.rebuildEventToTrackMap();
var sel = new tr.model.EventSet();
sel.push(t1.sliceGroup.slices[0]);
var shifted = track.viewport.getShiftedSelection(sel, 1);
assert.equal(shifted.length, 1);
assert.equal(shifted[0], t1.sliceGroup.slices[1]);
});
test('locationObj', function() {
var model = new tr.Model();
var process = model.getOrCreateProcess(123);
var thread = process.getOrCreateThread(456);
model.importTraces([], false, false, function() {
thread.asyncSliceGroup.push(
tr.c.test_utils.newAsyncSliceNamed('a', 80, 20, thread, thread));
thread.asyncSliceGroup.push(
tr.c.test_utils.newAsyncSliceNamed('a', 85, 10, thread, thread));
});
var timeline = document.createElement('tr-ui-timeline-track-view');
var vp = new tr.ui.TimelineViewport(timeline);
timeline.model = model;
timeline.style.maxHeight = '600px';
this.addHTMLOutput(timeline);
// Our stableId to track map is not automatically built. We need to
// search for the tracks and manually build the stableId map here.
var processTracks = document.getElementsByClassName('process-track-base');
vp.modelTrackContainer = {
addContainersToTrackMap: function(containerToTrackMap) {
// Invoking the process track's addContainersToTrackMap is enough to
// build the map for all children (i.e. Threads, AsyncSliceGroups)
// as well.
for (var i = 0; i < processTracks.length; i++)
processTracks[i].addContainersToTrackMap(containerToTrackMap);
},
addEventListener: function() {},
canvas: {
offsetLeft: tr.c.constants.HEADING_WIDTH,
offsetTop: 0
}
};
vp.rebuildContainerToTrackMap();
var asyncTrack =
vp.containerToTrackMap.getTrackByStableId('123.456.AsyncSliceGroup');
assert.isDefined(asyncTrack);
assert.isFalse(asyncTrack.expanded); // Make sure this starts unexpanded.
// Hack to allow Location to find the element we're looking for.
// This ensures the correct behaviour of document.elementFrompoint(x,y) of
// an originally off-screen element.
asyncTrack.scrollIntoView();
var boundRect = asyncTrack.getBoundingClientRect();
var viewX = boundRect.left;
var viewY = boundRect.top + boundRect.height / 2;
var location = Location.fromViewCoordinates(vp, viewX, viewY);
assert.equal(asyncTrack, location.getContainingTrack(vp));
assert.deepEqual(location.toViewCoordinates(vp),
{ viewX: viewX, viewY: viewY });
// Try expanding the multi-row track so that the dimensions of the thread
// track changes.
asyncTrack.expanded = true;
// Expanding the track causes the height to double. We can calculate the new
// viewY with respect to the track's old boundRect. ViewX remains unchanged.
var expandedViewY = boundRect.top + boundRect.height;
assert.deepEqual(location.toViewCoordinates(vp),
{ viewX: viewX, viewY: expandedViewY });
// Test the functionality of fromStableIdAndTimestamp.
var locationFromCoord =
Location.fromViewCoordinates(vp, viewX, boundRect.top);
var locationFromStableId =
Location.fromStableIdAndTimestamp(vp, '123.456.AsyncSliceGroup',
location.xWorld);
assert.deepEqual(locationFromCoord, locationFromStableId);
// Undo scroll.
document.getElementById('results-container').scrollTop = 0;
});
});
</script>