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:
committed by
Facebook GitHub Bot
parent
5ef37684eb
commit
ff7182525a
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
Reference in New Issue
Block a user