| // Copyright (C) 2022 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 m from 'mithril'; |
| |
| import {DataSource} from '../../common/recordingV2/recording_interfaces_v2'; |
| import {getBuiltinChromeCategoryList, isChromeTarget} from '../../common/state'; |
| import {globals} from '../globals'; |
| import { |
| CategoriesCheckboxList, |
| CompactProbe, |
| Toggle, |
| ToggleAttrs, |
| } from '../record_widgets'; |
| |
| import {RecordingSectionAttrs} from './recording_sections'; |
| |
| function extractChromeCategories(dataSources: DataSource[]): string[]| |
| undefined { |
| for (const dataSource of dataSources) { |
| if (dataSource.name === 'chromeCategories') { |
| return dataSource.descriptor as string[]; |
| } |
| } |
| return undefined; |
| } |
| |
| class ChromeCategoriesSelection implements |
| m.ClassComponent<RecordingSectionAttrs> { |
| view({attrs}: m.CVnode<RecordingSectionAttrs>) { |
| // If we are attempting to record via the Chrome extension, we receive the |
| // list of actually supported categories via DevTools. Otherwise, we fall |
| // back to an integrated list of categories from a recent version of Chrome. |
| let categories = globals.state.chromeCategories || |
| extractChromeCategories(attrs.dataSources); |
| if (!categories || !isChromeTarget(globals.state.recordingTarget)) { |
| categories = getBuiltinChromeCategoryList(); |
| } |
| |
| const defaultCategories = new Map<string, string>(); |
| const disabledByDefaultCategories = new Map<string, string>(); |
| const disabledPrefix = 'disabled-by-default-'; |
| categories.forEach((cat) => { |
| if (cat.startsWith(disabledPrefix)) { |
| disabledByDefaultCategories.set(cat, cat.replace(disabledPrefix, '')); |
| } else { |
| defaultCategories.set(cat, cat); |
| } |
| }); |
| |
| return m( |
| '.chrome-categories', |
| m(CategoriesCheckboxList, { |
| categories: defaultCategories, |
| title: 'Additional categories', |
| get: (cfg) => cfg.chromeCategoriesSelected, |
| set: (cfg, val) => cfg.chromeCategoriesSelected = val, |
| }), |
| m(CategoriesCheckboxList, { |
| categories: disabledByDefaultCategories, |
| title: 'High overhead categories', |
| get: (cfg) => cfg.chromeHighOverheadCategoriesSelected, |
| set: (cfg, val) => cfg.chromeHighOverheadCategoriesSelected = val, |
| })); |
| } |
| } |
| |
| export class ChromeSettings implements m.ClassComponent<RecordingSectionAttrs> { |
| view({attrs}: m.CVnode<RecordingSectionAttrs>) { |
| return m( |
| `.record-section${attrs.cssClass}`, |
| CompactProbe({ |
| title: 'Task scheduling', |
| setEnabled: (cfg, val) => cfg.taskScheduling = val, |
| isEnabled: (cfg) => cfg.taskScheduling, |
| }), |
| CompactProbe({ |
| title: 'IPC flows', |
| setEnabled: (cfg, val) => cfg.ipcFlows = val, |
| isEnabled: (cfg) => cfg.ipcFlows, |
| }), |
| CompactProbe({ |
| title: 'Javascript execution', |
| setEnabled: (cfg, val) => cfg.jsExecution = val, |
| isEnabled: (cfg) => cfg.jsExecution, |
| }), |
| CompactProbe({ |
| title: 'Web content rendering, layout and compositing', |
| setEnabled: (cfg, val) => cfg.webContentRendering = val, |
| isEnabled: (cfg) => cfg.webContentRendering, |
| }), |
| CompactProbe({ |
| title: 'UI rendering & surface compositing', |
| setEnabled: (cfg, val) => cfg.uiRendering = val, |
| isEnabled: (cfg) => cfg.uiRendering, |
| }), |
| CompactProbe({ |
| title: 'Input events', |
| setEnabled: (cfg, val) => cfg.inputEvents = val, |
| isEnabled: (cfg) => cfg.inputEvents, |
| }), |
| CompactProbe({ |
| title: 'Navigation & Loading', |
| setEnabled: (cfg, val) => cfg.navigationAndLoading = val, |
| isEnabled: (cfg) => cfg.navigationAndLoading, |
| }), |
| CompactProbe({ |
| title: 'Chrome Logs', |
| setEnabled: (cfg, val) => cfg.chromeLogs = val, |
| isEnabled: (cfg) => cfg.chromeLogs, |
| }), |
| m(Toggle, { |
| title: 'Remove untyped and sensitive data like URLs from the trace', |
| descr: 'Not recommended unless you intend to share the trace' + |
| ' with third-parties.', |
| setEnabled: (cfg, val) => cfg.chromePrivacyFiltering = val, |
| isEnabled: (cfg) => cfg.chromePrivacyFiltering, |
| } as ToggleAttrs), |
| m(ChromeCategoriesSelection, attrs)); |
| } |
| } |