Bug 1372988 part A - Warn when user prefs are set after the profile is dead, because the prefs won't get saved anyway. r=milan

MozReview-Commit-ID: IfwL5yYtLcF

--HG--
extra : rebase_source : f03a79b5f7c3b8eb802bfd2db9991e5ed6c74a8f
This commit is contained in:
Benjamin Smedberg 2017-06-21 11:17:01 -04:00
parent 5cf8c34a94
commit bfee2567d6
2 changed files with 23 additions and 5 deletions

View File

@ -102,6 +102,9 @@ Preferences::DirtyCallback()
}
if (gHashTable && sPreferences && !sPreferences->mDirty) {
sPreferences->mDirty = true;
NS_WARNING_ASSERTION(!sPreferences->mProfileShutdown,
"Setting user pref after profile shutdown.");
}
}
@ -662,7 +665,6 @@ Preferences::Shutdown()
*/
Preferences::Preferences()
: mDirty(false)
{
}
@ -796,11 +798,19 @@ Preferences::Observe(nsISupports *aSubject, const char *aTopic,
nsresult rv = NS_OK;
if (!nsCRT::strcmp(aTopic, "profile-before-change")) {
rv = SavePrefFile(nullptr);
} else if (!nsCRT::strcmp(aTopic, "profile-before-change-telemetry")) {
// Normally prefs aren't written after this point, and so we kick off
// an asynchronous pref save so that I/O can be done in parallel with
// other shutdown.
if (AllowOffMainThreadSave()) {
PreferencesWriter::Flush();
SavePrefFile(nullptr);
}
} else if (!nsCRT::strcmp(aTopic, "profile-before-change-telemetry")) {
// It's possible that a profile-before-change observer after ours
// set a pref. A blocking save here re-saves if necessary and also waits
// for any pending saves to complete.
SavePrefFileBlocking();
MOZ_ASSERT(!mDirty, "Preferences should not be dirty");
mProfileShutdown = true;
} else if (!strcmp(aTopic, "load-extension-defaults")) {
pref_LoadPrefsInDirList(NS_EXT_PREFS_DEFAULTS_DIR_LIST);
} else if (!nsCRT::strcmp(aTopic, "reload-default-prefs")) {
@ -1154,6 +1164,13 @@ Preferences::SavePrefFileInternal(nsIFile *aFile, SaveMethod aSaveMethod)
return NS_OK;
}
// check for profile shutdown after mDirty because the runnables from
// DirtyCallback can still be pending
if (mProfileShutdown) {
NS_WARNING("Cannot save pref file after profile shutdown.");
return NS_ERROR_ILLEGAL_DURING_SHUTDOWN;
}
// It's possible that we never got a prefs file.
nsresult rv = NS_OK;
if (mCurrentFile) {

View File

@ -485,7 +485,8 @@ protected:
private:
nsCOMPtr<nsIFile> mCurrentFile;
bool mDirty;
bool mDirty = false;
bool mProfileShutdown = false;
static Preferences* sPreferences;
static nsIPrefBranch* sRootBranch;