1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {Migrate, Store} from '../base/store'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {TraceInfo} from './trace_info'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {Engine} from '../trace_processor/engine'; 18*6dbdd20aSAndroid Build Coastguard Workerimport {App} from './app'; 19*6dbdd20aSAndroid Build Coastguard Workerimport {TabManager} from './tab'; 20*6dbdd20aSAndroid Build Coastguard Workerimport {TrackManager} from './track'; 21*6dbdd20aSAndroid Build Coastguard Workerimport {Timeline} from './timeline'; 22*6dbdd20aSAndroid Build Coastguard Workerimport {Workspace, WorkspaceManager} from './workspace'; 23*6dbdd20aSAndroid Build Coastguard Workerimport {SelectionManager} from './selection'; 24*6dbdd20aSAndroid Build Coastguard Workerimport {ScrollToArgs} from './scroll_helper'; 25*6dbdd20aSAndroid Build Coastguard Workerimport {NoteManager} from './note'; 26*6dbdd20aSAndroid Build Coastguard Workerimport {DisposableStack} from '../base/disposable_stack'; 27*6dbdd20aSAndroid Build Coastguard Workerimport {Evt} from '../base/events'; 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard Worker// Lists all the possible event listeners using the key as the event name and 30*6dbdd20aSAndroid Build Coastguard Worker// the type as the type of the callback. 31*6dbdd20aSAndroid Build Coastguard Workerexport interface EventListeners { 32*6dbdd20aSAndroid Build Coastguard Worker traceready: () => Promise<void> | void; 33*6dbdd20aSAndroid Build Coastguard Worker} 34*6dbdd20aSAndroid Build Coastguard Worker 35*6dbdd20aSAndroid Build Coastguard Worker/** 36*6dbdd20aSAndroid Build Coastguard Worker * The main API endpoint to interact programmaticaly with the UI and alter its 37*6dbdd20aSAndroid Build Coastguard Worker * state once a trace is loaded. There are N+1 instances of this interface, 38*6dbdd20aSAndroid Build Coastguard Worker * one for each plugin and one for the core (which, however, gets to see the 39*6dbdd20aSAndroid Build Coastguard Worker * full AppImpl behind this to acces all the internal methods). 40*6dbdd20aSAndroid Build Coastguard Worker * This interface is passed to plugins' onTraceLoad() hook and is injected 41*6dbdd20aSAndroid Build Coastguard Worker * pretty much everywhere in core. 42*6dbdd20aSAndroid Build Coastguard Worker */ 43*6dbdd20aSAndroid Build Coastguard Workerexport interface Trace extends App { 44*6dbdd20aSAndroid Build Coastguard Worker readonly engine: Engine; 45*6dbdd20aSAndroid Build Coastguard Worker readonly notes: NoteManager; 46*6dbdd20aSAndroid Build Coastguard Worker readonly timeline: Timeline; 47*6dbdd20aSAndroid Build Coastguard Worker readonly tabs: TabManager; 48*6dbdd20aSAndroid Build Coastguard Worker readonly tracks: TrackManager; 49*6dbdd20aSAndroid Build Coastguard Worker readonly selection: SelectionManager; 50*6dbdd20aSAndroid Build Coastguard Worker readonly workspace: Workspace; 51*6dbdd20aSAndroid Build Coastguard Worker readonly workspaces: WorkspaceManager; 52*6dbdd20aSAndroid Build Coastguard Worker readonly traceInfo: TraceInfo; 53*6dbdd20aSAndroid Build Coastguard Worker 54*6dbdd20aSAndroid Build Coastguard Worker // Events. 55*6dbdd20aSAndroid Build Coastguard Worker onTraceReady: Evt<void>; 56*6dbdd20aSAndroid Build Coastguard Worker 57*6dbdd20aSAndroid Build Coastguard Worker // Scrolls to the given track and/or time. Does NOT change the current 58*6dbdd20aSAndroid Build Coastguard Worker // selection. 59*6dbdd20aSAndroid Build Coastguard Worker scrollTo(args: ScrollToArgs): void; 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker // Create a store mounted over the top of this plugin's persistent state. 62*6dbdd20aSAndroid Build Coastguard Worker mountStore<T>(migrate: Migrate<T>): Store<T>; 63*6dbdd20aSAndroid Build Coastguard Worker 64*6dbdd20aSAndroid Build Coastguard Worker // Returns the blob of the current trace file. 65*6dbdd20aSAndroid Build Coastguard Worker // If the trace is opened from a file or postmessage, the blob is returned 66*6dbdd20aSAndroid Build Coastguard Worker // immediately. If the trace is opened from URL, this causes a re-download of 67*6dbdd20aSAndroid Build Coastguard Worker // the trace. It will throw if traceInfo.downloadable === false. 68*6dbdd20aSAndroid Build Coastguard Worker getTraceFile(): Promise<Blob>; 69*6dbdd20aSAndroid Build Coastguard Worker 70*6dbdd20aSAndroid Build Coastguard Worker // List of errors that were encountered while loading the trace by the TS 71*6dbdd20aSAndroid Build Coastguard Worker // code. These are on top of traceInfo.importErrors, which is a summary of 72*6dbdd20aSAndroid Build Coastguard Worker // what TraceProcessor reports on the stats table at import time. 73*6dbdd20aSAndroid Build Coastguard Worker get loadingErrors(): ReadonlyArray<string>; 74*6dbdd20aSAndroid Build Coastguard Worker 75*6dbdd20aSAndroid Build Coastguard Worker // When the trace is opened via postMessage deep-linking, returns the sub-set 76*6dbdd20aSAndroid Build Coastguard Worker // of postMessageData.pluginArgs[pluginId] for the current plugin. If not 77*6dbdd20aSAndroid Build Coastguard Worker // present returns undefined. 78*6dbdd20aSAndroid Build Coastguard Worker readonly openerPluginArgs?: {[key: string]: unknown}; 79*6dbdd20aSAndroid Build Coastguard Worker 80*6dbdd20aSAndroid Build Coastguard Worker // Trace scoped disposables. Will be destroyed when the trace is unloaded. 81*6dbdd20aSAndroid Build Coastguard Worker readonly trash: DisposableStack; 82*6dbdd20aSAndroid Build Coastguard Worker} 83*6dbdd20aSAndroid Build Coastguard Worker 84*6dbdd20aSAndroid Build Coastguard Worker/** 85*6dbdd20aSAndroid Build Coastguard Worker * A convenience interface to inject the App in Mithril components. 86*6dbdd20aSAndroid Build Coastguard Worker * Example usage: 87*6dbdd20aSAndroid Build Coastguard Worker * 88*6dbdd20aSAndroid Build Coastguard Worker * class MyComponent implements m.ClassComponent<TraceAttrs> { 89*6dbdd20aSAndroid Build Coastguard Worker * oncreate({attrs}: m.CVnodeDOM<AppAttrs>): void { 90*6dbdd20aSAndroid Build Coastguard Worker * attrs.trace.engine.runQuery(...); 91*6dbdd20aSAndroid Build Coastguard Worker * } 92*6dbdd20aSAndroid Build Coastguard Worker * } 93*6dbdd20aSAndroid Build Coastguard Worker */ 94*6dbdd20aSAndroid Build Coastguard Workerexport interface TraceAttrs { 95*6dbdd20aSAndroid Build Coastguard Worker trace: Trace; 96*6dbdd20aSAndroid Build Coastguard Worker} 97*6dbdd20aSAndroid Build Coastguard Worker 98*6dbdd20aSAndroid Build Coastguard Workerexport const TRACE_SUFFIX = '.perfetto-trace'; 99