/* 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 { Module } from "chrome://remote/content/shared/messagehandler/Module.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",
TabManager: "chrome://remote/content/shared/TabManager.sys.mjs",
WindowGlobalMessageHandler:
"chrome://remote/content/shared/messagehandler/WindowGlobalMessageHandler.sys.mjs",
});
class InputModule extends Module {
destroy() {}
async performActions(options = {}) {
const { actions, context: contextId } = options;
lazy.assert.string(
contextId,
`Expected "context" to be a string, got ${contextId}`
);
const context = lazy.TabManager.getBrowsingContextById(contextId);
if (!context) {
throw new lazy.error.NoSuchFrameError(
`Browsing context with id ${contextId} not found`
);
}
// Bug 1821460: Fetch top-level browsing context.
await this.messageHandler.forwardCommand({
moduleName: "input",
commandName: "performActions",
destination: {
type: lazy.WindowGlobalMessageHandler.type,
id: context.id,
},
params: {
actions,
},
});
return {};
}
/**
* Reset the input state in the provided browsing context.
*
* @param {object=} options
* @param {string} options.context
* Id of the browsing context to reset the input state.
*
* @throws {InvalidArgumentError}
* If context is not valid type.
* @throws {NoSuchFrameError}
* If the browsing context cannot be found.
*/
async releaseActions(options = {}) {
const { context: contextId } = options;
lazy.assert.string(
contextId,
`Expected "context" to be a string, got ${contextId}`
);
const context = lazy.TabManager.getBrowsingContextById(contextId);
if (!context) {
throw new lazy.error.NoSuchFrameError(
`Browsing context with id ${contextId} not found`
);
}
// Bug 1821460: Fetch top-level browsing context.
await this.messageHandler.forwardCommand({
moduleName: "input",
commandName: "releaseActions",
destination: {
type: lazy.WindowGlobalMessageHandler.type,
id: context.id,
},
params: {},
});
return {};
}
/**
* Sets the file property of a given input element with type file to a set of file paths.
*
* @param {object=} options
* @param {string} options.context
* Id of the browsing context to set the file property
* of a given input element.
* @param {SharedReference} options.element
* A reference to a node, which is used as
* a target for setting files.
* @param {Array} options.files
* A list of file paths which should be set.
*
* @throws {InvalidArgumentError}
* Raised if an argument is of an invalid type or value.
* @throws {NoSuchElementError}
* If the input element cannot be found.
* @throws {NoSuchFrameError}
* If the browsing context cannot be found.
* @throws {UnableToSetFileInputError}
* If the set of file paths was not set to the input element.
*/
async setFiles(options = {}) {
const { context: contextId, element, files } = options;
lazy.assert.string(
contextId,
`Expected "context" to be a string, got ${contextId}`
);
const context = lazy.TabManager.getBrowsingContextById(contextId);
if (!context) {
throw new lazy.error.NoSuchFrameError(
`Browsing context with id ${contextId} not found`
);
}
lazy.assert.array(files, `Expected "files" to be an array, got ${files}`);
for (const file of files) {
lazy.assert.string(
file,
`Expected an element of "files" to be a string, got ${file}`
);
}
await this.messageHandler.forwardCommand({
moduleName: "input",
commandName: "setFiles",
destination: {
type: lazy.WindowGlobalMessageHandler.type,
id: context.id,
},
params: { element, files },
});
}
static get supportedEvents() {
return [];
}
}
export const input = InputModule;