|  | /* | 
|  | * Copyright 2019, The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | import {nanos_to_string} from './transform.js'; | 
|  |  | 
|  | function transform_transaction(transaction, layerIdToName) { | 
|  | const transactions = []; | 
|  |  | 
|  | for (const surfaceChange of transaction.surfaceChange) { | 
|  | transactions.push(Object.freeze({ | 
|  | type: 'surfaceChange', | 
|  | obj: surfaceChange, | 
|  | layerName: layerIdToName[surfaceChange.id], | 
|  | })); | 
|  | } | 
|  |  | 
|  | for (const displayChange of transaction.displayChange) { | 
|  | transactions.push(Object.freeze({ | 
|  | type: 'displayChange', | 
|  | obj: displayChange, | 
|  | layerName: layerIdToName[displayChange.id], | 
|  | })); | 
|  | } | 
|  |  | 
|  | return transactions; | 
|  | } | 
|  |  | 
|  | function transform_entry(entry, layerIdToName) { | 
|  | const type = entry.increment; | 
|  | const timestamp = entry.timeStamp; | 
|  | const time = nanos_to_string(timestamp); | 
|  |  | 
|  | switch (type) { | 
|  | case 'transaction': | 
|  |  | 
|  | return Object.freeze({ | 
|  | type, | 
|  | // TODO: Rename to changes | 
|  | transactions: transform_transaction(entry.transaction, layerIdToName), | 
|  | synchronous: entry.transaction.synchronous, | 
|  | animation: entry.transaction.animation, | 
|  | identifier: entry.transaction.id, | 
|  | time, | 
|  | origin: entry.transaction.origin, | 
|  | timestamp, | 
|  | }); | 
|  |  | 
|  | case 'surfaceCreation': | 
|  | // NOTE: There is no break on purpose — we want to fall through to default | 
|  | layerIdToName[entry[type].id] = entry[type].name; | 
|  |  | 
|  | default: | 
|  | return Object.freeze({ | 
|  | type, | 
|  | obj: entry[type], | 
|  | layerName: entry[type].name ?? layerIdToName[entry[type].id], | 
|  | time, | 
|  | timestamp, | 
|  | }); | 
|  | } | 
|  | } | 
|  |  | 
|  | function transform_transaction_trace(entries) { | 
|  | const layerIdToName = {}; | 
|  | const data = entries.increment.map((entry) => transform_entry(entry, layerIdToName)); | 
|  |  | 
|  | return {children: data}; | 
|  | } | 
|  |  | 
|  | export {transform_transaction_trace}; |