= ({
setAriaSnapshotErrors(highlights);
setAriaSnapshot(ariaSnapshot);
if (!errors.length)
- window.dispatch({ event: 'highlightRequested', params: { ariaTemplate: fragment } });
- }, [mode]);
+ backend.highlightRequested({ ariaTemplate: fragment });
+ }, [mode, backend]);
const isRecording = mode === 'recording' || mode === 'recording-inspecting' || mode === 'assertingText' || mode === 'assertingVisibility';
return
{
- window.dispatch({ event: 'setMode', params: { mode: mode === 'none' || mode === 'standby' || mode === 'inspecting' ? 'recording' : 'standby' } });
+ backend.setMode({ mode: mode === 'none' || mode === 'standby' || mode === 'inspecting' ? 'recording' : 'standby' });
}}>Record
{
- const newMode = {
+ const newMode: Mode = {
'inspecting': 'standby',
'none': 'inspecting',
'standby': 'inspecting',
@@ -152,42 +174,42 @@ export const Recorder: React.FC = ({
'assertingVisibility': 'recording-inspecting',
'assertingValue': 'recording-inspecting',
'assertingSnapshot': 'recording-inspecting',
- }[mode];
- window.dispatch({ event: 'setMode', params: { mode: newMode } }).catch(() => { });
+ }[mode] as Mode;
+ backend.setMode({ mode: newMode }).catch(() => { });
}}>
{
- window.dispatch({ event: 'setMode', params: { mode: mode === 'assertingVisibility' ? 'recording' : 'assertingVisibility' } });
+ backend.setMode({ mode: mode === 'assertingVisibility' ? 'recording' : 'assertingVisibility' });
}}>
{
- window.dispatch({ event: 'setMode', params: { mode: mode === 'assertingText' ? 'recording' : 'assertingText' } });
+ backend.setMode({ mode: mode === 'assertingText' ? 'recording' : 'assertingText' });
}}>
{
- window.dispatch({ event: 'setMode', params: { mode: mode === 'assertingValue' ? 'recording' : 'assertingValue' } });
+ backend.setMode({ mode: mode === 'assertingValue' ? 'recording' : 'assertingValue' });
}}>
{
- window.dispatch({ event: 'setMode', params: { mode: mode === 'assertingSnapshot' ? 'recording' : 'assertingSnapshot' } });
+ backend.setMode({ mode: mode === 'assertingSnapshot' ? 'recording' : 'assertingSnapshot' });
}}>
{
copy(source.text);
}}>
{
- window.dispatch({ event: 'resume' });
+ backend.resume();
}}>
{
- window.dispatch({ event: 'pause' });
+ backend.pause();
}}>
{
- window.dispatch({ event: 'step' });
+ backend.step();
}}>
Target:
{
setSelectedFileId(fileId);
- window.dispatch({ event: 'fileChanged', params: { fileId } });
+ backend.fileChanged({ fileId });
}} />
{
- window.dispatch({ event: 'clear' });
+ backend.clear();
}}>
= ({
{
- window.dispatch({ event: 'setAutoExpect', params: { autoExpect: !autoExpect } });
+ backend.setAutoExpect({ autoExpect: !autoExpect });
setAutoExpect(!autoExpect);
}} />
@@ -248,3 +270,15 @@ export const Recorder: React.FC = ({
/>
;
};
+
+function createRecorderBackend(): RecorderBackend {
+ return new Proxy({} as RecorderBackend, {
+ get: (_target, prop: string | symbol) => {
+ if (typeof prop !== 'string')
+ return undefined;
+ return (params?: any) => {
+ return window.sendCommand({ method: prop, params });
+ };
+ },
+ });
+}
diff --git a/packages/recorder/src/recorderTypes.d.ts b/packages/recorder/src/recorderTypes.d.ts
index 2f5b0ffe4e817..0b65768d1b9c8 100644
--- a/packages/recorder/src/recorderTypes.d.ts
+++ b/packages/recorder/src/recorderTypes.d.ts
@@ -99,15 +99,29 @@ export type Source = {
declare global {
interface Window {
- playwrightSetMode: (mode: Mode) => void;
- playwrightSetPaused: (paused: boolean) => void;
- playwrightSetSources: (sources: Source[]) => void;
- playwrightSelectSource: (sourceId: string) => void;
- playwrightSetPageURL: (url: string | undefined) => void;
- playwrightSetOverlayVisible: (visible: boolean) => void;
- playwrightUpdateLogs: (callLogs: CallLog[]) => void;
- playwrightElementPicked: (elementInfo: ElementInfo, userGesture?: boolean) => void;
playwrightSourcesEchoForTest: Source[];
- dispatch(data: any): Promise;
+ sendCommand(data: { method: string; params?: any }): Promise;
+ dispatch(data: { method: string; params?: any }): void;
}
}
+
+export interface RecorderBackend {
+ setMode(params: { mode: Mode }): Promise;
+ setAutoExpect(params: { autoExpect: boolean }): Promise;
+ resume(): Promise;
+ pause(): Promise;
+ step(): Promise;
+ highlightRequested(params: { selector?: string; ariaTemplate?: AriaTemplateNode }): Promise;
+ fileChanged(params: { fileId: string }): Promise;
+ clear(): Promise;
+}
+
+export interface RecorderFrontend {
+ modeChanged: (params: { mode: Mode }) => void;
+ pauseStateChanged: (params: { paused: boolean }) => void;
+ sourcesUpdated: (params: { sources: Source[] }) => void;
+ sourceRevealRequested: (params: { sourceId: string }) => void;
+ pageNavigated: (params: { url: string | undefined }) => void;
+ callLogsUpdated: (params: { callLogs: CallLog[] }) => void;
+ elementPicked: (params: { elementInfo: ElementInfo, userGesture?: boolean }) => void;
+}