forked from mirrors/gecko-dev
		
	 52e65cee71
			
		
	
	
		52e65cee71
		
	
	
	
	
		
			
			Firefox background tasks use a new temporary profile directory for every invocation. We would like to write as little data as possible into the temporary profile directory in this mode. This patch allows to make the persistent cookie storage discard cookies just like private cookie storage. This approach simply uses that the base `CookieStorage` class is close to sufficient already. There may be a performance impact with more virtual invocations, but none of these functions seem likely to be hot. Differential Revision: https://phabricator.services.mozilla.com/D139910
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* 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/. */
 | |
| 
 | |
| #ifndef mozilla_net_CookiePersistentStorage_h
 | |
| #define mozilla_net_CookiePersistentStorage_h
 | |
| 
 | |
| #include "CookieStorage.h"
 | |
| 
 | |
| #include "mozilla/Atomics.h"
 | |
| #include "mozilla/Monitor.h"
 | |
| #include "mozilla/net/NeckoChannelParams.h"
 | |
| #include "mozIStorageBindingParamsArray.h"
 | |
| #include "mozIStorageCompletionCallback.h"
 | |
| #include "mozIStorageStatement.h"
 | |
| #include "mozIStorageStatementCallback.h"
 | |
| 
 | |
| class mozIStorageAsyncStatement;
 | |
| class mozIStorageService;
 | |
| class nsICookieTransactionCallback;
 | |
| class nsIEffectiveTLDService;
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace net {
 | |
| 
 | |
| class CookiePersistentStorage final : public CookieStorage {
 | |
|  public:
 | |
|   // Result codes for TryInitDB() and Read().
 | |
|   enum OpenDBResult { RESULT_OK, RESULT_RETRY, RESULT_FAILURE };
 | |
| 
 | |
|   static already_AddRefed<CookiePersistentStorage> Create();
 | |
| 
 | |
|   void HandleCorruptDB();
 | |
| 
 | |
|   void RemoveCookiesWithOriginAttributes(
 | |
|       const OriginAttributesPattern& aPattern,
 | |
|       const nsACString& aBaseDomain) override;
 | |
| 
 | |
|   void RemoveCookiesFromExactHost(
 | |
|       const nsACString& aHost, const nsACString& aBaseDomain,
 | |
|       const OriginAttributesPattern& aPattern) override;
 | |
| 
 | |
|   void StaleCookies(const nsTArray<Cookie*>& aCookieList,
 | |
|                     int64_t aCurrentTimeInUsec) override;
 | |
| 
 | |
|   void Close() override;
 | |
| 
 | |
|   void EnsureInitialized() override;
 | |
| 
 | |
|   void CleanupCachedStatements();
 | |
|   void CleanupDBConnection();
 | |
| 
 | |
|   void Activate();
 | |
| 
 | |
|   void RebuildCorruptDB();
 | |
|   void HandleDBClosed();
 | |
| 
 | |
|   nsresult RunInTransaction(nsICookieTransactionCallback* aCallback) override;
 | |
| 
 | |
|   // State of the database connection.
 | |
|   enum CorruptFlag {
 | |
|     OK,                   // normal
 | |
|     CLOSING_FOR_REBUILD,  // corruption detected, connection closing
 | |
|     REBUILDING            // close complete, rebuilding database from memory
 | |
|   };
 | |
| 
 | |
|   CorruptFlag GetCorruptFlag() const { return mCorruptFlag; }
 | |
| 
 | |
|   void SetCorruptFlag(CorruptFlag aFlag) { mCorruptFlag = aFlag; }
 | |
| 
 | |
|  protected:
 | |
|   const char* NotificationTopic() const override { return "cookie-changed"; }
 | |
| 
 | |
|   void NotifyChangedInternal(nsISupports* aSubject, const char16_t* aData,
 | |
|                              bool aOldCOokieIsSession) override;
 | |
| 
 | |
|   void RemoveAllInternal() override;
 | |
| 
 | |
|   void RemoveCookieFromDB(const CookieListIter& aIter) override;
 | |
| 
 | |
|   void StoreCookie(const nsACString& aBaseDomain,
 | |
|                    const OriginAttributes& aOriginAttributes,
 | |
|                    Cookie* aCookie) override;
 | |
| 
 | |
|  private:
 | |
|   CookiePersistentStorage();
 | |
| 
 | |
|   static void UpdateCookieInList(Cookie* aCookie, int64_t aLastAccessed,
 | |
|                                  mozIStorageBindingParamsArray* aParamsArray);
 | |
| 
 | |
|   void PrepareCookieRemoval(const CookieListIter& aIter,
 | |
|                             mozIStorageBindingParamsArray* aParamsArray);
 | |
| 
 | |
|   void InitDBConn();
 | |
|   nsresult InitDBConnInternal();
 | |
| 
 | |
|   OpenDBResult TryInitDB(bool aRecreateDB);
 | |
|   OpenDBResult Read();
 | |
| 
 | |
|   nsresult CreateTableWorker(const char* aName);
 | |
|   nsresult CreateTable();
 | |
|   nsresult CreateTableForSchemaVersion6();
 | |
|   nsresult CreateTableForSchemaVersion5();
 | |
| 
 | |
|   static UniquePtr<CookieStruct> GetCookieFromRow(mozIStorageStatement* aRow);
 | |
| 
 | |
|   already_AddRefed<nsIArray> PurgeCookies(int64_t aCurrentTimeInUsec,
 | |
|                                           uint16_t aMaxNumberOfCookies,
 | |
|                                           int64_t aCookiePurgeAge) override;
 | |
| 
 | |
|   void DeleteFromDB(mozIStorageBindingParamsArray* aParamsArray);
 | |
| 
 | |
|   void MaybeStoreCookiesToDB(mozIStorageBindingParamsArray* aParamsArray);
 | |
| 
 | |
|   nsCOMPtr<nsIThread> mThread;
 | |
|   nsCOMPtr<mozIStorageService> mStorageService;
 | |
|   nsCOMPtr<nsIEffectiveTLDService> mTLDService;
 | |
| 
 | |
|   // encapsulates a (key, Cookie) tuple for temporary storage purposes.
 | |
|   struct CookieDomainTuple {
 | |
|     CookieKey key;
 | |
|     OriginAttributes originAttributes;
 | |
|     UniquePtr<CookieStruct> cookie;
 | |
|   };
 | |
| 
 | |
|   // thread
 | |
|   TimeStamp mEndInitDBConn;
 | |
|   nsTArray<CookieDomainTuple> mReadArray;
 | |
| 
 | |
|   Monitor mMonitor MOZ_UNANNOTATED;
 | |
| 
 | |
|   Atomic<bool> mInitialized;
 | |
|   Atomic<bool> mInitializedDBConn;
 | |
| 
 | |
|   nsCOMPtr<nsIFile> mCookieFile;
 | |
|   nsCOMPtr<mozIStorageConnection> mDBConn;
 | |
|   nsCOMPtr<mozIStorageAsyncStatement> mStmtInsert;
 | |
|   nsCOMPtr<mozIStorageAsyncStatement> mStmtDelete;
 | |
|   nsCOMPtr<mozIStorageAsyncStatement> mStmtUpdate;
 | |
| 
 | |
|   CorruptFlag mCorruptFlag;
 | |
| 
 | |
|   // Various parts representing asynchronous read state. These are useful
 | |
|   // while the background read is taking place.
 | |
|   nsCOMPtr<mozIStorageConnection> mSyncConn;
 | |
| 
 | |
|   // DB completion handlers.
 | |
|   nsCOMPtr<mozIStorageStatementCallback> mInsertListener;
 | |
|   nsCOMPtr<mozIStorageStatementCallback> mUpdateListener;
 | |
|   nsCOMPtr<mozIStorageStatementCallback> mRemoveListener;
 | |
|   nsCOMPtr<mozIStorageCompletionCallback> mCloseListener;
 | |
| };
 | |
| 
 | |
| }  // namespace net
 | |
| }  // namespace mozilla
 | |
| 
 | |
| #endif  // mozilla_net_CookiePersistentStorage_h
 |