• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import {assertDefined} from 'common/assert_utils';
18import {AddDefaults} from 'parsers/operations/add_defaults';
19import {SetFormatters} from 'parsers/operations/set_formatters';
20import {TranslateIntDef} from 'parsers/operations/translate_intdef';
21import {DENYLIST_PROPERTIES} from 'parsers/window_manager/denylist_properties';
22import {EAGER_PROPERTIES} from 'parsers/window_manager/eager_properties';
23import {ProtoType} from 'parsers/window_manager/proto_type';
24import {TamperedProtos} from 'parsers/window_manager/tampered_protos';
25import {HEX_FORMATTER, RECT_FORMATTER} from 'trace/tree_node/formatters';
26import {Operation} from 'trace/tree_node/operations/operation';
27import {PropertyTreeNode} from 'trace/tree_node/property_tree_node';
28import {AddIsVisible} from './add_is_visible';
29import {AddWindowType} from './add_window_type';
30
31export interface OperationLists {
32  common: Array<Operation<PropertyTreeNode>>;
33  eager: Array<Operation<PropertyTreeNode>>;
34  lazy: Array<Operation<PropertyTreeNode>>;
35}
36
37const commonFormatters = new Map([['hashCode', HEX_FORMATTER]]);
38
39export class WmOperationLists {
40  private readonly LISTS = new Map<ProtoType, OperationLists>([
41    [
42      ProtoType.WindowManagerService,
43      {
44        common: [
45          new SetFormatters(
46            this.tamperedProtos.windowManagerServiceField,
47            commonFormatters,
48          ),
49          new TranslateIntDef(this.tamperedProtos.windowManagerServiceField),
50        ],
51        eager: [
52          new AddDefaults(
53            this.tamperedProtos.windowManagerServiceField,
54            EAGER_PROPERTIES.get(ProtoType.WindowManagerService),
55          ),
56        ],
57        lazy: [
58          new AddDefaults(
59            this.tamperedProtos.windowManagerServiceField,
60            undefined,
61            DENYLIST_PROPERTIES,
62          ),
63        ],
64      },
65    ],
66
67    [
68      ProtoType.RootWindowContainer,
69      {
70        common: [
71          new SetFormatters(
72            this.tamperedProtos.rootWindowContainerField,
73            commonFormatters,
74          ),
75          new TranslateIntDef(this.tamperedProtos.rootWindowContainerField),
76        ],
77        eager: [
78          new AddDefaults(
79            this.tamperedProtos.rootWindowContainerField,
80            EAGER_PROPERTIES.get(ProtoType.RootWindowContainer),
81          ),
82        ],
83        lazy: [
84          new AddDefaults(
85            this.tamperedProtos.rootWindowContainerField,
86            undefined,
87            DENYLIST_PROPERTIES,
88          ),
89        ],
90      },
91    ],
92
93    [
94      ProtoType.WindowContainer,
95      {
96        common: [
97          new SetFormatters(
98            this.tamperedProtos.windowContainerField,
99            commonFormatters,
100          ),
101          new TranslateIntDef(this.tamperedProtos.windowContainerField),
102        ],
103        eager: [
104          new AddDefaults(
105            this.tamperedProtos.windowContainerField,
106            EAGER_PROPERTIES.get(ProtoType.WindowContainer),
107          ),
108          new AddIsVisible(),
109        ],
110        lazy: [
111          new AddDefaults(
112            this.tamperedProtos.windowContainerField,
113            undefined,
114            DENYLIST_PROPERTIES,
115          ),
116        ],
117      },
118    ],
119
120    [
121      ProtoType.DisplayContent,
122      {
123        common: [
124          new SetFormatters(
125            this.tamperedProtos.displayContentField,
126            commonFormatters,
127          ),
128          new TranslateIntDef(this.tamperedProtos.displayContentField),
129        ],
130        eager: [
131          new AddDefaults(
132            this.tamperedProtos.displayContentField,
133            EAGER_PROPERTIES.get(ProtoType.DisplayContent),
134          ),
135        ],
136        lazy: [
137          new AddDefaults(
138            this.tamperedProtos.displayContentField,
139            undefined,
140            DENYLIST_PROPERTIES,
141          ),
142        ],
143      },
144    ],
145
146    [
147      ProtoType.DisplayArea,
148      {
149        common: [
150          new SetFormatters(
151            this.tamperedProtos.displayAreaField,
152            commonFormatters,
153          ),
154          new TranslateIntDef(this.tamperedProtos.displayAreaField),
155        ],
156        eager: [
157          new AddDefaults(
158            this.tamperedProtos.displayAreaField,
159            EAGER_PROPERTIES.get(ProtoType.DisplayArea),
160          ),
161        ],
162        lazy: [
163          new AddDefaults(
164            this.tamperedProtos.displayAreaField,
165            undefined,
166            DENYLIST_PROPERTIES,
167          ),
168        ],
169      },
170    ],
171
172    [
173      ProtoType.Task,
174      {
175        common: [
176          new SetFormatters(this.tamperedProtos.taskField, commonFormatters),
177          new TranslateIntDef(this.tamperedProtos.taskField),
178        ],
179        eager: [
180          new AddDefaults(
181            this.tamperedProtos.taskField,
182            EAGER_PROPERTIES.get(ProtoType.Task),
183          ),
184        ],
185        lazy: [
186          new AddDefaults(
187            this.tamperedProtos.taskField,
188            undefined,
189            DENYLIST_PROPERTIES,
190          ),
191        ],
192      },
193    ],
194
195    [
196      ProtoType.Activity,
197      {
198        common: [
199          new SetFormatters(
200            this.tamperedProtos.activityField,
201            commonFormatters,
202          ),
203          new TranslateIntDef(this.tamperedProtos.activityField),
204        ],
205        eager: [
206          new AddDefaults(
207            this.tamperedProtos.activityField,
208            EAGER_PROPERTIES.get(ProtoType.Activity),
209          ),
210          new AddIsVisible(),
211        ],
212        lazy: [
213          new AddDefaults(
214            this.tamperedProtos.activityField,
215            undefined,
216            DENYLIST_PROPERTIES,
217          ),
218        ],
219      },
220    ],
221
222    [
223      ProtoType.WindowToken,
224      {
225        common: [
226          new SetFormatters(
227            this.tamperedProtos.windowTokenField,
228            commonFormatters,
229          ),
230          new TranslateIntDef(this.tamperedProtos.windowTokenField),
231        ],
232        eager: [
233          new AddDefaults(
234            this.tamperedProtos.windowTokenField,
235            EAGER_PROPERTIES.get(ProtoType.WindowToken),
236          ),
237        ],
238        lazy: [
239          new AddDefaults(
240            this.tamperedProtos.windowTokenField,
241            undefined,
242            DENYLIST_PROPERTIES,
243          ),
244        ],
245      },
246    ],
247
248    [
249      ProtoType.WindowState,
250      {
251        common: [
252          new SetFormatters(
253            this.tamperedProtos.windowStateField,
254            new Map([
255              ['containingFrame', RECT_FORMATTER],
256              ['parentFrame', RECT_FORMATTER],
257              ...Array.from(commonFormatters.entries()),
258            ]),
259          ),
260          new TranslateIntDef(this.tamperedProtos.windowStateField),
261        ],
262        eager: [
263          new AddDefaults(
264            this.tamperedProtos.windowStateField,
265            EAGER_PROPERTIES.get(ProtoType.WindowState),
266          ),
267          new AddWindowType(),
268          new AddIsVisible(),
269        ],
270        lazy: [
271          new AddDefaults(
272            this.tamperedProtos.windowStateField,
273            undefined,
274            DENYLIST_PROPERTIES,
275          ),
276        ],
277      },
278    ],
279
280    [
281      ProtoType.TaskFragment,
282      {
283        common: [
284          new SetFormatters(
285            this.tamperedProtos.taskFragmentField,
286            commonFormatters,
287          ),
288          new TranslateIntDef(this.tamperedProtos.taskFragmentField),
289        ],
290        eager: [
291          new AddDefaults(
292            this.tamperedProtos.taskFragmentField,
293            EAGER_PROPERTIES.get(ProtoType.TaskFragment),
294          ),
295        ],
296        lazy: [
297          new AddDefaults(
298            this.tamperedProtos.taskFragmentField,
299            undefined,
300            DENYLIST_PROPERTIES,
301          ),
302        ],
303      },
304    ],
305  ]);
306
307  constructor(private readonly tamperedProtos: TamperedProtos) {}
308
309  get(type: ProtoType): OperationLists {
310    return assertDefined(this.LISTS.get(type));
311  }
312}
313