1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 tvcm.require('tracing.test_utils');
8 tvcm.require('tracing.trace_model.slice');
9 tvcm.require('tracing.timeline_track_view');
10 tvcm.require('tracing.draw_helpers');
11 tvcm.require('tvcm.ui.dom_helpers');
13 tvcm.unittest.testSuite('tracing.tracks.slice_track_test', function() {
14 var Selection = tracing.Selection;
15 var SliceTrack = tracing.tracks.SliceTrack;
16 var Slice = tracing.trace_model.Slice;
17 var Viewport = tracing.TimelineViewport;
19 test('instantiate', function() {
20 var div = document.createElement('div');
21 this.addHTMLOutput(div);
23 var viewport = new Viewport(div);
24 var drawingContainer = new tracing.tracks.DrawingContainer(viewport);
25 div.appendChild(drawingContainer);
27 var track = SliceTrack(viewport);
28 drawingContainer.appendChild(track);
29 drawingContainer.invalidate();
31 track.heading = 'testBasicSlices';
33 new Slice('', 'a', 0, 1, {}, 1),
34 new Slice('', 'b', 1, 2.1, {}, 4.8),
35 new Slice('', 'b', 1, 7, {}, 0.5),
36 new Slice('', 'c', 2, 7.6, {}, 0.4)
39 var dt = new tracing.TimelineDisplayTransform();
40 dt.xSetWorldBounds(0, 8.8, track.clientWidth);
41 track.viewport.setDisplayTransformImmediately(dt);
44 test('instantiate_shrinkingSliceSize', function() {
45 var div = document.createElement('div');
46 this.addHTMLOutput(div);
48 var viewport = new Viewport(div);
49 var drawingContainer = new tracing.tracks.DrawingContainer(viewport);
50 div.appendChild(drawingContainer);
52 var track = SliceTrack(viewport);
53 drawingContainer.appendChild(track);
54 drawingContainer.invalidate();
56 track.heading = 'testShrinkingSliceSizes';
58 var widths = [10, 5, 4, 3, 2, 1, 0.5, 0.4, 0.3, 0.2, 0.1, 0.05];
60 for (var i = 0; i < widths.length; i++) {
61 var s = new Slice('', 'a', 1, x, {}, widths[i]);
62 x += s.duration + 0.5;
65 track.slices = slices;
66 var dt = new tracing.TimelineDisplayTransform();
67 dt.xSetWorldBounds(0, 1.1 * x, track.clientWidth);
68 track.viewport.setDisplayTransformImmediately(dt);
71 test('instantiate_elide', function() {
72 var optDicts = [{ trackName: 'elideOff', elide: false },
73 { trackName: 'elideOn', elide: true }];
75 var tooLongTitle = 'Unless eliding this SHOULD NOT BE DISPLAYED. ';
76 var bigTitle = 'Very big title name that goes on longer ' +
77 'than you may expect';
79 for (var dictIndex in optDicts) {
80 var dict = optDicts[dictIndex];
82 var div = document.createElement('div');
83 div.appendChild(document.createTextNode(dict.trackName));
84 this.addHTMLOutput(div);
86 var viewport = new Viewport(div);
87 var drawingContainer = new tracing.tracks.DrawingContainer(viewport);
88 div.appendChild(drawingContainer);
90 var track = new SliceTrack(viewport);
91 drawingContainer.appendChild(track);
92 drawingContainer.invalidate();
94 track.SHOULD_ELIDE_TEXT = dict.elide;
95 track.heading = 'Visual: ' + dict.trackName;
97 // title, colorId, start, args, opt_duration
98 new Slice('', 'a ' + tooLongTitle + bigTitle, 0, 1, {}, 1),
99 new Slice('', bigTitle, 1, 2.1, {}, 4.8),
100 new Slice('', 'cccc cccc cccc', 1, 7, {}, 0.5),
101 new Slice('', 'd', 2, 7.6, {}, 1.0)
103 var dt = new tracing.TimelineDisplayTransform();
104 dt.xSetWorldBounds(0, 9.5, track.clientWidth);
105 track.viewport.setDisplayTransformImmediately(dt);
109 test('findAllObjectsMatchingInSliceTrack', function() {
110 var track = SliceTrack(new tracing.TimelineViewport());
112 new Slice('', 'a', 0, 1, {}, 1),
113 new Slice('', 'b', 1, 2.1, {}, 4.8),
114 new Slice('', 'b', 1, 7, {}, 0.5),
115 new Slice('', 'c', 2, 7.6, {}, 0.4)
117 var selection = new Selection();
118 track.addAllObjectsMatchingFilterToSelection(
119 new tracing.TitleFilter('b'), selection);
121 assertEquals(2, selection.length);
122 assertEquals(track.slices[1], selection[0]);
123 assertEquals(track.slices[2], selection[1]);
126 test('selectionHitTesting', function() {
127 var testEl = document.createElement('div');
128 testEl.appendChild(tvcm.ui.createScopedStyle('heading { width: 100px; }'));
129 testEl.style.width = '600px';
130 this.addHTMLOutput(testEl);
132 var viewport = new Viewport(testEl);
133 var drawingContainer = new tracing.tracks.DrawingContainer(viewport);
134 testEl.appendChild(drawingContainer);
136 var track = new SliceTrack(viewport);
137 drawingContainer.appendChild(track);
138 drawingContainer.updateCanvasSizeIfNeeded_();
140 track.heading = 'testSelectionHitTesting';
142 new Slice('', 'a', 0, 1, {}, 1),
143 new Slice('', 'b', 1, 5, {}, 4.8)
145 var y = track.getBoundingClientRect().top + 5;
146 var pixelRatio = window.devicePixelRatio || 1;
148 var vW = drawingContainer.canvas.getBoundingClientRect().width;
150 var dt = new tracing.TimelineDisplayTransform();
151 dt.xSetWorldBounds(0, wW, vW * pixelRatio);
152 track.viewport.setDisplayTransformImmediately(dt);
154 var selection = new Selection();
155 var x = (1.5 / wW) * vW;
156 track.addIntersectingItemsInRangeToSelection(x, x + 1, y, y + 1, selection);
157 assertEquals(track.slices[0], selection[0]);
159 var selection = new Selection();
161 track.addIntersectingItemsInRangeToSelection(x, x + 1, y, y + 1, selection);
162 assertEquals(0, selection.length);
164 var selection = new Selection();
166 track.addIntersectingItemsInRangeToSelection(x, x + 1, y, y + 1, selection);
167 assertEquals(track.slices[1], selection[0]);
169 var selection = new Selection();
171 track.addIntersectingItemsInRangeToSelection(x, x + 1, y, y + 1, selection);
172 assertEquals(0, selection.length);
175 test('elide', function() {
176 var testEl = document.createElement('div');
177 this.addHTMLOutput(testEl);
179 var viewport = new Viewport(testEl);
180 var drawingContainer = new tracing.tracks.DrawingContainer(viewport);
181 testEl.appendChild(drawingContainer);
183 var track = new SliceTrack(viewport);
184 drawingContainer.appendChild(track);
185 drawingContainer.updateCanvasSizeIfNeeded_();
187 var bigtitle = 'Super duper long long title ' +
188 'holy moly when did you get so verbose?';
189 var smalltitle = 'small';
190 track.heading = 'testElide';
192 // title, colorId, start, args, opt_duration
193 new Slice('', bigtitle, 0, 1, {}, 1),
194 new Slice('', smalltitle, 1, 2, {}, 1)
196 var dt = new tracing.TimelineDisplayTransform();
197 dt.xSetWorldBounds(0, 3.3, track.clientWidth);
198 track.viewport.setDisplayTransformImmediately(dt);
200 var stringWidthPair = undefined;
201 var pixWidth = dt.xViewVectorToWorld(1);
203 // Small titles on big slices are not elided.
205 tracing.elidedTitleCache_.get(
209 tracing.elidedTitleCache_.labelWidth(
213 assertEquals(smalltitle, stringWidthPair.string);
215 // Keep shrinking the slice until eliding starts.
216 var elidedWhenSmallEnough = false;
217 for (var sliceLength = 1; sliceLength >= 0.00001; sliceLength /= 2.0) {
219 tracing.elidedTitleCache_.get(
223 tracing.elidedTitleCache_.labelWidth(
227 if (stringWidthPair.string.length < smalltitle.length) {
228 elidedWhenSmallEnough = true;
232 assertTrue(elidedWhenSmallEnough);
234 // Big titles are elided immediately.
235 var superBigTitle = '';
236 for (var x = 0; x < 10; x++) {
237 superBigTitle += bigtitle;
240 tracing.elidedTitleCache_.get(
244 tracing.elidedTitleCache_.labelWidth(
248 assertTrue(stringWidthPair.string.length < superBigTitle.length);
250 // And elided text ends with ...
251 var len = stringWidthPair.string.length;
252 assertEquals('...', stringWidthPair.string.substring(len - 3, len));
255 test('sliceTrackAddItemNearToProvidedEvent', function() {
256 var track = new SliceTrack(new tracing.TimelineViewport());
258 new Slice('', 'a', 0, 1, {}, 1),
259 new Slice('', 'b', 1, 2.1, {}, 4.8),
260 new Slice('', 'b', 1, 7, {}, 0.5),
261 new Slice('', 'c', 2, 7.6, {}, 0.4)
263 var sel = new Selection();
264 track.addAllObjectsMatchingFilterToSelection(
265 new tracing.TitleFilter('b'), sel);
268 // Select to the right of B.
269 var selRight = new Selection();
270 ret = track.addItemNearToProvidedEventToSelection(sel[0], 1, selRight);
272 assertEquals(track.slices[2], selRight[0]);
274 // Select to the right of the 2nd b.
275 var selRight2 = new Selection();
276 ret = track.addItemNearToProvidedEventToSelection(sel[0], 2, selRight2);
278 assertEquals(track.slices[3], selRight2[0]);
280 // Select to 2 to the right of the 2nd b.
281 var selRightOfRight = new Selection();
282 ret = track.addItemNearToProvidedEventToSelection(
283 selRight[0], 1, selRightOfRight);
285 assertEquals(track.slices[3], selRightOfRight[0]);
287 // Select to the right of the rightmost slice.
288 var selNone = new Selection();
289 ret = track.addItemNearToProvidedEventToSelection(
290 selRightOfRight[0], 1, selNone);
292 assertEquals(0, selNone.length);
294 // Select A and then select left.
295 var sel = new Selection();
296 track.addAllObjectsMatchingFilterToSelection(
297 new tracing.TitleFilter('a'), sel);
300 selNone = new Selection();
301 ret = track.addItemNearToProvidedEventToSelection(sel[0], -1, selNone);
303 assertEquals(0, selNone.length);
306 test('sliceTrackAddClosestEventToSelection', function() {
307 var track = new SliceTrack(new tracing.TimelineViewport());
309 new Slice('', 'a', 0, 1, {}, 1),
310 new Slice('', 'b', 1, 2.1, {}, 4.8),
311 new Slice('', 'b', 1, 7, {}, 0.5),
312 new Slice('', 'c', 2, 7.6, {}, 0.4)
315 // Before with not range.
316 var sel = new Selection();
317 track.addClosestEventToSelection(0, 0, 0, 0, sel);
318 assertEquals(0, sel.length);
320 // Before with negative range.
321 var sel = new Selection();
322 track.addClosestEventToSelection(1.5, -10, 0, 0, sel);
323 assertEquals(0, sel.length);
325 // Before first slice.
326 var sel = new Selection();
327 track.addClosestEventToSelection(0.5, 1, 0, 0, sel);
328 assertEquals(1, sel.length);
329 assertEquals(track.slices[0], sel[0]);
331 // Within first slice closer to start.
332 var sel = new Selection();
333 track.addClosestEventToSelection(1.3, 1, 0, 0, sel);
334 assertEquals(track.slices[0], sel[0]);
336 // Between slices with good range.
337 var sel = new Selection();
338 track.addClosestEventToSelection(2.08, 3, 0, 0, sel);
339 assertEquals(track.slices[1], sel[0]);
341 // Between slices with bad range.
342 var sel = new Selection();
343 track.addClosestEventToSelection(2.05, 0.03, 0, 0, sel);
344 assertEquals(0, sel.length);
346 // Within slice closer to end.
347 var sel = new Selection();
348 track.addClosestEventToSelection(6, 100, 0, 0, sel);
349 assertEquals(track.slices[1], sel[0]);
351 // Within slice with bad range.
352 var sel = new Selection();
353 track.addClosestEventToSelection(1.8, 0.1, 0, 0, sel);
354 assertEquals(0, sel.length);
356 // After last slice with good range.
357 var sel = new Selection();
358 track.addClosestEventToSelection(8.5, 1, 0, 0, sel);
359 assertEquals(track.slices[3], sel[0]);
361 // After last slice with bad range.
362 var sel = new Selection();
363 track.addClosestEventToSelection(10, 1, 0, 0, sel);
364 assertEquals(0, sel.length);