+ {didRecordCommits && isSearchInputVisible && (
+
+ )}
{view}
diff --git a/packages/react-devtools-shared/src/devtools/views/Profiler/ProfilerContext.js b/packages/react-devtools-shared/src/devtools/views/Profiler/ProfilerContext.js
index 7539573fc6c0..1867b9d05d95 100644
--- a/packages/react-devtools-shared/src/devtools/views/Profiler/ProfilerContext.js
+++ b/packages/react-devtools-shared/src/devtools/views/Profiler/ProfilerContext.js
@@ -14,6 +14,7 @@ import {
createContext,
useCallback,
useContext,
+ useDeferredValue,
useMemo,
useState,
useEffect,
@@ -24,13 +25,53 @@ import {
TreeStateContext,
} from '../Components/TreeContext';
import {StoreContext} from '../context';
+import {createRegExp} from '../utils';
import {logEvent} from 'react-devtools-shared/src/Logger';
import {useCommitFilteringAndNavigation} from './useCommitFilteringAndNavigation';
-import type {CommitDataFrontend, ProfilingDataFrontend} from './types';
+import type {
+ CommitDataFrontend,
+ CommitTree,
+ CommitTreeNode,
+ ProfilingDataFrontend,
+} from './types';
export type TabID = 'flame-chart' | 'ranked-chart';
+type SearchResult = {id: number, name: string | null};
+
+function fiberMatchesQuery(node: CommitTreeNode, regExp: RegExp): boolean {
+ const {displayName, hocDisplayNames, key} = node;
+ return (
+ (displayName !== null && regExp.test(displayName)) ||
+ (hocDisplayNames !== null &&
+ hocDisplayNames.some(name => regExp.test(name))) ||
+ (key !== null && regExp.test(String(key)))
+ );
+}
+
+// Collect the fibers in a commit tree that match `text`, in tree (pre-order)
+// order. Kept module-level and pure so it isn't recreated on every render.
+function collectSearchMatches(
+ commitTree: CommitTree,
+ text: string,
+): Array