Bug 885054 - Sidebars should not migrate across private / non-private window. r=gavin

This commit is contained in:
Erik Vold 2013-07-09 13:21:23 -07:00
parent 1a7d96b183
commit b73190dfcb
4 changed files with 109 additions and 2 deletions

View File

@ -823,7 +823,8 @@ var gBrowserInit = {
// setup history swipe animation
gHistorySwipeAnimation.init();
if (window.opener && !window.opener.closed) {
if (window.opener && !window.opener.closed &&
PrivateBrowsingUtils.isWindowPrivate(window) == PrivateBrowsingUtils.isWindowPrivate(window.opener)) {
let openerSidebarBox = window.opener.document.getElementById("sidebar-box");
// If the opener had a sidebar, open the same sidebar in our window.
// The opener can be the hidden window too, if we're coming from the state

View File

@ -45,6 +45,7 @@ MOCHITEST_BROWSER_FILES = \
browser_privatebrowsing_popupblocker.js \
browser_privatebrowsing_protocolhandler.js \
browser_privatebrowsing_protocolhandler_page.html \
browser_privatebrowsing_sidebar.js \
browser_privatebrowsing_theming.js \
browser_privatebrowsing_ui.js \
browser_privatebrowsing_urlbarfocus.js \

View File

@ -0,0 +1,92 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// This test makes sure that Sidebars do not migrate across windows with
// different privacy states
// See Bug 885054: https://bugzilla.mozilla.org/show_bug.cgi?id=885054
function test() {
waitForExplicitFinish();
let { utils: Cu } = Components;
let { Promise: { defer } } = Cu.import("resource://gre/modules/Promise.jsm", {});
// opens a sidebar
function openSidebar(win) {
let { promise, resolve } = defer();
let doc = win.document;
let sidebarID = 'viewBookmarksSidebar';
let sidebar = doc.getElementById('sidebar');
let sidebarurl = doc.getElementById(sidebarID).getAttribute('sidebarurl');
sidebar.addEventListener('load', function onSidebarLoad() {
if (sidebar.contentWindow.location.href != sidebarurl)
return;
sidebar.removeEventListener('load', onSidebarLoad, true);
resolve(win);
}, true);
win.toggleSidebar(sidebarID, true);
return promise;
}
let windowCache = [];
function cacheWindow(w) {
windowCache.push(w);
return w;
}
function closeCachedWindows () {
windowCache.forEach(function(w) w.close());
}
// Part 1: NON PRIVATE WINDOW -> PRIVATE WINDOW
openWindow(window, {}, 1).
then(cacheWindow).
then(openSidebar).
then(function(win) openWindow(win, { private: true })).
then(cacheWindow).
then(function({ document }) {
let sidebarBox = document.getElementById("sidebar-box");
is(sidebarBox.hidden, true, 'Opening a private window from reg window does not open the sidebar');
}).
// Part 2: NON PRIVATE WINDOW -> NON PRIVATE WINDOW
then(function() openWindow(window)).
then(cacheWindow).
then(openSidebar).
then(function(win) openWindow(win)).
then(cacheWindow).
then(function({ document }) {
let sidebarBox = document.getElementById("sidebar-box");
is(sidebarBox.hidden, false, 'Opening a reg window from reg window does open the sidebar');
}).
// Part 3: PRIVATE WINDOW -> NON PRIVATE WINDOW
then(function() openWindow(window, { private: true })).
then(cacheWindow).
then(openSidebar).
then(function(win) openWindow(win)).
then(cacheWindow).
then(function({ document }) {
let sidebarBox = document.getElementById("sidebar-box");
is(sidebarBox.hidden, true, 'Opening a reg window from a private window does not open the sidebar');
}).
// Part 4: PRIVATE WINDOW -> PRIVATE WINDOW
then(function() openWindow(window, { private: true })).
then(cacheWindow).
then(openSidebar).
then(function(win) openWindow(win, { private: true })).
then(cacheWindow).
then(function({ document }) {
let sidebarBox = document.getElementById("sidebar-box");
is(sidebarBox.hidden, false, 'Opening a private window from private window does open the sidebar');
}).
then(closeCachedWindows).
then(finish);
}

View File

@ -31,6 +31,20 @@ function whenNewWindowLoaded(aOptions, aCallback) {
return win;
}
function openWindow(aParent, aOptions, a3) {
let { Promise: { defer } } = Components.utils.import("resource://gre/modules/Promise.jsm", {});
let { promise, resolve } = defer();
let win = aParent.OpenBrowserWindow(aOptions);
win.addEventListener("load", function onLoad() {
win.removeEventListener("load", onLoad, false);
resolve(win);
}, false);
return promise;
}
function newDirectory() {
let FileUtils =
Cu.import("resource://gre/modules/FileUtils.jsm", {}).FileUtils;
@ -62,4 +76,3 @@ function _initTest() {
}
_initTest();