Home | History | Annotate | Download | only in tracks
      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