1 // Copyright (c) 2012 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. 4 5 'use strict'; 6 7 base.require('tracks.timeline_slice_group_track'); 8 base.require('ui'); 9 base.exportTo('tracks', function() { 10 11 /** 12 * A track that displays a TimelineAsyncSliceGroup. 13 * @constructor 14 * @extends {TimelineSliceGroup} 15 */ 16 17 var TimelineAsyncSliceGroupTrack = base.ui.define( 18 tracks.TimelineSliceGroupTrack); 19 20 TimelineAsyncSliceGroupTrack.prototype = { 21 22 __proto__: tracks.TimelineSliceGroupTrack.prototype, 23 24 decorate: function() { 25 this.classList.add('timeline-async-slice-group-track'); 26 }, 27 28 addSliceTrack_: function(slices) { 29 var track = tracks.TimelineSliceGroupTrack.prototype.addSliceTrack_.call( 30 this, slices); 31 track.asyncStyle = true; 32 return track; 33 }, 34 35 /** 36 * Breaks up the list of slices into N rows, each of which is a list of 37 * slices that are non overlapping. 38 * 39 * It uses a very simple approach: walk through the slices in sorted order 40 * by start time. For each slice, try to fit it in an existing subRow. If it 41 * doesn't fit in any subrow, make another subRow. 42 */ 43 buildSubRows_: function() { 44 var slices = tracing.filterSliceArray(this.categoryFilter, 45 this.group_.slices); 46 slices.sort(function(x, y) { 47 return x.start - y.start; 48 }); 49 50 var subRows = []; 51 for (var i = 0; i < slices.length; i++) { 52 var slice = slices[i]; 53 54 var found = false; 55 for (var j = 0; j < subRows.length; j++) { 56 var subRow = subRows[j]; 57 var lastSliceInSubRow = subRow[subRow.length - 1]; 58 if (slice.start >= lastSliceInSubRow.end) { 59 found = true; 60 // Instead of plotting one big slice for the entire 61 // TimelineAsyncEvent, we plot each of the subSlices. 62 if (slice.subSlices === undefined || slice.subSlices.length < 1) 63 throw new Error('TimelineAsyncEvent missing subSlices: ') + 64 slice.name; 65 for (var k = 0; k < slice.subSlices.length; k++) 66 subRow.push(slice.subSlices[k]); 67 break; 68 } 69 } 70 if (!found) { 71 var subRow = []; 72 if (slice.subSlices !== undefined) { 73 for (var k = 0; k < slice.subSlices.length; k++) 74 subRow.push(slice.subSlices[k]); 75 subRows.push(subRow); 76 } 77 } 78 } 79 return subRows; 80 } 81 }; 82 83 return { 84 TimelineAsyncSliceGroupTrack: TimelineAsyncSliceGroupTrack 85 }; 86 }); 87