author Mason Chang <>
Tue, 16 Feb 2016 09:07:52 -0800
changeset 284382 b85eae6c9a0582aa8bd92ec4adf4fea753ae539c
parent 282426 e22b3043887ed36bf2c634c2924a7c8d39d226b1
child 296761 db1255660184afab1d0b1a490a709ecfba770a62
permissions -rw-r--r--
Bug 1246213 - Skia reftest fuzzing for Skia content on OS X. r=jmuizelaar

/* -*- 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 */

#ifndef nsDOMStorage_h___
#define nsDOMStorage_h___

#include "mozilla/Attributes.h"
#include "mozilla/ErrorResult.h"
#include "nsIDOMStorage.h"
#include "nsAutoPtr.h"
#include "nsCycleCollectionParticipant.h"
#include "nsWeakReference.h"
#include "nsWrapperCache.h"
#include "nsISupports.h"

class nsIPrincipal;
class nsPIDOMWindowInner;

namespace mozilla {
namespace dom {

class DOMStorageManager;
class DOMStorageCache;

class DOMStorage final
  : public nsIDOMStorage
  , public nsSupportsWeakReference
  , public nsWrapperCache

  enum StorageType {
    LocalStorage = 1,
    SessionStorage = 2

  StorageType GetType() const;

  DOMStorageManager* GetManager() const
    return mManager;

  DOMStorageCache const* GetCache() const
    return mCache;

  nsIPrincipal* GetPrincipal();
  bool PrincipalEquals(nsIPrincipal* aPrincipal);
  bool CanAccess(nsIPrincipal* aPrincipal);
  bool IsPrivate()
    return mIsPrivate;

  DOMStorage(nsPIDOMWindowInner* aWindow,
             DOMStorageManager* aManager,
             DOMStorageCache* aCache,
             const nsAString& aDocumentURI,
             nsIPrincipal* aPrincipal,
             bool aIsPrivate);

  // WebIDL
  JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;

  nsPIDOMWindowInner* GetParentObject() const
    return mWindow;

  uint32_t GetLength(ErrorResult& aRv);

  void Key(uint32_t aIndex, nsAString& aResult, ErrorResult& aRv);

  void GetItem(const nsAString& aKey, nsAString& aResult, ErrorResult& aRv);

  bool NameIsEnumerable(const nsAString& aName) const
    return true;

  void GetSupportedNames(unsigned, nsTArray<nsString>& aKeys);

  void NamedGetter(const nsAString& aKey, bool& aFound, nsAString& aResult,
                   ErrorResult& aRv)
    GetItem(aKey, aResult, aRv);
    aFound = !aResult.IsVoid();

  void SetItem(const nsAString& aKey, const nsAString& aValue,
               ErrorResult& aRv);

  void NamedSetter(const nsAString& aKey, const nsAString& aValue,
                   ErrorResult& aRv)
    SetItem(aKey, aValue, aRv);

  void RemoveItem(const nsAString& aKey, ErrorResult& aRv);

  void NamedDeleter(const nsAString& aKey, bool& aFound, ErrorResult& aRv)
    RemoveItem(aKey, aRv);

    aFound = !aRv.ErrorCodeIs(NS_SUCCESS_DOM_NO_OPERATION);

  void Clear(ErrorResult& aRv);

  // The method checks whether the caller can use a storage.
  // CanUseStorage is called before any DOM initiated operation
  // on a storage is about to happen and ensures that the storage's
  // session-only flag is properly set according the current settings.
  // It is an optimization since the privileges check and session only
  // state determination are complex and share the code (comes hand in
  // hand together).
  static bool CanUseStorage(nsPIDOMWindowInner* aWindow,
                            DOMStorage* aStorage = nullptr);

  bool IsPrivate() const { return mIsPrivate; }
  bool IsSessionOnly() const { return mIsSessionOnly; }

  bool IsForkOf(const DOMStorage* aOther) const
    return mCache == aOther->mCache;


  friend class DOMStorageManager;
  friend class DOMStorageCache;

  nsCOMPtr<nsPIDOMWindowInner> mWindow;
  RefPtr<DOMStorageManager> mManager;
  RefPtr<DOMStorageCache> mCache;
  nsString mDocumentURI;

  // Principal this DOMStorage (i.e. localStorage or sessionStorage) has
  // been created for
  nsCOMPtr<nsIPrincipal> mPrincipal;

  // Whether this storage is running in private-browsing window.
  bool mIsPrivate : 1;

  // Whether storage is set to persist data only per session, may change
  // dynamically and is set by CanUseStorage function that is called
  // before any operation on the storage.
  bool mIsSessionOnly : 1;

  void BroadcastChangeNotification(const nsSubstring& aKey,
                                   const nsSubstring& aOldValue,
                                   const nsSubstring& aNewValue);

} // namespace dom
} // namespace mozilla

#endif /* nsDOMStorage_h___ */