Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Tests userScripts.execute() and activeTab</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
<script type="text/javascript" src="head.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<script type="text/javascript">
"use strict";
const makeExtension = ({ manifest: manifestProps, ...otherProps }) => {
return ExtensionTestUtils.loadExtension({
manifest: {
manifest_version: 3,
action: {},
...manifestProps,
},
...otherProps,
});
};
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
set: [
["extensions.originControls.grantByDefault", false],
["extensions.webextOptionalPermissionPrompts", false],
],
});
});
async function verifyExecuteActiveTab(permissions = [], host_permissions = []) {
const manifest = {
permissions,
host_permissions,
optional_permissions: ["userScripts"],
};
let extension = makeExtension({
manifest,
background() {
async function userScriptsExecute(options) {
await new Promise(resolve => {
browser.test.withHandlingUserInput(() => {
resolve(
browser.permissions.request({ permissions: ["userScripts"] })
);
});
});
return browser.userScripts.execute(options);
}
browser.action.onClicked.addListener(async tab => {
const results = await userScriptsExecute({
target: { tabId: tab.id },
js: [{ code: "document.title" }],
});
browser.test.assertEq(
1,
results.length,
"got expected number of results"
);
browser.test.assertEq(
"file sample",
results[0].result,
"got the expected title"
);
browser.test.assertEq(
0,
results[0].frameId,
"got the expected frameId"
);
browser.test.sendMessage("execute-script");
});
browser.test.onMessage.addListener(async msg => {
switch (msg) {
case "reload-and-execute": {
const tabs = await browser.tabs.query({ active: true });
const tabId = tabs[0].id;
let promiseTabLoad = new Promise(resolve => {
browser.tabs.onUpdated.addListener(
function listener(updatedTabId, changeInfo) {
browser.test.assertEq(
tabId,
updatedTabId,
"got expected tabId"
);
if (
tabId === updatedTabId &&
changeInfo.status === "complete"
) {
browser.tabs.onUpdated.removeListener(listener);
resolve();
}
}
);
});
await browser.tabs.reload();
await promiseTabLoad;
await browser.test.assertRejects(
userScriptsExecute({
target: { tabId },
js: [{ code: '"Unexpected execution";' }],
}),
"Missing host permission for the tab",
"expected host permission error"
);
browser.test.sendMessage("execute-script-after-reload");
break;
}
default:
browser.test.fail(`invalid message received: ${msg}`);
}
});
browser.test.sendMessage("background-ready");
},
});
let tab = await AppTestDelegate.openNewForegroundTab(
window,
true
);
await extension.startup();
await extension.awaitMessage("background-ready");
await AppTestDelegate.clickBrowserAction(window, extension);
await extension.awaitMessage("execute-script");
await AppTestDelegate.closeBrowserAction(window, extension);
extension.sendMessage("reload-and-execute");
await extension.awaitMessage("execute-script-after-reload");
await extension.unload();
await AppTestDelegate.removeTab(window, tab);
}
// Test userScripts.execute works with standard activeTab permission.
add_task(async function test_userScripts_execute_activeTab_permission() {
await verifyExecuteActiveTab(["activeTab"]);
});
// Test userScripts.execute works with automatic activeTab granted from optional
// host permissions.
add_task(
async function test_userScripts_execute_activeTab_automatic_originControls() {
await verifyExecuteActiveTab([], ["*://test1.example.com/*"]);
}
);
</script>
</body>
</html>