Implement clipboard permissions support feature

Co-authored-by: pavelfeldman <883973+pavelfeldman@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2025-08-01 18:56:45 +00:00
parent fc127d5895
commit ce81f556a5
7 changed files with 353 additions and 5 deletions

View File

@@ -113,7 +113,10 @@ class IsolatedContextFactory extends BaseContextFactory {
}
protected override async _doCreateContext(browser: playwright.Browser): Promise<playwright.BrowserContext> {
return browser.newContext(this.browserConfig.contextOptions);
const contextOptions = { ...this.browserConfig.contextOptions };
if (this.browserConfig.permissions)
contextOptions.permissions = this.browserConfig.permissions;
return browser.newContext(contextOptions);
}
}
@@ -127,7 +130,13 @@ class CdpContextFactory extends BaseContextFactory {
}
protected override async _doCreateContext(browser: playwright.Browser): Promise<playwright.BrowserContext> {
return this.browserConfig.isolated ? await browser.newContext() : browser.contexts()[0];
if (this.browserConfig.isolated) {
const contextOptions: playwright.BrowserContextOptions = {};
if (this.browserConfig.permissions)
contextOptions.permissions = this.browserConfig.permissions;
return browser.newContext(contextOptions);
}
return browser.contexts()[0];
}
}
@@ -145,7 +154,10 @@ class RemoteContextFactory extends BaseContextFactory {
}
protected override async _doCreateContext(browser: playwright.Browser): Promise<playwright.BrowserContext> {
return browser.newContext();
const contextOptions: playwright.BrowserContextOptions = {};
if (this.browserConfig.permissions)
contextOptions.permissions = this.browserConfig.permissions;
return browser.newContext(contextOptions);
}
}
@@ -168,12 +180,15 @@ class PersistentContextFactory implements BrowserContextFactory {
const browserType = playwright[this.browserConfig.browserName];
for (let i = 0; i < 5; i++) {
try {
const browserContext = await browserType.launchPersistentContext(userDataDir, {
const contextOptions = {
...this.browserConfig.launchOptions,
...this.browserConfig.contextOptions,
handleSIGINT: false,
handleSIGTERM: false,
});
};
if (this.browserConfig.permissions)
contextOptions.permissions = this.browserConfig.permissions;
const browserContext = await browserType.launchPersistentContext(userDataDir, contextOptions);
const close = () => this._closeBrowserContext(browserContext, userDataDir);
return { browserContext, close };
} catch (error: any) {

View File

@@ -39,6 +39,7 @@ export type CLIOptions = {
imageResponses?: 'allow' | 'omit';
sandbox?: boolean;
outputDir?: string;
permissions?: string[];
port?: number;
proxyBypass?: string;
proxyServer?: string;
@@ -177,6 +178,7 @@ export function configFromCLIOptions(cliOptions: CLIOptions): Config {
browserName,
isolated: cliOptions.isolated,
userDataDir: cliOptions.userDataDir,
permissions: cliOptions.permissions,
launchOptions,
contextOptions,
cdpEndpoint: cliOptions.cdpEndpoint,
@@ -218,6 +220,7 @@ function configFromEnv(): Config {
options.imageResponses = 'omit';
options.sandbox = envToBoolean(process.env.PLAYWRIGHT_MCP_SANDBOX);
options.outputDir = envToString(process.env.PLAYWRIGHT_MCP_OUTPUT_DIR);
options.permissions = commaSeparatedList(process.env.PLAYWRIGHT_MCP_PERMISSIONS);
options.port = envToNumber(process.env.PLAYWRIGHT_MCP_PORT);
options.proxyBypass = envToString(process.env.PLAYWRIGHT_MCP_PROXY_BYPASS);
options.proxyServer = envToString(process.env.PLAYWRIGHT_MCP_PROXY_SERVER);

View File

@@ -46,6 +46,7 @@ program
.option('--image-responses <mode>', 'whether to send image responses to the client. Can be "allow" or "omit", Defaults to "allow".')
.option('--no-sandbox', 'disable the sandbox for all process types that are normally sandboxed.')
.option('--output-dir <path>', 'path to the directory for output files.')
.option('--permissions <permissions>', 'comma-separated list of permissions to grant, for example "clipboard-read,clipboard-write"', commaSeparatedList)
.option('--port <port>', 'port to listen on for SSE transport.')
.option('--proxy-bypass <bypass>', 'comma-separated domains to bypass proxy, for example ".com,chromium.org,.domain.com"')
.option('--proxy-server <proxy>', 'specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"')