dom/datastore/DataStore.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include "mozilla/dom/DataStore.h"
     6 #include "mozilla/dom/DataStoreCursor.h"
     7 #include "mozilla/dom/DataStoreBinding.h"
     8 #include "mozilla/dom/DataStoreImplBinding.h"
     9 #include "mozilla/dom/Navigator.h"
    10 #include "mozilla/dom/Promise.h"
    11 #include "mozilla/ErrorResult.h"
    12 #include "mozilla/Preferences.h"
    13 #include "AccessCheck.h"
    15 namespace mozilla {
    16 namespace dom {
    18 NS_IMPL_ADDREF_INHERITED(DataStore, DOMEventTargetHelper)
    19 NS_IMPL_RELEASE_INHERITED(DataStore, DOMEventTargetHelper)
    21 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DataStore)
    22   NS_INTERFACE_MAP_ENTRY(nsISupports)
    23 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
    25 NS_IMPL_CYCLE_COLLECTION(DataStore, mStore)
    27 DataStore::DataStore(nsPIDOMWindow* aWindow)
    28   : DOMEventTargetHelper(aWindow)
    29 {
    30 }
    32 already_AddRefed<DataStore>
    33 DataStore::Constructor(GlobalObject& aGlobal, ErrorResult& aRv)
    34 {
    35   nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aGlobal.GetAsSupports());
    36   if (!window) {
    37     aRv.Throw(NS_ERROR_FAILURE);
    38     return nullptr;
    39   }
    41   nsRefPtr<DataStore> store = new DataStore(window);
    42   return store.forget();
    43 }
    45 JSObject*
    46 DataStore::WrapObject(JSContext* aCx)
    47 {
    48   return DataStoreBinding::Wrap(aCx, this);
    49 }
    51 /*static*/ bool
    52 DataStore::EnabledForScope(JSContext* aCx, JS::Handle<JSObject*> aObj)
    53 {
    54   // Only expose the interface when it is:
    55   // 1. enabled by the preference and
    56   // 2. accessed by the chrome codes in Gecko.
    57   return (Navigator::HasDataStoreSupport(aCx, aObj) &&
    58           nsContentUtils::ThreadsafeIsCallerChrome());
    59 }
    61 void
    62 DataStore::GetName(nsAString& aName, ErrorResult& aRv)
    63 {
    64   MOZ_ASSERT(NS_IsMainThread());
    65   MOZ_ASSERT(mStore);
    67   nsAutoString name;
    68   mStore->GetName(name, aRv);
    69   aName.Assign(name);
    70 }
    72 void
    73 DataStore::GetOwner(nsAString& aOwner, ErrorResult& aRv)
    74 {
    75   MOZ_ASSERT(NS_IsMainThread());
    76   MOZ_ASSERT(mStore);
    78   nsAutoString owner;
    79   mStore->GetOwner(owner, aRv);
    80   aOwner.Assign(owner);
    81 }
    83 bool
    84 DataStore::GetReadOnly(ErrorResult& aRv)
    85 {
    86   MOZ_ASSERT(NS_IsMainThread());
    87   MOZ_ASSERT(mStore);
    89   return mStore->GetReadOnly(aRv);
    90 }
    92 already_AddRefed<Promise>
    93 DataStore::Get(const Sequence<OwningStringOrUnsignedLong>& aId,
    94                ErrorResult& aRv)
    95 {
    96   MOZ_ASSERT(NS_IsMainThread());
    97   MOZ_ASSERT(mStore);
    99   return mStore->Get(aId, aRv);
   100 }
   102 already_AddRefed<Promise>
   103 DataStore::Put(JSContext* aCx,
   104                JS::Handle<JS::Value> aObj,
   105                const StringOrUnsignedLong& aId,
   106                const nsAString& aRevisionId,
   107                ErrorResult& aRv)
   108 {
   109   MOZ_ASSERT(NS_IsMainThread());
   110   MOZ_ASSERT(mStore);
   112   return mStore->Put(aObj, aId, aRevisionId, aRv);
   113 }
   115 already_AddRefed<Promise>
   116 DataStore::Add(JSContext* aCx,
   117                JS::Handle<JS::Value> aObj,
   118                const Optional<StringOrUnsignedLong>& aId,
   119                const nsAString& aRevisionId,
   120                ErrorResult& aRv)
   121 {
   122   MOZ_ASSERT(NS_IsMainThread());
   123   MOZ_ASSERT(mStore);
   125   return mStore->Add(aObj, aId, aRevisionId, aRv);
   126 }
   128 already_AddRefed<Promise>
   129 DataStore::Remove(const StringOrUnsignedLong& aId,
   130                   const nsAString& aRevisionId,
   131                   ErrorResult& aRv)
   132 {
   133   MOZ_ASSERT(NS_IsMainThread());
   134   MOZ_ASSERT(mStore);
   136   return mStore->Remove(aId, aRevisionId, aRv);
   137 }
   139 already_AddRefed<Promise>
   140 DataStore::Clear(const nsAString& aRevisionId, ErrorResult& aRv)
   141 {
   142   MOZ_ASSERT(NS_IsMainThread());
   143   MOZ_ASSERT(mStore);
   145   return mStore->Clear(aRevisionId, aRv);
   146 }
   148 void
   149 DataStore::GetRevisionId(nsAString& aRevisionId, ErrorResult& aRv)
   150 {
   151   MOZ_ASSERT(NS_IsMainThread());
   152   MOZ_ASSERT(mStore);
   154   nsAutoString revisionId;
   155   mStore->GetRevisionId(revisionId, aRv);
   156   aRevisionId.Assign(revisionId);
   157 }
   159 already_AddRefed<Promise>
   160 DataStore::GetLength(ErrorResult& aRv)
   161 {
   162   MOZ_ASSERT(NS_IsMainThread());
   163   MOZ_ASSERT(mStore);
   165   return mStore->GetLength(aRv);
   166 }
   168 already_AddRefed<DataStoreCursor>
   169 DataStore::Sync(const nsAString& aRevisionId, ErrorResult& aRv)
   170 {
   171   MOZ_ASSERT(NS_IsMainThread());
   172   MOZ_ASSERT(mStore);
   174   return mStore->Sync(aRevisionId, aRv);
   175 }
   177 void
   178 DataStore::SetDataStoreImpl(DataStoreImpl& aStore, ErrorResult& aRv)
   179 {
   180   MOZ_ASSERT(NS_IsMainThread());
   181   MOZ_ASSERT(!mStore);
   183   mStore = &aStore;
   184   mStore->SetEventTarget(*this, aRv);
   185 }
   187 } //namespace dom
   188 } //namespace mozilla

mercurial