diff options
Diffstat (limited to 'browser/components/sessionstore/test/browser_privatetabs.js')
-rw-r--r-- | browser/components/sessionstore/test/browser_privatetabs.js | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_privatetabs.js b/browser/components/sessionstore/test/browser_privatetabs.js new file mode 100644 index 000000000..cc02e56cf --- /dev/null +++ b/browser/components/sessionstore/test/browser_privatetabs.js @@ -0,0 +1,133 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +add_task(function cleanup() { + info("Forgetting closed tabs"); + while (ss.getClosedTabCount(window)) { + ss.forgetClosedTab(window, 0); + } +}); + +add_task(function() { + let URL_PUBLIC = "http://example.com/public/" + Math.random(); + let URL_PRIVATE = "http://example.com/private/" + Math.random(); + let tab1, tab2; + try { + // Setup a public tab and a private tab + info("Setting up public tab"); + tab1 = gBrowser.addTab(URL_PUBLIC); + yield promiseBrowserLoaded(tab1.linkedBrowser); + + info("Setting up private tab"); + tab2 = gBrowser.addTab(); + yield promiseBrowserLoaded(tab2.linkedBrowser); + yield setUsePrivateBrowsing(tab2.linkedBrowser, true); + tab2.linkedBrowser.loadURI(URL_PRIVATE); + yield promiseBrowserLoaded(tab2.linkedBrowser); + + info("Flush to make sure chrome received all data."); + yield TabStateFlusher.flush(tab1.linkedBrowser); + yield TabStateFlusher.flush(tab2.linkedBrowser); + + info("Checking out state"); + let state = yield promiseRecoveryFileContents(); + + info("State: " + state); + // Ensure that sessionstore.js only knows about the public tab + ok(state.indexOf(URL_PUBLIC) != -1, "State contains public tab"); + ok(state.indexOf(URL_PRIVATE) == -1, "State does not contain private tab"); + + // Ensure that we can close and undo close the public tab but not the private tab + gBrowser.removeTab(tab2); + tab2 = null; + + gBrowser.removeTab(tab1); + tab1 = null; + + tab1 = ss.undoCloseTab(window, 0); + ok(true, "Public tab supports undo close"); + + is(ss.getClosedTabCount(window), 0, "Private tab does not support undo close"); + + } finally { + if (tab1) { + gBrowser.removeTab(tab1); + } + if (tab2) { + gBrowser.removeTab(tab2); + } + } +}); + +add_task(function () { + const FRAME_SCRIPT = "data:," + + "docShell.QueryInterface%28Components.interfaces.nsILoadContext%29.usePrivateBrowsing%3Dtrue"; + + // Clear the list of closed windows. + forgetClosedWindows(); + + // Create a new window to attach our frame script to. + let win = yield promiseNewWindowLoaded(); + let mm = win.getGroupMessageManager("browsers"); + mm.loadFrameScript(FRAME_SCRIPT, true); + + // Create a new tab in the new window that will load the frame script. + let tab = win.gBrowser.addTab("about:mozilla"); + let browser = tab.linkedBrowser; + yield promiseBrowserLoaded(browser); + yield TabStateFlusher.flush(browser); + + // Check that we consider the tab as private. + let state = JSON.parse(ss.getTabState(tab)); + ok(state.isPrivate, "tab considered private"); + + // Ensure we don't allow restoring closed private tabs in non-private windows. + win.gBrowser.removeTab(tab); + is(ss.getClosedTabCount(win), 0, "no tabs to restore"); + + // Create a new tab in the new window that will load the frame script. + tab = win.gBrowser.addTab("about:mozilla"); + browser = tab.linkedBrowser; + yield promiseBrowserLoaded(browser); + yield TabStateFlusher.flush(browser); + + // Check that we consider the tab as private. + state = JSON.parse(ss.getTabState(tab)); + ok(state.isPrivate, "tab considered private"); + + // Check that all private tabs are removed when the non-private + // window is closed and we don't save windows without any tabs. + yield BrowserTestUtils.closeWindow(win); + is(ss.getClosedWindowCount(), 0, "no windows to restore"); +}); + +add_task(function () { + // Clear the list of closed windows. + forgetClosedWindows(); + + // Create a new window to attach our frame script to. + let win = yield promiseNewWindowLoaded({private: true}); + + // Create a new tab in the new window that will load the frame script. + let tab = win.gBrowser.addTab("about:mozilla"); + let browser = tab.linkedBrowser; + yield promiseBrowserLoaded(browser); + yield TabStateFlusher.flush(browser); + + // Check that we consider the tab as private. + let state = JSON.parse(ss.getTabState(tab)); + ok(state.isPrivate, "tab considered private"); + + // Ensure that closed tabs in a private windows can be restored. + win.gBrowser.removeTab(tab); + is(ss.getClosedTabCount(win), 1, "there is a single tab to restore"); + + // Ensure that closed private windows can never be restored. + yield BrowserTestUtils.closeWindow(win); + is(ss.getClosedWindowCount(), 0, "no windows to restore"); +}); + +function setUsePrivateBrowsing(browser, val) { + return sendMessage(browser, "ss-test:setUsePrivateBrowsing", val); +} + |