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;
}