Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
29c87ba
feat(chrome): add direct Qwen WebBridge
yiliang114 Aug 7, 2026
0c80bd5
Merge branch 'main' into codex/8699-qwen-webbridge
yiliang114 Aug 8, 2026
0c671fa
fix(chrome): correct WebBridge permissions
yiliang114 Aug 8, 2026
6304334
fix(webbridge): close browser capability gaps
yiliang114 Aug 8, 2026
18eae48
Merge remote-tracking branch 'origin/main' into HEAD
yiliang114 Aug 9, 2026
5828a0b
test(serve): include webbridge capability
yiliang114 Aug 9, 2026
927ebc5
fix(webbridge): address review findings
yiliang114 Aug 9, 2026
fc6b38a
Merge remote-tracking branch 'origin/codex/8699-qwen-webbridge' into …
yiliang114 Aug 9, 2026
48bcdf2
Merge remote-tracking branch 'origin/main' into HEAD
yiliang114 Aug 9, 2026
acab444
fix(serve): respect WebBridge env snapshot
yiliang114 Aug 9, 2026
eed3101
fix(serve): close WebBridge lifecycle gaps
yiliang114 Aug 10, 2026
324e851
Merge remote-tracking branch 'origin/main' into HEAD
yiliang114 Aug 10, 2026
39a306b
fix(chrome): close WebBridge action gaps
yiliang114 Aug 10, 2026
67fb632
fix(chrome): recover timed-out WebBridge actions
yiliang114 Aug 10, 2026
543d06b
fix(chrome): satisfy WebBridge CI checks
yiliang114 Aug 10, 2026
1ec263d
Merge remote-tracking branch 'origin/main' into HEAD
yiliang114 Aug 10, 2026
0ea5dab
Merge remote-tracking branch 'origin/main' into HEAD
yiliang114 Aug 10, 2026
08d5269
Merge remote-tracking branch 'origin/main' into HEAD
yiliang114 Aug 10, 2026
793524f
fix(webbridge): close remaining lifecycle gaps
yiliang114 Aug 11, 2026
87057c2
Merge remote-tracking branch 'origin/main' into HEAD
yiliang114 Aug 11, 2026
be94348
fix(webbridge): fail closed on unsafe tab states
yiliang114 Aug 11, 2026
b3c321b
fix(webbridge): close review edge cases
yiliang114 Aug 12, 2026
042ac24
fix(chrome): close webbridge action races
yiliang114 Aug 12, 2026
6bc851c
fix(chrome): close WebBridge result gaps
yiliang114 Aug 14, 2026
87335b9
fix(chrome): close WebBridge review gaps
yiliang114 Aug 14, 2026
4157a19
fix(chrome): close WebBridge action races
yiliang114 Aug 14, 2026
5c17c2d
fix(chrome): harden WebBridge per review findings
yiliang114 Aug 15, 2026
f5e8944
Merge remote-tracking branch 'origin/main' into automation-pr-8707
yiliang114 Aug 15, 2026
33ce64f
fix(chrome): settle timeout teardown cleanly and make ref numbering h…
yiliang114 Aug 15, 2026
179be96
fix(chrome): harden WebBridge network capture lifecycle
yiliang114 Aug 15, 2026
acbd178
fix(serve): trim operator-supplied QWEN_WEBBRIDGE_TOKEN at boot
yiliang114 Aug 15, 2026
a80becc
fix(webbridge): keep tab ownership closable and dispatch shifted digits
yiliang114 Aug 15, 2026
736eb9a
fix(chrome): sample geometry after instant scroll, cap artifact pageT…
yiliang114 Aug 15, 2026
3be205b
fix(webbridge): structured find_tab URL matching, transactional stale…
yiliang114 Aug 15, 2026
4d62075
Merge remote-tracking branch 'origin/main' into resolve-8707
yiliang114 Aug 25, 2026
f3b16e2
Merge remote-tracking branch 'origin/main' into resolve-8707
yiliang114 Aug 26, 2026
5d25476
Merge remote-tracking branch 'origin/main' into codex/8699-qwen-webbr…
yiliang114 Sep 1, 2026
230e890
Merge remote-tracking branch 'origin/main' into codex/8699-qwen-webbr…
yiliang114 Sep 2, 2026
a18a3fd
Merge branch 'main' into codex/8699-qwen-webbridge
yiliang114 Sep 2, 2026
8e4d077
Merge branch 'main' into codex/8699-qwen-webbridge
yiliang114 Sep 2, 2026
2f6245d
docs(daemon): fix capability registry count after webbridge merge
yiliang114 Sep 3, 2026
1182e70
merge: bring main into the WebBridge branch
yiliang114 Sep 3, 2026
42bfb1c
Merge branch 'main' into codex/8699-qwen-webbridge
yiliang114 Sep 3, 2026
f32c62e
Merge branch 'main' into codex/8699-qwen-webbridge
yiliang114 Sep 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix(chrome): sample geometry after instant scroll, cap artifact pageT…
…itle

- mouse_click and element screenshot now scroll with behavior:'instant':
  the default 'auto' follows the page's scroll-behavior CSS, so on
  smooth-scroll pages the geometry was sampled while the scroll animation
  was still in flight and clicks landed at stale coordinates while still
  reporting success
- save_as_pdf caps page-controlled pageTitle at 1 KiB: document.title is
  uncapped page input riding the unchunked metadata frame and could exceed
  the daemon's WS maxPayload, dropping the bridge for every session
- regression tests pin the instant-scroll declaration and the title cap
  • Loading branch information
yiliang114 committed Aug 15, 2026
commit 736eb9a68960b0955ede1bacb8200f752dac6269
Original file line number Diff line number Diff line change
Expand Up @@ -866,6 +866,14 @@ describe('WebBridge actions', () => {
'Input.dispatchMouseEvent',
expect.objectContaining({ type: 'mousePressed', x: 20, y: 30 }),
);
// Coordinates are sampled after the scroll: it must not be a smooth
// animation still in flight when getBoxModel measures the box.
expect(cdp.send).toHaveBeenCalledWith(
'Runtime.callFunctionOn',
expect.objectContaining({
functionDeclaration: expect.stringContaining("behavior: 'instant'"),
}),
);
});

it('keeps a delivered mouse click successful if navigation clears metadata', async () => {
Expand Down Expand Up @@ -1703,6 +1711,22 @@ describe('WebBridge actions', () => {
);
});

it('caps page-controlled pageTitle in the PDF metadata frame', async () => {
// document.title is page-controlled and rides the unchunked metadata
// frame; an uncapped multi-MiB title would exceed the daemon's WS
// maxPayload and drop the bridge for every session.
cdp.send
.mockResolvedValueOnce({ data: 'cGRm' })
.mockResolvedValueOnce({ result: { value: 't'.repeat(4096) } });
const { executeWebBridgeAction } = await loadActions();

const result = (await executeWebBridgeAction('save_as_pdf', {
_tabId: 17,
})) as { pageTitle: string };

expect(result.pageTitle).toHaveLength(1024);
});

it('captures element screenshots in document coordinates', async () => {
cdp.send
.mockResolvedValueOnce({ result: { objectId: 'button-1' } })
Expand Down
12 changes: 9 additions & 3 deletions packages/chrome-extension/src/background/web-bridge-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ async function mouseClick(args: Args): Promise<unknown> {
await send('Runtime.callFunctionOn', {
objectId,
functionDeclaration:
"function() { this.scrollIntoView({ block: 'center', inline: 'center' }); }",
"function() { this.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' }); }",
});
const box = record(await send('DOM.getBoxModel', { objectId }));
const content = record(box['model'])['content'];
Comment thread
yiliang114 marked this conversation as resolved.
Expand Down Expand Up @@ -804,7 +804,7 @@ async function screenshot(args: Args): Promise<unknown> {
await send('Runtime.callFunctionOn', {
objectId,
functionDeclaration:
"function() { this.scrollIntoView({ block: 'center', inline: 'center' }); }",
"function() { this.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' }); }",
});
const box = record(await send('DOM.getBoxModel', { objectId }));
const border = record(box['model'])['border'];
Expand Down Expand Up @@ -879,7 +879,13 @@ async function saveAsPdf(args: Args): Promise<unknown> {
returnByValue: true,
}),
);
pageTitle = string(record(titleResult['result'])['value']) ?? '';
// document.title is page-controlled and rides the unchunked metadata
// frame — cap it so a multi-MiB title cannot exceed the daemon's WS
// maxPayload and take down the bridge for every session.
pageTitle = (string(record(titleResult['result'])['value']) ?? '').slice(
0,
1024,
);
} catch {
// Metadata is optional.
}
Expand Down
Loading