diff --git a/apps/extension/src/lib/__tests__/trace-reducer-v2.test.ts b/apps/extension/src/lib/__tests__/trace-reducer-v2.test.ts index 4a9e375..510a075 100644 --- a/apps/extension/src/lib/__tests__/trace-reducer-v2.test.ts +++ b/apps/extension/src/lib/__tests__/trace-reducer-v2.test.ts @@ -171,7 +171,7 @@ describe("reduceTraceSteps", () => { }); }); - it("keeps hover steps before menu clicks", () => { + it("drops hover steps, which only exist in trace v3", () => { const { steps } = reduceTraceSteps( [ { @@ -187,12 +187,7 @@ describe("reduceTraceSteps", () => { ], "https://example.com/app", ); - expect(steps.map((s) => s.op)).toEqual(["hover", "click"]); - expect(steps[0]).toMatchObject({ - op: "hover", - page: "p1", - target: { name: "Account" }, - }); + expect(steps.map((s) => s.op)).toEqual(["click"]); }); it("resolveTraceStartUrl prefers explicit start URL", () => { diff --git a/apps/extension/src/lib/__tests__/trace-reducer-v3.test.ts b/apps/extension/src/lib/__tests__/trace-reducer-v3.test.ts index 1018aec..8d0e59f 100644 --- a/apps/extension/src/lib/__tests__/trace-reducer-v3.test.ts +++ b/apps/extension/src/lib/__tests__/trace-reducer-v3.test.ts @@ -48,6 +48,25 @@ describe("trace reducer v3", () => { ]); }); + it("keeps hover steps before menu clicks", () => { + const drafts: RecordingDraftStep[] = [ + { + op: "hover", + captureTarget: { tag: "span", role: "button", name: "Account" }, + preStateId: "s1", + postStateId: "s1", + }, + { + op: "click", + captureTarget: { tag: "a", role: "link", name: "Profile" }, + preStateId: "s1", + postStateId: "s1", + }, + ]; + + expect(reduceTraceStepsV3(drafts).steps.map((s) => s.op)).toEqual(["hover", "click"]); + }); + it("does not export a tab transition without both observation endpoints", () => { const sourceOnly: RecordingDraftStep = { op: "switch_tab", preStateId: "s1" }; const targetOnly: RecordingDraftStep = { op: "switch_tab", postStateId: "s2" }; diff --git a/apps/extension/src/lib/recording/trace-reducer-v2.ts b/apps/extension/src/lib/recording/trace-reducer-v2.ts index dacf581..f129bc4 100644 --- a/apps/extension/src/lib/recording/trace-reducer-v2.ts +++ b/apps/extension/src/lib/recording/trace-reducer-v2.ts @@ -119,14 +119,6 @@ function toV2Step( }, effectForNavigation(step.navigatedTo, urlToId), ); - case "hover": - if (!step.captureTarget) return null; - return { - op: "hover", - id, - page, - target: step.captureTarget, - }; case "fill": if (!step.captureTarget) return null; return { @@ -161,6 +153,9 @@ function toV2Step( }, effectForNavigation(step.navigatedTo, urlToId), ); + // `hover` only exists in Trace v3. Peers that negotiate v2 predate the + // step variant and fail to decode the whole result if we emit it. + case "hover": case "scroll": case "switch_tab": return null; diff --git a/apps/extension/src/tools/__tests__/record-steps.test.ts b/apps/extension/src/tools/__tests__/record-steps.test.ts index 83d108b..f933b49 100644 --- a/apps/extension/src/tools/__tests__/record-steps.test.ts +++ b/apps/extension/src/tools/__tests__/record-steps.test.ts @@ -1200,7 +1200,8 @@ describe("recorded user steps reach the exported trace", () => { const trace = (stopped as RecordStopResult).trace; expect("version" in trace).toBe(false); expect("pages" in trace && trace.pages.length).toBeGreaterThan(0); - expect("steps" in trace && trace.steps.map((step) => step.op)).toEqual(["hover", "click"]); + // `hover` has no v2 counterpart on peers that negotiate v2. + expect("steps" in trace && trace.steps.map((step) => step.op)).toEqual(["click"]); }); it("rejects unsupported trace_version values", async () => {