Skip to content

Commit 1f85978

Browse files
committed
fix(browser): preserve cdp ssrf policy
1 parent aa00373 commit 1f85978

5 files changed

Lines changed: 45 additions & 1 deletion

extensions/browser/src/browser/pw-tools-core.browser-ssrf-guard.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,40 @@ describe("pw-tools-core browser SSRF guards", () => {
8282
});
8383
});
8484

85+
it("preserves SSRF policy when aborting a pending click", async () => {
86+
const ctrl = new AbortController();
87+
let clickStarted: () => void = () => {};
88+
const clickStartedPromise = new Promise<void>((resolve) => {
89+
clickStarted = resolve;
90+
});
91+
pageState.page = { url: vi.fn(() => "https://example.com") };
92+
pageState.locator = {
93+
click: vi.fn(() => {
94+
clickStarted();
95+
return new Promise(() => {});
96+
}),
97+
};
98+
99+
const task = interactions.clickViaPlaywright({
100+
cdpUrl: "http://127.0.0.1:18792",
101+
targetId: "tab-1",
102+
ref: "1",
103+
ssrfPolicy: { dangerouslyAllowPrivateNetwork: false },
104+
signal: ctrl.signal,
105+
});
106+
107+
await clickStartedPromise;
108+
ctrl.abort(new Error("aborted by test"));
109+
110+
await expect(task).rejects.toThrow("aborted by test");
111+
expect(sessionMocks.forceDisconnectPlaywrightForTarget).toHaveBeenCalledWith({
112+
cdpUrl: "http://127.0.0.1:18792",
113+
targetId: "tab-1",
114+
ssrfPolicy: { dangerouslyAllowPrivateNetwork: false },
115+
reason: "click aborted",
116+
});
117+
});
118+
85119
it("re-checks select-triggered navigations with the session safety helper", async () => {
86120
let currentUrl = "https://example.com";
87121
pageState.page = { url: vi.fn(() => currentUrl) };

extensions/browser/src/browser/pw-tools-core.interactions.evaluate.abort.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,20 @@ describe("evaluateViaPlaywright (abort)", () => {
9191
cdpUrl: "http://127.0.0.1:9222",
9292
fn,
9393
ref,
94+
ssrfPolicy: { dangerouslyAllowPrivateNetwork: false },
9495
signal: ctrl.signal,
9596
});
9697

9798
await pending.evalCalledPromise;
9899
ctrl.abort(new Error("aborted by test"));
99100

100101
await expect(p).rejects.toThrow("aborted by test");
101-
expect(forceDisconnectPlaywrightForTarget).toHaveBeenCalled();
102+
expect(forceDisconnectPlaywrightForTarget).toHaveBeenCalledWith({
103+
cdpUrl: "http://127.0.0.1:9222",
104+
targetId: undefined,
105+
ssrfPolicy: { dangerouslyAllowPrivateNetwork: false },
106+
reason: "evaluate aborted",
107+
});
102108
});
103109

104110
it("does not disconnect when evaluate is blocked by an observed dialog", async () => {

extensions/browser/src/browser/pw-tools-core.interactions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,7 @@ export async function clickViaPlaywright(opts: {
558558
void forceDisconnectPlaywrightForTarget({
559559
cdpUrl: opts.cdpUrl,
560560
targetId: opts.targetId,
561+
ssrfPolicy: opts.ssrfPolicy,
561562
reason: "click aborted",
562563
}).catch(() => {});
563564
};
@@ -1025,6 +1026,7 @@ export async function evaluateViaPlaywright(opts: {
10251026
void forceDisconnectPlaywrightForTarget({
10261027
cdpUrl: opts.cdpUrl,
10271028
targetId: opts.targetId,
1029+
ssrfPolicy: opts.ssrfPolicy,
10281030
reason: "evaluate aborted",
10291031
}).catch(() => {});
10301032
});

extensions/browser/src/browser/pw-tools-core.snapshot.navigate-guard.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ describe("pw-tools-core.snapshot navigate guard", () => {
108108
expect(getPwToolsCoreSessionMocks().forceDisconnectPlaywrightForTarget).toHaveBeenCalledWith({
109109
cdpUrl: "http://127.0.0.1:18792",
110110
targetId: "tab-1",
111+
ssrfPolicy: { allowPrivateNetwork: true },
111112
reason: "retry navigate after detached frame",
112113
});
113114
expect(getPwToolsCoreSessionMocks().gotoPageWithNavigationGuard).toHaveBeenCalledTimes(2);

extensions/browser/src/browser/pw-tools-core.snapshot.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ export async function navigateViaPlaywright(opts: {
435435
await forceDisconnectPlaywrightForTarget({
436436
cdpUrl: opts.cdpUrl,
437437
targetId: opts.targetId,
438+
ssrfPolicy: opts.ssrfPolicy,
438439
reason: "retry navigate after detached frame",
439440
}).catch(() => {});
440441
page = await getPageForTargetId(opts);

0 commit comments

Comments
 (0)