xref: /aosp_15_r20/development/tools/winscope/src/trace/custom_query.ts (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker/*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker
17*90c8c64dSAndroid Build Coastguard Workerimport {RelativeEntryIndex, TraceEntryEager} from './trace';
18*90c8c64dSAndroid Build Coastguard Worker
19*90c8c64dSAndroid Build Coastguard Workerexport enum CustomQueryType {
20*90c8c64dSAndroid Build Coastguard Worker  SF_LAYERS_ID_AND_NAME,
21*90c8c64dSAndroid Build Coastguard Worker  VIEW_CAPTURE_METADATA,
22*90c8c64dSAndroid Build Coastguard Worker  VSYNCID,
23*90c8c64dSAndroid Build Coastguard Worker  WM_WINDOWS_TOKEN_AND_TITLE,
24*90c8c64dSAndroid Build Coastguard Worker}
25*90c8c64dSAndroid Build Coastguard Worker
26*90c8c64dSAndroid Build Coastguard Workerexport class ProcessParserResult {
27*90c8c64dSAndroid Build Coastguard Worker  static [CustomQueryType.SF_LAYERS_ID_AND_NAME]<T>(
28*90c8c64dSAndroid Build Coastguard Worker    parserResult: CustomQueryParserResultTypeMap[CustomQueryType.SF_LAYERS_ID_AND_NAME],
29*90c8c64dSAndroid Build Coastguard Worker  ): CustomQueryResultTypeMap<T>[CustomQueryType.SF_LAYERS_ID_AND_NAME] {
30*90c8c64dSAndroid Build Coastguard Worker    return parserResult;
31*90c8c64dSAndroid Build Coastguard Worker  }
32*90c8c64dSAndroid Build Coastguard Worker
33*90c8c64dSAndroid Build Coastguard Worker  static [CustomQueryType.VIEW_CAPTURE_METADATA]<T>(
34*90c8c64dSAndroid Build Coastguard Worker    parserResult: CustomQueryParserResultTypeMap[CustomQueryType.VIEW_CAPTURE_METADATA],
35*90c8c64dSAndroid Build Coastguard Worker  ): CustomQueryResultTypeMap<T>[CustomQueryType.VIEW_CAPTURE_METADATA] {
36*90c8c64dSAndroid Build Coastguard Worker    return parserResult;
37*90c8c64dSAndroid Build Coastguard Worker  }
38*90c8c64dSAndroid Build Coastguard Worker
39*90c8c64dSAndroid Build Coastguard Worker  static [CustomQueryType.VSYNCID]<T>(
40*90c8c64dSAndroid Build Coastguard Worker    parserResult: CustomQueryParserResultTypeMap[CustomQueryType.VSYNCID],
41*90c8c64dSAndroid Build Coastguard Worker    makeTraceEntry: (
42*90c8c64dSAndroid Build Coastguard Worker      index: RelativeEntryIndex,
43*90c8c64dSAndroid Build Coastguard Worker      vsyncId: bigint,
44*90c8c64dSAndroid Build Coastguard Worker    ) => TraceEntryEager<T, bigint>,
45*90c8c64dSAndroid Build Coastguard Worker  ): CustomQueryResultTypeMap<T>[CustomQueryType.VSYNCID] {
46*90c8c64dSAndroid Build Coastguard Worker    return parserResult.map((vsyncId, index) => {
47*90c8c64dSAndroid Build Coastguard Worker      return makeTraceEntry(index, vsyncId);
48*90c8c64dSAndroid Build Coastguard Worker    });
49*90c8c64dSAndroid Build Coastguard Worker  }
50*90c8c64dSAndroid Build Coastguard Worker
51*90c8c64dSAndroid Build Coastguard Worker  static [CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE]<T>(
52*90c8c64dSAndroid Build Coastguard Worker    parserResult: CustomQueryParserResultTypeMap[CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE],
53*90c8c64dSAndroid Build Coastguard Worker  ): CustomQueryResultTypeMap<T>[CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE] {
54*90c8c64dSAndroid Build Coastguard Worker    return parserResult;
55*90c8c64dSAndroid Build Coastguard Worker  }
56*90c8c64dSAndroid Build Coastguard Worker}
57*90c8c64dSAndroid Build Coastguard Worker
58*90c8c64dSAndroid Build Coastguard Workerexport interface CustomQueryParamTypeMap {
59*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.SF_LAYERS_ID_AND_NAME]: never;
60*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.VIEW_CAPTURE_METADATA]: never;
61*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.VSYNCID]: never;
62*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE]: never;
63*90c8c64dSAndroid Build Coastguard Worker}
64*90c8c64dSAndroid Build Coastguard Worker
65*90c8c64dSAndroid Build Coastguard Workerexport interface CustomQueryParserResultTypeMap {
66*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.SF_LAYERS_ID_AND_NAME]: Array<{id: number; name: string}>;
67*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.VIEW_CAPTURE_METADATA]: {
68*90c8c64dSAndroid Build Coastguard Worker    packageName: string;
69*90c8c64dSAndroid Build Coastguard Worker    windowName: string;
70*90c8c64dSAndroid Build Coastguard Worker  };
71*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.VSYNCID]: Array<bigint>;
72*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE]: Array<{
73*90c8c64dSAndroid Build Coastguard Worker    token: string;
74*90c8c64dSAndroid Build Coastguard Worker    title: string;
75*90c8c64dSAndroid Build Coastguard Worker  }>;
76*90c8c64dSAndroid Build Coastguard Worker}
77*90c8c64dSAndroid Build Coastguard Worker
78*90c8c64dSAndroid Build Coastguard Workerexport interface CustomQueryResultTypeMap<T> {
79*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.SF_LAYERS_ID_AND_NAME]: Array<{id: number; name: string}>;
80*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.VIEW_CAPTURE_METADATA]: {
81*90c8c64dSAndroid Build Coastguard Worker    packageName: string;
82*90c8c64dSAndroid Build Coastguard Worker    windowName: string;
83*90c8c64dSAndroid Build Coastguard Worker  };
84*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.VSYNCID]: Array<TraceEntryEager<T, bigint>>;
85*90c8c64dSAndroid Build Coastguard Worker  [CustomQueryType.WM_WINDOWS_TOKEN_AND_TITLE]: Array<{
86*90c8c64dSAndroid Build Coastguard Worker    token: string;
87*90c8c64dSAndroid Build Coastguard Worker    title: string;
88*90c8c64dSAndroid Build Coastguard Worker  }>;
89*90c8c64dSAndroid Build Coastguard Worker}
90*90c8c64dSAndroid Build Coastguard Worker
91*90c8c64dSAndroid Build Coastguard Workerexport class VisitableParserCustomQuery<Q extends CustomQueryType> {
92*90c8c64dSAndroid Build Coastguard Worker  private readonly type: CustomQueryType;
93*90c8c64dSAndroid Build Coastguard Worker  private result: Promise<CustomQueryParserResultTypeMap[Q]> | undefined;
94*90c8c64dSAndroid Build Coastguard Worker
95*90c8c64dSAndroid Build Coastguard Worker  constructor(type: Q) {
96*90c8c64dSAndroid Build Coastguard Worker    this.type = type;
97*90c8c64dSAndroid Build Coastguard Worker  }
98*90c8c64dSAndroid Build Coastguard Worker
99*90c8c64dSAndroid Build Coastguard Worker  visit<R extends CustomQueryType>(
100*90c8c64dSAndroid Build Coastguard Worker    type: R,
101*90c8c64dSAndroid Build Coastguard Worker    visitor: () => Promise<CustomQueryParserResultTypeMap[R]>,
102*90c8c64dSAndroid Build Coastguard Worker  ): VisitableParserCustomQuery<Q> {
103*90c8c64dSAndroid Build Coastguard Worker    if (type !== this.type) {
104*90c8c64dSAndroid Build Coastguard Worker      return this;
105*90c8c64dSAndroid Build Coastguard Worker    }
106*90c8c64dSAndroid Build Coastguard Worker    this.result = visitor() as Promise<CustomQueryParserResultTypeMap[Q]>;
107*90c8c64dSAndroid Build Coastguard Worker    return this;
108*90c8c64dSAndroid Build Coastguard Worker  }
109*90c8c64dSAndroid Build Coastguard Worker
110*90c8c64dSAndroid Build Coastguard Worker  getResult(): Promise<CustomQueryParserResultTypeMap[Q]> {
111*90c8c64dSAndroid Build Coastguard Worker    if (this.result === undefined) {
112*90c8c64dSAndroid Build Coastguard Worker      throw new Error(
113*90c8c64dSAndroid Build Coastguard Worker        `No result available. Looks like custom query (type: ${this.type}) is not implemented!`,
114*90c8c64dSAndroid Build Coastguard Worker      );
115*90c8c64dSAndroid Build Coastguard Worker    }
116*90c8c64dSAndroid Build Coastguard Worker    return this.result;
117*90c8c64dSAndroid Build Coastguard Worker  }
118*90c8c64dSAndroid Build Coastguard Worker}
119