зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1402066: Part 2 - Enable permissions tests in OOP mode. r=aswan
MozReview-Commit-ID: 4Tv2HAaSV19 --HG-- extra : source : 641430a496824e34170786f6f3bc5e587f2056eb extra : amend_source : e049c437ad8a70766544a3476a584395df7debb3
This commit is contained in:
Родитель
da3313920f
Коммит
1eb9c4b99b
|
@ -95,8 +95,9 @@ function promiseBrowserLoaded(browser, url, redirectUrl) {
|
|||
}
|
||||
|
||||
class ContentPage {
|
||||
constructor(remote = REMOTE_CONTENT_SCRIPTS) {
|
||||
constructor(remote = REMOTE_CONTENT_SCRIPTS, extension = null) {
|
||||
this.remote = remote;
|
||||
this.extension = extension;
|
||||
|
||||
this.browserReady = this._initBrowser();
|
||||
}
|
||||
|
@ -123,6 +124,13 @@ class ContentPage {
|
|||
browser.setAttribute("type", "content");
|
||||
browser.setAttribute("disableglobalhistory", "true");
|
||||
|
||||
if (this.extension && this.extension.remote) {
|
||||
this.remote = true;
|
||||
browser.setAttribute("remote", "true");
|
||||
browser.setAttribute("remoteType", "extension");
|
||||
browser.sameProcessAsFrameLoader = this.extension.groupFrameLoader;
|
||||
}
|
||||
|
||||
let awaitFrameLoader = Promise.resolve();
|
||||
if (this.remote) {
|
||||
awaitFrameLoader = promiseEvent(browser, "XULFrameLoaderCreated");
|
||||
|
@ -688,8 +696,26 @@ var ExtensionTestUtils = {
|
|||
REMOTE_CONTENT_SCRIPTS = !!val;
|
||||
},
|
||||
|
||||
loadContentPage(url, remote = undefined, redirectUrl = undefined) {
|
||||
let contentPage = new ContentPage(remote);
|
||||
/**
|
||||
* Loads a content page into a hidden docShell.
|
||||
*
|
||||
* @param {string} url
|
||||
* The URL to load.
|
||||
* @param {object} [options = {}]
|
||||
* @param {ExtensionWrapper} [options.extension]
|
||||
* If passed, load the URL as an extension page for the given
|
||||
* extension.
|
||||
* @param {boolean} [options.remote]
|
||||
* If true, load the URL in a content process. If false, load
|
||||
* it in the parent process.
|
||||
* @param {string} [options.redirectUrl]
|
||||
* An optional URL that the initial page is expected to
|
||||
* redirect to.
|
||||
*
|
||||
* @returns {ContentPage}
|
||||
*/
|
||||
loadContentPage(url, {extension = undefined, remote = undefined, redirectUrl = undefined} = {}) {
|
||||
let contentPage = new ContentPage(remote, extension && extension.extension);
|
||||
|
||||
return contentPage.loadURL(url, redirectUrl).then(() => {
|
||||
return contentPage;
|
||||
|
|
|
@ -1,11 +1,7 @@
|
|||
"use strict";
|
||||
|
||||
XPCOMUtils.defineLazyGetter(this, "ExtensionManager", () => {
|
||||
const {ExtensionManager}
|
||||
= Cu.import("resource://gre/modules/ExtensionChild.jsm", {});
|
||||
return ExtensionManager;
|
||||
});
|
||||
Cu.import("resource://gre/modules/ExtensionPermissions.jsm");
|
||||
Cu.import("resource://gre/modules/MessageChannel.jsm");
|
||||
|
||||
const BROWSER_PROPERTIES = "chrome://browser/locale/browser.properties";
|
||||
|
||||
|
@ -13,19 +9,39 @@ AddonTestUtils.init(this);
|
|||
AddonTestUtils.overrideCertDB();
|
||||
AddonTestUtils.createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");
|
||||
|
||||
// Find the DOMWindowUtils for the background page for the given
|
||||
// extension (wrapper)
|
||||
function findWinUtils(extension) {
|
||||
let extensionChild = ExtensionManager.extensions.get(extension.extension.id);
|
||||
let bgwin = null;
|
||||
for (let view of extensionChild.views) {
|
||||
if (view.viewType == "background") {
|
||||
bgwin = view.contentWindow;
|
||||
}
|
||||
let extensionHandlers = new WeakSet();
|
||||
|
||||
function frameScript() {
|
||||
/* globals content */
|
||||
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
||||
Cu.import("resource://gre/modules/MessageChannel.jsm");
|
||||
|
||||
let handle;
|
||||
MessageChannel.addListener(this, "ExtensionTest:HandleUserInput", {
|
||||
receiveMessage({name, data}) {
|
||||
if (data) {
|
||||
handle = content.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIDOMWindowUtils)
|
||||
.setHandlingUserInput(true);
|
||||
} else if (handle) {
|
||||
handle.destruct();
|
||||
handle = null;
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
async function withHandlingUserInput(extension, fn) {
|
||||
let {messageManager} = extension.extension.groupFrameLoader;
|
||||
|
||||
if (!extensionHandlers.has(extension)) {
|
||||
messageManager.loadFrameScript(`data:,(${frameScript})(this)`, false);
|
||||
extensionHandlers.add(extension);
|
||||
}
|
||||
notEqual(bgwin, null, "Found background window for the test extension");
|
||||
return bgwin.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIDOMWindowUtils);
|
||||
|
||||
await MessageChannel.sendMessage(messageManager, "ExtensionTest:HandleUserInput", true);
|
||||
await fn();
|
||||
await MessageChannel.sendMessage(messageManager, "ExtensionTest:HandleUserInput", false);
|
||||
}
|
||||
|
||||
let sawPrompt = false;
|
||||
|
@ -94,7 +110,6 @@ add_task(async function test_permissions() {
|
|||
});
|
||||
|
||||
await extension.startup();
|
||||
let winUtils = findWinUtils(extension);
|
||||
|
||||
function call(method, arg) {
|
||||
extension.sendMessage(method, arg);
|
||||
|
@ -137,32 +152,31 @@ add_task(async function test_permissions() {
|
|||
result = await call("contains", {permissions: [perm]});
|
||||
equal(result, false, "Permission requested outside an event handler was not granted");
|
||||
|
||||
let userInputHandle = winUtils.setHandlingUserInput(true);
|
||||
await withHandlingUserInput(extension, async () => {
|
||||
result = await call("request", {permissions: ["notifications"]});
|
||||
equal(result.status, "error", "request() for permission not in optional_permissions should fail");
|
||||
ok(/since it was not declared in optional_permissions/.test(result.message),
|
||||
"error message for undeclared optional_permission is reasonable");
|
||||
|
||||
result = await call("request", {permissions: ["notifications"]});
|
||||
equal(result.status, "error", "request() for permission not in optional_permissions should fail");
|
||||
ok(/since it was not declared in optional_permissions/.test(result.message),
|
||||
"error message for undeclared optional_permission is reasonable");
|
||||
// Check request() when the prompt is canceled.
|
||||
acceptPrompt = false;
|
||||
result = await call("request", {permissions: [perm]});
|
||||
equal(result.status, "success", "request() returned cleanly");
|
||||
equal(result.result, false, "request() returned false for rejected permission");
|
||||
|
||||
// Check request() when the prompt is canceled.
|
||||
acceptPrompt = false;
|
||||
result = await call("request", {permissions: [perm]});
|
||||
equal(result.status, "success", "request() returned cleanly");
|
||||
equal(result.result, false, "request() returned false for rejected permission");
|
||||
result = await call("contains", {permissions: [perm]});
|
||||
equal(result, false, "Rejected permission was not granted");
|
||||
|
||||
result = await call("contains", {permissions: [perm]});
|
||||
equal(result, false, "Rejected permission was not granted");
|
||||
|
||||
// Call request() and accept the prompt
|
||||
acceptPrompt = true;
|
||||
let allOptional = {
|
||||
permissions: OPTIONAL_PERMISSIONS,
|
||||
origins: OPTIONAL_ORIGINS,
|
||||
};
|
||||
result = await call("request", allOptional);
|
||||
equal(result.status, "success", "request() returned cleanly");
|
||||
equal(result.result, true, "request() returned true for accepted permissions");
|
||||
userInputHandle.destruct();
|
||||
// Call request() and accept the prompt
|
||||
acceptPrompt = true;
|
||||
let allOptional = {
|
||||
permissions: OPTIONAL_PERMISSIONS,
|
||||
origins: OPTIONAL_ORIGINS,
|
||||
};
|
||||
result = await call("request", allOptional);
|
||||
equal(result.status, "success", "request() returned cleanly");
|
||||
equal(result.result, true, "request() returned true for accepted permissions");
|
||||
});
|
||||
|
||||
let allPermissions = {
|
||||
permissions: [...REQUIRED_PERMISSIONS, ...OPTIONAL_PERMISSIONS],
|
||||
|
@ -240,17 +254,15 @@ add_task(async function test_startup() {
|
|||
let perms = await extension1.awaitMessage("perms");
|
||||
perms = await extension2.awaitMessage("perms");
|
||||
|
||||
let winUtils = findWinUtils(extension1);
|
||||
let handle = winUtils.setHandlingUserInput(true);
|
||||
extension1.sendMessage(PERMS1);
|
||||
await extension1.awaitMessage("requested");
|
||||
handle.destruct();
|
||||
await withHandlingUserInput(extension1, async () => {
|
||||
extension1.sendMessage(PERMS1);
|
||||
await extension1.awaitMessage("requested");
|
||||
});
|
||||
|
||||
winUtils = findWinUtils(extension2);
|
||||
handle = winUtils.setHandlingUserInput(true);
|
||||
extension2.sendMessage(PERMS2);
|
||||
await extension2.awaitMessage("requested");
|
||||
handle.destruct();
|
||||
await withHandlingUserInput(extension2, async () => {
|
||||
extension2.sendMessage(PERMS2);
|
||||
await extension2.awaitMessage("requested");
|
||||
});
|
||||
|
||||
// Restart everything, and force the permissions store to be
|
||||
// re-read on startup
|
||||
|
@ -323,47 +335,45 @@ add_task(async function test_alreadyGranted() {
|
|||
|
||||
await extension.startup();
|
||||
|
||||
let winUtils = findWinUtils(extension);
|
||||
let handle = winUtils.setHandlingUserInput(true);
|
||||
await withHandlingUserInput(extension, async () => {
|
||||
let url = await extension.awaitMessage("ready");
|
||||
await ExtensionTestUtils.loadContentPage(url, {extension});
|
||||
await extension.awaitMessage("page-ready");
|
||||
|
||||
let url = await extension.awaitMessage("ready");
|
||||
await ExtensionTestUtils.loadContentPage(url);
|
||||
await extension.awaitMessage("page-ready");
|
||||
async function checkRequest(arg, expectPrompt, msg) {
|
||||
sawPrompt = false;
|
||||
extension.sendMessage("request", arg);
|
||||
let result = await extension.awaitMessage("request.result");
|
||||
ok(result, "request() call succeeded");
|
||||
equal(sawPrompt, expectPrompt,
|
||||
`Got ${expectPrompt ? "" : "no "}permission prompt for ${msg}`);
|
||||
}
|
||||
|
||||
async function checkRequest(arg, expectPrompt, msg) {
|
||||
sawPrompt = false;
|
||||
extension.sendMessage("request", arg);
|
||||
let result = await extension.awaitMessage("request.result");
|
||||
ok(result, "request() call succeeded");
|
||||
equal(sawPrompt, expectPrompt,
|
||||
`Got ${expectPrompt ? "" : "no "}permission prompt for ${msg}`);
|
||||
}
|
||||
await checkRequest({permissions: ["geolocation"]}, false,
|
||||
"required permission from manifest");
|
||||
await checkRequest({origins: ["http://required-host.com/"]}, false,
|
||||
"origin permission from manifest");
|
||||
await checkRequest({origins: ["http://host.required-domain.com/"]}, false,
|
||||
"wildcard origin permission from manifest");
|
||||
|
||||
await checkRequest({permissions: ["geolocation"]}, false,
|
||||
"required permission from manifest");
|
||||
await checkRequest({origins: ["http://required-host.com/"]}, false,
|
||||
"origin permission from manifest");
|
||||
await checkRequest({origins: ["http://host.required-domain.com/"]}, false,
|
||||
"wildcard origin permission from manifest");
|
||||
await checkRequest({permissions: ["clipboardRead"]}, true,
|
||||
"optional permission");
|
||||
await checkRequest({permissions: ["clipboardRead"]}, false,
|
||||
"already granted optional permission");
|
||||
|
||||
await checkRequest({permissions: ["clipboardRead"]}, true,
|
||||
"optional permission");
|
||||
await checkRequest({permissions: ["clipboardRead"]}, false,
|
||||
"already granted optional permission");
|
||||
await checkRequest({origins: ["http://optional-host.com/"]}, true,
|
||||
"optional origin");
|
||||
await checkRequest({origins: ["http://optional-host.com/"]}, false,
|
||||
"already granted origin permission");
|
||||
|
||||
await checkRequest({origins: ["http://optional-host.com/"]}, true,
|
||||
"optional origin");
|
||||
await checkRequest({origins: ["http://optional-host.com/"]}, false,
|
||||
"already granted origin permission");
|
||||
await checkRequest({origins: ["http://*.optional-domain.com/"]}, true,
|
||||
"optional wildcard origin");
|
||||
await checkRequest({origins: ["http://*.optional-domain.com/"]}, false,
|
||||
"already granted optional wildcard origin");
|
||||
await checkRequest({origins: ["http://host.optional-domain.com/"]}, false,
|
||||
"host matching optional wildcard origin");
|
||||
});
|
||||
|
||||
await checkRequest({origins: ["http://*.optional-domain.com/"]}, true,
|
||||
"optional wildcard origin");
|
||||
await checkRequest({origins: ["http://*.optional-domain.com/"]}, false,
|
||||
"already granted optional wildcard origin");
|
||||
await checkRequest({origins: ["http://host.optional-domain.com/"]}, false,
|
||||
"host matching optional wildcard origin");
|
||||
|
||||
handle.destruct();
|
||||
await extension.unload();
|
||||
});
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ add_task(async function test_content_redirect_to_non_accessible_resource() {
|
|||
let watcher = onModifyListener(url).then(channel => {
|
||||
return onStopListener(channel);
|
||||
});
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, undefined, "about:blank");
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, {redirectUrl: "about:blank"});
|
||||
equal(contentPage.browser.documentURI.spec, "about:blank", `expected no redirect`);
|
||||
equal(await watcher, url, "expected no redirect");
|
||||
await contentPage.close();
|
||||
|
@ -161,7 +161,7 @@ add_task(async function test_content_302_redirect_to_extension() {
|
|||
await extension.startup();
|
||||
let redirectUrl = await extension.awaitMessage("redirectURI");
|
||||
let url = `${gServerUrl}/redirect?redirect_uri=${redirectUrl}`;
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, undefined, redirectUrl);
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, {redirectUrl});
|
||||
equal(contentPage.browser.documentURI.spec, redirectUrl, `expected redirect`);
|
||||
await contentPage.close();
|
||||
await extension.unload();
|
||||
|
@ -175,7 +175,7 @@ add_task(async function test_content_channel_redirect_to_extension() {
|
|||
let redirectUrl = await extension.awaitMessage("redirectURI");
|
||||
let url = `${gServerUrl}/dummy?r=${Math.random()}`;
|
||||
onModifyListener(url, redirectUrl);
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, undefined, redirectUrl);
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, {redirectUrl});
|
||||
equal(contentPage.browser.documentURI.spec, redirectUrl, `expected redirect`);
|
||||
await contentPage.close();
|
||||
await extension.unload();
|
||||
|
@ -205,7 +205,7 @@ add_task(async function test_extension_302_redirect() {
|
|||
let redirectUrl = await extension.awaitMessage("redirectURI");
|
||||
let completed = extension.awaitFinish("requestCompleted");
|
||||
let url = `${gServerUrl}/redirect?r=${Math.random()}&redirect_uri=${redirectUrl}`;
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, undefined, redirectUrl);
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, {redirectUrl});
|
||||
equal(contentPage.browser.documentURI.spec, redirectUrl, `expected content redirect`);
|
||||
await completed;
|
||||
await contentPage.close();
|
||||
|
@ -239,7 +239,7 @@ add_task(async function test_extension_redirect() {
|
|||
let redirectUrl = await extension.awaitMessage("redirectURI");
|
||||
let completed = extension.awaitFinish("requestCompleted");
|
||||
let url = `${gServerUrl}/dummy?r=${Math.random()}`;
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, undefined, redirectUrl);
|
||||
let contentPage = await ExtensionTestUtils.loadContentPage(url, {redirectUrl});
|
||||
equal(contentPage.browser.documentURI.spec, redirectUrl, `expected redirect`);
|
||||
await completed;
|
||||
await contentPage.close();
|
||||
|
|
|
@ -74,6 +74,8 @@ skip-if = os == "android" # checking for telemetry needs to be updated: 1384923
|
|||
skip-if = os == "android"
|
||||
[test_native_manifests.js]
|
||||
skip-if = os == "android"
|
||||
[test_ext_permissions.js]
|
||||
skip-if = os == "android" # Bug 1350559
|
||||
[test_proxy_scripts.js]
|
||||
skip-if = os == "linux" # bug 1393940
|
||||
[test_proxy_scripts_results.js]
|
||||
|
|
|
@ -48,8 +48,6 @@ tags = webextensions in-process-webextensions
|
|||
[test_locale_converter.js]
|
||||
[test_locale_data.js]
|
||||
|
||||
[test_ext_permissions.js]
|
||||
skip-if = os == "android" # Bug 1350559
|
||||
[test_ext_runtime_sendMessage_args.js]
|
||||
|
||||
[include:xpcshell-common.ini]
|
||||
|
|
Загрузка…
Ссылка в новой задаче