@@ -11,6 +11,7 @@ const MainThreadTasks = require('../../../lib/tracehouse/main-thread-tasks.js');
1111const TraceProcessor = require ( '../../../lib/tracehouse/trace-processor.js' ) ;
1212const taskGroups = require ( '../../../lib/tracehouse/task-groups.js' ) . taskGroups ;
1313const pwaTrace = require ( '../../fixtures/traces/progressive-app.json' ) ;
14+ const noTracingStartedTrace = require ( '../../fixtures/traces/no-tracingstarted-m74.json' ) ;
1415const TracingProcessor = require ( '../../../lib/tracehouse/trace-processor.js' ) ;
1516const assert = require ( 'assert' ) ;
1617
@@ -59,6 +60,11 @@ describe('Main Thread Tasks', () => {
5960 assert . equal ( Math . round ( totalTime ) , 396 ) ;
6061 } ) ;
6162
63+ it ( 'should handle slightly trace events that slightly overlap' , ( ) => {
64+ const tasks = run ( noTracingStartedTrace ) ;
65+ expect ( tasks ) . toHaveLength ( 425 ) ;
66+ } ) ;
67+
6268 it ( 'should compute parent/child correctly' , ( ) => {
6369 /*
6470 An artistic rendering of the below trace:
@@ -416,6 +422,52 @@ describe('Main Thread Tasks', () => {
416422 ] ) ;
417423 } ) ;
418424
425+ it ( 'should handle child events that extend <1ms beyond parent event' , ( ) => {
426+ /*
427+ An artistic rendering of the below trace:
428+ ████████████████TaskA██████████████████
429+ █████████TaskB██████████████████
430+ */
431+ const traceEvents = [
432+ ...boilerplateTrace ,
433+ { ph : 'B' , name : 'TaskA' , pid, tid, ts : baseTs , args} ,
434+ { ph : 'B' , name : 'TaskB' , pid, tid, ts : baseTs + 25e3 , args} ,
435+ { ph : 'E' , name : 'TaskA' , pid, tid, ts : baseTs + 100e3 - 50 , args} , // this is invalid, but happens in practice
436+ { ph : 'E' , name : 'TaskB' , pid, tid, ts : baseTs + 100e3 , args} ,
437+ ] ;
438+
439+ traceEvents . forEach ( evt => Object . assign ( evt , { cat : 'devtools.timeline' } ) ) ;
440+
441+ const tasks = run ( { traceEvents} ) ;
442+ const [ taskA , taskB ] = tasks ;
443+ expect ( tasks ) . toEqual ( [
444+ {
445+ parent : undefined ,
446+ attributableURLs : [ ] ,
447+
448+ children : [ taskB ] ,
449+ event : traceEvents . find ( event => event . name === 'TaskA' ) ,
450+ startTime : 0 ,
451+ endTime : 100 ,
452+ duration : 100 ,
453+ selfTime : 25 ,
454+ group : taskGroups . other ,
455+ } ,
456+ {
457+ parent : taskA ,
458+ attributableURLs : [ ] ,
459+
460+ children : [ ] ,
461+ event : traceEvents . find ( event => event . name === 'TaskB' && event . ph === 'B' ) ,
462+ startTime : 25 ,
463+ endTime : 100 ,
464+ duration : 75 ,
465+ selfTime : 75 ,
466+ group : taskGroups . other ,
467+ } ,
468+ ] ) ;
469+ } ) ;
470+
419471 const invalidEventSets = [
420472 [
421473 // TaskA overlaps with TaskB, X first
@@ -429,6 +481,13 @@ describe('Main Thread Tasks', () => {
429481 { ph : 'X' , name : 'TaskB' , pid, tid, ts : baseTs + 5e3 , dur : 100e3 , args} ,
430482 { ph : 'E' , name : 'TaskA' , pid, tid, ts : baseTs + 90e3 , args} ,
431483 ] ,
484+ [
485+ // TaskA overlaps with TaskB, both B/E
486+ { ph : 'B' , name : 'TaskA' , pid, tid, ts : baseTs , args} ,
487+ { ph : 'B' , name : 'TaskB' , pid, tid, ts : baseTs + 5e3 , args} ,
488+ { ph : 'E' , name : 'TaskA' , pid, tid, ts : baseTs + 90e3 , args} ,
489+ { ph : 'E' , name : 'TaskB' , pid, tid, ts : baseTs + 95e3 , args} ,
490+ ] ,
432491 [
433492 // TaskA is missing a B event
434493 { ph : 'E' , name : 'TaskA' , pid, tid, ts : baseTs , args} ,
0 commit comments