mirror of
https://github.com/puppeteer/puppeteer
synced 2024-06-14 14:02:48 +00:00
feat(browsercontext): implement BrowserContext.overridePermissions (#3159)
Introduce an API to manage permissions per browser context: - BrowserContext.overridePermissions(origin, permissions) - BrowserContext.clearPermissionOverrides() Fixes #846.
This commit is contained in:
@@ -37,11 +37,11 @@ class Browser extends EventEmitter {
|
||||
this._connection = connection;
|
||||
this._closeCallback = closeCallback || new Function();
|
||||
|
||||
this._defaultContext = new BrowserContext(this, null);
|
||||
this._defaultContext = new BrowserContext(this._connection, this, null);
|
||||
/** @type {Map<string, BrowserContext>} */
|
||||
this._contexts = new Map();
|
||||
for (const contextId of contextIds)
|
||||
this._contexts.set(contextId, new BrowserContext(this, contextId));
|
||||
this._contexts.set(contextId, new BrowserContext(this._connection, this, contextId));
|
||||
|
||||
/** @type {Map<string, Target>} */
|
||||
this._targets = new Map();
|
||||
@@ -65,7 +65,7 @@ class Browser extends EventEmitter {
|
||||
*/
|
||||
async createIncognitoBrowserContext() {
|
||||
const {browserContextId} = await this._connection.send('Target.createBrowserContext');
|
||||
const context = new BrowserContext(this, browserContextId);
|
||||
const context = new BrowserContext(this._connection, this, browserContextId);
|
||||
this._contexts.set(browserContextId, context);
|
||||
return context;
|
||||
}
|
||||
@@ -77,6 +77,13 @@ class Browser extends EventEmitter {
|
||||
return [this._defaultContext, ...Array.from(this._contexts.values())];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {!BrowserContext}
|
||||
*/
|
||||
defaultBrowserContext() {
|
||||
return this._defaultContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?string} contextId
|
||||
*/
|
||||
@@ -231,11 +238,13 @@ Browser.Events = {
|
||||
|
||||
class BrowserContext extends EventEmitter {
|
||||
/**
|
||||
* @param {!Puppeteer.Connection} connection
|
||||
* @param {!Browser} browser
|
||||
* @param {?string} contextId
|
||||
*/
|
||||
constructor(browser, contextId) {
|
||||
constructor(connection, browser, contextId) {
|
||||
super();
|
||||
this._connection = connection;
|
||||
this._browser = browser;
|
||||
this._id = contextId;
|
||||
}
|
||||
@@ -266,6 +275,43 @@ class BrowserContext extends EventEmitter {
|
||||
return !!this._id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} origin
|
||||
* @param {!Array<string>} permissions
|
||||
*/
|
||||
async overridePermissions(origin, permissions) {
|
||||
const webPermissionToProtocol = new Map([
|
||||
['geolocation', 'geolocation'],
|
||||
['midi', 'midi'],
|
||||
['notifications', 'notifications'],
|
||||
['push', 'push'],
|
||||
['camera', 'videoCapture'],
|
||||
['microphone', 'audioCapture'],
|
||||
['background-sync', 'backgroundSync'],
|
||||
['ambient-light-sensor', 'sensors'],
|
||||
['accelerometer', 'sensors'],
|
||||
['gyroscope', 'sensors'],
|
||||
['magnetometer', 'sensors'],
|
||||
['accessibility-events', 'accessibilityEvents'],
|
||||
['clipboard-read', 'clipboardRead'],
|
||||
['clipboard-write', 'clipboardWrite'],
|
||||
['payment-handler', 'paymentHandler'],
|
||||
// chrome-specific permissions we have.
|
||||
['midi-sysex', 'midiSysex'],
|
||||
]);
|
||||
permissions = permissions.map(permission => {
|
||||
const protocolPermission = webPermissionToProtocol.get(permission);
|
||||
if (!protocolPermission)
|
||||
throw new Error('Unknown permission: ' + permission);
|
||||
return protocolPermission;
|
||||
});
|
||||
await this._connection.send('Browser.grantPermissions', {origin, browserContextId: this._id || undefined, permissions});
|
||||
}
|
||||
|
||||
async clearPermissionOverrides() {
|
||||
await this._connection.send('Browser.resetPermissions', {browserContextId: this._id || undefined});
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {!Promise<!Puppeteer.Page>}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user