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:
Kris Maglione 2017-09-25 21:05:00 -07:00
Родитель da3313920f
Коммит 1eb9c4b99b
5 изменённых файлов: 132 добавлений и 96 удалений

Просмотреть файл

@ -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]