[ui] Rename various things.

PluginTrackInfo -> TrackDescriptor
Track -> TrackBase
TrackLike -> Track
TracePluginContext -> PluginContextTrace (like Vnode vs VnodeDOM)
TrackInfo -> TrackInstanceDescriptor
registerTrack() -> LEGACY_registerTrack()
registerTrackController() -> LEGACY_registerTrackController()
PluginInfo -> PluginDescriptor
TrackDescriptor.trackFactory -> TrackDescriptor.track

Change-Id: Ib267ca2a445eac010e2e87e8252aa9991dbaba90
diff --git a/ui/src/common/basic_async_track.ts b/ui/src/common/basic_async_track.ts
index 24e3f28..2faf829 100644
--- a/ui/src/common/basic_async_track.ts
+++ b/ui/src/common/basic_async_track.ts
@@ -20,7 +20,7 @@
 import {PxSpan, TimeScale} from '../frontend/time_scale';
 import {SliceRect} from '../frontend/track';
 import {TrackButtonAttrs} from '../frontend/track_panel';
-import {TrackLike} from '../public';
+import {Track} from '../public';
 
 import {TrackData} from './track_data';
 
@@ -40,7 +40,7 @@
 // This provides the logic to perform data reloads at appropriate times as the
 // window is panned and zoomed about.
 // The extending class need only define renderCanvas() and onBoundsChange().
-export abstract class BasicAsyncTrack<Data> implements TrackLike {
+export abstract class BasicAsyncTrack<Data> implements Track {
   private requestingData = false;
   private queuedRequest = false;
   private currentState?: TrackData;
diff --git a/ui/src/common/plugins.ts b/ui/src/common/plugins.ts
index 7278e06..13a4e10 100644
--- a/ui/src/common/plugins.ts
+++ b/ui/src/common/plugins.ts
@@ -30,14 +30,14 @@
   Plugin,
   PluginClass,
   PluginContext,
-  PluginInfo,
-  PluginTrackInfo,
+  PluginContextTrace,
+  PluginDescriptor,
   StatefulPlugin,
   Store,
-  TracePluginContext,
+  Track,
   TrackContext,
-  TrackInfo,
-  TrackLike,
+  TrackDescriptor,
+  TrackInstanceDescriptor,
   Viewer,
 } from '../public';
 
@@ -73,13 +73,13 @@
     });
   }
 
-  registerTrackController(track: TrackControllerFactory): void {
+  LEGACY_registerTrackController(track: TrackControllerFactory): void {
     if (!this.alive) return;
     const unregister = trackControllerRegistry.register(track);
     this.trash.add(unregister);
   }
 
-  registerTrack(track: TrackCreator): void {
+  LEGACY_registerTrack(track: TrackCreator): void {
     if (!this.alive) return;
     const unregister = trackRegistry.register(track);
     this.trash.add(unregister);
@@ -95,30 +95,30 @@
 // related resources, such as the engine and the store.
 // The TracePluginContext exists for the whole duration a plugin is active AND a
 // trace is loaded.
-class TracePluginContextImpl<T> implements TracePluginContext<T>, Disposable {
+class TracePluginContextImpl<T> implements PluginContextTrace<T>, Disposable {
   private trash = new Trash();
   private alive = true;
 
   constructor(
       private ctx: PluginContext, readonly store: Store<T>,
       readonly engine: EngineProxy,
-      readonly trackRegistry: Map<string, PluginTrackInfo>,
-      private suggestedTracks: Set<TrackInfo>,
+      readonly trackRegistry: Map<string, TrackDescriptor>,
+      private suggestedTracks: Set<TrackInstanceDescriptor>,
       private commandRegistry: Map<string, Command>) {
     this.trash.add(engine);
     this.trash.add(store);
   }
 
-  registerTrackController(track: TrackControllerFactory): void {
+  LEGACY_registerTrackController(track: TrackControllerFactory): void {
     // Silently ignore if context is dead.
     if (!this.alive) return;
-    this.ctx.registerTrackController(track);
+    this.ctx.LEGACY_registerTrackController(track);
   }
 
-  registerTrack(track: TrackCreator): void {
+  LEGACY_registerTrack(track: TrackCreator): void {
     // Silently ignore if context is dead.
     if (!this.alive) return;
-    this.ctx.registerTrack(track);
+    this.ctx.LEGACY_registerTrack(track);
   }
 
   addCommand(cmd: Command): void {
@@ -143,7 +143,7 @@
   // Register a new track in this context.
   // All tracks registered through this method are removed when this context is
   // destroyed, i.e. when the trace is unloaded.
-  addTrack(trackDetails: PluginTrackInfo): void {
+  addTrack(trackDetails: TrackDescriptor): void {
     // Silently ignore if context is dead.
     if (!this.alive) return;
     const {uri} = trackDetails;
@@ -156,7 +156,7 @@
   // This is a direct replacement for findPotentialTracks().
   // Note: This interface is likely to be deprecated soon, but is required while
   // both plugin and original type tracks coexist.
-  suggestTrack(trackInfo: TrackInfo): void {
+  suggestTrack(trackInfo: TrackInstanceDescriptor): void {
     this.suggestedTracks.add(trackInfo);
     this.trash.addCallback(() => this.suggestedTracks.delete(trackInfo));
   }
@@ -168,7 +168,7 @@
 }
 
 // 'Static' registry of all known plugins.
-export class PluginRegistry extends Registry<PluginInfo<unknown>> {
+export class PluginRegistry extends Registry<PluginDescriptor<unknown>> {
   constructor() {
     super((info) => info.pluginId);
   }
@@ -184,19 +184,17 @@
   return typeof v === 'function' && !!(v.prototype.onActivate);
 }
 
-function makePlugin<T>(info: PluginInfo<T>): Plugin<T> {
-  const {plugin: pluginFactory} = info;
+function makePlugin<T>(info: PluginDescriptor<T>): Plugin<T> {
+  const {plugin} = info;
 
-  if (typeof pluginFactory === 'function') {
-    if (isPluginClass(pluginFactory)) {
-      const PluginClass = pluginFactory;
+  if (typeof plugin === 'function') {
+    if (isPluginClass(plugin)) {
+      const PluginClass = plugin;
       return new PluginClass();
     } else {
-      return pluginFactory();
+      return plugin();
     }
   } else {
-    // pluginFactory is the plugin!
-    const plugin = pluginFactory;
     return plugin;
   }
 }
@@ -205,9 +203,9 @@
   private registry: PluginRegistry;
   private plugins: Map<string, PluginDetails<unknown>>;
   private engine?: Engine;
-  readonly trackRegistry = new Map<string, PluginTrackInfo>();
+  readonly trackRegistry = new Map<string, TrackDescriptor>();
   readonly commandRegistry = new Map<string, Command>();
-  readonly suggestedTracks = new Set<TrackInfo>();
+  readonly suggestedTracks = new Set<TrackInstanceDescriptor>();
 
   constructor(registry: PluginRegistry) {
     this.registry = registry;
@@ -265,7 +263,7 @@
     return this.plugins.get(pluginId);
   }
 
-  findPotentialTracks(): TrackInfo[] {
+  findPotentialTracks(): TrackInstanceDescriptor[] {
     return Array.from(this.suggestedTracks);
   }
 
@@ -300,15 +298,15 @@
 
   // Look up track into for a given track's URI.
   // Returns |undefined| if no track can be found.
-  resolveTrackInfo(uri: string): PluginTrackInfo|undefined {
+  resolveTrackInfo(uri: string): TrackDescriptor|undefined {
     return this.trackRegistry.get(uri);
   }
 
   // Create a new plugin track object from its URI.
   // Returns undefined if no such track is registered.
-  createTrack(uri: string, trackCtx: TrackContext): TrackLike|undefined {
+  createTrack(uri: string, trackCtx: TrackContext): Track|undefined {
     const trackInfo = pluginManager.trackRegistry.get(uri);
-    return trackInfo && trackInfo.trackFactory(trackCtx);
+    return trackInfo && trackInfo.track(trackCtx);
   }
 
   private doPluginTraceLoad<T>(
diff --git a/ui/src/frontend/base_slice_track.ts b/ui/src/frontend/base_slice_track.ts
index f16057b..e95fb20 100644
--- a/ui/src/frontend/base_slice_track.ts
+++ b/ui/src/frontend/base_slice_track.ts
@@ -40,7 +40,7 @@
 import {DEFAULT_SLICE_LAYOUT, SliceLayout} from './slice_layout';
 import {constraintsToQuerySuffix} from './sql_utils';
 import {PxSpan, TimeScale} from './time_scale';
-import {NewTrackArgs, SliceRect, Track} from './track';
+import {NewTrackArgs, SliceRect, TrackBase} from './track';
 import {BUCKETS_PER_PIXEL, CacheKey, TrackCache} from './track_cache';
 
 // The common class that underpins all tracks drawing slices.
@@ -179,7 +179,7 @@
 
 export abstract class BaseSliceTrack<T extends BaseSliceTrackTypes =
                                                    BaseSliceTrackTypes> extends
-    Track<T['config']> {
+    TrackBase<T['config']> {
   protected sliceLayout: SliceLayout = {...DEFAULT_SLICE_LAYOUT};
 
   // This is the over-skirted cached bounds:
diff --git a/ui/src/frontend/track.ts b/ui/src/frontend/track.ts
index 31e9c79..6ddbc51 100644
--- a/ui/src/frontend/track.ts
+++ b/ui/src/frontend/track.ts
@@ -19,7 +19,7 @@
 import {EngineProxy} from '../common/engine';
 import {TrackState} from '../common/state';
 import {TrackData} from '../common/track_data';
-import {TrackLike} from '../public';
+import {Track} from '../public';
 
 import {checkerboard} from './checkerboard';
 import {globals} from './globals';
@@ -42,7 +42,7 @@
 
   // We need the |create| method because the stored value in the registry can be
   // an abstract class, and we cannot call 'new' on an abstract class.
-  create(args: NewTrackArgs): Track;
+  create(args: NewTrackArgs): TrackBase;
 }
 
 export interface SliceRect {
@@ -54,8 +54,8 @@
 }
 
 // The abstract class that needs to be implemented by all tracks.
-export abstract class Track<Config = {}, Data extends TrackData = TrackData>
-    implements TrackLike {
+export abstract class TrackBase<Config = {}, Data extends TrackData = TrackData>
+    implements Track {
   // The UI-generated track ID (not to be confused with the SQL track.id).
   protected readonly trackId: string;
   protected readonly engine: EngineProxy;
diff --git a/ui/src/frontend/track_group_panel.ts b/ui/src/frontend/track_group_panel.ts
index b5cc4ee..b378189 100644
--- a/ui/src/frontend/track_group_panel.ts
+++ b/ui/src/frontend/track_group_panel.ts
@@ -25,7 +25,7 @@
   TrackGroupState,
   TrackState,
 } from '../common/state';
-import {Migrate, TrackContext, TrackLike} from '../public';
+import {Migrate, Track, TrackContext} from '../public';
 
 import {globals} from './globals';
 import {drawGridLines} from './gridline_helper';
@@ -45,7 +45,7 @@
   private readonly trackGroupId: string;
   private shellWidth = 0;
   private backgroundColor = '#ffffff';  // Updated from CSS later.
-  private summaryTrack?: TrackLike;
+  private summaryTrack?: Track;
 
   constructor({attrs}: m.CVnode<Attrs>) {
     super();
@@ -305,8 +305,7 @@
   return path.split('/').slice(-1)[0];
 }
 
-function loadTrack(trackState: TrackState, trackId: string): TrackLike|
-    undefined {
+function loadTrack(trackState: TrackState, trackId: string): Track|undefined {
   const engine = globals.engines.get(trackState.engineId);
   if (engine === undefined) {
     return undefined;
diff --git a/ui/src/frontend/track_panel.ts b/ui/src/frontend/track_panel.ts
index 202aa51..c280ced 100644
--- a/ui/src/frontend/track_panel.ts
+++ b/ui/src/frontend/track_panel.ts
@@ -24,7 +24,7 @@
 import {RegistryError} from '../common/registry';
 import {TrackState} from '../common/state';
 import {raf} from '../core/raf_scheduler';
-import {Migrate, TrackContext, TrackLike} from '../public';
+import {Migrate, Track, TrackContext} from '../public';
 
 import {SELECTION_FILL_COLOR, TRACK_SHELL_WIDTH} from './css_constants';
 import {globals} from './globals';
@@ -101,7 +101,7 @@
 }
 
 interface TrackShellAttrs {
-  track: TrackLike;
+  track: Track;
   trackState: TrackState;
 }
 
@@ -233,7 +233,7 @@
 }
 
 export interface TrackContentAttrs {
-  track: TrackLike;
+  track: Track;
 }
 export class TrackContent implements m.ClassComponent<TrackContentAttrs> {
   private mouseDownX?: number;
@@ -292,7 +292,7 @@
 
 interface TrackComponentAttrs {
   trackState: TrackState;
-  track: TrackLike;
+  track: Track;
 }
 class TrackComponent implements m.ClassComponent<TrackComponentAttrs> {
   view({attrs}: m.CVnode<TrackComponentAttrs>) {
@@ -356,7 +356,7 @@
   // TODO(hjd): It would be nicer if these could not be undefined here.
   // We should implement a NullTrack which can be used if the trackState
   // has disappeared.
-  private track: TrackLike|undefined;
+  private track: Track|undefined;
   private trackState: TrackState|undefined;
 
   private tryLoadTrack(vnode: m.CVnode<TrackPanelAttrs>) {
@@ -520,8 +520,7 @@
   }
 }
 
-function loadTrack(trackState: TrackState, trackId: string): TrackLike|
-    undefined {
+function loadTrack(trackState: TrackState, trackId: string): Track|undefined {
   const engine = globals.engines.get(trackState.engineId);
   if (engine === undefined) {
     return undefined;
diff --git a/ui/src/plugins/com.example.Skeleton/index.ts b/ui/src/plugins/com.example.Skeleton/index.ts
index 0881b5f..354cb7f 100644
--- a/ui/src/plugins/com.example.Skeleton/index.ts
+++ b/ui/src/plugins/com.example.Skeleton/index.ts
@@ -16,9 +16,9 @@
   MetricVisualisation,
   Plugin,
   PluginContext,
-  PluginInfo,
-  TracePluginContext,
-  TrackInfo,
+  PluginContextTrace,
+  PluginDescriptor,
+  TrackInstanceDescriptor,
 } from '../../public';
 
 interface State {
@@ -35,11 +35,11 @@
     return {foo: 'bar'};
   }
 
-  async onTraceLoad(_: TracePluginContext<State>): Promise<void> {
+  async onTraceLoad(_: PluginContextTrace<State>): Promise<void> {
     //
   }
 
-  async onTraceUnload(_: TracePluginContext<State>): Promise<void> {
+  async onTraceUnload(_: PluginContextTrace<State>): Promise<void> {
     //
   }
 
@@ -47,17 +47,17 @@
     //
   }
 
-  async findPotentialTracks(_: TracePluginContext<State>):
-      Promise<TrackInfo[]> {
+  async findPotentialTracks(_: PluginContextTrace<State>):
+      Promise<TrackInstanceDescriptor[]> {
     return [];
   }
 
-  metricVisualisations(_: TracePluginContext<State>): MetricVisualisation[] {
+  metricVisualisations(_: PluginContextTrace<State>): MetricVisualisation[] {
     return [];
   }
 }
 
-export const plugin: PluginInfo<State> = {
+export const plugin: PluginDescriptor<State> = {
   // SKELETON: Update pluginId to match the directory of the plugin.
   pluginId: 'com.example.Skeleton',
   plugin: Skeleton,
diff --git a/ui/src/plugins/dev.perfetto.AndroidBinderViz/index.ts b/ui/src/plugins/dev.perfetto.AndroidBinderViz/index.ts
index c7e0c8c..a77b14e 100644
--- a/ui/src/plugins/dev.perfetto.AndroidBinderViz/index.ts
+++ b/ui/src/plugins/dev.perfetto.AndroidBinderViz/index.ts
@@ -16,7 +16,7 @@
   MetricVisualisation,
   Plugin,
   PluginContext,
-  PluginInfo,
+  PluginDescriptor,
 } from '../../public';
 
 const SPEC = `
@@ -50,7 +50,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'dev.perfetto.AndroidBinderVizPlugin',
   plugin: AndroidBinderVizPlugin,
 };
diff --git a/ui/src/plugins/dev.perfetto.AndroidCujs/index.ts b/ui/src/plugins/dev.perfetto.AndroidCujs/index.ts
index 3870cfe..8947364 100644
--- a/ui/src/plugins/dev.perfetto.AndroidCujs/index.ts
+++ b/ui/src/plugins/dev.perfetto.AndroidCujs/index.ts
@@ -15,7 +15,7 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
+  PluginDescriptor,
 } from '../../public';
 
 class AndroidCujs implements Plugin {
@@ -130,7 +130,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'dev.perfetto.AndroidCujs',
   plugin: AndroidCujs,
 };
diff --git a/ui/src/plugins/dev.perfetto.AndroidPerf/index.ts b/ui/src/plugins/dev.perfetto.AndroidPerf/index.ts
index 17aa796..feb7080 100644
--- a/ui/src/plugins/dev.perfetto.AndroidPerf/index.ts
+++ b/ui/src/plugins/dev.perfetto.AndroidPerf/index.ts
@@ -15,7 +15,7 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
+  PluginDescriptor,
 } from '../../public';
 
 class AndroidPerf implements Plugin {
@@ -60,7 +60,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'dev.perfetto.AndroidPerf',
   plugin: AndroidPerf,
 };
diff --git a/ui/src/plugins/dev.perfetto.CoreCommands/index.ts b/ui/src/plugins/dev.perfetto.CoreCommands/index.ts
index fedc300..5b94d08 100644
--- a/ui/src/plugins/dev.perfetto.CoreCommands/index.ts
+++ b/ui/src/plugins/dev.perfetto.CoreCommands/index.ts
@@ -15,7 +15,7 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
+  PluginDescriptor,
 } from '../../public';
 
 const SQL_STATS = `
@@ -174,7 +174,7 @@
   },
 };
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'dev.perfetto.CoreCommands',
   plugin: coreCommands,
 };
diff --git a/ui/src/plugins/dev.perfetto.ExampleSimpleCommand/index.ts b/ui/src/plugins/dev.perfetto.ExampleSimpleCommand/index.ts
index 1051784..4bb6e12 100644
--- a/ui/src/plugins/dev.perfetto.ExampleSimpleCommand/index.ts
+++ b/ui/src/plugins/dev.perfetto.ExampleSimpleCommand/index.ts
@@ -15,7 +15,7 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
+  PluginDescriptor,
 } from '../../public';
 
 // This is just an example plugin, used to prove that the plugin system works.
@@ -29,7 +29,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'dev.perfetto.ExampleSimpleCommand',
   plugin: ExampleSimpleCommand,
 };
diff --git a/ui/src/plugins/dev.perfetto.ExampleState/index.ts b/ui/src/plugins/dev.perfetto.ExampleState/index.ts
index a124f71..a18cfe2 100644
--- a/ui/src/plugins/dev.perfetto.ExampleState/index.ts
+++ b/ui/src/plugins/dev.perfetto.ExampleState/index.ts
@@ -15,8 +15,8 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
-  TracePluginContext,
+  PluginContextTrace,
+  PluginDescriptor,
 } from '../../public';
 
 interface State {
@@ -39,7 +39,7 @@
     //
   }
 
-  async onTraceLoad(ctx: TracePluginContext<State>): Promise<void> {
+  async onTraceLoad(ctx: PluginContextTrace<State>): Promise<void> {
     const {viewer, store} = ctx;
     ctx.addCommand({
       id: 'dev.perfetto.ExampleState#ShowCounter',
@@ -54,7 +54,7 @@
   }
 }
 
-export const plugin: PluginInfo<State> = {
+export const plugin: PluginDescriptor<State> = {
   pluginId: 'dev.perfetto.ExampleState',
   plugin: ExampleState,
 };
diff --git a/ui/src/plugins/dev.perfetto.LargeScreensPerf/index.ts b/ui/src/plugins/dev.perfetto.LargeScreensPerf/index.ts
index 07881da..07872ed 100644
--- a/ui/src/plugins/dev.perfetto.LargeScreensPerf/index.ts
+++ b/ui/src/plugins/dev.perfetto.LargeScreensPerf/index.ts
@@ -15,7 +15,7 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
+  PluginDescriptor,
 } from '../../public';
 
 class LargeScreensPerf implements Plugin {
@@ -36,7 +36,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'dev.perfetto.LargeScreensPerf',
   plugin: LargeScreensPerf,
 };
diff --git a/ui/src/public/index.ts b/ui/src/public/index.ts
index 8c90493..60ab2b8 100644
--- a/ui/src/public/index.ts
+++ b/ui/src/public/index.ts
@@ -154,7 +154,7 @@
   // 'TrackController' and a 'Track'. In more recent versions of the UI
   // the functionality of |TrackController| has been merged into Track so
   // |TrackController|s are not necessary in new code.
-  registerTrackController(track: TrackControllerFactory): void;
+  LEGACY_registerTrackController(track: TrackControllerFactory): void;
 
   // Register a track factory. The core UI invokes |TrackCreator| to
   // construct tracks discovered by invoking |TrackProvider|s.
@@ -164,7 +164,7 @@
   // which returns GPU counter tracks. The counter track factory itself
   // could be registered in dev.perfetto.CounterTrack - a whole
   // different plugin.
-  registerTrack(track: TrackCreator): void;
+  LEGACY_registerTrack(track: TrackCreator): void;
 
   // Add a command.
   addCommand(command: Command): void;
@@ -187,9 +187,7 @@
   mountStore<State>(migrate: Migrate<State>): Store<State>;
 }
 
-// TODO(stevegolton): Rename `Track` to `BaseTrack` (or similar) and rename this
-// interface to `Track`.
-export interface TrackLike {
+export interface Track {
   onCreate(): void;
   render(ctx: CanvasRenderingContext2D): void;
   onFullRedraw(): void;
@@ -206,7 +204,7 @@
   onDestroy(): void;
 }
 
-export interface PluginTrackInfo {
+export interface TrackDescriptor {
   // A unique identifier for the track. This must be unique within all tracks.
   uri: string;
 
@@ -215,7 +213,7 @@
   displayName: string;
 
   // A factory function returning the track object.
-  trackFactory: (ctx: TrackContext) => TrackLike;
+  track: (ctx: TrackContext) => Track;
 
   // The track "kind" Uued by various subsystems e.g. aggregation controllers.
   // This is where "XXX_TRACK_KIND" values should be placed.
@@ -269,25 +267,25 @@
 // Similar to PluginContext but with additional properties to operate on the
 // currently loaded trace. Passed to trace-relevant hooks instead of
 // PluginContext.
-export interface TracePluginContext<T = undefined> extends PluginContext {
+export interface PluginContextTrace<T = undefined> extends PluginContext {
   readonly engine: EngineProxy;
   readonly store: Store<T>;
 
   // Add a new track from this plugin. The track is just made available here,
   // it's not automatically shown until it's added to a workspace.
-  addTrack(trackDetails: PluginTrackInfo): void;
+  addTrack(trackDetails: TrackDescriptor): void;
 
   // Suggest a track be added to the workspace on a fresh trace load.
   // Supersedes `findPotentialTracks()` which has been removed.
   // Note: this API will be deprecated soon.
-  suggestTrack(trackInfo: TrackInfo): void;
+  suggestTrack(trackInfo: TrackInstanceDescriptor): void;
 }
 
 export interface BasePlugin<State> {
   // Lifecycle methods.
   onActivate(ctx: PluginContext): void;
-  onTraceLoad?(ctx: TracePluginContext<State>): Promise<void>;
-  onTraceUnload?(ctx: TracePluginContext<State>): Promise<void>;
+  onTraceLoad?(ctx: PluginContextTrace<State>): Promise<void>;
+  onTraceUnload?(ctx: PluginContextTrace<State>): Promise<void>;
   onDeactivate?(ctx: PluginContext): void;
 
   // Extension points.
@@ -320,7 +318,7 @@
   new(): Plugin<T>;
 }
 
-export interface TrackInfo {
+export interface TrackInstanceDescriptor {
   // A human readable name for this specific track. It will normally be
   // displayed on the left-hand-side of the track.
   name: string;
@@ -361,7 +359,7 @@
 // implementations.
 export type PluginFactory<T> = PluginClass<T>|Plugin<T>|(() => Plugin<T>);
 
-export interface PluginInfo<T = undefined> {
+export interface PluginDescriptor<T = undefined> {
   // A unique string for your plugin. To ensure the name is unique you
   // may wish to use a URL with reversed components in the manner of
   // Java package names.
diff --git a/ui/src/tracks/actual_frames/index.ts b/ui/src/tracks/actual_frames/index.ts
index 5e1d631..90de29a 100644
--- a/ui/src/tracks/actual_frames/index.ts
+++ b/ui/src/tracks/actual_frames/index.ts
@@ -17,8 +17,8 @@
 import {LONG, LONG_NULL, NUM, STR} from '../../common/query_result';
 import {TrackData} from '../../common/track_data';
 import {TrackController} from '../../controller/track_controller';
-import {NewTrackArgs, Track} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 import {ChromeSliceTrack} from '../chrome_slices';
 
 export const ACTUAL_FRAMES_SLICE_TRACK_KIND = 'ActualFramesSliceTrack';
@@ -156,19 +156,19 @@
 
 export class ActualFramesSliceTrack extends ChromeSliceTrack {
   static readonly kind = ACTUAL_FRAMES_SLICE_TRACK_KIND;
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new ActualFramesSliceTrack(args);
   }
 }
 
 class ActualFrames implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrackController(ActualFramesSliceTrackController);
-    ctx.registerTrack(ActualFramesSliceTrack);
+    ctx.LEGACY_registerTrackController(ActualFramesSliceTrackController);
+    ctx.LEGACY_registerTrack(ActualFramesSliceTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.ActualFrames',
   plugin: ActualFrames,
 };
diff --git a/ui/src/tracks/android_log/index.ts b/ui/src/tracks/android_log/index.ts
index 597d334..743d665 100644
--- a/ui/src/tracks/android_log/index.ts
+++ b/ui/src/tracks/android_log/index.ts
@@ -26,8 +26,8 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
-  TracePluginContext,
+  PluginContextTrace,
+  PluginDescriptor,
 } from '../../public';
 
 export const ANDROID_LOGS_TRACK_KIND = 'AndroidLogTrack';
@@ -149,7 +149,7 @@
 class AndroidLog implements Plugin {
   onActivate(_ctx: PluginContext): void {}
 
-  async onTraceLoad(ctx: TracePluginContext): Promise<void> {
+  async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
     const result =
         await ctx.engine.query(`select count(1) as cnt from android_logs`);
     const count = result.firstRow({cnt: NUM}).cnt;
@@ -158,7 +158,7 @@
         uri: 'perfetto.AndroidLog',
         displayName: 'Android logs',
         kind: ANDROID_LOGS_TRACK_KIND,
-        trackFactory: ({trackInstanceId}) => {
+        track: ({trackInstanceId}) => {
           return new TrackWithControllerAdapter<Config, Data>(
               ctx.engine,
               trackInstanceId,
@@ -171,7 +171,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.AndroidLog',
   plugin: AndroidLog,
 };
diff --git a/ui/src/tracks/annotation/index.ts b/ui/src/tracks/annotation/index.ts
index e2baabb..2c8649a 100644
--- a/ui/src/tracks/annotation/index.ts
+++ b/ui/src/tracks/annotation/index.ts
@@ -20,8 +20,8 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
-  TracePluginContext,
+  PluginContextTrace,
+  PluginDescriptor,
 } from '../../public';
 import {
   Config as CounterTrackConfig,
@@ -32,11 +32,11 @@
 class AnnotationPlugin implements Plugin {
   onActivate(_ctx: PluginContext): void {}
 
-  async onTraceLoad(ctx: TracePluginContext): Promise<void> {
+  async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
     await this.addAnnotationCounterTracks(ctx);
   }
 
-  private async addAnnotationCounterTracks(ctx: TracePluginContext) {
+  private async addAnnotationCounterTracks(ctx: PluginContextTrace) {
     const {engine} = ctx;
     const counterResult = await engine.query(`
       SELECT
@@ -76,7 +76,7 @@
         tags: {
           metric: true,
         },
-        trackFactory: (trackCtx) => {
+        track: (trackCtx) => {
           return new CounterTrack(trackCtx, config, ctx.engine);
         },
       });
@@ -84,7 +84,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.Annotation',
   plugin: AnnotationPlugin,
 };
diff --git a/ui/src/tracks/async_slices/index.ts b/ui/src/tracks/async_slices/index.ts
index d25717f..09d0dda 100644
--- a/ui/src/tracks/async_slices/index.ts
+++ b/ui/src/tracks/async_slices/index.ts
@@ -19,8 +19,8 @@
 import {
   TrackController,
 } from '../../controller/track_controller';
-import {NewTrackArgs, Track} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 import {ChromeSliceTrack} from '../chrome_slices';
 
 export const ASYNC_SLICE_TRACK_KIND = 'AsyncSliceTrack';
@@ -134,19 +134,19 @@
 
 export class AsyncSliceTrack extends ChromeSliceTrack {
   static readonly kind = ASYNC_SLICE_TRACK_KIND;
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new AsyncSliceTrack(args);
   }
 }
 
 class AsyncSlicePlugin implements Plugin {
   onActivate(ctx: PluginContext) {
-    ctx.registerTrackController(AsyncSliceTrackController);
-    ctx.registerTrack(AsyncSliceTrack);
+    ctx.LEGACY_registerTrackController(AsyncSliceTrackController);
+    ctx.LEGACY_registerTrack(AsyncSliceTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.AsyncSlices',
   plugin: AsyncSlicePlugin,
 };
diff --git a/ui/src/tracks/chrome_scroll_jank/chrome_tasks_scroll_jank_track.ts b/ui/src/tracks/chrome_scroll_jank/chrome_tasks_scroll_jank_track.ts
index 60db8a0..1026328 100644
--- a/ui/src/tracks/chrome_scroll_jank/chrome_tasks_scroll_jank_track.ts
+++ b/ui/src/tracks/chrome_scroll_jank/chrome_tasks_scroll_jank_track.ts
@@ -22,10 +22,12 @@
   NamedSliceTrackTypes,
 } from '../../frontend/named_slice_track';
 import {runQueryInNewTab} from '../../frontend/query_result_tab';
-import {NewTrackArgs, Track} from '../../frontend/track';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
 
-import {ScrollJankTracks as DecideTracksResult} from './index';
-import {ENABLE_CHROME_SCROLL_JANK_PLUGIN} from './index';
+import {
+  ENABLE_CHROME_SCROLL_JANK_PLUGIN,
+  ScrollJankTracks as DecideTracksResult,
+} from './index';
 
 interface ChromeTasksScrollJankTrackConfig {}
 
@@ -36,7 +38,7 @@
 export class ChromeTasksScrollJankTrack extends
     NamedSliceTrack<ChromeTasksScrollJankTrackTypes> {
   static readonly kind = 'org.chromium.ScrollJank.BrowserUIThreadLongTasks';
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new ChromeTasksScrollJankTrack(args);
   }
 
diff --git a/ui/src/tracks/chrome_scroll_jank/event_latency_track.ts b/ui/src/tracks/chrome_scroll_jank/event_latency_track.ts
index dd8d725..cfcaada 100644
--- a/ui/src/tracks/chrome_scroll_jank/event_latency_track.ts
+++ b/ui/src/tracks/chrome_scroll_jank/event_latency_track.ts
@@ -26,7 +26,7 @@
 import {
   NamedSliceTrackTypes,
 } from '../../frontend/named_slice_track';
-import {NewTrackArgs, Track} from '../../frontend/track';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
 import {PrimaryTrackSortKey} from '../../public';
 import {
   CustomSqlDetailsPanelConfig,
@@ -51,7 +51,7 @@
     CustomSqlTableSliceTrack<EventLatencyTrackTypes> {
   static readonly kind = 'org.chromium.ScrollJank.event_latencies';
 
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new EventLatencyTrack(args);
   }
 
diff --git a/ui/src/tracks/chrome_scroll_jank/index.ts b/ui/src/tracks/chrome_scroll_jank/index.ts
index 963a2b1..592d9a5 100644
--- a/ui/src/tracks/chrome_scroll_jank/index.ts
+++ b/ui/src/tracks/chrome_scroll_jank/index.ts
@@ -16,7 +16,7 @@
 import {Engine} from '../../common/engine';
 import {featureFlags} from '../../common/feature_flags';
 import {ObjectById} from '../../common/state';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 import {CustomSqlDetailsPanelConfig} from '../custom_sql_table_slices';
 
 import {ChromeTasksScrollJankTrack} from './chrome_tasks_scroll_jank_track';
@@ -129,14 +129,14 @@
 
 class ChromeScrollJankPlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrack(ChromeTasksScrollJankTrack);
-    ctx.registerTrack(EventLatencyTrack);
-    ctx.registerTrack(ScrollJankV3Track);
-    ctx.registerTrack(TopLevelScrollTrack);
+    ctx.LEGACY_registerTrack(ChromeTasksScrollJankTrack);
+    ctx.LEGACY_registerTrack(EventLatencyTrack);
+    ctx.LEGACY_registerTrack(ScrollJankV3Track);
+    ctx.LEGACY_registerTrack(TopLevelScrollTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.ChromeScrollJank',
   plugin: ChromeScrollJankPlugin,
 };
diff --git a/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_track.ts b/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_track.ts
index 8ef8fac..f1db56e 100644
--- a/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_track.ts
+++ b/ui/src/tracks/chrome_scroll_jank/scroll_jank_v3_track.ts
@@ -23,7 +23,7 @@
 } from '../../common/state';
 import {globals} from '../../frontend/globals';
 import {NamedSliceTrackTypes} from '../../frontend/named_slice_track';
-import {NewTrackArgs, Track} from '../../frontend/track';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
 import {PrimaryTrackSortKey} from '../../public';
 import {
   CustomSqlDetailsPanelConfig,
@@ -48,7 +48,7 @@
     CustomSqlTableSliceTrack<NamedSliceTrackTypes> {
   static readonly kind = 'org.chromium.ScrollJank.scroll_jank_v3_track';
 
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new ScrollJankV3Track(args);
   }
 
diff --git a/ui/src/tracks/chrome_scroll_jank/scroll_track.ts b/ui/src/tracks/chrome_scroll_jank/scroll_track.ts
index b02a82a..97ccc4a 100644
--- a/ui/src/tracks/chrome_scroll_jank/scroll_track.ts
+++ b/ui/src/tracks/chrome_scroll_jank/scroll_track.ts
@@ -17,7 +17,7 @@
 import {Engine} from '../../common/engine';
 import {SCROLLING_TRACK_GROUP} from '../../common/state';
 import {NamedSliceTrackTypes} from '../../frontend/named_slice_track';
-import {NewTrackArgs, Track} from '../../frontend/track';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
 import {PrimaryTrackSortKey} from '../../public';
 import {
   CustomSqlDetailsPanelConfig,
@@ -37,7 +37,7 @@
     CustomSqlTableSliceTrack<NamedSliceTrackTypes> {
   static readonly kind = 'org.chromium.TopLevelScrolls.scrolls';
 
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new TopLevelScrollTrack(args);
   }
 
diff --git a/ui/src/tracks/chrome_slices/index.ts b/ui/src/tracks/chrome_slices/index.ts
index 875a7bf..28efb24 100644
--- a/ui/src/tracks/chrome_slices/index.ts
+++ b/ui/src/tracks/chrome_slices/index.ts
@@ -28,8 +28,8 @@
 import {globals} from '../../frontend/globals';
 import {cachedHsluvToHex} from '../../frontend/hsluv_cache';
 import {PxSpan, TimeScale} from '../../frontend/time_scale';
-import {NewTrackArgs, SliceRect, Track} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {NewTrackArgs, SliceRect, TrackBase} from '../../frontend/track';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 export const SLICE_TRACK_KIND = 'ChromeSliceTrack';
 const SLICE_HEIGHT = 18;
@@ -159,9 +159,9 @@
   }
 }
 
-export class ChromeSliceTrack extends Track<Config, Data> {
+export class ChromeSliceTrack extends TrackBase<Config, Data> {
   static readonly kind: string = SLICE_TRACK_KIND;
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new ChromeSliceTrack(args);
   }
 
@@ -439,12 +439,12 @@
 
 class ChromeSlicesPlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrackController(ChromeSliceTrackController);
-    ctx.registerTrack(ChromeSliceTrack);
+    ctx.LEGACY_registerTrackController(ChromeSliceTrackController);
+    ctx.LEGACY_registerTrack(ChromeSliceTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.ChromeSlices',
   plugin: ChromeSlicesPlugin,
 };
diff --git a/ui/src/tracks/counter/index.ts b/ui/src/tracks/counter/index.ts
index 69122ad..1fbc53f 100644
--- a/ui/src/tracks/counter/index.ts
+++ b/ui/src/tracks/counter/index.ts
@@ -35,11 +35,11 @@
   NUM,
   Plugin,
   PluginContext,
-  PluginInfo,
+  PluginContextTrace,
+  PluginDescriptor,
   PrimaryTrackSortKey,
   Store,
   STR,
-  TracePluginContext,
   TrackContext,
 } from '../../public';
 import {getTrackName} from '../../public/utils';
@@ -618,7 +618,7 @@
 class CounterPlugin implements Plugin {
   onActivate(_ctx: PluginContext): void {}
 
-  async onTraceLoad(ctx: TracePluginContext): Promise<void> {
+  async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
     await this.addCounterTracks(ctx);
     await this.addGpuFrequencyTracks(ctx);
     await this.addCpuFreqLimitCounterTracks(ctx);
@@ -627,7 +627,7 @@
     await this.addProcessCounterTracks(ctx);
   }
 
-  private async addCounterTracks(ctx: TracePluginContext) {
+  private async addCounterTracks(ctx: PluginContextTrace) {
     const counters = await this.getCounterNames(ctx.engine);
     for (const {trackId, name} of counters) {
       const config:
@@ -638,7 +638,7 @@
         displayName: name,
         kind: COUNTER_TRACK_KIND,
         trackIds: [trackId],
-        trackFactory: (trackCtx) => {
+        track: (trackCtx) => {
           return new CounterTrack(trackCtx, config, ctx.engine);
         },
       });
@@ -681,7 +681,7 @@
     return tracks;
   }
 
-  private async addGpuFrequencyTracks(ctx: TracePluginContext) {
+  private async addGpuFrequencyTracks(ctx: PluginContextTrace) {
     const engine = ctx.engine;
     const numGpus = await engine.getNumberOfGpus();
     const maxGpuFreqResult = await engine.query(`
@@ -717,7 +717,7 @@
           displayName: name,
           kind: COUNTER_TRACK_KIND,
           trackIds: [trackId],
-          trackFactory: (trackCtx) => {
+          track: (trackCtx) => {
             return new CounterTrack(trackCtx, config, ctx.engine);
           },
         });
@@ -725,7 +725,7 @@
     }
   }
 
-  async addCpuFreqLimitCounterTracks(ctx: TracePluginContext): Promise<void> {
+  async addCpuFreqLimitCounterTracks(ctx: PluginContextTrace): Promise<void> {
     const cpuFreqLimitCounterTracksSql = `
       select name, id
       from cpu_counter_track
@@ -736,7 +736,7 @@
     this.addCpuCounterTracks(ctx, cpuFreqLimitCounterTracksSql);
   }
 
-  async addCpuPerfCounterTracks(ctx: TracePluginContext): Promise<void> {
+  async addCpuPerfCounterTracks(ctx: PluginContextTrace): Promise<void> {
     // Perf counter tracks are bound to CPUs, follow the scheduling and
     // frequency track naming convention ("Cpu N ...").
     // Note: we might not have a track for a given cpu if no data was seen from
@@ -751,7 +751,7 @@
     this.addCpuCounterTracks(ctx, addCpuPerfCounterTracksSql);
   }
 
-  async addCpuCounterTracks(ctx: TracePluginContext, sql: string):
+  async addCpuCounterTracks(ctx: PluginContextTrace, sql: string):
       Promise<void> {
     const result = await ctx.engine.query(sql);
 
@@ -773,14 +773,14 @@
         displayName: name,
         kind: COUNTER_TRACK_KIND,
         trackIds: [trackId],
-        trackFactory: (trackCtx) => {
+        track: (trackCtx) => {
           return new CounterTrack(trackCtx, config, ctx.engine);
         },
       });
     }
   }
 
-  async addThreadCounterTracks(ctx: TracePluginContext): Promise<void> {
+  async addThreadCounterTracks(ctx: PluginContextTrace): Promise<void> {
     const result = await ctx.engine.query(`
       select
         thread_counter_track.name as trackName,
@@ -836,14 +836,14 @@
         displayName: name,
         kind,
         trackIds: [trackId],
-        trackFactory: (trackCtx) => {
+        track: (trackCtx) => {
           return new CounterTrack(trackCtx, config, ctx.engine);
         },
       });
     }
   }
 
-  async addProcessCounterTracks(ctx: TracePluginContext): Promise<void> {
+  async addProcessCounterTracks(ctx: PluginContextTrace): Promise<void> {
     const result = await ctx.engine.query(`
     select
       process_counter_track.id as trackId,
@@ -893,7 +893,7 @@
         displayName: name,
         kind: COUNTER_TRACK_KIND,
         trackIds: [trackId],
-        trackFactory: (trackCtx) => {
+        track: (trackCtx) => {
           return new CounterTrack(trackCtx, config, ctx.engine);
         },
       });
@@ -901,7 +901,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.Counter',
   plugin: CounterPlugin,
 };
diff --git a/ui/src/tracks/cpu_freq/index.ts b/ui/src/tracks/cpu_freq/index.ts
index 5b182be..35faefc 100644
--- a/ui/src/tracks/cpu_freq/index.ts
+++ b/ui/src/tracks/cpu_freq/index.ts
@@ -38,8 +38,8 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
-  TracePluginContext,
+  PluginContextTrace,
+  PluginDescriptor,
 } from '../../public';
 
 
@@ -492,7 +492,7 @@
 class CpuFreq implements Plugin {
   onActivate(_ctx: PluginContext): void {}
 
-  async onTraceLoad(ctx: TracePluginContext): Promise<void> {
+  async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
     const {engine} = ctx;
 
     const cpus = await engine.getCpus();
@@ -538,7 +538,7 @@
           displayName: `Cpu ${cpu} Frequency`,
           kind: CPU_FREQ_TRACK_KIND,
           cpu,
-          trackFactory: ({trackInstanceId}) => {
+          track: ({trackInstanceId}) => {
             return new TrackWithControllerAdapter<Config, Data>(
                 engine,
                 trackInstanceId,
@@ -557,7 +557,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.CpuFreq',
   plugin: CpuFreq,
 };
diff --git a/ui/src/tracks/cpu_profile/index.ts b/ui/src/tracks/cpu_profile/index.ts
index 7045ac0..616e9a2 100644
--- a/ui/src/tracks/cpu_profile/index.ts
+++ b/ui/src/tracks/cpu_profile/index.ts
@@ -25,8 +25,8 @@
 import {globals} from '../../frontend/globals';
 import {cachedHsluvToHex} from '../../frontend/hsluv_cache';
 import {TimeScale} from '../../frontend/time_scale';
-import {NewTrackArgs, Track} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 const BAR_HEIGHT = 3;
 const MARGIN_TOP = 4.5;
@@ -85,7 +85,7 @@
   return cachedHsluvToHex(hue, saturation, lightness);
 }
 
-class CpuProfileTrack extends Track<Config, Data> {
+class CpuProfileTrack extends TrackBase<Config, Data> {
   static readonly kind = CPU_PROFILE_TRACK_KIND;
   static create(args: NewTrackArgs): CpuProfileTrack {
     return new CpuProfileTrack(args);
@@ -246,12 +246,12 @@
 
 class CpuProfile implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrackController(CpuProfileTrackController);
-    ctx.registerTrack(CpuProfileTrack);
+    ctx.LEGACY_registerTrackController(CpuProfileTrackController);
+    ctx.LEGACY_registerTrack(CpuProfileTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.CpuProfile',
   plugin: CpuProfile,
 };
diff --git a/ui/src/tracks/cpu_slices/index.ts b/ui/src/tracks/cpu_slices/index.ts
index 1d8693c..c2de3f6 100644
--- a/ui/src/tracks/cpu_slices/index.ts
+++ b/ui/src/tracks/cpu_slices/index.ts
@@ -39,8 +39,8 @@
   EngineProxy,
   Plugin,
   PluginContext,
-  PluginInfo,
-  TracePluginContext,
+  PluginContextTrace,
+  PluginDescriptor,
 } from '../../public';
 
 export const CPU_SLICE_TRACK_KIND = 'CpuSliceTrack';
@@ -472,7 +472,7 @@
     // No-op
   }
 
-  async onTraceLoad(ctx: TracePluginContext): Promise<void> {
+  async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
     const cpus = await ctx.engine.getCpus();
     const cpuToSize = await this.guessCpuSizes(ctx.engine);
 
@@ -486,7 +486,7 @@
         displayName: name,
         kind: CPU_SLICE_TRACK_KIND,
         cpu,
-        trackFactory: ({trackInstanceId}) => {
+        track: ({trackInstanceId}) => {
           return new TrackWithControllerAdapter<Config, Data>(
               ctx.engine,
               trackInstanceId,
@@ -523,7 +523,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.CpuSlices',
   plugin: CpuSlices,
 };
diff --git a/ui/src/tracks/custom_sql_table_slices/index.ts b/ui/src/tracks/custom_sql_table_slices/index.ts
index e371bff..8ffe388 100644
--- a/ui/src/tracks/custom_sql_table_slices/index.ts
+++ b/ui/src/tracks/custom_sql_table_slices/index.ts
@@ -27,7 +27,7 @@
   NamedSliceTrackTypes,
 } from '../../frontend/named_slice_track';
 import {NewTrackArgs} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 export interface CustomSqlTableDefConfig {
   // Table name
@@ -109,7 +109,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.CustomSqlTrack',
   plugin: CustomSqlTrackPlugin,
 };
diff --git a/ui/src/tracks/debug/index.ts b/ui/src/tracks/debug/index.ts
index b3195e1..78c12e7 100644
--- a/ui/src/tracks/debug/index.ts
+++ b/ui/src/tracks/debug/index.ts
@@ -12,17 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 import {DebugTrackV2} from './slice_track';
 
 class DebugTrackPlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrack(DebugTrackV2);
+    ctx.LEGACY_registerTrack(DebugTrackV2);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.DebugSlices',
   plugin: DebugTrackPlugin,
 };
diff --git a/ui/src/tracks/expected_frames/index.ts b/ui/src/tracks/expected_frames/index.ts
index dce354c..b30d31e 100644
--- a/ui/src/tracks/expected_frames/index.ts
+++ b/ui/src/tracks/expected_frames/index.ts
@@ -16,7 +16,7 @@
 
 export const EXPECTED_FRAMES_SLICE_TRACK_KIND = 'ExpectedFramesSliceTrack';
 
-import {NewTrackArgs, Track} from '../../frontend/track';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
 import {ChromeSliceTrack} from '../chrome_slices';
 
 import {LONG, LONG_NULL, NUM, STR} from '../../common/query_result';
@@ -24,7 +24,7 @@
 import {
   TrackController,
 } from '../../controller/track_controller';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 import {BigintMath as BIMath} from '../../base/bigint_math';
 
 export interface Config {
@@ -142,19 +142,19 @@
 
 export class ExpectedFramesSliceTrack extends ChromeSliceTrack {
   static readonly kind = EXPECTED_FRAMES_SLICE_TRACK_KIND;
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new ExpectedFramesSliceTrack(args);
   }
 }
 
 class ExpectedFramesPlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrackController(ExpectedFramesSliceTrackController);
-    ctx.registerTrack(ExpectedFramesSliceTrack);
+    ctx.LEGACY_registerTrackController(ExpectedFramesSliceTrackController);
+    ctx.LEGACY_registerTrack(ExpectedFramesSliceTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.ExpectedFrames',
   plugin: ExpectedFramesPlugin,
 };
diff --git a/ui/src/tracks/ftrace/index.ts b/ui/src/tracks/ftrace/index.ts
index 54cc44f..f2ad696 100644
--- a/ui/src/tracks/ftrace/index.ts
+++ b/ui/src/tracks/ftrace/index.ts
@@ -23,8 +23,8 @@
   EngineProxy,
   Plugin,
   PluginContext,
-  PluginInfo,
-  TracePluginContext,
+  PluginContextTrace,
+  PluginDescriptor,
 } from '../../public';
 
 export const FTRACE_RAW_TRACK_KIND = 'FtraceRawTrack';
@@ -139,7 +139,7 @@
 class FtraceRawPlugin implements Plugin {
   onActivate(_: PluginContext) {}
 
-  async onTraceLoad(ctx: TracePluginContext): Promise<void> {
+  async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
     const cpus = await this.lookupCpuCores(ctx.engine);
     for (const cpuNum of cpus) {
       const uri = `perfetto.FtraceRaw#cpu${cpuNum}`;
@@ -149,7 +149,7 @@
         displayName: `Ftrace Track for CPU ${cpuNum}`,
         kind: FTRACE_RAW_TRACK_KIND,
         cpu: cpuNum,
-        trackFactory: () => {
+        track: () => {
           return new FtraceRawTrack(ctx.engine, cpuNum);
         },
       });
@@ -172,7 +172,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.FtraceRaw',
   plugin: FtraceRawPlugin,
 };
diff --git a/ui/src/tracks/generic_slice_track/index.ts b/ui/src/tracks/generic_slice_track/index.ts
index c467254..6053621 100644
--- a/ui/src/tracks/generic_slice_track/index.ts
+++ b/ui/src/tracks/generic_slice_track/index.ts
@@ -17,7 +17,7 @@
   NamedSliceTrackTypes,
 } from '../../frontend/named_slice_track';
 import {NewTrackArgs} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 export interface GenericSliceTrackConfig {
   sqlTrackId: number;
@@ -47,11 +47,11 @@
 
 class GenericSliceTrackPlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrack(GenericSliceTrack);
+    ctx.LEGACY_registerTrack(GenericSliceTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.GenericSliceTrack',
   plugin: GenericSliceTrackPlugin,
 };
diff --git a/ui/src/tracks/heap_profile/index.ts b/ui/src/tracks/heap_profile/index.ts
index 08018ce..38b19e7 100644
--- a/ui/src/tracks/heap_profile/index.ts
+++ b/ui/src/tracks/heap_profile/index.ts
@@ -23,8 +23,8 @@
 import {FLAMEGRAPH_HOVERED_COLOR} from '../../frontend/flamegraph';
 import {globals} from '../../frontend/globals';
 import {TimeScale} from '../../frontend/time_scale';
-import {NewTrackArgs, Track} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 export const HEAP_PROFILE_TRACK_KIND = 'HeapProfileTrack';
 
@@ -88,7 +88,7 @@
 const MARGIN_TOP = 4.5;
 const RECT_HEIGHT = 30.5;
 
-class HeapProfileTrack extends Track<Config, Data> {
+class HeapProfileTrack extends TrackBase<Config, Data> {
   static readonly kind = HEAP_PROFILE_TRACK_KIND;
   static create(args: NewTrackArgs): HeapProfileTrack {
     return new HeapProfileTrack(args);
@@ -217,12 +217,12 @@
 
 class HeapProfilePlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrackController(HeapProfileTrackController);
-    ctx.registerTrack(HeapProfileTrack);
+    ctx.LEGACY_registerTrackController(HeapProfileTrackController);
+    ctx.LEGACY_registerTrack(HeapProfileTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.HeapProfile',
   plugin: HeapProfilePlugin,
 };
diff --git a/ui/src/tracks/null_track/index.ts b/ui/src/tracks/null_track/index.ts
index 1ff53a4..a007185 100644
--- a/ui/src/tracks/null_track/index.ts
+++ b/ui/src/tracks/null_track/index.ts
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import {NewTrackArgs, Track} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 export const NULL_TRACK_KIND = 'NullTrack';
 
-export class NullTrack extends Track {
+export class NullTrack extends TrackBase {
   static readonly kind = NULL_TRACK_KIND;
   constructor(args: NewTrackArgs) {
     super(args);
@@ -37,11 +37,11 @@
 
 class NullTrackPlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrack(NullTrack);
+    ctx.LEGACY_registerTrack(NullTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.NullTrack',
   plugin: NullTrackPlugin,
 };
diff --git a/ui/src/tracks/perf_samples_profile/index.ts b/ui/src/tracks/perf_samples_profile/index.ts
index ff836ad..b6e624a 100644
--- a/ui/src/tracks/perf_samples_profile/index.ts
+++ b/ui/src/tracks/perf_samples_profile/index.ts
@@ -22,8 +22,8 @@
 import {FLAMEGRAPH_HOVERED_COLOR} from '../../frontend/flamegraph';
 import {globals} from '../../frontend/globals';
 import {TimeScale} from '../../frontend/time_scale';
-import {NewTrackArgs, Track} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 export const PERF_SAMPLES_PROFILE_TRACK_KIND = 'PerfSamplesProfileTrack';
 
@@ -77,7 +77,7 @@
 const MARGIN_TOP = 4.5;
 const RECT_HEIGHT = 30.5;
 
-class PerfSamplesProfileTrack extends Track<Config, Data> {
+class PerfSamplesProfileTrack extends TrackBase<Config, Data> {
   static readonly kind = PERF_SAMPLES_PROFILE_TRACK_KIND;
   static create(args: NewTrackArgs): PerfSamplesProfileTrack {
     return new PerfSamplesProfileTrack(args);
@@ -210,12 +210,12 @@
 
 class PerfSamplesProfilePlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrackController(PerfSamplesProfileTrackController);
-    ctx.registerTrack(PerfSamplesProfileTrack);
+    ctx.LEGACY_registerTrackController(PerfSamplesProfileTrackController);
+    ctx.LEGACY_registerTrack(PerfSamplesProfileTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.PerfSamplesProfile',
   plugin: PerfSamplesProfilePlugin,
 };
diff --git a/ui/src/tracks/process_summary/index.ts b/ui/src/tracks/process_summary/index.ts
index 154ead0..24cae70 100644
--- a/ui/src/tracks/process_summary/index.ts
+++ b/ui/src/tracks/process_summary/index.ts
@@ -24,8 +24,8 @@
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
-  TracePluginContext,
+  PluginContextTrace,
+  PluginDescriptor,
 } from '../../public';
 
 import {
@@ -50,12 +50,12 @@
 
   onActivate(_ctx: PluginContext): void {}
 
-  async onTraceLoad(ctx: TracePluginContext): Promise<void> {
+  async onTraceLoad(ctx: PluginContextTrace): Promise<void> {
     await this.addProcessTrackGroups(ctx);
     await this.addKernelThreadSummary(ctx);
   }
 
-  private async addProcessTrackGroups(ctx: TracePluginContext): Promise<void> {
+  private async addProcessTrackGroups(ctx: PluginContextTrace): Promise<void> {
     this.upidToUuid.clear();
     this.utidToUuid.clear();
 
@@ -224,7 +224,7 @@
             tags: {
               isDebuggable,
             },
-            trackFactory: ({trackInstanceId}) => {
+            track: ({trackInstanceId}) => {
               return new TrackWithControllerAdapter<
                   ProcessSchedulingTrackConfig,
                   ProcessSchedulingTrackData>(
@@ -249,7 +249,7 @@
             tags: {
               isDebuggable,
             },
-            trackFactory: ({trackInstanceId}) => {
+            track: ({trackInstanceId}) => {
               return new TrackWithControllerAdapter<
                   ProcessSummaryTrackConfig,
                   ProcessSummaryTrackData>(
@@ -265,7 +265,7 @@
     }
   }
 
-  private async addKernelThreadSummary(ctx: TracePluginContext): Promise<void> {
+  private async addKernelThreadSummary(ctx: PluginContextTrace): Promise<void> {
     const {engine} = ctx;
 
     // Identify kernel threads if this is a linux system trace, and sufficient
@@ -314,7 +314,7 @@
       uri: 'perfetto.ProcessSummary#kernel',
       displayName: `Kernel thread summary`,
       kind: PROCESS_SUMMARY_TRACK,
-      trackFactory: ({trackInstanceId}) => {
+      track: ({trackInstanceId}) => {
         return new TrackWithControllerAdapter<
             ProcessSummaryTrackConfig,
             ProcessSummaryTrackData>(
@@ -346,7 +346,7 @@
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.ProcessSummary',
   plugin: ProcessSummaryPlugin,
 };
diff --git a/ui/src/tracks/screenshots/index.ts b/ui/src/tracks/screenshots/index.ts
index eaf2998..cc85c16 100644
--- a/ui/src/tracks/screenshots/index.ts
+++ b/ui/src/tracks/screenshots/index.ts
@@ -19,11 +19,11 @@
 import {
   NamedSliceTrackTypes,
 } from '../../frontend/named_slice_track';
-import {NewTrackArgs, Track} from '../../frontend/track';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
 import {
   Plugin,
   PluginContext,
-  PluginInfo,
+  PluginDescriptor,
   PrimaryTrackSortKey,
 } from '../../public';
 import {
@@ -40,7 +40,7 @@
 
 class ScreenshotsTrack extends CustomSqlTableSliceTrack<NamedSliceTrackTypes> {
   static readonly kind = 'dev.perfetto.ScreenshotsTrack';
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new ScreenshotsTrack(args);
   }
 
@@ -88,11 +88,11 @@
 
 class ScreenshotsPlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrack(ScreenshotsTrack);
+    ctx.LEGACY_registerTrack(ScreenshotsTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.Screenshots',
   plugin: ScreenshotsPlugin,
 };
diff --git a/ui/src/tracks/thread_state/index.ts b/ui/src/tracks/thread_state/index.ts
index b684e6c..807f8f9 100644
--- a/ui/src/tracks/thread_state/index.ts
+++ b/ui/src/tracks/thread_state/index.ts
@@ -25,8 +25,8 @@
 import {TrackController} from '../../controller/track_controller';
 import {checkerboardExcept} from '../../frontend/checkerboard';
 import {globals} from '../../frontend/globals';
-import {NewTrackArgs, Track} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 
 export const THREAD_STATE_TRACK_KIND = 'ThreadStateTrack';
@@ -162,7 +162,7 @@
 const RECT_HEIGHT = 12;
 const EXCESS_WIDTH = 10;
 
-class ThreadStateTrack extends Track<Config, Data> {
+class ThreadStateTrack extends TrackBase<Config, Data> {
   static readonly kind = THREAD_STATE_TRACK_KIND;
   static create(args: NewTrackArgs): ThreadStateTrack {
     return new ThreadStateTrack(args);
@@ -285,12 +285,12 @@
 
 class ThreadState implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrack(ThreadStateTrack);
-    ctx.registerTrackController(ThreadStateTrackController);
+    ctx.LEGACY_registerTrack(ThreadStateTrack);
+    ctx.LEGACY_registerTrackController(ThreadStateTrackController);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.ThreadState',
   plugin: ThreadState,
 };
diff --git a/ui/src/tracks/thread_state_v2/index.ts b/ui/src/tracks/thread_state_v2/index.ts
index ce78b78..9c465b6 100644
--- a/ui/src/tracks/thread_state_v2/index.ts
+++ b/ui/src/tracks/thread_state_v2/index.ts
@@ -29,7 +29,7 @@
   SliceLayout,
 } from '../../frontend/slice_layout';
 import {NewTrackArgs} from '../../frontend/track';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 
 export const THREAD_STATE_ROW = {
   ...BASE_SLICE_ROW,
@@ -126,11 +126,11 @@
 
 class ThreadStateTrackV2 implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrack(ThreadStateTrack);
+    ctx.LEGACY_registerTrack(ThreadStateTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.ThreadStateTrackV2',
   plugin: ThreadStateTrackV2,
 };
diff --git a/ui/src/tracks/visualised_args/index.ts b/ui/src/tracks/visualised_args/index.ts
index abee625..3385bf9 100644
--- a/ui/src/tracks/visualised_args/index.ts
+++ b/ui/src/tracks/visualised_args/index.ts
@@ -16,9 +16,9 @@
 
 import {Actions} from '../../common/actions';
 import {globals} from '../../frontend/globals';
-import {NewTrackArgs, Track} from '../../frontend/track';
+import {NewTrackArgs, TrackBase} from '../../frontend/track';
 import {TrackButton, TrackButtonAttrs} from '../../frontend/track_panel';
-import {Plugin, PluginContext, PluginInfo} from '../../public';
+import {Plugin, PluginContext, PluginDescriptor} from '../../public';
 import {
   ChromeSliceTrack,
   ChromeSliceTrackController,
@@ -41,7 +41,7 @@
 
 export class VisualisedArgsTrack extends ChromeSliceTrack {
   static readonly kind = VISUALISED_ARGS_SLICE_TRACK_KIND;
-  static create(args: NewTrackArgs): Track {
+  static create(args: NewTrackArgs): TrackBase {
     return new VisualisedArgsTrack(args);
   }
 
@@ -67,12 +67,12 @@
 
 class VisualisedArgsPlugin implements Plugin {
   onActivate(ctx: PluginContext): void {
-    ctx.registerTrackController(VisualisedArgsTrackController);
-    ctx.registerTrack(VisualisedArgsTrack);
+    ctx.LEGACY_registerTrackController(VisualisedArgsTrackController);
+    ctx.LEGACY_registerTrack(VisualisedArgsTrack);
   }
 }
 
-export const plugin: PluginInfo = {
+export const plugin: PluginDescriptor = {
   pluginId: 'perfetto.VisualisedArgs',
   plugin: VisualisedArgsPlugin,
 };