290 lines
9.7 KiB
JavaScript
290 lines
9.7 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/. */
|
|
|
|
"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",
|
|
});
|
|
});
|