Skip to content

Commit a9caf20

Browse files
committed
fix: forbid closing the last page
1 parent 4e7001a commit a9caf20

File tree

4 files changed

+27
-3
lines changed

4 files changed

+27
-3
lines changed

src/McpContext.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ export class McpContext implements Context {
131131
this.#consoleCollector.addPage(page);
132132
return page;
133133
}
134+
async closePage(pageIdx: number): Promise<void> {
135+
if (this.#pages.length === 1) {
136+
throw new Error(
137+
'Unable to close the last page in the browser. It is fine to keep the last page open.',
138+
);
139+
}
140+
const page = this.getPageByIdx(pageIdx);
141+
this.setSelectedPageIdx(0);
142+
await page.close({runBeforeUnload: false});
143+
}
134144

135145
getNetworkRequestByUrl(url: string): HTTPRequest {
136146
const requests = this.getNetworkRequests();

src/tools/ToolDefinition.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export type Context = Readonly<{
6262
clearDialog(): void;
6363
getPageByIdx(idx: number): Page;
6464
newPage(): Promise<Page>;
65+
closePage(pageIdx: number): Promise<void>;
6566
setSelectedPageIdx(idx: number): void;
6667
getElementByUid(uid: string): Promise<ElementHandle<Element>>;
6768
setNetworkConditions(conditions: string | null): void;

src/tools/pages.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ export const closePage = defineTool({
5858
),
5959
},
6060
handler: async (request, response, context) => {
61-
const page = context.getPageByIdx(request.params.pageIdx);
62-
context.setSelectedPageIdx(0);
63-
await page.close({runBeforeUnload: false});
61+
await context.closePage(request.params.pageIdx);
6462
response.setIncludePages(true);
6563
},
6664
});

tests/tools/pages.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,21 @@ describe('pages', () => {
5353
assert.ok(response.includePages);
5454
});
5555
});
56+
it('cannot close the last page', async () => {
57+
await withBrowser(async (response, context) => {
58+
const page = context.getSelectedPage();
59+
try {
60+
await closePage.handler({params: {pageIdx: 0}}, response, context);
61+
assert.fail('not reached');
62+
} catch (err) {
63+
assert.strictEqual(
64+
err.message,
65+
'Unable to close the last page in the browser. It is fine to keep the last page open.',
66+
);
67+
}
68+
assert.ok(!page.isClosed());
69+
});
70+
});
5671
});
5772
describe('browser_select_page', () => {
5873
it('selects a page', async () => {

0 commit comments

Comments
 (0)