Add main thread filter control

Summary: This adds a filter on top of the event types to only highlight when the thread occurs on the main thread

Reviewed By: lblasa

Differential Revision: D47520036

fbshipit-source-id: b4a67b262345d845e5dcbf79bba5a210c1bca4f8
This commit is contained in:
Luke De Feo
2023-07-19 08:58:20 -07:00
committed by Facebook GitHub Bot
parent 5ef37684eb
commit ff7182525a
4 changed files with 56 additions and 1 deletions

View File

@@ -19,6 +19,7 @@ import {
Typography, Typography,
TreeSelect, TreeSelect,
Space, Space,
Switch,
} from 'antd'; } from 'antd';
import { import {
MoreOutlined, MoreOutlined,
@@ -39,6 +40,9 @@ export const Controls: React.FC = () => {
const instance = usePlugin(plugin); const instance = usePlugin(plugin);
const searchTerm = useValue(instance.uiState.searchTerm); const searchTerm = useValue(instance.uiState.searchTerm);
const isPaused = useValue(instance.uiState.isPaused); const isPaused = useValue(instance.uiState.isPaused);
const filterMainThreadMonitoring = useValue(
instance.uiState.filterMainThreadMonitoring,
);
const frameworkEventMonitoring: Map<FrameworkEventType, boolean> = useValue( const frameworkEventMonitoring: Map<FrameworkEventType, boolean> = useValue(
instance.uiState.frameworkEventMonitoring, instance.uiState.frameworkEventMonitoring,
@@ -81,6 +85,10 @@ export const Controls: React.FC = () => {
}></Button> }></Button>
{frameworkEventMonitoring.size > 0 && ( {frameworkEventMonitoring.size > 0 && (
<MoreOptionsMenu <MoreOptionsMenu
filterMainThreadMonitoring={filterMainThreadMonitoring}
onSetFilterMainThreadMonitoring={
instance.uiActions.onSetFilterMainThreadMonitoring
}
onSetEventMonitored={onSetEventMonitored} onSetEventMonitored={onSetEventMonitored}
frameworkEventTypes={[...frameworkEventMonitoring.entries()]} frameworkEventTypes={[...frameworkEventMonitoring.entries()]}
/> />
@@ -92,7 +100,11 @@ export const Controls: React.FC = () => {
function MoreOptionsMenu({ function MoreOptionsMenu({
onSetEventMonitored, onSetEventMonitored,
frameworkEventTypes, frameworkEventTypes,
filterMainThreadMonitoring,
onSetFilterMainThreadMonitoring,
}: { }: {
filterMainThreadMonitoring: boolean;
onSetFilterMainThreadMonitoring: (toggled: boolean) => void;
onSetEventMonitored: ( onSetEventMonitored: (
eventType: FrameworkEventType, eventType: FrameworkEventType,
monitored: boolean, monitored: boolean,
@@ -126,6 +138,8 @@ function MoreOptionsMenu({
{/*invisible until shown*/} {/*invisible until shown*/}
<FrameworkEventsMonitoringModal <FrameworkEventsMonitoringModal
filterMainThreadMonitoring={filterMainThreadMonitoring}
onSetFilterMainThreadMonitoring={onSetFilterMainThreadMonitoring}
frameworkEventTypes={frameworkEventTypes} frameworkEventTypes={frameworkEventTypes}
onSetEventMonitored={onSetEventMonitored} onSetEventMonitored={onSetEventMonitored}
visible={showFrameworkEventsModal} visible={showFrameworkEventsModal}
@@ -139,6 +153,8 @@ function FrameworkEventsMonitoringModal({
visible, visible,
onCancel, onCancel,
onSetEventMonitored, onSetEventMonitored,
onSetFilterMainThreadMonitoring,
filterMainThreadMonitoring,
frameworkEventTypes, frameworkEventTypes,
}: { }: {
visible: boolean; visible: boolean;
@@ -147,6 +163,8 @@ function FrameworkEventsMonitoringModal({
eventType: FrameworkEventType, eventType: FrameworkEventType,
monitored: boolean, monitored: boolean,
) => void; ) => void;
filterMainThreadMonitoring: boolean;
onSetFilterMainThreadMonitoring: (toggled: boolean) => void;
frameworkEventTypes: [FrameworkEventType, boolean][]; frameworkEventTypes: [FrameworkEventType, boolean][];
}) { }) {
const selectedFrameworkEvents = frameworkEventTypes const selectedFrameworkEvents = frameworkEventTypes
@@ -193,6 +211,18 @@ function FrameworkEventsMonitoringModal({
} }
}} }}
/> />
<Layout.Horizontal gap="medium">
<Switch
checked={filterMainThreadMonitoring}
onChange={(event) => {
onSetFilterMainThreadMonitoring(event);
}}
/>
<Typography.Text>
Only highlight events that occured on the main thread
</Typography.Text>
</Layout.Horizontal>
</Space> </Space>
</Modal> </Modal>
); );

View File

@@ -80,6 +80,9 @@ export function Tree2({nodes, rootId}: {nodes: Map<Id, UINode>; rootId: Id}) {
const hoveredNode = head(useValue(instance.uiState.hoveredNodes)); const hoveredNode = head(useValue(instance.uiState.hoveredNodes));
const frameworkEvents = useValue(instance.frameworkEvents); const frameworkEvents = useValue(instance.frameworkEvents);
const filterMainThreadMonitoring = useValue(
instance.uiState.filterMainThreadMonitoring,
);
const frameworkEventsMonitoring = useValue( const frameworkEventsMonitoring = useValue(
instance.uiState.frameworkEventMonitoring, instance.uiState.frameworkEventMonitoring,
); );
@@ -239,6 +242,7 @@ export function Tree2({nodes, rootId}: {nodes: Map<Id, UINode>; rootId: Id}) {
treeNode={treeNodes[virtualRow.index]} treeNode={treeNodes[virtualRow.index]}
frameworkEvents={frameworkEvents} frameworkEvents={frameworkEvents}
frameworkEventsMonitoring={frameworkEventsMonitoring} frameworkEventsMonitoring={frameworkEventsMonitoring}
filterMainThreadMonitoring={filterMainThreadMonitoring}
highlightedNodes={highlightedNodes} highlightedNodes={highlightedNodes}
selectedNode={selectedNode?.id} selectedNode={selectedNode?.id}
hoveredNode={hoveredNode} hoveredNode={hoveredNode}
@@ -290,6 +294,7 @@ function TreeItemContainer({
treeNode, treeNode,
frameworkEvents, frameworkEvents,
frameworkEventsMonitoring, frameworkEventsMonitoring,
filterMainThreadMonitoring,
highlightedNodes, highlightedNodes,
selectedNode, selectedNode,
hoveredNode, hoveredNode,
@@ -306,6 +311,7 @@ function TreeItemContainer({
frameworkEvents: Map<Id, FrameworkEvent[]>; frameworkEvents: Map<Id, FrameworkEvent[]>;
highlightedNodes: Set<Id>; highlightedNodes: Set<Id>;
frameworkEventsMonitoring: Map<FrameworkEventType, boolean>; frameworkEventsMonitoring: Map<FrameworkEventType, boolean>;
filterMainThreadMonitoring: boolean;
selectedNode?: Id; selectedNode?: Id;
hoveredNode?: Id; hoveredNode?: Id;
isUsingKBToScroll: RefObject<MillisSinceEpoch>; isUsingKBToScroll: RefObject<MillisSinceEpoch>;
@@ -317,7 +323,11 @@ function TreeItemContainer({
}) { }) {
let events = frameworkEvents.get(treeNode.id); let events = frameworkEvents.get(treeNode.id);
if (events) { if (events) {
events = events.filter((e) => frameworkEventsMonitoring.get(e.type)); events = events
.filter((e) => frameworkEventsMonitoring.get(e.type))
.filter(
(e) => filterMainThreadMonitoring === false || e.thread === 'main',
);
} }
return ( return (

View File

@@ -213,6 +213,7 @@ export function plugin(client: PluginClient<Events>) {
frameworkEventMonitoring: createState( frameworkEventMonitoring: createState(
new Map<FrameworkEventType, boolean>(), new Map<FrameworkEventType, boolean>(),
), ),
filterMainThreadMonitoring: createState(false),
isPaused: createState(false), isPaused: createState(false),
@@ -297,11 +298,17 @@ export function plugin(client: PluginClient<Events>) {
const monitoredEvents = uiState.frameworkEventMonitoring.get(); const monitoredEvents = uiState.frameworkEventMonitoring.get();
const filterMainThread = uiState.filterMainThreadMonitoring.get();
const nodesToHighlight = const nodesToHighlight =
frameScan.frameworkEvents frameScan.frameworkEvents
?.filter( ?.filter(
(frameworkEvent) => monitoredEvents.get(frameworkEvent.type) === true, (frameworkEvent) => monitoredEvents.get(frameworkEvent.type) === true,
) )
.filter(
(frameworkEvent) =>
filterMainThread === false || frameworkEvent.thread === 'main',
)
.map((event) => event.nodeId) ?? []; .map((event) => event.nodeId) ?? [];
highlightedNodes.update((draft) => { highlightedNodes.update((draft) => {
@@ -456,6 +463,10 @@ function uiActions(uiState: UIState, nodes: Atom<Map<Id, UINode>>): UIActions {
uiState.visualiserWidth.set(width); uiState.visualiserWidth.set(width);
}; };
const onSetFilterMainThreadMonitoring = (toggled: boolean) => {
uiState.filterMainThreadMonitoring.set(toggled);
};
return { return {
onExpandNode, onExpandNode,
onCollapseNode, onCollapseNode,
@@ -464,6 +475,7 @@ function uiActions(uiState: UIState, nodes: Atom<Map<Id, UINode>>): UIActions {
onContextMenuOpen, onContextMenuOpen,
onFocusNode, onFocusNode,
setVisualiserWidth, setVisualiserWidth,
onSetFilterMainThreadMonitoring,
}; };
} }

View File

@@ -22,6 +22,7 @@ export type UIState = {
expandedNodes: Atom<Set<Id>>; expandedNodes: Atom<Set<Id>>;
visualiserWidth: Atom<number>; visualiserWidth: Atom<number>;
frameworkEventMonitoring: Atom<Map<FrameworkEventType, boolean>>; frameworkEventMonitoring: Atom<Map<FrameworkEventType, boolean>>;
filterMainThreadMonitoring: Atom<boolean>;
}; };
export type NodeSelection = { export type NodeSelection = {
@@ -42,6 +43,7 @@ export type UIActions = {
onExpandNode: (node: Id) => void; onExpandNode: (node: Id) => void;
onCollapseNode: (node: Id) => void; onCollapseNode: (node: Id) => void;
setVisualiserWidth: (width: number) => void; setVisualiserWidth: (width: number) => void;
onSetFilterMainThreadMonitoring: (toggled: boolean) => void;
}; };
export type SelectionSource = 'visualiser' | 'tree' | 'keyboard'; export type SelectionSource = 'visualiser' | 'tree' | 'keyboard';
@@ -113,6 +115,7 @@ export type FrameworkEvent = {
timestamp: number; timestamp: number;
payload?: JSON; payload?: JSON;
attribution?: FrameworkEventAttribution; attribution?: FrameworkEventAttribution;
thread?: 'main' | string;
}; };
export type InitEvent = { export type InitEvent = {