[go: nahoru, domu]

Move EventTypeHelpers utils to timeline_model

This way we can also use it in the timeline_model and SDK module without causing circular deps. At first I was hesitant to add it into the legacy folder but I now think it makes sense given that it's added for compatibility between the new engine and the legacy artifacts and once we can remove the legacy artifacts we should also be able to remove the helpers.

Bug: 1433692
Change-Id: I764cb1cce8575076bd9dc5f29cd3f612a308f561
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/4459271
Reviewed-by: Nancy Li <nancyly@chromium.org>
Commit-Queue: Andres Olivares <andoli@chromium.org>
diff --git a/config/gni/devtools_grd_files.gni b/config/gni/devtools_grd_files.gni
index b936783..0fe7e54 100644
--- a/config/gni/devtools_grd_files.gni
+++ b/config/gni/devtools_grd_files.gni
@@ -1427,7 +1427,6 @@
   "front_end/panels/timeline/CLSLinkifier.js",
   "front_end/panels/timeline/CompatibilityTracksAppender.js",
   "front_end/panels/timeline/CountersGraph.js",
-  "front_end/panels/timeline/EventTypeHelpers.js",
   "front_end/panels/timeline/EventsTimelineTreeView.js",
   "front_end/panels/timeline/GPUTrackAppender.js",
   "front_end/panels/timeline/InteractionsTrackAppender.js",
diff --git a/front_end/core/sdk/TracingModel.ts b/front_end/core/sdk/TracingModel.ts
index 0848e01..7164d10 100644
--- a/front_end/core/sdk/TracingModel.ts
+++ b/front_end/core/sdk/TracingModel.ts
@@ -919,3 +919,68 @@
     return extracted;
   }
 }
+
+export interface TimesForEventMs {
+  startTime: TraceEngine.Types.Timing.MilliSeconds;
+  endTime: TraceEngine.Types.Timing.MilliSeconds;
+  selfTime: TraceEngine.Types.Timing.MilliSeconds;
+  duration: TraceEngine.Types.Timing.MilliSeconds;
+}
+
+export function timesForEventInMilliseconds(event: Event|
+                                            TraceEngine.Types.TraceEvents.TraceEventData): TimesForEventMs {
+  if (event instanceof Event) {
+    return {
+      startTime: TraceEngine.Types.Timing.MilliSeconds(event.startTime),
+      endTime: TraceEngine.Types.Timing.MilliSeconds(event.endTime || event.startTime),
+      duration: TraceEngine.Types.Timing.MilliSeconds(event.duration || 0),
+      selfTime: TraceEngine.Types.Timing.MilliSeconds(event.selfTime),
+    };
+  }
+  const duration = event.dur ? TraceEngine.Helpers.Timing.microSecondsToMilliseconds(event.dur) :
+                               TraceEngine.Types.Timing.MilliSeconds(0);
+  return {
+    startTime: TraceEngine.Helpers.Timing.microSecondsToMilliseconds(event.ts),
+    endTime: TraceEngine.Helpers.Timing.microSecondsToMilliseconds(
+        TraceEngine.Types.Timing.MicroSeconds(event.ts + (event.dur || 0))),
+    duration: event.dur ? TraceEngine.Helpers.Timing.microSecondsToMilliseconds(event.dur) :
+                          TraceEngine.Types.Timing.MilliSeconds(0),
+    // TODO(crbug.com/1434599): Implement selfTime calculation for events
+    // from the new engine.
+    selfTime: duration,
+  };
+}
+// Parsed categories are cached to prevent calling cat.split() multiple
+// times on the same categories string.
+const parsedCategories = new Map<string, Set<string>>();
+export function eventHasCategory(event: Event|TraceEngine.Types.TraceEvents.TraceEventData, category: string): boolean {
+  if (event instanceof Event) {
+    return event.hasCategory(category);
+  }
+  let parsedCategoriesForEvent = parsedCategories.get(event.cat);
+  if (!parsedCategoriesForEvent) {
+    parsedCategoriesForEvent = new Set(event.cat.split(',') || []);
+  }
+  return parsedCategoriesForEvent.has(category);
+}
+
+export function phaseForEvent(event: Event|
+                              TraceEngine.Types.TraceEvents.TraceEventData): TraceEngine.Types.TraceEvents.Phase {
+  if (event instanceof Event) {
+    return event.phase;
+  }
+  return event.ph;
+}
+
+export function threadIDForEvent(event: Event|
+                                 TraceEngine.Types.TraceEvents.TraceEventData): TraceEngine.Types.TraceEvents.ThreadID {
+  if (event instanceof Event) {
+    return event.thread.idInternal as TraceEngine.Types.TraceEvents.ThreadID;
+  }
+  return event.tid;
+}
+
+export function eventIsFromNewEngine(event: Event|TraceEngine.Types.TraceEvents.TraceEventData|
+                                     null): event is TraceEngine.Types.TraceEvents.TraceEventData {
+  return event !== null && !(event instanceof Event);
+}
diff --git a/front_end/panels/timeline/BUILD.gn b/front_end/panels/timeline/BUILD.gn
index 0ceb42d..ddb6b99 100644
--- a/front_end/panels/timeline/BUILD.gn
+++ b/front_end/panels/timeline/BUILD.gn
@@ -25,7 +25,6 @@
     "CLSLinkifier.ts",
     "CompatibilityTracksAppender.ts",
     "CountersGraph.ts",
-    "EventTypeHelpers.ts",
     "EventsTimelineTreeView.ts",
     "GPUTrackAppender.ts",
     "InteractionsTrackAppender.ts",
diff --git a/front_end/panels/timeline/EventTypeHelpers.ts b/front_end/panels/timeline/EventTypeHelpers.ts
deleted file mode 100644
index 8dfa966..0000000
--- a/front_end/panels/timeline/EventTypeHelpers.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2023 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-import * as SDK from '../../core/sdk/sdk.js';
-import * as TraceEngine from '../../models/trace/trace.js';
-
-export interface TimesForEventMs {
-  startTime: TraceEngine.Types.Timing.MilliSeconds;
-  endTime: TraceEngine.Types.Timing.MilliSeconds;
-  selfTime: TraceEngine.Types.Timing.MilliSeconds;
-  duration: TraceEngine.Types.Timing.MilliSeconds;
-}
-
-export function timesForEventInMilliseconds(event: SDK.TracingModel.Event|
-                                            TraceEngine.Types.TraceEvents.TraceEventData): TimesForEventMs {
-  if (event instanceof SDK.TracingModel.Event) {
-    return {
-      startTime: TraceEngine.Types.Timing.MilliSeconds(event.startTime),
-      endTime: TraceEngine.Types.Timing.MilliSeconds(event.endTime || event.startTime),
-      duration: TraceEngine.Types.Timing.MilliSeconds(event.duration || 0),
-      selfTime: TraceEngine.Types.Timing.MilliSeconds(event.selfTime),
-    };
-  }
-  const duration = event.dur ? TraceEngine.Helpers.Timing.microSecondsToMilliseconds(event.dur) :
-                               TraceEngine.Types.Timing.MilliSeconds(0);
-  return {
-    startTime: TraceEngine.Helpers.Timing.microSecondsToMilliseconds(event.ts),
-    endTime: TraceEngine.Helpers.Timing.microSecondsToMilliseconds(
-        TraceEngine.Types.Timing.MicroSeconds(event.ts + (event.dur || 0))),
-    duration: event.dur ? TraceEngine.Helpers.Timing.microSecondsToMilliseconds(event.dur) :
-                          TraceEngine.Types.Timing.MilliSeconds(0),
-    // TODO(crbug.com/1434599): Implement selfTime calculation for events
-    // from the new engine.
-    selfTime: duration,
-  };
-}
-// Parsed categories are cached to prevent calling cat.split() multiple
-// times on the same categories string.
-const parsedCategories = new Map<string, Set<string>>();
-export function eventHasCategory(
-    event: SDK.TracingModel.Event|TraceEngine.Types.TraceEvents.TraceEventData, category: string): boolean {
-  if (event instanceof SDK.TracingModel.Event) {
-    return event.hasCategory(category);
-  }
-  let parsedCategoriesForEvent = parsedCategories.get(event.cat);
-  if (!parsedCategoriesForEvent) {
-    parsedCategoriesForEvent = new Set(event.cat.split(',') || []);
-  }
-  return parsedCategoriesForEvent.has(category);
-}
-
-export function phaseForEvent(event: SDK.TracingModel.Event|
-                              TraceEngine.Types.TraceEvents.TraceEventData): TraceEngine.Types.TraceEvents.Phase {
-  if (event instanceof SDK.TracingModel.Event) {
-    return event.phase;
-  }
-  return event.ph;
-}
-
-export function threadIDForEvent(event: SDK.TracingModel.Event|
-                                 TraceEngine.Types.TraceEvents.TraceEventData): TraceEngine.Types.TraceEvents.ThreadID {
-  if (event instanceof SDK.TracingModel.Event) {
-    return event.thread.idInternal as TraceEngine.Types.TraceEvents.ThreadID;
-  }
-  return event.tid;
-}
-
-export function eventIsFromNewEngine(event: SDK.TracingModel.Event|TraceEngine.Types.TraceEvents.TraceEventData|
-                                     null): event is TraceEngine.Types.TraceEvents.TraceEventData {
-  return event !== null && !(event instanceof SDK.TracingModel.Event);
-}
diff --git a/front_end/panels/timeline/EventsTimelineTreeView.ts b/front_end/panels/timeline/EventsTimelineTreeView.ts
index 4e4480c..cc88630 100644
--- a/front_end/panels/timeline/EventsTimelineTreeView.ts
+++ b/front_end/panels/timeline/EventsTimelineTreeView.ts
@@ -4,11 +4,10 @@
 
 import * as Common from '../../core/common/common.js';
 import * as i18n from '../../core/i18n/i18n.js';
-import type * as SDK from '../../core/sdk/sdk.js';
+import * as SDK from '../../core/sdk/sdk.js';
 import type * as TimelineModel from '../../models/timeline_model/timeline_model.js';
 import * as DataGrid from '../../ui/legacy/components/data_grid/data_grid.js';
 import * as UI from '../../ui/legacy/legacy.js';
-import {eventIsFromNewEngine} from './EventTypeHelpers.js';
 
 import {Category, IsLong} from './TimelineFilters.js';
 
@@ -64,7 +63,7 @@
   override updateContents(selection: TimelineSelection): void {
     super.updateContents(selection);
     if (TimelineSelection.isTraceEventSelection(selection.object)) {
-      if (eventIsFromNewEngine(selection.object)) {
+      if (SDK.TracingModel.eventIsFromNewEngine(selection.object)) {
         // TODO: support new trace event types in the tree view.
         return;
       }
diff --git a/front_end/panels/timeline/TimelineDetailsView.ts b/front_end/panels/timeline/TimelineDetailsView.ts
index 4c2d0a1..4dc513c 100644
--- a/front_end/panels/timeline/TimelineDetailsView.ts
+++ b/front_end/panels/timeline/TimelineDetailsView.ts
@@ -22,7 +22,6 @@
 
 import {BottomUpTimelineTreeView, CallTreeTimelineTreeView, type TimelineTreeView} from './TimelineTreeView.js';
 import {TimelineDetailsContentHelper, TimelineUIUtils} from './TimelineUIUtils.js';
-import {eventIsFromNewEngine} from './EventTypeHelpers.js';
 
 const UIStrings = {
   /**
@@ -285,7 +284,7 @@
   private appendDetailsTabsForTraceEventAndShowDetails(
       event: SDK.TracingModel.Event|TraceEngine.Types.TraceEvents.TraceEventData, content: Node): void {
     this.setContent(content);
-    if (eventIsFromNewEngine(event)) {
+    if (SDK.TracingModel.eventIsFromNewEngine(event)) {
       // TODO(crbug.com/1386091): Add support for this use case in the
       // new engine.
       return;
diff --git a/front_end/panels/timeline/TimelineFlameChartDataProvider.ts b/front_end/panels/timeline/TimelineFlameChartDataProvider.ts
index 686ab18..ce3e065 100644
--- a/front_end/panels/timeline/TimelineFlameChartDataProvider.ts
+++ b/front_end/panels/timeline/TimelineFlameChartDataProvider.ts
@@ -41,7 +41,6 @@
 import * as ThemeSupport from '../../ui/legacy/theme_support/theme_support.js';
 
 import {CompatibilityTracksAppender, type TrackAppenderName} from './CompatibilityTracksAppender.js';
-import {eventIsFromNewEngine} from './EventTypeHelpers.js';
 
 import timelineFlamechartPopoverStyles from './timelineFlamechartPopover.css.js';
 
@@ -1203,7 +1202,7 @@
     }
     this.lastInitiatorEntry = entryIndex;
     let event = this.eventByIndex(entryIndex);
-    if (eventIsFromNewEngine(event)) {
+    if (SDK.TracingModel.eventIsFromNewEngine(event)) {
       // TODO(crbug.com/1434596): Add support for this use case in the
       // new engine.
       return false;
diff --git a/front_end/panels/timeline/TimelineSelection.ts b/front_end/panels/timeline/TimelineSelection.ts
index 124677b..7b489fb 100644
--- a/front_end/panels/timeline/TimelineSelection.ts
+++ b/front_end/panels/timeline/TimelineSelection.ts
@@ -6,8 +6,6 @@
 import * as TimelineModel from '../../models/timeline_model/timeline_model.js';
 import * as TraceEngine from '../../models/trace/trace.js';
 
-import {eventIsFromNewEngine, timesForEventInMilliseconds} from './EventTypeHelpers.js';
-
 type PermittedObjectTypes = TimelineModel.TimelineFrameModel.TimelineFrame|
                             TimelineModel.TimelineModel.NetworkRequest|SDK.TracingModel.Event|
                             TraceEngine.Types.TraceEvents.TraceEventData|SelectionRange;
@@ -58,11 +56,11 @@
         TimelineSelection.isNetworkRequestSelection(object)) {
       return false;
     }
-    return eventIsFromNewEngine(object);
+    return SDK.TracingModel.eventIsFromNewEngine(object);
   }
 
   static fromTraceEvent(event: SDK.TracingModel.Event|TraceEngine.Types.TraceEvents.TraceEventData): TimelineSelection {
-    const {startTime, endTime} = timesForEventInMilliseconds(event);
+    const {startTime, endTime} = SDK.TracingModel.timesForEventInMilliseconds(event);
     return new TimelineSelection(startTime, TraceEngine.Types.Timing.MilliSeconds(endTime || (startTime + 1)), event);
   }
 
diff --git a/front_end/panels/timeline/TimelineUIUtils.ts b/front_end/panels/timeline/TimelineUIUtils.ts
index cda4cac..f09f5c0 100644
--- a/front_end/panels/timeline/TimelineUIUtils.ts
+++ b/front_end/panels/timeline/TimelineUIUtils.ts
@@ -48,13 +48,6 @@
 import invalidationsTreeStyles from './invalidationsTree.css.js';
 // eslint-disable-next-line rulesdir/es_modules_import
 import imagePreviewStyles from '../../ui/legacy/components/utils/imagePreview.css.js';
-import {
-  timesForEventInMilliseconds,
-  eventHasCategory,
-  phaseForEvent,
-  threadIDForEvent,
-  eventIsFromNewEngine,
-} from './EventTypeHelpers.js';
 
 import {CLSRect} from './CLSLinkifier.js';
 import {TimelinePanel} from './TimelinePanel.js';
@@ -1392,8 +1385,8 @@
 
   static eventStyle(event: SDK.TracingModel.Event|TraceEngine.Types.TraceEvents.TraceEventData): TimelineRecordStyle {
     const eventStyles = TimelineUIUtils.initEventStyles();
-    if (eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console) ||
-        eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.UserTiming)) {
+    if (SDK.TracingModel.eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console) ||
+        SDK.TracingModel.eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.UserTiming)) {
       return new TimelineRecordStyle(event.name, TimelineUIUtils.categories()['scripting']);
     }
 
@@ -1439,7 +1432,7 @@
       let payload: TraceEngine.Types.TraceEvents.TraceEventData|null = null;
       if (event instanceof SDK.TracingModel.PayloadEvent) {
         payload = event.rawPayload();
-      } else if (eventIsFromNewEngine(event)) {
+      } else if (SDK.TracingModel.eventIsFromNewEngine(event)) {
         payload = event;
       }
 
@@ -1449,7 +1442,7 @@
       }
     }
     const title = TimelineUIUtils.eventStyle(event).title;
-    if (eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console)) {
+    if (SDK.TracingModel.eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console)) {
       return title;
     }
     if (event.name === recordType.TimeStamp) {
@@ -1626,7 +1619,7 @@
         break;
 
       default:
-        if (eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console)) {
+        if (SDK.TracingModel.eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console)) {
           detailsText = null;
         } else {
           detailsText = await linkifyTopCallFrameAsText();
@@ -1763,7 +1756,7 @@
       }
 
       default: {
-        if (eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console)) {
+        if (SDK.TracingModel.eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console)) {
           detailsText = null;
         } else {
           details = this.linkifyTopCallFrame(event, target, linkifier, isFreshRecording);
@@ -1871,7 +1864,7 @@
       traceParseData: TraceEngine.TraceModel.PartialTraceParseDataDuringMigration|null = null,
       ): Promise<DocumentFragment> {
     const maybeTarget = model.targetByEvent(event);
-    const {duration, selfTime} = timesForEventInMilliseconds(event);
+    const {duration, selfTime} = SDK.TracingModel.timesForEventInMilliseconds(event);
     let relatedNodesMap: (Map<number, SDK.DOMModel.DOMNode|null>|null)|null = null;
     if (maybeTarget) {
       const target = (maybeTarget as SDK.Target.Target);
@@ -1946,9 +1939,9 @@
     // this information in the handlers, and read it here.
     if (event.name === recordTypes.EventTiming && duration > TraceEngine.Types.Timing.MilliSeconds(200)) {
       // This ensures we do not have a ConstructedEvent which are not ever going to be Interaction events.
-      const eventHasPayload = eventIsFromNewEngine(event) || SDK.TracingModel.eventHasPayload(event);
+      const eventHasPayload = SDK.TracingModel.eventIsFromNewEngine(event) || SDK.TracingModel.eventHasPayload(event);
       if (eventHasPayload) {
-        const payload = eventIsFromNewEngine(event) ? event : event.rawPayload();
+        const payload = SDK.TracingModel.eventIsFromNewEngine(event) ? event : event.rawPayload();
         if (TraceEngine.Types.TraceEvents.isSyntheticInteractionEvent(payload)) {
           contentHelper.appendWarningRow(
               event, TimelineModel.TimelineModel.TimelineModelImpl.WarningType.LongInteraction);
@@ -2218,7 +2211,7 @@
       }
 
       case recordTypes.Animation: {
-        if (phaseForEvent(event) === TraceEngine.Types.TraceEvents.Phase.ASYNC_NESTABLE_INSTANT) {
+        if (SDK.TracingModel.phaseForEvent(event) === TraceEngine.Types.TraceEvents.Phase.ASYNC_NESTABLE_INSTANT) {
           contentHelper.appendTextRow(i18nString(UIStrings.state), eventData['state']);
         }
         break;
@@ -2283,7 +2276,7 @@
           contentHelper.appendElementRow(i18nString(UIStrings.details), detailsNode);
         }
         let payload: TraceEngine.Types.TraceEvents.TraceEventData|null = null;
-        if (eventIsFromNewEngine(event)) {
+        if (SDK.TracingModel.eventIsFromNewEngine(event)) {
           payload = event;
         } else if (SDK.TracingModel.eventHasPayload(event)) {
           payload = event.rawPayload();
@@ -2296,7 +2289,8 @@
       }
 
       case recordTypes.LayoutShift: {
-        if (!eventIsFromNewEngine(event) || !TraceEngine.Types.TraceEvents.isSyntheticLayoutShift(event)) {
+        if (!SDK.TracingModel.eventIsFromNewEngine(event) ||
+            !TraceEngine.Types.TraceEvents.isSyntheticLayoutShift(event)) {
           console.error('Unexpected type for LayoutShift event');
           break;
         }
@@ -2632,7 +2626,7 @@
       event: SDK.TracingModel.Event|TraceEngine.Types.TraceEvents.TraceEventData, target: SDK.Target.Target|null,
       relatedNodesMap: Map<number, SDK.DOMModel.DOMNode|null>|null, contentHelper: TimelineDetailsContentHelper): void {
     const recordTypes = TimelineModel.TimelineModel.RecordType;
-    const {startTime} = timesForEventInMilliseconds(event);
+    const {startTime} = SDK.TracingModel.timesForEventInMilliseconds(event);
     let callSiteStackLabel;
     let stackLabel;
 
@@ -2793,7 +2787,7 @@
       model: TimelineModel.TimelineModel.TimelineModelImpl,
       event: SDK.TracingModel.Event|TraceEngine.Types.TraceEvents.TraceEventData): boolean {
     const events = model.inspectedTargetEvents();
-    const {startTime, endTime} = timesForEventInMilliseconds(event);
+    const {startTime, endTime} = SDK.TracingModel.timesForEventInMilliseconds(event);
     function eventComparator(startTime: number, e: SDK.TracingModel.Event): number {
       return startTime - e.startTime;
     }
@@ -2813,7 +2807,7 @@
         if (!nextEvent.selfTime) {
           continue;
         }
-        if (threadIDForEvent(nextEvent) !== threadIDForEvent(event)) {
+        if (SDK.TracingModel.threadIDForEvent(nextEvent) !== SDK.TracingModel.threadIDForEvent(event)) {
           continue;
         }
         if (i > index) {
@@ -2823,7 +2817,7 @@
         total[categoryName] = (total[categoryName] || 0) + nextEvent.selfTime;
       }
     }
-    if (TraceEngine.Types.TraceEvents.isAsyncPhase(phaseForEvent(event))) {
+    if (TraceEngine.Types.TraceEvents.isAsyncPhase(SDK.TracingModel.phaseForEvent(event))) {
       if (endTime) {
         let aggregatedTotal = 0;
         for (const categoryName in total) {
@@ -3113,14 +3107,16 @@
     const recordTypes = TimelineModel.TimelineModel.RecordType;
 
     if (event.name !== recordTypes.NavigationStart &&
-        (eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console) ||
-         eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.UserTiming))) {
+        (SDK.TracingModel.eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.Console) ||
+         SDK.TracingModel.eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.UserTiming))) {
       return {
         title: title,
         dashStyle: tallMarkerDashStyle,
         lineWidth: 0.5,
-        color: eventHasCategory(event, TimelineModel.TimelineModel.TimelineModelImpl.Category.UserTiming) ? 'purple' :
-                                                                                                            'orange',
+        color: SDK.TracingModel.eventHasCategory(
+                   event, TimelineModel.TimelineModel.TimelineModelImpl.Category.UserTiming) ?
+            'purple' :
+            'orange',
         tall: false,
         lowPriority: false,
       };
@@ -3183,7 +3179,7 @@
       Element|null {
     const timelineData =
         event instanceof SDK.TracingModel.Event ? TimelineModel.TimelineModel.TimelineData.forEvent(event) : null;
-    const {duration} = timesForEventInMilliseconds(event);
+    const {duration} = SDK.TracingModel.timesForEventInMilliseconds(event);
     const warning = warningType || timelineData?.warning;
     if (!warning) {
       return null;
@@ -3662,8 +3658,8 @@
     model: TimelineModel.TimelineModel.TimelineModelImpl,
     traceParsedData: TraceEngine.TraceModel.PartialTraceParseDataDuringMigration|
     null): TraceEngine.Types.Timing.MilliSeconds {
-  const {startTime} = timesForEventInMilliseconds(event);
-  if (eventIsFromNewEngine(event) && traceParsedData) {
+  const {startTime} = SDK.TracingModel.timesForEventInMilliseconds(event);
+  if (SDK.TracingModel.eventIsFromNewEngine(event) && traceParsedData) {
     const time = TraceEngine.Helpers.Timing.timeStampForEventAdjustedByClosestNavigation(
         event,
         traceParsedData.Meta.traceBounds,
diff --git a/front_end/panels/timeline/timeline.ts b/front_end/panels/timeline/timeline.ts
index 8c65768..de8c72c 100644
--- a/front_end/panels/timeline/timeline.ts
+++ b/front_end/panels/timeline/timeline.ts
@@ -7,7 +7,6 @@
 import * as CompatibilityTracksAppender from './CompatibilityTracksAppender.js';
 import * as CountersGraph from './CountersGraph.js';
 import * as EventsTimelineTreeView from './EventsTimelineTreeView.js';
-import * as EventTypeHelpers from './EventTypeHelpers.js';
 import * as GPUTrackAppender from './GPUTrackAppender.js';
 import * as InteractionsTrackAppender from './InteractionsTrackAppender.js';
 import * as LayoutShiftsTrackAppender from './LayoutShiftsTrackAppender.js';
@@ -38,7 +37,6 @@
   CompatibilityTracksAppender,
   CountersGraph,
   EventsTimelineTreeView,
-  EventTypeHelpers,
   GPUTrackAppender,
   InteractionsTrackAppender,
   LayoutShiftsTrackAppender,
diff --git a/test/unittests/front_end/panels/timeline/EventTypeHelpers_test.ts b/test/unittests/front_end/panels/timeline/EventTypeHelpers_test.ts
index 01503d7..0c470e0 100644
--- a/test/unittests/front_end/panels/timeline/EventTypeHelpers_test.ts
+++ b/test/unittests/front_end/panels/timeline/EventTypeHelpers_test.ts
@@ -4,7 +4,6 @@
 
 import * as SDK from '../../../../../front_end/core/sdk/sdk.js';
 import * as TraceEngine from '../../../../../front_end/models/trace/trace.js';
-import * as Timeline from '../../../../../front_end/panels/timeline/timeline.js';
 
 import {
   makeFakeSDKEventFromPayload,
@@ -26,7 +25,7 @@
       };
       const event = makeFakeSDKEventFromPayload(payload);
       event.selfTime = 5;
-      const times = Timeline.EventTypeHelpers.timesForEventInMilliseconds(event);
+      const times = SDK.TracingModel.timesForEventInMilliseconds(event);
       assert.deepEqual(times, {
         startTime: TraceEngine.Types.Timing.MilliSeconds(10),
         endTime: TraceEngine.Types.Timing.MilliSeconds(15),
@@ -43,7 +42,7 @@
         ts: 10_000,
       };
       const event = makeFakeSDKEventFromPayload(payload);
-      const times = Timeline.EventTypeHelpers.timesForEventInMilliseconds(event);
+      const times = SDK.TracingModel.timesForEventInMilliseconds(event);
       assert.deepEqual(times, {
         startTime: TraceEngine.Types.Timing.MilliSeconds(10),
         endTime: TraceEngine.Types.Timing.MilliSeconds(10),
@@ -61,7 +60,7 @@
         dur: TraceEngine.Types.Timing.MicroSeconds(5_000),
       };
 
-      const times = Timeline.EventTypeHelpers.timesForEventInMilliseconds(event);
+      const times = SDK.TracingModel.timesForEventInMilliseconds(event);
       assert.deepEqual(times, {
         startTime: TraceEngine.Types.Timing.MilliSeconds(10),
         endTime: TraceEngine.Types.Timing.MilliSeconds(15),
@@ -77,7 +76,7 @@
         ts: TraceEngine.Types.Timing.MicroSeconds(10_000),
       };
 
-      const times = Timeline.EventTypeHelpers.timesForEventInMilliseconds(event);
+      const times = SDK.TracingModel.timesForEventInMilliseconds(event);
       assert.deepEqual(times, {
         startTime: TraceEngine.Types.Timing.MilliSeconds(10),
         endTime: TraceEngine.Types.Timing.MilliSeconds(10),
@@ -96,8 +95,8 @@
         dur: 5_000,
       };
       const event = makeFakeSDKEventFromPayload(payload);
-      const hasCategory = Timeline.EventTypeHelpers.eventHasCategory(event, 'testing2');
-      const notHasCategory = Timeline.EventTypeHelpers.eventHasCategory(event, 'not-testing');
+      const hasCategory = SDK.TracingModel.eventHasCategory(event, 'testing2');
+      const notHasCategory = SDK.TracingModel.eventHasCategory(event, 'not-testing');
       assert.isTrue(hasCategory);
       assert.isFalse(notHasCategory);
     });
@@ -108,8 +107,8 @@
         name: 'test-event',
         cat: 'disabled-by-default-devtools.timeline,blink.console',
       };
-      const hasCategory = Timeline.EventTypeHelpers.eventHasCategory(event, 'blink.console');
-      const notHasCategory = Timeline.EventTypeHelpers.eventHasCategory(event, 'timeline');
+      const hasCategory = SDK.TracingModel.eventHasCategory(event, 'blink.console');
+      const notHasCategory = SDK.TracingModel.eventHasCategory(event, 'timeline');
       assert.isTrue(hasCategory);
       assert.isFalse(notHasCategory);
     });
@@ -124,7 +123,7 @@
         dur: 5_000,
       };
       const event = makeFakeSDKEventFromPayload(payload);
-      const phase = Timeline.EventTypeHelpers.phaseForEvent(event);
+      const phase = SDK.TracingModel.phaseForEvent(event);
       assert.strictEqual(phase, TraceEngine.Types.TraceEvents.Phase.BEGIN);
     });
 
@@ -133,7 +132,7 @@
         ...defaultTraceEvent,
         ph: TraceEngine.Types.TraceEvents.Phase.BEGIN,
       };
-      const phase = Timeline.EventTypeHelpers.phaseForEvent(event);
+      const phase = SDK.TracingModel.phaseForEvent(event);
       assert.strictEqual(phase, TraceEngine.Types.TraceEvents.Phase.BEGIN);
     });
   });
@@ -151,7 +150,7 @@
       const process = new SDK.TracingModel.Process(tracingModel, 1);
       const thread = new SDK.TracingModel.Thread(process, 1);
       const event = SDK.TracingModel.PayloadEvent.fromPayload(payload, thread);
-      const threadID = Timeline.EventTypeHelpers.threadIDForEvent(event);
+      const threadID = SDK.TracingModel.threadIDForEvent(event);
       assert.strictEqual(threadID, 1);
     });
 
@@ -161,7 +160,7 @@
         ph: TraceEngine.Types.TraceEvents.Phase.BEGIN,
         tid: 2 as TraceEngine.Types.TraceEvents.ThreadID,
       };
-      const phase = Timeline.EventTypeHelpers.threadIDForEvent(event);
+      const phase = SDK.TracingModel.threadIDForEvent(event);
       assert.strictEqual(phase, 2 as TraceEngine.Types.TraceEvents.ThreadID);
     });
   });
diff --git a/test/unittests/front_end/panels/timeline/TimelineSelection_test.ts b/test/unittests/front_end/panels/timeline/TimelineSelection_test.ts
index ba69c81..383b052 100644
--- a/test/unittests/front_end/panels/timeline/TimelineSelection_test.ts
+++ b/test/unittests/front_end/panels/timeline/TimelineSelection_test.ts
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import * as SDK from '../../../../../front_end/core/sdk/sdk.js';
 import * as TimelineModel from '../../../../../front_end/models/timeline_model/timeline_model.js';
 import * as Timeline from '../../../../../front_end/panels/timeline/timeline.js';
 import {describeWithEnvironment} from '../../helpers/EnvironmentHelpers.js';
@@ -62,9 +63,8 @@
     }
     const selection = Timeline.TimelineSelection.TimelineSelection.fromTraceEvent(firstLCPEvent);
     assert.strictEqual(selection.object, firstLCPEvent);
-    assert.strictEqual(
-        selection.startTime, Timeline.EventTypeHelpers.timesForEventInMilliseconds(firstLCPEvent).startTime);
-    assert.strictEqual(selection.endTime, Timeline.EventTypeHelpers.timesForEventInMilliseconds(firstLCPEvent).endTime);
+    assert.strictEqual(selection.startTime, SDK.TracingModel.timesForEventInMilliseconds(firstLCPEvent).startTime);
+    assert.strictEqual(selection.endTime, SDK.TracingModel.timesForEventInMilliseconds(firstLCPEvent).endTime);
     assert.isTrue(Timeline.TimelineSelection.TimelineSelection.isTraceEventSelection(selection.object));
   });