123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /* -*- Mode: C++; tab-width: 8; 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 nsDOMStorageManager_h__
- #define nsDOMStorageManager_h__
- #include "nsIDOMStorageManager.h"
- #include "DOMStorageObserver.h"
- #include "DOMStorageCache.h"
- #include "mozilla/dom/DOMStorage.h"
- #include "nsTHashtable.h"
- #include "nsDataHashtable.h"
- #include "nsClassHashtable.h"
- #include "nsHashKeys.h"
- namespace mozilla {
- class OriginAttributesPattern;
- namespace dom {
- const DOMStorage::StorageType SessionStorage = DOMStorage::SessionStorage;
- const DOMStorage::StorageType LocalStorage = DOMStorage::LocalStorage;
- class DOMStorageManager : public nsIDOMStorageManager
- , public DOMStorageObserverSink
- {
- NS_DECL_ISUPPORTS
- NS_DECL_NSIDOMSTORAGEMANAGER
- public:
- virtual DOMStorage::StorageType Type() { return mType; }
- // Reads the preference for DOM storage quota
- static uint32_t GetQuota();
- // Gets (but not ensures) cache for the given scope
- DOMStorageCache* GetCache(const nsACString& aOriginSuffix, const nsACString& aOriginNoSuffix);
- // Returns object keeping usage cache for the scope.
- already_AddRefed<DOMStorageUsage> GetOriginUsage(const nsACString& aOriginNoSuffix);
- static nsCString CreateOrigin(const nsACString& aOriginSuffix, const nsACString& aOriginNoSuffix);
- protected:
- explicit DOMStorageManager(DOMStorage::StorageType aType);
- virtual ~DOMStorageManager();
- private:
- // DOMStorageObserverSink, handler to various chrome clearing notification
- virtual nsresult Observe(const char* aTopic,
- const nsAString& aOriginAttributesPattern,
- const nsACString& aOriginScope) override;
- // Since nsTHashtable doesn't like multiple inheritance, we have to aggregate
- // DOMStorageCache into the entry.
- class DOMStorageCacheHashKey : public nsCStringHashKey
- {
- public:
- explicit DOMStorageCacheHashKey(const nsACString* aKey)
- : nsCStringHashKey(aKey)
- , mCache(new DOMStorageCache(aKey))
- {}
- DOMStorageCacheHashKey(const DOMStorageCacheHashKey& aOther)
- : nsCStringHashKey(aOther)
- {
- NS_ERROR("Shouldn't be called");
- }
- DOMStorageCache* cache() { return mCache; }
- // Keep the cache referenced forever, used for sessionStorage.
- void HardRef() { mCacheRef = mCache; }
- private:
- // weak ref only since cache references its manager.
- DOMStorageCache* mCache;
- // hard ref when this is sessionStorage to keep it alive forever.
- RefPtr<DOMStorageCache> mCacheRef;
- };
- // Ensures cache for a scope, when it doesn't exist it is created and initalized,
- // this also starts preload of persistent data.
- already_AddRefed<DOMStorageCache> PutCache(const nsACString& aOriginSuffix,
- const nsACString& aOriginNoSuffix,
- nsIPrincipal* aPrincipal);
- // Helper for creation of DOM storage objects
- nsresult GetStorageInternal(bool aCreate,
- mozIDOMWindow* aWindow,
- nsIPrincipal* aPrincipal,
- const nsAString& aDocumentURI,
- bool aPrivate,
- nsIDOMStorage** aRetval);
- // Suffix->origin->cache map
- typedef nsTHashtable<DOMStorageCacheHashKey> CacheOriginHashtable;
- nsClassHashtable<nsCStringHashKey, CacheOriginHashtable> mCaches;
- const DOMStorage::StorageType mType;
- void ClearCaches(uint32_t aUnloadFlags,
- const OriginAttributesPattern& aPattern,
- const nsACString& aKeyPrefix);
- protected:
- // Keeps usage cache objects for eTLD+1 scopes we have touched.
- nsDataHashtable<nsCStringHashKey, RefPtr<DOMStorageUsage> > mUsages;
- friend class DOMStorageCache;
- // Releases cache since it is no longer referrered by any DOMStorage object.
- virtual void DropCache(DOMStorageCache* aCache);
- };
- // Derived classes to allow two different contract ids, one for localStorage and
- // one for sessionStorage management. localStorage manager is used as service
- // scoped to the application while sessionStorage managers are instantiated by each
- // top doc shell in the application since sessionStorages are isolated per top level
- // browsing context. The code may easily by shared by both.
- class DOMLocalStorageManager final : public DOMStorageManager
- {
- public:
- DOMLocalStorageManager();
- virtual ~DOMLocalStorageManager();
- // Global getter of localStorage manager service
- static DOMLocalStorageManager* Self() { return sSelf; }
- // Like Self, but creates an instance if we're not yet initialized.
- static DOMLocalStorageManager* Ensure();
- private:
- static DOMLocalStorageManager* sSelf;
- };
- class DOMSessionStorageManager final : public DOMStorageManager
- {
- public:
- DOMSessionStorageManager();
- };
- } // namespace dom
- } // namespace mozilla
- #endif /* nsDOMStorageManager_h__ */
|