Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* 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/. */
"use strict";
const {
PromptHandlerConfiguration,
PromptHandlers,
PromptTypes,
UserPromptHandler,
} = ChromeUtils.importESModule(
"chrome://remote/content/shared/webdriver/UserPromptHandler.sys.mjs"
);
add_task(function test_PromptHandlerConfiguration_ctor() {
const config = new PromptHandlerConfiguration("accept", true);
equal(config.handler, "accept");
equal(config.notify, true);
});
add_task(function test_PromptHandlerConfiguration_toString() {
equal(
new PromptHandlerConfiguration().toString(),
"[object PromptHandlerConfiguration]"
);
});
add_task(function test_PromptHandlerConfiguration_toJSON() {
let configuration, serialized;
for (const behavior of Object.values(PromptHandlers)) {
console.log(`Test handler - ${behavior}`);
configuration = new PromptHandlerConfiguration(behavior, false);
serialized = configuration.toJSON();
equal(serialized, behavior);
configuration = new PromptHandlerConfiguration(behavior, true);
serialized = configuration.toJSON();
if ([PromptHandlers.Accept, PromptHandlers.Dismiss].includes(behavior)) {
equal(serialized, `${behavior} and notify`);
} else {
equal(serialized, behavior);
}
}
});
add_task(function test_UserPromptHandler_ctor() {
const handler = new UserPromptHandler();
equal(handler.activePromptHandlers, null);
});
add_task(function test_UserPromptHandler_toString() {
equal(new UserPromptHandler().toString(), "[object UserPromptHandler]");
});
add_task(function test_UserPromptHandler_fromJSON() {
let promptHandler;
let serialized;
// Unhandled prompt behavior as string
for (const behavior of Object.values(PromptHandlers)) {
console.log(`Test as string for ${behavior}`);
promptHandler = UserPromptHandler.fromJSON(behavior);
equal(promptHandler.activePromptHandlers.size, 1);
ok(promptHandler.activePromptHandlers.has("fallbackDefault"));
const handler = promptHandler.activePromptHandlers.get("fallbackDefault");
ok(behavior.startsWith(handler.handler));
if (behavior == "ignore") {
ok(handler.notify);
} else {
equal(handler.notify, /and notify/.test(behavior));
}
serialized = promptHandler.toJSON();
equal(serialized, behavior);
}
// Unhandled prompt behavior as object
for (const promptType of Object.values(PromptTypes)) {
for (const behavior of Object.values(PromptHandlers)) {
console.log(`Test as object for ${promptType} - ${behavior}`);
promptHandler = UserPromptHandler.fromJSON({ [promptType]: behavior });
equal(promptHandler.activePromptHandlers.size, 1);
ok(promptHandler.activePromptHandlers.has(promptType));
const handler = promptHandler.activePromptHandlers.get(promptType);
ok(behavior.startsWith(handler.handler));
if (behavior == "ignore") {
ok(handler.notify);
} else {
equal(handler.notify, /and notify/.test(behavior));
}
serialized = promptHandler.toJSON();
deepEqual(serialized, { [promptType]: behavior });
}
}
// Empty object
promptHandler = UserPromptHandler.fromJSON({});
equal(promptHandler.activePromptHandlers.size, 0);
serialized = promptHandler.toJSON();
deepEqual(serialized, {});
});
add_task(function test_UserPromptHandler_fromJSON_invalid() {
for (const type of [
undefined,
null,
true,
42,
[],
"default",
"beforeunload",
]) {
Assert.throws(
() => UserPromptHandler.fromJSON(type),
/InvalidArgumentError/
);
}
// Invalid types for prompt types and handlers
for (const type of [undefined, null, true, 42, {}, []]) {
Assert.throws(
() => UserPromptHandler.fromJSON({ [type]: "accept" }),
/InvalidArgumentError/
);
Assert.throws(
() => UserPromptHandler.fromJSON({ alert: type }),
/InvalidArgumentError/
);
}
// Invalid values for prompt type and handlers
Assert.throws(
() => UserPromptHandler.fromJSON({ foo: "accept" }),
/InvalidArgumentError/
);
Assert.throws(
() => UserPromptHandler.fromJSON({ alert: "foo" }),
/InvalidArgumentError/
);
});
add_task(function test_UserPromptHandler_getPromptHandler() {
let configuration, promptHandler;
// Check the default value with no handlers defined
for (const promptType of Object.values(PromptTypes)) {
console.log(`Test default behavior for ${promptType}`);
promptHandler = new UserPromptHandler();
equal(promptHandler.activePromptHandlers, null);
const handler = promptHandler.getPromptHandler(promptType);
if (promptType === PromptTypes.BeforeUnload) {
equal(handler.handler, PromptHandlers.Accept);
equal(handler.notify, false);
} else {
equal(handler.handler, PromptHandlers.Dismiss);
equal(handler.notify, true);
}
}
// Check custom default behavior for all prompt types
for (const promptType of Object.values(PromptTypes)) {
console.log(`Test custom default behavior for ${promptType}`);
promptHandler = new UserPromptHandler();
configuration = new PromptHandlerConfiguration(
PromptHandlers.Ignore,
false
);
promptHandler.update(new Map([[PromptTypes.Default, configuration]]));
equal(promptHandler.activePromptHandlers.size, 1);
const handler = promptHandler.getPromptHandler(promptType);
equal(handler.handler, PromptHandlers.Ignore);
equal(handler.notify, false);
}
// Check custom fallbackDefault behavior for all prompt types
for (const promptType of Object.values(PromptTypes)) {
console.log(`Test custom fallbackDefault behavior for ${promptType}`);
promptHandler = new UserPromptHandler();
configuration = new PromptHandlerConfiguration(
PromptHandlers.Ignore,
false
);
promptHandler.update(new Map([["fallbackDefault", configuration]]));
equal(promptHandler.activePromptHandlers.size, 1);
const handler = promptHandler.getPromptHandler(promptType);
if (promptType === PromptTypes.BeforeUnload) {
equal(handler.handler, PromptHandlers.Accept);
equal(handler.notify, false);
} else {
equal(handler.handler, PromptHandlers.Ignore);
equal(handler.notify, false);
}
}
// Check custom behavior overrides default for all prompt types
for (const promptType of Object.values(PromptTypes)) {
if (promptType === PromptTypes.Default) {
continue;
}
console.log(`Test custom behavior overrides default for ${promptType}`);
promptHandler = new UserPromptHandler();
configuration = new PromptHandlerConfiguration(
PromptHandlers.Ignore,
false
);
promptHandler.update(new Map([[PromptTypes.Default, configuration]]));
configuration = new PromptHandlerConfiguration(PromptHandlers.Accept, true);
promptHandler.update(new Map([[promptType, configuration]]));
const handler = promptHandler.getPromptHandler(promptType);
equal(handler.handler, PromptHandlers.Accept);
equal(handler.notify, true);
}
// Check custom behavior overrides fallbackDefault for all prompt types
for (const promptType of Object.values(PromptTypes)) {
console.log(
`Test custom behavior overrides fallbackDefault for ${promptType}`
);
promptHandler = new UserPromptHandler();
configuration = new PromptHandlerConfiguration(
PromptHandlers.Ignore,
false
);
promptHandler.update(new Map([["fallbackDefault", configuration]]));
configuration = new PromptHandlerConfiguration(PromptHandlers.Accept, true);
promptHandler.update(new Map([[promptType, configuration]]));
const handler = promptHandler.getPromptHandler(promptType);
equal(handler.handler, PromptHandlers.Accept);
equal(handler.notify, true);
}
// Check default behavior overrides fallbackDefault for all prompt types
promptHandler = new UserPromptHandler();
promptHandler.update(
new Map([
[
"fallbackDefault",
new PromptHandlerConfiguration(PromptHandlers.Ignore, false),
],
[
PromptTypes.Default,
new PromptHandlerConfiguration(PromptHandlers.Accept, true),
],
])
);
for (const promptType of Object.values(PromptTypes)) {
console.log(
`Test default behavior overrides fallbackDefault for ${promptType}`
);
const handler = promptHandler.getPromptHandler(promptType);
equal(handler.handler, PromptHandlers.Accept);
equal(handler.notify, true);
}
});
add_task(function test_UserPromptHandler_toJSON() {
let configuration, promptHandler, serialized;
// Default behavior
promptHandler = new UserPromptHandler();
serialized = promptHandler.toJSON();
equal(serialized, "dismiss and notify");
// Custom default behavior
promptHandler = new UserPromptHandler();
configuration = new PromptHandlerConfiguration(PromptHandlers.Accept, false);
promptHandler.update(new Map([[PromptTypes.Default, configuration]]));
serialized = promptHandler.toJSON();
deepEqual(serialized, {
default: "accept",
});
// Multiple handler definitions
promptHandler = new UserPromptHandler();
configuration = new PromptHandlerConfiguration(PromptHandlers.Ignore, false);
promptHandler.update(new Map([[PromptTypes.Default, configuration]]));
configuration = new PromptHandlerConfiguration(PromptHandlers.Accept, true);
promptHandler.update(new Map([[PromptTypes.Alert, configuration]]));
configuration = new PromptHandlerConfiguration(PromptHandlers.Dismiss, false);
promptHandler.update(new Map([[PromptTypes.Confirm, configuration]]));
serialized = promptHandler.toJSON();
deepEqual(serialized, {
default: "ignore",
alert: "accept and notify",
confirm: "dismiss",
});
});