dom/events/DataContainerEvent.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 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "mozilla/dom/DataContainerEvent.h"
     7 #include "nsContentUtils.h"
     8 #include "nsIDocument.h"
     9 #include "nsIXPConnect.h"
    11 namespace mozilla {
    12 namespace dom {
    14 DataContainerEvent::DataContainerEvent(EventTarget* aOwner,
    15                                        nsPresContext* aPresContext,
    16                                        WidgetEvent* aEvent)
    17   : Event(aOwner, aPresContext, aEvent)
    18 {
    19   if (mOwner) {
    20     if (nsIDocument* doc = mOwner->GetExtantDoc()) {
    21       doc->WarnOnceAbout(nsIDocument::eDataContainerEvent);
    22     }
    23   }
    24 }
    26 NS_IMPL_CYCLE_COLLECTION_CLASS(DataContainerEvent)
    28 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(DataContainerEvent, Event)
    29   tmp->mData.Clear();
    30 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
    32 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(DataContainerEvent, Event)
    33   tmp->mData.EnumerateRead(TraverseEntry, &cb);
    34 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
    36 NS_IMPL_ADDREF_INHERITED(DataContainerEvent, Event)
    37 NS_IMPL_RELEASE_INHERITED(DataContainerEvent, Event)
    39 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DataContainerEvent)
    40   NS_INTERFACE_MAP_ENTRY(nsIDOMDataContainerEvent)
    41 NS_INTERFACE_MAP_END_INHERITING(Event)
    43 NS_IMETHODIMP
    44 DataContainerEvent::GetData(const nsAString& aKey, nsIVariant** aData)
    45 {
    46   NS_ENSURE_ARG_POINTER(aData);
    48   mData.Get(aKey, aData);
    49   return NS_OK;
    50 }
    52 NS_IMETHODIMP
    53 DataContainerEvent::SetData(const nsAString& aKey, nsIVariant* aData)
    54 {
    55   NS_ENSURE_ARG(aData);
    57   // Make sure this event isn't already being dispatched.
    58   NS_ENSURE_STATE(!mEvent->mFlags.mIsBeingDispatched);
    59   mData.Put(aKey, aData);
    60   return NS_OK;
    61 }
    63 void
    64 DataContainerEvent::SetData(JSContext* aCx, const nsAString& aKey,
    65                             JS::Handle<JS::Value> aVal,
    66                             ErrorResult& aRv)
    67 {
    68   if (!nsContentUtils::XPConnect()) {
    69     aRv = NS_ERROR_FAILURE;
    70     return;
    71   }
    72   nsCOMPtr<nsIVariant> val;
    73   nsresult rv =
    74     nsContentUtils::XPConnect()->JSToVariant(aCx, aVal, getter_AddRefs(val));
    75   if (NS_FAILED(rv)) {
    76     aRv = rv;
    77     return;
    78   }
    79   aRv = SetData(aKey, val);
    80 }
    82 PLDHashOperator
    83 DataContainerEvent::TraverseEntry(const nsAString& aKey,
    84                                   nsIVariant* aDataItem,
    85                                   void* aUserArg)
    86 {
    87   nsCycleCollectionTraversalCallback *cb =
    88     static_cast<nsCycleCollectionTraversalCallback*>(aUserArg);
    89   cb->NoteXPCOMChild(aDataItem);
    91   return PL_DHASH_NEXT;
    92 }
    94 } // namespace dom
    95 } // namespace mozilla
    97 using namespace mozilla;
    98 using namespace mozilla::dom;
   100 nsresult
   101 NS_NewDOMDataContainerEvent(nsIDOMEvent** aInstancePtrResult,
   102                             EventTarget* aOwner,
   103                             nsPresContext* aPresContext,
   104                             WidgetEvent* aEvent)
   105 {
   106   DataContainerEvent* it = new DataContainerEvent(aOwner, aPresContext, aEvent);
   107   NS_ADDREF(it);
   108   *aInstancePtrResult = static_cast<Event*>(it);
   109   return NS_OK;
   110 }

mercurial