blob: 8e6e3c9767a5ab44d312660052ff4ca23cdb1d5e [file] [log] [blame]
Primiano Tuccie36ca632018-08-21 14:32:23 +02001// Copyright (C) 2018 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15import {globals} from '../controller/globals';
Hector Dearman9565d122018-10-11 11:30:50 +010016
Primiano Tuccie36ca632018-08-21 14:32:23 +020017import {Child, Controller, ControllerInitializerAny} from './controller';
18import {PermalinkController} from './permalink_controller';
Hector Dearman9565d122018-10-11 11:30:50 +010019import {RecordController} from './record_controller';
Primiano Tuccie36ca632018-08-21 14:32:23 +020020import {TraceController} from './trace_controller';
21
22// The root controller for the entire app. It handles the lifetime of all
23// the other controllers (e.g., track and query controllers) according to the
24// global state.
25export class AppController extends Controller<'main'> {
Nicolò Mazzucato1ed43cb2019-07-30 16:25:17 +010026 // extensionPort is needed for the RecordController to communicate with the
27 // extension through the frontend. This is because the controller is running
28 // on a worker, and isn't able to directly send messages to the extension.
29 private extensionPort: MessagePort;
30
31 constructor(extensionPort: MessagePort) {
Primiano Tuccie36ca632018-08-21 14:32:23 +020032 super('main');
Nicolò Mazzucato1ed43cb2019-07-30 16:25:17 +010033 this.extensionPort = extensionPort;
Primiano Tuccie36ca632018-08-21 14:32:23 +020034 }
35
36 // This is the root method that is called every time the controller tree is
37 // re-triggered. This can happen due to:
38 // - An action received from the frontend.
39 // - An internal promise of a nested controller being resolved and manually
40 // re-triggering the controllers.
41 run() {
Primiano Tuccie36ca632018-08-21 14:32:23 +020042 const childControllers: ControllerInitializerAny[] = [
43 Child('permalink', PermalinkController, {}),
Nicolò Mazzucato1ed43cb2019-07-30 16:25:17 +010044 Child(
45 'record',
46 RecordController,
47 {app: globals, extensionPort: this.extensionPort}),
Primiano Tuccie36ca632018-08-21 14:32:23 +020048 ];
Deepanjan Roy435835d2018-09-25 15:24:59 -040049 for (const engineCfg of Object.values(globals.state.engines)) {
50 childControllers.push(Child(engineCfg.id, TraceController, engineCfg.id));
Primiano Tuccie36ca632018-08-21 14:32:23 +020051 }
52 return childControllers;
53 }
54}