// Copyright (C) 2018 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 {RECORDING_V2_FLAG} from '../common/feature_flags'; import {globals} from '../frontend/globals'; import {Child, Controller, ControllerInitializerAny} from './controller'; import {PermalinkController} from './permalink_controller'; import {RecordController} from './record_controller'; import {TraceController} from './trace_controller'; // The root controller for the entire app. It handles the lifetime of all // the other controllers (e.g., track and query controllers) according to the // global state. export class AppController extends Controller<'main'> { // extensionPort is needed for the RecordController to communicate with the // extension through the frontend. This is because the controller is running // on a worker, and isn't able to directly send messages to the extension. private extensionPort: MessagePort; constructor(extensionPort: MessagePort) { super('main'); this.extensionPort = extensionPort; } // This is the root method that is called every time the controller tree is // re-triggered. This can happen due to: // - An action received from the frontend. // - An internal promise of a nested controller being resolved and manually // re-triggering the controllers. run() { const childControllers: ControllerInitializerAny[] = [Child('permalink', PermalinkController, {})]; if (!RECORDING_V2_FLAG.get()) { childControllers.push(Child( 'record', RecordController, {extensionPort: this.extensionPort})); } if (globals.state.engine !== undefined) { const engineCfg = globals.state.engine; childControllers.push(Child(engineCfg.id, TraceController, engineCfg.id)); } return childControllers; } }