blob: a7f2c344a8dad444c4b9ebb2c28a7c3a86f3c4ab [file] [log] [blame]
// 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));
}
}