dom/events/DataContainerEvent.cpp

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:a17e14b57f38
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/. */
5
6 #include "mozilla/dom/DataContainerEvent.h"
7 #include "nsContentUtils.h"
8 #include "nsIDocument.h"
9 #include "nsIXPConnect.h"
10
11 namespace mozilla {
12 namespace dom {
13
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 }
25
26 NS_IMPL_CYCLE_COLLECTION_CLASS(DataContainerEvent)
27
28 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(DataContainerEvent, Event)
29 tmp->mData.Clear();
30 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
31
32 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(DataContainerEvent, Event)
33 tmp->mData.EnumerateRead(TraverseEntry, &cb);
34 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
35
36 NS_IMPL_ADDREF_INHERITED(DataContainerEvent, Event)
37 NS_IMPL_RELEASE_INHERITED(DataContainerEvent, Event)
38
39 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DataContainerEvent)
40 NS_INTERFACE_MAP_ENTRY(nsIDOMDataContainerEvent)
41 NS_INTERFACE_MAP_END_INHERITING(Event)
42
43 NS_IMETHODIMP
44 DataContainerEvent::GetData(const nsAString& aKey, nsIVariant** aData)
45 {
46 NS_ENSURE_ARG_POINTER(aData);
47
48 mData.Get(aKey, aData);
49 return NS_OK;
50 }
51
52 NS_IMETHODIMP
53 DataContainerEvent::SetData(const nsAString& aKey, nsIVariant* aData)
54 {
55 NS_ENSURE_ARG(aData);
56
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 }
62
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 }
81
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);
90
91 return PL_DHASH_NEXT;
92 }
93
94 } // namespace dom
95 } // namespace mozilla
96
97 using namespace mozilla;
98 using namespace mozilla::dom;
99
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 }
111

mercurial