| author | Mike Perry <mikeperry-git@torproject.org> |
| Thu, 11 Jun 2015 11:00:00 -0400 | |
| changeset 248684 | 9361bef1aefeee5aac307cbaaea2245b9c8d6bcf |
| parent 248522 | c2570d3a3e4a2bc164f1ba7b401025eb494f1be0 |
| child 248685 | 9807fb275ecf3cdd63edb6cdd8fb40be6ff77dc5 |
| push id | 28903 |
| push user | philringnalda@gmail.com |
| push date | Sun, 14 Jun 2015 01:32:39 +0000 |
| treeherder | mozilla-central@e3ab171ddd37 [default view] [failures only] |
| perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
| reviewers | ehsan |
| bugs | 967812 |
| milestone | 41.0a1 |
| first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
| last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
| extensions/cookie/nsPermissionManager.cpp | file | annotate | diff | comparison | revisions | |
| extensions/cookie/nsPermissionManager.h | file | annotate | diff | comparison | revisions |
--- a/extensions/cookie/nsPermissionManager.cpp +++ b/extensions/cookie/nsPermissionManager.cpp @@ -379,17 +379,18 @@ nsPermissionManager::AppClearDataObserve // to find that URL. If not set, don't use any default permissions. static const char kDefaultsUrlPrefName[] = "permissions.manager.defaultsUrl"; static const char kPermissionChangeNotification[] = PERM_CHANGE_NOTIFICATION; NS_IMPL_ISUPPORTS(nsPermissionManager, nsIPermissionManager, nsIObserver, nsISupportsWeakReference) nsPermissionManager::nsPermissionManager() - : mLargestID(0) + : mMemoryOnlyDB(false) + , mLargestID(0) , mIsShuttingDown(false) { } nsPermissionManager::~nsPermissionManager() { RemoveAllFromMemory(); gPermissionManager = nullptr; @@ -421,16 +422,20 @@ nsPermissionManager::GetXPCOMSingleton() return gPermissionManager; } nsresult nsPermissionManager::Init() { nsresult rv; + // If the 'permissions.memory_only' pref is set to true, then don't write any + // permission settings to disk, but keep them in a memory-only database. + mMemoryOnlyDB = mozilla::Preferences::GetBool("permissions.memory_only", false); + mObserverService = do_GetService("@mozilla.org/observer-service;1", &rv); if (NS_SUCCEEDED(rv)) { mObserverService->AddObserver(this, "profile-before-change", true); mObserverService->AddObserver(this, "profile-do-change", true); } if (IsChildProcess()) { // Stop here; we don't need the DB in the child process @@ -453,16 +458,33 @@ nsPermissionManager::RefreshPermission() NS_ENSURE_SUCCESS(rv, rv); rv = FetchPermissions(); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; } nsresult +nsPermissionManager::OpenDatabase(nsIFile* aPermissionsFile) +{ + nsresult rv; + nsCOMPtr<mozIStorageService> storage = do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID); + if (!storage) { + return NS_ERROR_UNEXPECTED; + } + // cache a connection to the hosts database + if (mMemoryOnlyDB) { + rv = storage->OpenSpecialDatabase("memory", getter_AddRefs(mDBConn)); + } else { + rv = storage->OpenDatabase(aPermissionsFile, getter_AddRefs(mDBConn)); + } + return rv; +} + +nsresult nsPermissionManager::InitDB(bool aRemoveFile) { nsCOMPtr<nsIFile> permissionsFile; nsresult rv = NS_GetSpecialDirectory(NS_APP_PERMISSION_PARENT_DIR, getter_AddRefs(permissionsFile)); if (NS_FAILED(rv)) { rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(permissionsFile)); } NS_ENSURE_SUCCESS(rv, NS_ERROR_UNEXPECTED); @@ -475,34 +497,31 @@ nsPermissionManager::InitDB(bool aRemove rv = permissionsFile->Exists(&exists); NS_ENSURE_SUCCESS(rv, rv); if (exists) { rv = permissionsFile->Remove(false); NS_ENSURE_SUCCESS(rv, rv); } } - nsCOMPtr<mozIStorageService> storage = do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID); - if (!storage) - return NS_ERROR_UNEXPECTED; - - // cache a connection to the hosts database - rv = storage->OpenDatabase(permissionsFile, getter_AddRefs(mDBConn)); - if (rv == NS_ERROR_FILE_CORRUPTED) { + rv = OpenDatabase(permissionsFile); + if (rv == NS_ERROR_UNEXPECTED) { + return rv; + } else if (rv == NS_ERROR_FILE_CORRUPTED) { LogToConsole(NS_LITERAL_STRING("permissions.sqlite is corrupted! Try again!")); // Add telemetry probe mozilla::Telemetry::Accumulate(mozilla::Telemetry::PERMISSIONS_SQL_CORRUPTED, 1); // delete corrupted permissions.sqlite and try again rv = permissionsFile->Remove(false); NS_ENSURE_SUCCESS(rv, rv); LogToConsole(NS_LITERAL_STRING("Corrupted permissions.sqlite has been removed.")); - rv = storage->OpenDatabase(permissionsFile, getter_AddRefs(mDBConn)); + rv = OpenDatabase(permissionsFile); NS_ENSURE_SUCCESS(rv, rv); LogToConsole(NS_LITERAL_STRING("OpenDatabase to permissions.sqlite is successful!")); } bool ready; mDBConn->GetConnectionReady(&ready); if (!ready) { LogToConsole(NS_LITERAL_STRING("Fail to get connection to permissions.sqlite! Try again!")); @@ -510,17 +529,17 @@ nsPermissionManager::InitDB(bool aRemove // delete and try again rv = permissionsFile->Remove(false); NS_ENSURE_SUCCESS(rv, rv); LogToConsole(NS_LITERAL_STRING("Defective permissions.sqlite has been removed.")); // Add telemetry probe mozilla::Telemetry::Accumulate(mozilla::Telemetry::DEFECTIVE_PERMISSIONS_SQL_REMOVED, 1); - rv = storage->OpenDatabase(permissionsFile, getter_AddRefs(mDBConn)); + rv = OpenDatabase(permissionsFile); NS_ENSURE_SUCCESS(rv, rv); LogToConsole(NS_LITERAL_STRING("OpenDatabase to permissions.sqlite is successful!")); mDBConn->GetConnectionReady(&ready); if (!ready) return NS_ERROR_UNEXPECTED; }
--- a/extensions/cookie/nsPermissionManager.h +++ b/extensions/cookie/nsPermissionManager.h @@ -229,16 +229,17 @@ private: bool aExactHostMatch); nsresult CommonTestPermission(nsIPrincipal* aPrincipal, const char *aType, uint32_t *aPermission, bool aExactHostMatch, bool aIncludingSession); + nsresult OpenDatabase(nsIFile* permissionsFile); nsresult InitDB(bool aRemoveFile); nsresult CreateTable(); nsresult Import(); nsresult ImportDefaults(); nsresult _DoImport(nsIInputStream *inputStream, mozIStorageConnection *aConn); nsresult Read(); void NotifyObserversWithPermission(const nsACString &aHost, uint32_t aAppId, @@ -321,16 +322,18 @@ private: nsCOMPtr<nsIObserverService> mObserverService; nsCOMPtr<nsIIDNService> mIDNService; nsCOMPtr<mozIStorageConnection> mDBConn; nsCOMPtr<mozIStorageAsyncStatement> mStmtInsert; nsCOMPtr<mozIStorageAsyncStatement> mStmtDelete; nsCOMPtr<mozIStorageAsyncStatement> mStmtUpdate; + bool mMemoryOnlyDB; + nsTHashtable<PermissionHashKey> mPermissionTable; // a unique, monotonically increasing id used to identify each database entry int64_t mLargestID; // An array to store the strings identifying the different types. nsTArray<nsCString> mTypeArray; // A list of struct for counting applications