Bug 1346171 - Part 2 - Test synchronous session file deletion on clearing history. r=sebastian

MozReview-Commit-ID: JUrbSD2t41t

--HG--
extra : rebase_source : b563dc9944f13f1fc2fccdc1b88786282f8d6379
This commit is contained in:
Jan Henning 2017-03-12 11:13:33 +01:00
parent bb40130b5e
commit a6d3db031b
3 changed files with 70 additions and 0 deletions

View File

@ -87,4 +87,10 @@ interface nsISessionStore : nsISupports
* @param aWindow The window to remove
*/
void removeWindow(in nsIDOMWindow aWindow);
/**
* Set the load state of the session store. Use only for testing.
* @param aState The target load state.
*/
void setLoadState(in long aState);
};

View File

@ -1607,6 +1607,11 @@ SessionStore.prototype = {
} else if (this._loadState <= STATE_QUITTING) {
this.saveStateDelayed();
}
},
setLoadState: function ss_setLoadState(aState) {
this.flushPendingState();
this._loadState = aState;
}
};

View File

@ -48,7 +48,21 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1343603
cleanupTabs();
});
let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
// Session store load state constants
const STATE_STOPPED = 0;
const STATE_RUNNING = 1;
const STATE_QUITTING = -1;
const STATE_QUITTING_FLUSHED = -2;
function createFileIfNotExists(file) {
if (!file.exists()) {
file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
}
}
// URLs for testing
const url1 = "http://example.org/chrome/mobile/android/tests/browser/chrome/basic_article_mobile.html";
const url2 = "http://example.org/chrome/mobile/android/tests/browser/chrome/basic_article.html";
const url3 = "data:text/html;charset=utf-8,It%20was%20a%20dark%20and%20stormy%20night.";
@ -89,6 +103,51 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1343603
cleanupTabs();
});
add_task(function* test_sessionStoreClearFiles() {
// Temporarily set the session store to shutdown mode to test the
// synchronous deletion code path.
// This also means that nothing gets written to disk until explicitly
// flushed, so we can test that all files have been deleted and don't
// have to worry about them already having been recreated before we get
// around checking on them.
ss.setLoadState(STATE_QUITTING);
let sessionFile = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
let sessionFileBackup = sessionFile.clone();
let sessionFilePrevious = sessionFile.clone();
let sessionFileTemp = sessionFile.clone();
sessionFile.append("sessionstore.js"); // The main session store save file.
sessionFileBackup.append("sessionstore.bak"); // A backup copy to guard against interrupted writes.
sessionFilePrevious.append("sessionstore.old"); // The previous session's file, used for what used to be the "Tabs from last time".
sessionFileTemp.append(sessionFile.leafName + ".tmp"); // Temporary file for writing changes to disk.
createFileIfNotExists(sessionFile);
createFileIfNotExists(sessionFileBackup);
createFileIfNotExists(sessionFilePrevious);
createFileIfNotExists(sessionFileTemp);
ok(sessionFile.exists(), "session file exists");
ok(sessionFileBackup.exists(), "backup file exists");
ok(sessionFilePrevious.exists(), "last session file exists");
ok(sessionFileTemp.exists(), "temp file exists");
// Clear browsing history
let sanitize = { history:true };
let notification = promiseNotification("sessionstore-state-purge-complete");
BrowserApp.sanitize(sanitize);
yield notification;
ok(!sessionFile.exists(), "session file was deleted");
ok(!sessionFileBackup.exists(), "backup file was deleted");
ok(!sessionFilePrevious.exists(), "last session file was deleted");
ok(!sessionFileTemp.exists(), "temp file was deleted");
// Revert back to normal
ss.setLoadState(STATE_RUNNING);
});
add_task(function* test_sessionStoreClearZombieTabHistory() {
// Add a new tab with some content
tabTest = BrowserApp.addTab(url1 , { selected: true, parentId: BrowserApp.selectedTab.id });