nsresult nsDOMStorageMemoryDB::GetKeyValue(DOMStorageImpl* aStorage, const nsAString& aKey, nsAString& aValue, PRBool* aSecure) { if (mPreloading) { NS_PRECONDITION(mPreloadDB, "Must have a preload DB set when preloading"); return mPreloadDB->GetKeyValue(aStorage, aKey, aValue, aSecure); } nsresult rv; nsInMemoryStorage* storage; rv = GetItemsTable(aStorage, &storage); NS_ENSURE_SUCCESS(rv, rv); nsInMemoryItem* item; if (!storage->mTable.Get(aKey, &item)) return NS_ERROR_DOM_NOT_FOUND_ERR; aValue = item->mValue; *aSecure = item->mSecure; return NS_OK; }
nsresult nsDOMStorageMemoryDB::SetKey(DOMStorageImpl* aStorage, const nsAString& aKey, const nsAString& aValue, PRBool aSecure, PRInt32 aQuota, PRBool aExcludeOfflineFromUsage, PRInt32 *aNewUsage) { nsresult rv; nsInMemoryStorage* storage; rv = GetItemsTable(aStorage, &storage); NS_ENSURE_SUCCESS(rv, rv); PRInt32 usage = 0; if (!aStorage->GetQuotaDomainDBKey(!aExcludeOfflineFromUsage).IsEmpty()) { rv = GetUsage(aStorage, aExcludeOfflineFromUsage, &usage); NS_ENSURE_SUCCESS(rv, rv); } usage += aKey.Length() + aValue.Length(); nsInMemoryItem* item; if (!storage->mTable.Get(aKey, &item)) { if (usage > aQuota) { return NS_ERROR_DOM_QUOTA_REACHED; } item = new nsInMemoryItem(); if (!item) return NS_ERROR_OUT_OF_MEMORY; storage->mTable.Put(aKey, item); storage->mUsageDelta += aKey.Length(); } else { if (!aSecure && item->mSecure) return NS_ERROR_DOM_SECURITY_ERR; usage -= aKey.Length() + item->mValue.Length(); if (usage > aQuota) { return NS_ERROR_DOM_QUOTA_REACHED; } } storage->mUsageDelta += aValue.Length() - item->mValue.Length(); item->mValue = aValue; item->mSecure = aSecure; *aNewUsage = usage; MarkScopeDirty(aStorage); return NS_OK; }
nsresult nsDOMStorageMemoryDB::ClearStorage(DOMStorageImpl* aStorage) { nsresult rv; nsInMemoryStorage* storage; rv = GetItemsTable(aStorage, &storage); NS_ENSURE_SUCCESS(rv, rv); storage->mTable.Enumerate(RemoveAllKeysEnum, storage); return NS_OK; }
nsresult nsDOMStorageMemoryDB::GetAllKeys(DOMStorageImpl* aStorage, nsTHashtable<nsSessionStorageEntry>* aKeys) { nsresult rv; nsInMemoryStorage* storage; rv = GetItemsTable(aStorage, &storage); NS_ENSURE_SUCCESS(rv, rv); GetAllKeysEnumStruc struc; struc.mTarget = aKeys; struc.mStorage = aStorage; storage->mTable.EnumerateRead(GetAllKeysEnum, &struc); return NS_OK; }
nsresult nsDOMStorageMemoryDB::SetSecure(DOMStorageImpl* aStorage, const nsAString& aKey, const PRBool aSecure) { nsresult rv; nsInMemoryStorage* storage; rv = GetItemsTable(aStorage, &storage); NS_ENSURE_SUCCESS(rv, rv); nsInMemoryItem* item; if (!storage->mTable.Get(aKey, &item)) return NS_ERROR_DOM_NOT_FOUND_ERR; item->mSecure = aSecure; return NS_OK; }
nsresult nsDOMStorageMemoryDB::RemoveKey(DOMStorageImpl* aStorage, const nsAString& aKey, PRBool aExcludeOfflineFromUsage, PRInt32 aKeyUsage) { nsresult rv; nsInMemoryStorage* storage; rv = GetItemsTable(aStorage, &storage); NS_ENSURE_SUCCESS(rv, rv); nsInMemoryItem* item; if (!storage->mTable.Get(aKey, &item)) return NS_ERROR_DOM_NOT_FOUND_ERR; storage->mUsageDelta -= aKey.Length() + item->mValue.Length(); storage->mTable.Remove(aKey); return NS_OK; }