author | Bellindira Castillo [:bellindira] <bellindira@appcoast.com> |
Fri, 14 Dec 2012 14:06:45 -0600 | |
changeset 116145 | e28f0f4b25a4e76ab368a88b12fd67a29c9faefd |
parent 116144 | c6e671c2f43c14fd7f26eb1824bbdb6e38500dc0 |
child 116146 | e570d3a26106cc0050daf1781ed0455798facf72 |
push id | 24043 |
push user | ryanvm@gmail.com |
push date | Sat, 15 Dec 2012 21:18:16 +0000 |
treeherder | mozilla-central@c8a1314aa449 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | ttaubert |
bugs | 819510 |
milestone | 20.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/browser/components/sessionstore/src/SessionStore.jsm +++ b/browser/components/sessionstore/src/SessionStore.jsm @@ -3706,16 +3706,19 @@ let SessionStoreInternal = { return; } #ifdef MOZ_PER_WINDOW_PRIVATE_BROWSING // Forget about private windows. for (let i = oState.windows.length - 1; i >= 0; i--) { if (oState.windows[i].isPrivate) { oState.windows.splice(i, 1); + if (oState.selectedWindow >= i) { + oState.selectedWindow--; + } } } for (let i = oState._closedWindows.length - 1; i >= 0; i--) { if (oState._closedWindows[i].isPrivate) { oState._closedWindows.splice(i, 1); } } #endif
--- a/browser/components/sessionstore/test/Makefile.in +++ b/browser/components/sessionstore/test/Makefile.in @@ -132,16 +132,17 @@ MOCHITEST_BROWSER_FILES = \ $(filter disabled-for-intermittent-failures--bug-766044, browser_459906_sample.html) \ $(filter disabled-for-intermittent-failures--bug-765389, browser_461743_sample.html) \ $(NULL) ifdef MOZ_PER_WINDOW_PRIVATE_BROWSING MOCHITEST_BROWSER_FILES += \ browser_354894_perwindowpb.js \ browser_394759_perwindowpb.js \ + browser_819510_perwindowpb.js \ $(NULL) else MOCHITEST_BROWSER_FILES += \ browser_248970_a.js \ browser_248970_b.js \ browser_354894.js \ browser_394759_privatebrowsing.js \ $(NULL)
new file mode 100644 --- /dev/null +++ b/browser/components/sessionstore/test/browser_819510_perwindowpb.js @@ -0,0 +1,171 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +const originalState = ss.getBrowserState(); + +/** Private Browsing Test for Bug 819510 **/ +function test() { + waitForExplicitFinish(); + + registerCleanupFunction(function() { + Services.prefs.clearUserPref("browser.sessionstore.interval"); + ss.setBrowserState(originalState); + }); + + runNextTest(); +} + +let tests = [ + test_1, + test_2, + test_3, +]; + +const testState = { + windows: [{ + tabs: [ + { entries: [{ url: "about:blank" }] }, + ] + }] +}; + +function runNextTest() { + // Set an empty state + let windowsEnum = Services.wm.getEnumerator("navigator:browser"); + while (windowsEnum.hasMoreElements()) { + let currentWindow = windowsEnum.getNext(); + if (currentWindow != window) { + currentWindow.close(); + } + } + + // Run the next test, or finish + if (tests.length) { + let currentTest = tests.shift(); + waitForBrowserState(testState, currentTest); + } + else { + Services.prefs.clearUserPref("browser.sessionstore.interval"); + ss.setBrowserState(originalState); + finish(); + } +} + +// Test opening default mochitest-normal-private-normal-private windows +// (saving the state with last window being private) +function test_1() { + testOnWindow(false, function(aWindow) { + aWindow.gBrowser.addTab("http://www.example.com/1"); + testOnWindow(true, function(aWindow) { + aWindow.gBrowser.addTab("http://www.example.com/2"); + testOnWindow(false, function(aWindow) { + aWindow.gBrowser.addTab("http://www.example.com/3"); + testOnWindow(true, function(aWindow) { + aWindow.gBrowser.addTab("http://www.example.com/4"); + + let curState = JSON.parse(ss.getBrowserState()); + is (curState.windows.length, 5, "Browser has opened 5 windows"); + is (curState.windows[2].isPrivate, true, "Window is private"); + is (curState.windows[4].isPrivate, true, "Last window is private"); + is (curState.selectedWindow, 5, "Last window opened is the one selected"); + + Services.obs.addObserver(function observe(aSubject, aTopic, aData) { + Services.obs.removeObserver(observe, aTopic); + aSubject.QueryInterface(Ci.nsISupportsString); + let state = JSON.parse(aSubject.data); + is(state.windows.length, 3, + "sessionstore state: 3 windows in data being writted to disk"); + is (state.selectedWindow, 3, + "Selected window is updated to match one of the saved windows"); + state.windows.forEach(function(win) { + is(!win.isPrivate, true, "Saved window is not private"); + }); + is(state._closedWindows.length, 0, + "sessionstore state: no closed windows in data being writted to disk"); + runNextTest(); + }, "sessionstore-state-write", false); + + Services.prefs.setIntPref("browser.sessionstore.interval", 0); + }); + }); + }); + }); +} + +// Test opening default mochitest window + 2 private windows +function test_2() { +testOnWindow(true, function(aWindow) { + aWindow.gBrowser.addTab("http://www.example.com/1"); + testOnWindow(true, function(aWindow) { + aWindow.gBrowser.addTab("http://www.example.com/2"); + + let curState = JSON.parse(ss.getBrowserState()); + is (curState.windows.length, 3, "Browser has opened 3 windows"); + is (curState.windows[1].isPrivate, true, "Window 1 is private"); + is (curState.windows[2].isPrivate, true, "Window 2 is private"); + is (curState.selectedWindow, 3, "Last window opened is the one selected"); + + Services.obs.addObserver(function observe(aSubject, aTopic, aData) { + Services.obs.removeObserver(observe, aTopic); + aSubject.QueryInterface(Ci.nsISupportsString); + let state = JSON.parse(aSubject.data); + is(state.windows.length, 1, + "sessionstore state: 1 windows in data being writted to disk"); + is (state.selectedWindow, 1, + "Selected window is updated to match one of the saved windows"); + is(state._closedWindows.length, 0, + "sessionstore state: no closed windows in data being writted to disk"); + runNextTest(); + }, "sessionstore-state-write", false); + Services.prefs.setIntPref("browser.sessionstore.interval", 0); + }); +}); +} + +// Test opening default-normal-private-normal windows and closing a normal window +function test_3() { + testOnWindow(false, function(normalWindow) { + normalWindow.gBrowser.addTab("http://www.example.com/1"); + testOnWindow(true, function(aWindow) { + aWindow.gBrowser.addTab("http://www.example.com/2"); + testOnWindow(false, function(aWindow) { + aWindow.gBrowser.addTab("http://www.example.com/3"); + + let curState = JSON.parse(ss.getBrowserState()); + is (curState.windows.length, 4, "Browser has opened 4 windows"); + is (curState.windows[2].isPrivate, true, "Window 2 is private"); + is (curState.selectedWindow, 4, "Last window opened is the one selected"); + + normalWindow.close(); + Services.obs.addObserver(function observe(aSubject, aTopic, aData) { + Services.obs.removeObserver(observe, aTopic); + aSubject.QueryInterface(Ci.nsISupportsString); + let state = JSON.parse(aSubject.data); + is(state.windows.length, 2, + "sessionstore state: 2 windows in data being writted to disk"); + is (state.selectedWindow, 2, + "Selected window is updated to match one of the saved windows"); + state.windows.forEach(function(win) { + is(!win.isPrivate, true, "Saved window is not private"); + }); + is(state._closedWindows.length, 1, + "sessionstore state: 1 closed window in data being writted to disk"); + state._closedWindows.forEach(function(win) { + is(!win.isPrivate, true, "Closed window is not private"); + }); + runNextTest(); + }, "sessionstore-state-write", false); + + Services.prefs.setIntPref("browser.sessionstore.interval", 0); + }); + }); + }); +} + +function testOnWindow(aIsPrivate, aCallback) { + let win = OpenBrowserWindow({private: aIsPrivate}); + win.addEventListener("load", function onLoad() { + win.removeEventListener("load", onLoad, false); + executeSoon(function() { aCallback(win); }); + }, false); +}