Bug 1276738 - Ensure that .open() on web content called with chrome privileges results in a new window with the appropriate principal. r=Gijs

MozReview-Commit-ID: IG9ioQLTI78

--HG--
extra : rebase_source : 0ba3de736ba4fd80a7444c9246a8c2bf77308570
extra : source : ea2da46bde0a4a3039d69e198ad40afefc92a5ec
This commit is contained in:
Mike Conley 2016-05-02 17:36:12 -04:00
Родитель c3144863d0
Коммит cb9696f49a
3 изменённых файлов: 70 добавлений и 3 удалений

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

@ -3,5 +3,6 @@ tags = openwindow
[browser_new_remote_window_flags.js]
run-if = e10s
[browser_new_content_window_from_chrome_principal.js]
[browser_new_sized_window.js]
skip-if = os == 'win' # Bug 1276802 - Opening windows from content on Windows might not get the size right

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

@ -0,0 +1,34 @@
"use strict";
/**
* Tests that if chrome-privileged code calls .open() on an
* unprivileged window, that the principal in the newly
* opened window is appropriately set.
*/
add_task(function* test_chrome_opens_window() {
// This magic value of 2 means that by default, when content tries
// to open a new window, it'll actually open in a new window instead
// of a new tab.
yield SpecialPowers.pushPrefEnv({"set": [
["browser.link.open_newwindow", 2],
]});
let newWinPromise = BrowserTestUtils.waitForNewWindow(true, "http://example.com/");
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
content.open("http://example.com/", "_blank");
});
let win = yield newWinPromise;
let browser = win.gBrowser.selectedBrowser;
yield ContentTask.spawn(browser, null, function*() {
Assert.ok(!content.document.nodePrincipal.isSystemPrincipal,
"We should not have a system principal.")
Assert.equal(content.document.nodePrincipal.origin,
"http://example.com",
"Should have the example.com principal");
});
yield BrowserTestUtils.closeWindow(win);
});

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

@ -279,15 +279,47 @@ this.BrowserTestUtils = {
/**
* Waits for the next browser window to open and be fully loaded.
*
* @param {bool} delayedStartup (optional)
* Whether or not to wait for the browser-delayed-startup-finished
* observer notification before resolving. Defaults to true.
* @param {string} initialBrowserLoaded (optional)
* If set, we will wait until the initial browser in the new
* window has loaded a particular page. If unset, the initial
* browser may or may not have finished loading its first page
* when the resulting Promise resolves.
* @return {Promise}
* A Promise which resolves the next time that a DOM window
* opens and the delayed startup observer notification fires.
*/
waitForNewWindow: Task.async(function* (delayedStartup=true) {
waitForNewWindow: Task.async(function* (delayedStartup=true,
initialBrowserLoaded=null) {
let win = yield this.domWindowOpened();
yield TestUtils.topicObserved("browser-delayed-startup-finished",
subject => subject == win);
let promises = [
TestUtils.topicObserved("browser-delayed-startup-finished",
subject => subject == win),
];
if (initialBrowserLoaded) {
yield this.waitForEvent(win, "DOMContentLoaded");
let browser = win.gBrowser.selectedBrowser;
// Retrieve the given browser's current process type.
let process =
browser.isRemoteBrowser ? Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT
: Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
if (win.gMultiProcessBrowser &&
!E10SUtils.canLoadURIInProcess(initialBrowserLoaded, process)) {
yield this.waitForEvent(browser, "XULFrameLoaderCreated");
}
let loadPromise = this.browserLoaded(browser, false, initialBrowserLoaded);
promises.push(loadPromise);
}
yield Promise.all(promises);
return win;
}),