117 lines
3.6 KiB
JavaScript
117 lines
3.6 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
import { RootBiDiModule } from "chrome://remote/content/webdriver-bidi/modules/RootBiDiModule.sys.mjs";
|
|
|
|
const lazy = {};
|
|
|
|
ChromeUtils.defineESModuleGetters(lazy, {
|
|
assert: "chrome://remote/content/shared/webdriver/Assert.sys.mjs",
|
|
error: "chrome://remote/content/shared/webdriver/Errors.sys.mjs",
|
|
permissions: "chrome://remote/content/shared/Permissions.sys.mjs",
|
|
pprint: "chrome://remote/content/shared/Format.sys.mjs",
|
|
UserContextManager:
|
|
"chrome://remote/content/shared/UserContextManager.sys.mjs",
|
|
});
|
|
|
|
class PermissionsModule extends RootBiDiModule {
|
|
constructor(messageHandler) {
|
|
super(messageHandler);
|
|
}
|
|
|
|
destroy() {}
|
|
|
|
/**
|
|
* An object that holds the information about permission descriptor
|
|
* for Webdriver BiDi permissions.setPermission command.
|
|
*
|
|
* @typedef PermissionDescriptor
|
|
*
|
|
* @property {string} name
|
|
* The name of the permission.
|
|
*/
|
|
|
|
/**
|
|
* Set to a given permission descriptor a given state on a provided origin.
|
|
*
|
|
* @param {object=} options
|
|
* @param {PermissionDescriptor} options.descriptor
|
|
* The descriptor of the permission which will be updated.
|
|
* @param {PermissionState} options.state
|
|
* The state which will be set to the permission.
|
|
* @param {string} options.origin
|
|
* The origin which is used as a target for permission update.
|
|
* @param {string=} options.userContext
|
|
* The id of the user context which should be used as a target
|
|
* for permission update.
|
|
*
|
|
* @throws {InvalidArgumentError}
|
|
* Raised if an argument is of an invalid type or value.
|
|
* @throws {UnsupportedOperationError}
|
|
* Raised when unsupported permissions are set.
|
|
*/
|
|
async setPermission(options = {}) {
|
|
const {
|
|
descriptor,
|
|
state,
|
|
origin,
|
|
userContext: userContextId = null,
|
|
} = options;
|
|
|
|
lazy.permissions.validateDescriptor(descriptor);
|
|
|
|
const permissionName = descriptor.name;
|
|
|
|
if (permissionName === "storage-access") {
|
|
// TODO: Bug 1895457. Add support for "storage-access" permission.
|
|
throw new lazy.error.UnsupportedOperationError(
|
|
`"descriptor.name" "${permissionName}" is currently unsupported`
|
|
);
|
|
}
|
|
|
|
lazy.permissions.validateState(state);
|
|
|
|
lazy.assert.string(
|
|
origin,
|
|
lazy.pprint`Expected "origin" to be a string, got ${origin}`
|
|
);
|
|
lazy.assert.that(
|
|
origin => URL.canParse(origin),
|
|
lazy.pprint`Expected "origin" to be a valid URL, got ${origin}`
|
|
)(origin);
|
|
|
|
let userContext;
|
|
if (userContextId !== null) {
|
|
lazy.assert.string(
|
|
userContextId,
|
|
lazy.pprint`Expected "userContext" to be a string, got ${userContextId}`
|
|
);
|
|
|
|
if (!lazy.UserContextManager.hasUserContextId(userContextId)) {
|
|
throw new lazy.error.NoSuchUserContextError(
|
|
`User Context with id ${userContextId} was not found`
|
|
);
|
|
}
|
|
|
|
userContext = lazy.UserContextManager.getInternalIdById(userContextId);
|
|
}
|
|
|
|
const activeWindow = Services.wm.getMostRecentBrowserWindow();
|
|
let typedDescriptor;
|
|
try {
|
|
typedDescriptor = activeWindow.navigator.permissions.parseSetParameters({
|
|
descriptor,
|
|
state,
|
|
});
|
|
} catch (err) {
|
|
throw new lazy.error.InvalidArgumentError(
|
|
`The conversion of "descriptor" was not successful: ${err.message}`
|
|
);
|
|
}
|
|
|
|
lazy.permissions.set(typedDescriptor, state, origin, userContext);
|
|
}
|
|
}
|
|
|
|
export const permissions = PermissionsModule;
|