Bug 1362228 - Make sure messageManager.loadFrameScript() is called before window.postMessage(), r=janv

After BrowserLoaded got called and persist() been resolved, there is no guarantee window.postMessage()
is executed after addEventListener(). In order to call window.postMessage() after addEventListener(),
make sure messageManager.loadFrameScript() is registered "message" in chrome privileged script,
instead of via web content.
This commit is contained in:
Shawn Huang 2017-06-30 09:40:19 -07:00
Родитель 59605ed6b5
Коммит 8ebd1a59a4
4 изменённых файлов: 60 добавлений и 56 удалений

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

@ -8,12 +8,6 @@ const testPageURL =
add_task(async function testPermissionAllow() {
removePermission(testPageURL, "persistent-storage");
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
registerPopupEventHandler("popupshowing", function () {
ok(true, "prompt showing");
@ -26,7 +20,12 @@ add_task(async function testPermissionAllow() {
ok(true, "prompt hidden");
});
await promiseMessage(true, gBrowser);
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await waitForMessage(true, gBrowser);
is(getPermission(testPageURL, "persistent-storage"),
Components.interfaces.nsIPermissionManager.ALLOW_ACTION,
@ -37,13 +36,6 @@ add_task(async function testPermissionAllow() {
});
add_task(async function testNoPermissionPrompt() {
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
registerPopupEventHandler("popupshowing", function () {
ok(false, "Shouldn't show a popup this time");
});
@ -54,7 +46,12 @@ add_task(async function testNoPermissionPrompt() {
ok(false, "Shouldn't show a popup this time");
});
await promiseMessage(true, gBrowser);
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await waitForMessage(true, gBrowser);
is(getPermission(testPageURL, "persistent-storage"),
Components.interfaces.nsIPermissionManager.ALLOW_ACTION,

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

@ -8,12 +8,6 @@ const testPageURL =
add_task(async function testPermissionDenied() {
removePermission(testPageURL, "persistent-storage");
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
registerPopupEventHandler("popupshowing", function () {
ok(true, "prompt showing");
@ -26,7 +20,12 @@ add_task(async function testPermissionDenied() {
ok(true, "prompt hidden");
});
await promiseMessage(false, gBrowser);
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await waitForMessage(false, gBrowser);
is(getPermission(testPageURL, "persistent-storage"),
Components.interfaces.nsIPermissionManager.DENY_ACTION,
@ -37,13 +36,6 @@ add_task(async function testPermissionDenied() {
});
add_task(async function testNoPermissionPrompt() {
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
registerPopupEventHandler("popupshowing", function () {
ok(false, "Shouldn't show a popup this time");
});
@ -54,7 +46,12 @@ add_task(async function testNoPermissionPrompt() {
ok(false, "Shouldn't show a popup this time");
});
await promiseMessage(false, gBrowser);
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await waitForMessage(false, gBrowser);
is(getPermission(testPageURL, "persistent-storage"),
Components.interfaces.nsIPermissionManager.DENY_ACTION,
@ -65,13 +62,6 @@ add_task(async function testNoPermissionPrompt() {
});
add_task(async function testPermissionDeniedDismiss() {
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
registerPopupEventHandler("popupshowing", function () {
ok(true, "prompt showing");
});
@ -84,7 +74,12 @@ add_task(async function testPermissionDeniedDismiss() {
ok(true, "prompt hidden");
});
await promiseMessage(false, gBrowser);
info("Creating tab");
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
info("Loading test page: " + testPageURL);
gBrowser.selectedBrowser.loadURI(testPageURL);
await waitForMessage(false, gBrowser);
is(getPermission(testPageURL, "persistent-storage"),
Components.interfaces.nsIPermissionManager.DENY_ACTION,

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

@ -11,13 +11,6 @@ add_task(async function testPermissionUnknownInPrivateWindow() {
info("Creating private window");
let win = await BrowserTestUtils.openNewBrowserWindow({ private : true });
info("Creating private tab");
win.gBrowser.selectedTab = win.gBrowser.addTab();
info("Loading test page: " + testPageURL);
win.gBrowser.selectedBrowser.loadURI(testPageURL);
await BrowserTestUtils.browserLoaded(win.gBrowser.selectedBrowser);
registerPopupEventHandler("popupshowing", function () {
ok(false, "Shouldn't show a popup this time");
}, win);
@ -28,7 +21,12 @@ add_task(async function testPermissionUnknownInPrivateWindow() {
ok(false, "Shouldn't show a popup this time");
}, win);
await promiseMessage(false, win.gBrowser);
info("Creating private tab");
win.gBrowser.selectedTab = win.gBrowser.addTab();
info("Loading test page: " + testPageURL);
win.gBrowser.selectedBrowser.loadURI(testPageURL);
await waitForMessage(false, win.gBrowser);
is(getPermission(testPageURL, "persistent-storage"),
Components.interfaces.nsIPermissionManager.UNKNOWN_ACTION,

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

@ -77,18 +77,32 @@ function dismissNotification(popup, win)
});
}
function promiseMessage(aMessage, browser)
function waitForMessage(aMessage, browser)
{
return ContentTask.spawn(browser.selectedBrowser, aMessage, async function(aMessage) {
await new Promise((resolve, reject) => {
content.addEventListener("message", function(event) {
is(event.data, aMessage, "received " + aMessage);
if (event.data == aMessage)
resolve();
else
reject();
}, {once: true});
return new Promise((resolve, reject) => {
function contentScript() {
addEventListener("message", function(event) {
sendAsyncMessage("testLocal:persisted",
{persisted: event.data});
}, {once: true}, true);
}
let script = "data:,(" + contentScript.toString() + ")();";
let mm = browser.selectedBrowser.messageManager;
mm.addMessageListener("testLocal:persisted", function listener(msg) {
mm.removeMessageListener("testLocal:persisted", listener);
mm.removeDelayedFrameScript(script);
is(msg.data.persisted, aMessage, "received " + aMessage);
if (msg.data.persisted == aMessage) {
resolve();
} else {
reject();
}
});
mm.loadFrameScript(script, true);
});
}