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