// 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 { view({attrs}: m.CVnode) { // 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(); const disabledByDefaultCategories = new Map(); 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 { view({attrs}: m.CVnode) { 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)); } }