fix(extension): bugfix

This commit is contained in:
Ljy-0827
2026-08-06 18:46:06 +08:00
parent d685c75d25
commit 6c610faed9
5 changed files with 45 additions and 3 deletions
@@ -422,6 +422,10 @@ export function startRecordCapture(
const onMouseOver = (event: MouseEvent) => {
const target = eventTarget(event);
if (isOverlayTarget(target)) return;
if (pendingHover && target instanceof Element && pendingHover.element.contains(target)) {
if (Date.now() - pendingHover.recordedAt <= HOVER_BEFORE_CLICK_MAX_MS) return;
pendingHover = null;
}
const hover = hoverTargetFromEvent(target);
if (!hover) return;
const now = Date.now();
@@ -456,6 +456,41 @@ describe("ToolDispatcher", () => {
);
});
it("transfers hover overlay bypass ownership between sessions", async () => {
vi.stubGlobal("chrome", {
tabs: {
sendMessage: vi.fn(async () => undefined),
},
});
const { transport } = fakeTransport();
const sessions = new SessionManager({
agentWindow: {
create: vi.fn(async () => 1),
remove: vi.fn(async () => {}),
ensureActiveTab: vi.fn(async () => {}),
},
});
const dispatcher = new ToolDispatcher({ transport, sessions });
const helpers = dispatcher as unknown as {
setHoverBypass: (sessionId: string, tabId: number, enabled: boolean) => Promise<void>;
};
await helpers.setHoverBypass("aa11", 7, true);
await helpers.setHoverBypass("bb22", 7, true);
await helpers.setHoverBypass("aa11", 7, false);
expect(chrome.tabs.sendMessage).not.toHaveBeenCalledWith(
7,
expect.objectContaining({ enabled: false }),
);
await helpers.setHoverBypass("bb22", 7, false);
expect(chrome.tabs.sendMessage).toHaveBeenCalledWith(
7,
expect.objectContaining({ enabled: false }),
);
expect(chrome.tabs.sendMessage).toHaveBeenCalledTimes(2);
});
it("limits default-target hover reassertion to the active tab", async () => {
vi.stubGlobal("chrome", {
tabs: {
@@ -1566,6 +1566,7 @@ describe("buildVomScene", () => {
surfaceProbes: [
{ triggerBackendNodeId: 20, triggerAction: "hover", subItems: ["My profile"] },
{ triggerBackendNodeId: 20, triggerAction: "hover", subItems: ["Sign out"] },
{ triggerBackendNodeId: 21, triggerAction: "hover", subItems: ["Settings"] },
],
nodes: [
{
+4 -3
View File
@@ -534,12 +534,13 @@ export class ToolDispatcher {
}
private async setHoverBypass(sessionId: string, tabId: number, enabled: boolean): Promise<void> {
const owner = this.hoverBypassTabs.get(tabId);
if (enabled) {
if (this.hoverBypassTabs.has(tabId)) return;
await bypassOverlay(tabId, true);
if (owner === sessionId) return;
if (owner === undefined) await bypassOverlay(tabId, true);
this.hoverBypassTabs.set(tabId, sessionId);
} else {
if (!this.hoverBypassTabs.has(tabId)) return;
if (owner !== sessionId) return;
await bypassOverlay(tabId, false);
this.hoverBypassTabs.delete(tabId);
}
+1
View File
@@ -927,6 +927,7 @@ function buildConditionalSurfaces(nodes: VomNode[], captured: CapturedViewModel)
probe.triggerPoint,
);
if (!match) continue;
if (used.has(match.id)) continue;
used.add(probe.triggerBackendNodeId);
used.add(match.id);
surfaces.push({