forked from mirrors/gecko-dev
By storing the PrincipalInfo in the parent copy it is possible to query the BackgroundSessionStorageManager withouth the need of a preprocessing step matching resulting data to principals using the browsing context tree. Instead the result from the query contains the principal info. To be able to initialize the parent actor lazily with a principal info, it was needed to make clearing the storage be a less fine grained transaction. Instead of sending updates per cache, we after clearing in the child process we send a message to the parent that in turn performs the same steps. Differential Revision: https://phabricator.services.mozilla.com/D125680
99 lines
2.5 KiB
C++
99 lines
2.5 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* 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_dom_SessionStorageCache_h
|
|
#define mozilla_dom_SessionStorageCache_h
|
|
|
|
#include "mozilla/UniquePtr.h"
|
|
#include "mozilla/dom/LSWriteOptimizerImpl.h"
|
|
#include "nsTHashMap.h"
|
|
|
|
namespace mozilla::dom {
|
|
|
|
class SSSetItemInfo;
|
|
class SSWriteInfo;
|
|
class SessionStorageCacheChild;
|
|
|
|
/**
|
|
* Coalescing manipulation queue used by `SessionStorageCache`. Used by
|
|
* `SessionStorageCache` to buffer and coalesce manipulations before they
|
|
* are sent to the parent process.
|
|
*/
|
|
class SSWriteOptimizer final : public LSWriteOptimizer<nsAString, nsString> {
|
|
public:
|
|
void Enumerate(nsTArray<SSWriteInfo>& aWriteInfos);
|
|
};
|
|
|
|
class SessionStorageCache final {
|
|
public:
|
|
NS_INLINE_DECL_REFCOUNTING(SessionStorageCache)
|
|
|
|
SessionStorageCache();
|
|
|
|
int64_t GetOriginQuotaUsage();
|
|
|
|
uint32_t Length();
|
|
|
|
void Key(uint32_t aIndex, nsAString& aResult);
|
|
|
|
void GetItem(const nsAString& aKey, nsAString& aResult);
|
|
|
|
void GetKeys(nsTArray<nsString>& aKeys);
|
|
|
|
nsresult SetItem(const nsAString& aKey, const nsAString& aValue,
|
|
nsString& aOldValue, bool aRecordWriteInfo = true);
|
|
|
|
nsresult RemoveItem(const nsAString& aKey, nsString& aOldValue,
|
|
bool aRecordWriteInfo = true);
|
|
|
|
void Clear(bool aByUserInteraction = true, bool aRecordWriteInfo = true);
|
|
|
|
void ResetWriteInfos();
|
|
|
|
already_AddRefed<SessionStorageCache> Clone() const;
|
|
|
|
nsTArray<SSSetItemInfo> SerializeData();
|
|
|
|
nsTArray<SSWriteInfo> SerializeWriteInfos();
|
|
|
|
void DeserializeData(const nsTArray<SSSetItemInfo>& aData);
|
|
|
|
void DeserializeWriteInfos(const nsTArray<SSWriteInfo>& aInfos);
|
|
|
|
void SetActor(SessionStorageCacheChild* aActor);
|
|
|
|
SessionStorageCacheChild* Actor() const { return mActor; }
|
|
|
|
void ClearActor();
|
|
|
|
void SetLoadedOrCloned() { mLoadedOrCloned = true; }
|
|
|
|
bool WasLoadedOrCloned() const { return mLoadedOrCloned; }
|
|
|
|
private:
|
|
~SessionStorageCache();
|
|
|
|
struct DataSet {
|
|
DataSet() : mOriginQuotaUsage(0) {}
|
|
|
|
bool ProcessUsageDelta(int64_t aDelta);
|
|
|
|
nsTHashMap<nsStringHashKey, nsString> mKeys;
|
|
|
|
SSWriteOptimizer mWriteOptimizer;
|
|
|
|
int64_t mOriginQuotaUsage;
|
|
};
|
|
|
|
DataSet mDataSet;
|
|
|
|
SessionStorageCacheChild* mActor;
|
|
bool mLoadedOrCloned;
|
|
};
|
|
|
|
} // namespace mozilla::dom
|
|
|
|
#endif // mozilla_dom_SessionStorageCache_h
|