nsresult SessionStorageCache::SetItem(DataSetType aDataSetType, const nsAString& aKey, const nsAString& aValue, nsString& aOldValue) { int64_t delta = 0; DataSet* dataSet = Set(aDataSetType); if (!dataSet->mKeys.Get(aKey, &aOldValue)) { SetDOMStringToNull(aOldValue); // We only consider key size if the key doesn't exist before. delta = static_cast<int64_t>(aKey.Length()); } delta += static_cast<int64_t>(aValue.Length()) - static_cast<int64_t>(aOldValue.Length()); if (aValue == aOldValue && DOMStringIsNull(aValue) == DOMStringIsNull(aOldValue)) { return NS_SUCCESS_DOM_NO_OPERATION; } if (!dataSet->ProcessUsageDelta(delta)) { return NS_ERROR_DOM_QUOTA_REACHED; } dataSet->mKeys.Put(aKey, nsString(aValue)); return NS_OK; }
void SessionStorageCache::Clear(DataSetType aDataSetType, bool aByUserInteraction) { DataSet* dataSet = Set(aDataSetType); dataSet->ProcessUsageDelta(-dataSet->mOriginQuotaUsage); dataSet->mKeys.Clear(); if (!aByUserInteraction && aDataSetType == eSessionSetType) { mSessionDataSetActive = false; } }
nsresult SessionStorageCache::RemoveItem(DataSetType aDataSetType, const nsAString& aKey, nsString& aOldValue) { DataSet* dataSet = Set(aDataSetType); if (!dataSet->mKeys.Get(aKey, &aOldValue)) { return NS_SUCCESS_DOM_NO_OPERATION; } // Recalculate the cached data size dataSet->ProcessUsageDelta(-(static_cast<int64_t>(aOldValue.Length()) + static_cast<int64_t>(aKey.Length()))); dataSet->mKeys.Remove(aKey); return NS_OK; }