@@ -17,7 +17,7 @@ describeWithEnvironment('AICallTree', () => {
1717 return e . name === Trace . Types . Events . Name . RASTER_TASK && e . pid === 4274 && e . tid === 23555 ;
1818 } ) ;
1919 assert . isOk ( rasterTask ) ;
20- assert . isNull ( Utils . AICallTree . AICallTree . from ( rasterTask , parsedTrace ) ) ;
20+ assert . isNull ( Utils . AICallTree . AICallTree . fromEvent ( rasterTask , parsedTrace ) ) ;
2121 } ) ;
2222
2323 it ( 'does not build a tree from events the renderer is not aware of' , async function ( ) {
@@ -26,7 +26,7 @@ describeWithEnvironment('AICallTree', () => {
2626 const shift = parsedTrace . LayoutShifts . clusters . at ( 0 ) ?. events . at ( 0 ) ;
2727 assert . isOk ( shift ) ;
2828 assert . isTrue ( Trace . Types . Events . isSyntheticLayoutShift ( shift ) ) ;
29- assert . isNull ( Utils . AICallTree . AICallTree . from ( shift , parsedTrace ) ) ;
29+ assert . isNull ( Utils . AICallTree . AICallTree . fromEvent ( shift , parsedTrace ) ) ;
3030 } ) ;
3131
3232 it ( 'supports NodeJS traces that do not have a "main thread"' , async function ( ) {
@@ -44,7 +44,7 @@ describeWithEnvironment('AICallTree', () => {
4444 return Trace . Types . Events . isProfileCall ( event ) && event . callFrame . functionName === 'callAndPauseOnStart' ;
4545 } ) ;
4646 assert . isOk ( funcCall ) ;
47- const callTree = Utils . AICallTree . AICallTree . from ( funcCall , parsedTrace ) ;
47+ const callTree = Utils . AICallTree . AICallTree . fromEvent ( funcCall , parsedTrace ) ;
4848 assert . isOk ( callTree ) ;
4949 const expectedData = '\n' +
5050 `
@@ -117,7 +117,7 @@ URL #: 3
117117 if ( ! selectedEvent ) {
118118 throw new Error ( 'Could not find expected event.' ) ;
119119 }
120- const callTree = Utils . AICallTree . AICallTree . from ( selectedEvent , parsedTrace ) ;
120+ const callTree = Utils . AICallTree . AICallTree . fromEvent ( selectedEvent , parsedTrace ) ;
121121 const expectedData = '\n' +
122122 `
123123
@@ -170,7 +170,7 @@ self: 0.2
170170 if ( ! selectedEvent ) {
171171 throw new Error ( 'Could not find expected event.' ) ;
172172 }
173- const callTree = Utils . AICallTree . AICallTree . from ( selectedEvent , parsedTrace ) ;
173+ const callTree = Utils . AICallTree . AICallTree . fromEvent ( selectedEvent , parsedTrace ) ;
174174 assert . isOk ( callTree ) ;
175175
176176 // We don't need to validate the whole tree, just that it has recursion
@@ -189,7 +189,7 @@ self: 0.2
189189 if ( ! tinyEvent ) {
190190 throw new Error ( 'Could not find expected event.' ) ;
191191 }
192- const tinyStr = Utils . AICallTree . AICallTree . from ( tinyEvent , parsedTrace ) ?. serialize ( ) ;
192+ const tinyStr = Utils . AICallTree . AICallTree . fromEvent ( tinyEvent , parsedTrace ) ?. serialize ( ) ;
193193 assert . strictEqual ( tinyStr ?. split ( '\n' ) . filter ( l => l . startsWith ( 'Node:' ) ) . join ( '\n' ) , `
194194Node: 1 – Task
195195Node: 2 – Parse HTML
@@ -203,7 +203,7 @@ Node: 5 – get storage`.trim());
203203 if ( ! evaluateEvent ) {
204204 throw new Error ( 'Could not find expected event.' ) ;
205205 }
206- const treeStr = Utils . AICallTree . AICallTree . from ( evaluateEvent , parsedTrace ) ?. serialize ( ) ;
206+ const treeStr = Utils . AICallTree . AICallTree . fromEvent ( evaluateEvent , parsedTrace ) ?. serialize ( ) ;
207207 assert . strictEqual ( treeStr ?. split ( '\n' ) . filter ( l => l . startsWith ( 'Node:' ) ) . join ( '\n' ) , `
208208Node: 1 – Task
209209Node: 2 – Parse HTML
@@ -218,7 +218,7 @@ Node: 6 – H.la`.trim());
218218 if ( ! compileEvent ) {
219219 throw new Error ( 'Could not find expected event.' ) ;
220220 }
221- const compileStr = Utils . AICallTree . AICallTree . from ( compileEvent , parsedTrace ) ?. serialize ( ) ;
221+ const compileStr = Utils . AICallTree . AICallTree . fromEvent ( compileEvent , parsedTrace ) ?. serialize ( ) ;
222222 assert . strictEqual ( compileStr ?. split ( '\n' ) . filter ( l => l . startsWith ( 'Node:' ) ) . join ( '\n' ) , `
223223Node: 1 – Task
224224Node: 2 – Parse HTML
@@ -227,33 +227,51 @@ Node: 4 – (anonymous)
227227Node: 5 – Compile code` . trim ( ) ) ;
228228 assert . include ( compileStr , 'Compile code' ) ;
229229 } ) ;
230- } ) ;
231230
232- describe ( 'AITreeFilter' , ( ) => {
233- const makeEvent = (
234- name : string ,
235- ts : number ,
236- dur : number ,
237- ) : Trace . Types . Events . Event => ( {
238- name,
239- cat : 'disabled-by-default-devtools.timeline' ,
240- ph : Trace . Types . Events . Phase . COMPLETE ,
241- ts : Trace . Types . Timing . Micro ( ts ) ,
242- dur : Trace . Types . Timing . Micro ( dur ) ,
243- pid : Trace . Types . Events . ProcessID ( 1 ) ,
244- tid : Trace . Types . Events . ThreadID ( 4 ) ,
245- args : { } ,
231+ it ( 'can construct a tree from a period of time' , async function ( ) {
232+ const { parsedTrace} = await TraceLoader . traceEngine ( this , 'nested-interactions.json.gz' ) ;
233+ // Picked this interaction event because it spans multiple icicles in the main thread.
234+ // Note: if you are debugging this test, it is useful to load up this trace
235+ // in RPP and look for the first "keydown" event.
236+ const interaction = parsedTrace . UserInteractions . interactionEventsWithNoNesting . find ( e => {
237+ return Trace . Types . Events . isEventTimingStart ( e . rawSourceEvent ) &&
238+ e . rawSourceEvent . args . data . interactionId === 3572 ;
239+ } ) ;
240+ assert . isOk ( interaction ) ;
241+ const timings = Trace . Helpers . Timing . eventTimingsMicroSeconds ( interaction ) ;
242+ const tree = Utils . AICallTree . AICallTree . fromTime ( timings . startTime , timings . endTime , parsedTrace ) ;
243+ assert . isOk ( tree ) ;
244+ const output = tree . serialize ( ) ;
245+ const totalNodes = output . split ( '\n' ) . filter ( l => l . startsWith ( 'Node:' ) ) . length ;
246+ assert . strictEqual ( totalNodes , 242 ) ; // Check the min duration filter is working.
247+ // Check there are 3 keydown events. This confirms that the call tree is taking events from the right timespan.
248+ const keyDownEvents = output . split ( '\n' ) . filter ( line => {
249+ return line . startsWith ( 'Node:' ) && line . includes ( 'Event: keydown' ) ;
250+ } ) ;
251+ assert . lengthOf ( keyDownEvents , 3 ) ;
246252 } ) ;
253+ } ) ;
247254
255+ const makeEvent = ( name : string , ts : number , dur : number ) : Trace . Types . Events . Event => ( {
256+ name,
257+ cat : 'disabled-by-default-devtools.timeline' ,
258+ ph : Trace . Types . Events . Phase . COMPLETE ,
259+ ts : Trace . Types . Timing . Micro ( ts ) ,
260+ dur : Trace . Types . Timing . Micro ( dur ) ,
261+ pid : Trace . Types . Events . ProcessID ( 1 ) ,
262+ tid : Trace . Types . Events . ThreadID ( 4 ) ,
263+ args : { } ,
264+ } ) ;
265+ describe ( 'AITreeFilter' , ( ) => {
248266 it ( 'always includes the selected event' , ( ) => {
249267 const selectedEvent = makeEvent ( 'selected' , 0 , 100 ) ;
250- const filter = new Utils . AICallTree . AITreeFilter ( selectedEvent ) ;
268+ const filter = new Utils . AICallTree . SelectedEventDurationFilter ( selectedEvent ) ;
251269 assert . isTrue ( filter . accept ( selectedEvent ) ) ;
252270 } ) ;
253271
254272 it ( 'includes events that are long enough' , ( ) => {
255273 const selectedEvent = makeEvent ( 'selected' , 0 , 100 ) ;
256- const filter = new Utils . AICallTree . AITreeFilter ( selectedEvent ) ;
274+ const filter = new Utils . AICallTree . SelectedEventDurationFilter ( selectedEvent ) ;
257275
258276 assert . isTrue ( filter . accept ( makeEvent ( 'short' , 0 , 1 ) ) ) ;
259277 assert . isTrue ( filter . accept ( makeEvent ( 'short' , 0 , 0.6 ) ) ) ;
@@ -264,23 +282,25 @@ describe('AITreeFilter', () => {
264282
265283 it ( 'excludes events that are too short' , ( ) => {
266284 const selectedEvent = makeEvent ( 'selected' , 0 , 100 ) ;
267- const filter = new Utils . AICallTree . AITreeFilter ( selectedEvent ) ;
285+ const filter = new Utils . AICallTree . SelectedEventDurationFilter ( selectedEvent ) ;
268286
269287 assert . isFalse ( filter . accept ( makeEvent ( 'short' , 0 , 0 ) ) ) ;
270288 assert . isFalse ( filter . accept ( makeEvent ( 'short' , 0 , 0.1 ) ) ) ;
271289 assert . isFalse ( filter . accept ( makeEvent ( 'short' , 0 , 0.4 ) ) ) ;
272290 } ) ;
291+ } ) ;
273292
293+ describe ( 'CompileCode filter' , ( ) => {
274294 it ( 'excludes COMPILE_CODE nodes if non-selected' , ( ) => {
275295 const selectedEvent = makeEvent ( 'selected' , 0 , 100 ) ;
276296 const compileCodeEvent = makeEvent ( Trace . Types . Events . Name . COMPILE_CODE , 0 , 100 ) ;
277- const filter = new Utils . AICallTree . AITreeFilter ( selectedEvent ) ;
297+ const filter = new Utils . AICallTree . ExcludeCompileCodeFilter ( selectedEvent ) ;
278298 assert . isFalse ( filter . accept ( compileCodeEvent ) ) ;
279299 } ) ;
280300
281301 it ( 'includes COMPILE_CODE nodes if selected' , ( ) => {
282302 const selectedEvent = makeEvent ( Trace . Types . Events . Name . COMPILE_CODE , 0 , 100 ) ;
283- const filter = new Utils . AICallTree . AITreeFilter ( selectedEvent ) ;
303+ const filter = new Utils . AICallTree . ExcludeCompileCodeFilter ( selectedEvent ) ;
284304 assert . isTrue ( filter . accept ( selectedEvent ) ) ;
285305 } ) ;
286306} ) ;
0 commit comments