/* 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 the last open directory used inside the private // browsing mode is not remembered after leaving that mode. var windowsToClose = []; function testOnWindow(options, callback) { var win = OpenBrowserWindow(options); win.addEventListener( "load", function () { windowsToClose.push(win); callback(win); }, { once: true } ); } registerCleanupFunction(function () { windowsToClose.forEach(function (win) { win.close(); }); }); function test() { // initialization waitForExplicitFinish(); let dir1 = Services.dirsvc.get("ProfD", Ci.nsIFile); let dir2 = Services.dirsvc.get("TmpD", Ci.nsIFile); let file = dir2.clone(); file.append("pbtest.file"); file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o600); const kPrefName = "browser.open.lastDir"; function setupCleanSlate(win) { win.gLastOpenDirectory.reset(); Services.prefs.clearUserPref(kPrefName); } setupCleanSlate(window); // open one regular and one private window testOnWindow(undefined, function (nonPrivateWindow) { setupCleanSlate(nonPrivateWindow); testOnWindow({ private: true }, function (privateWindow) { setupCleanSlate(privateWindow); // Test 1: general workflow test // initial checks ok( !nonPrivateWindow.gLastOpenDirectory.path, "Last open directory path should be initially empty" ); nonPrivateWindow.gLastOpenDirectory.path = dir2; is( nonPrivateWindow.gLastOpenDirectory.path.path, dir2.path, "The path should be successfully set" ); nonPrivateWindow.gLastOpenDirectory.path = null; is( nonPrivateWindow.gLastOpenDirectory.path.path, dir2.path, "The path should be not change when assigning it to null" ); nonPrivateWindow.gLastOpenDirectory.path = dir1; is( nonPrivateWindow.gLastOpenDirectory.path.path, dir1.path, "The path should be successfully outside of the private browsing mode" ); // test the private window is( privateWindow.gLastOpenDirectory.path.path, dir1.path, "The path should not change when entering the private browsing mode" ); privateWindow.gLastOpenDirectory.path = dir2; is( privateWindow.gLastOpenDirectory.path.path, dir2.path, "The path should successfully change inside the private browsing mode" ); // test the non-private window is( nonPrivateWindow.gLastOpenDirectory.path.path, dir1.path, "The path should be reset to the same path as before entering the private browsing mode" ); setupCleanSlate(nonPrivateWindow); setupCleanSlate(privateWindow); // Test 2: the user first tries to open a file inside the private browsing mode // test the private window ok( !privateWindow.gLastOpenDirectory.path, "No original path should exist inside the private browsing mode" ); privateWindow.gLastOpenDirectory.path = dir1; is( privateWindow.gLastOpenDirectory.path.path, dir1.path, "The path should be successfully set inside the private browsing mode" ); // test the non-private window ok( !nonPrivateWindow.gLastOpenDirectory.path, "The path set inside the private browsing mode should not leak when leaving that mode" ); setupCleanSlate(nonPrivateWindow); setupCleanSlate(privateWindow); // Test 3: the last open directory is set from a previous session, it should be used // in normal mode Services.prefs.setComplexValue(kPrefName, Ci.nsIFile, dir1); is( nonPrivateWindow.gLastOpenDirectory.path.path, dir1.path, "The pref set from last session should take effect outside the private browsing mode" ); setupCleanSlate(nonPrivateWindow); setupCleanSlate(privateWindow); // Test 4: the last open directory is set from a previous session, it should be used // in private browsing mode mode Services.prefs.setComplexValue(kPrefName, Ci.nsIFile, dir1); // test the private window is( privateWindow.gLastOpenDirectory.path.path, dir1.path, "The pref set from last session should take effect inside the private browsing mode" ); // test the non-private window is( nonPrivateWindow.gLastOpenDirectory.path.path, dir1.path, "The pref set from last session should remain in effect after leaving the private browsing mode" ); setupCleanSlate(nonPrivateWindow); setupCleanSlate(privateWindow); // Test 5: setting the path to a file shouldn't work nonPrivateWindow.gLastOpenDirectory.path = file; ok( !nonPrivateWindow.gLastOpenDirectory.path, "Setting the path to a file shouldn't work when it's originally null" ); nonPrivateWindow.gLastOpenDirectory.path = dir1; nonPrivateWindow.gLastOpenDirectory.path = file; is( nonPrivateWindow.gLastOpenDirectory.path.path, dir1.path, "Setting the path to a file shouldn't work when it's not originally null" ); // cleanup file.remove(false); finish(); }); }); }