2013-12-18 09:39:53 -08:00
|
|
|
/* Any copyright is dedicated to the Public Domain.
|
|
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
|
|
|
|
let Imports = {};
|
|
|
|
Cu.import("resource:///modules/sessionstore/SessionSaver.jsm", Imports);
|
2013-12-04 01:15:43 -08:00
|
|
|
let {SessionSaver} = Imports;
|
2013-12-18 09:39:53 -08:00
|
|
|
|
|
|
|
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.");
|
2014-01-20 08:36:59 -08:00
|
|
|
SyncHandlers.get(tab1.linkedBrowser).flush();
|
2013-12-18 09:39:53 -08:00
|
|
|
SyncHandlers.get(tab2.linkedBrowser).flush();
|
|
|
|
|
|
|
|
info("Checking out state");
|
|
|
|
yield SessionSaver.run();
|
|
|
|
let path = OS.Path.join(OS.Constants.Path.profileDir, "sessionstore.js");
|
|
|
|
let data = yield OS.File.read(path);
|
|
|
|
let state = new TextDecoder().decode(data);
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2014-01-15 02:24:25 -08:00
|
|
|
add_task(function () {
|
|
|
|
const FRAME_SCRIPT = "data:," +
|
|
|
|
"docShell.QueryInterface%28Ci.nsILoadContext%29.usePrivateBrowsing%3Dtrue";
|
|
|
|
|
2014-01-18 00:51:46 -08:00
|
|
|
// Clear the list of closed windows.
|
|
|
|
while (ss.getClosedWindowCount()) {
|
|
|
|
ss.forgetClosedWindow(0);
|
|
|
|
}
|
|
|
|
|
2014-01-15 02:24:25 -08:00
|
|
|
// Create a new window to attach our frame script to.
|
|
|
|
let win = yield promiseNewWindowLoaded();
|
|
|
|
win.messageManager.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);
|
|
|
|
SyncHandlers.get(browser).flush();
|
|
|
|
|
|
|
|
// Check that we consider the tab as private.
|
|
|
|
let state = JSON.parse(ss.getTabState(tab));
|
|
|
|
ok(state.isPrivate, "tab considered private");
|
|
|
|
|
2014-01-18 00:51:46 -08:00
|
|
|
// 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.
|
|
|
|
let tab = win.gBrowser.addTab("about:mozilla");
|
|
|
|
let browser = tab.linkedBrowser;
|
|
|
|
yield promiseBrowserLoaded(browser);
|
|
|
|
SyncHandlers.get(browser).flush();
|
|
|
|
|
|
|
|
// Check that we consider the tab as private.
|
|
|
|
let 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 promiseWindowClosed(win);
|
|
|
|
is(ss.getClosedWindowCount(), 0, "no windows to restore");
|
|
|
|
});
|
|
|
|
|
|
|
|
add_task(function () {
|
|
|
|
// Clear the list of closed windows.
|
|
|
|
while (ss.getClosedWindowCount()) {
|
|
|
|
ss.forgetClosedWindow(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
SyncHandlers.get(browser).flush();
|
|
|
|
|
|
|
|
// 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.
|
2014-01-15 02:24:25 -08:00
|
|
|
yield promiseWindowClosed(win);
|
2014-01-18 00:51:46 -08:00
|
|
|
is(ss.getClosedWindowCount(), 0, "no windows to restore");
|
2014-01-15 02:24:25 -08:00
|
|
|
});
|
|
|
|
|
2013-12-18 09:39:53 -08:00
|
|
|
function setUsePrivateBrowsing(browser, val) {
|
|
|
|
return sendMessage(browser, "ss-test:setUsePrivateBrowsing", val);
|
|
|
|
}
|
|
|
|
|