1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "nsCOMPtr.h"
8 #include "mozilla/dom/MutationEvent.h"
9 #include "mozilla/InternalMutationEvent.h"
10
11 class nsPresContext;
12
13 namespace mozilla {
14 namespace dom {
15
MutationEvent(EventTarget * aOwner,nsPresContext * aPresContext,InternalMutationEvent * aEvent)16 MutationEvent::MutationEvent(EventTarget* aOwner,
17 nsPresContext* aPresContext,
18 InternalMutationEvent* aEvent)
19 : Event(aOwner, aPresContext,
20 aEvent ? aEvent : new InternalMutationEvent(false, eVoidEvent))
21 {
22 mEventIsInternal = (aEvent == nullptr);
23 }
24
25 NS_INTERFACE_MAP_BEGIN(MutationEvent)
NS_INTERFACE_MAP_ENTRY(nsIDOMMutationEvent)26 NS_INTERFACE_MAP_ENTRY(nsIDOMMutationEvent)
27 NS_INTERFACE_MAP_END_INHERITING(Event)
28
29 NS_IMPL_ADDREF_INHERITED(MutationEvent, Event)
30 NS_IMPL_RELEASE_INHERITED(MutationEvent, Event)
31
32 already_AddRefed<nsINode>
33 MutationEvent::GetRelatedNode()
34 {
35 nsCOMPtr<nsINode> n =
36 do_QueryInterface(mEvent->AsMutationEvent()->mRelatedNode);
37 return n.forget();
38 }
39
40 NS_IMETHODIMP
GetRelatedNode(nsIDOMNode ** aRelatedNode)41 MutationEvent::GetRelatedNode(nsIDOMNode** aRelatedNode)
42 {
43 nsCOMPtr<nsINode> relatedNode = GetRelatedNode();
44 nsCOMPtr<nsIDOMNode> relatedDOMNode = relatedNode ? relatedNode->AsDOMNode() : nullptr;
45 relatedDOMNode.forget(aRelatedNode);
46 return NS_OK;
47 }
48
49 NS_IMETHODIMP
GetPrevValue(nsAString & aPrevValue)50 MutationEvent::GetPrevValue(nsAString& aPrevValue)
51 {
52 InternalMutationEvent* mutation = mEvent->AsMutationEvent();
53 if (mutation->mPrevAttrValue)
54 mutation->mPrevAttrValue->ToString(aPrevValue);
55 return NS_OK;
56 }
57
58 NS_IMETHODIMP
GetNewValue(nsAString & aNewValue)59 MutationEvent::GetNewValue(nsAString& aNewValue)
60 {
61 InternalMutationEvent* mutation = mEvent->AsMutationEvent();
62 if (mutation->mNewAttrValue)
63 mutation->mNewAttrValue->ToString(aNewValue);
64 return NS_OK;
65 }
66
67 NS_IMETHODIMP
GetAttrName(nsAString & aAttrName)68 MutationEvent::GetAttrName(nsAString& aAttrName)
69 {
70 InternalMutationEvent* mutation = mEvent->AsMutationEvent();
71 if (mutation->mAttrName)
72 mutation->mAttrName->ToString(aAttrName);
73 return NS_OK;
74 }
75
76 uint16_t
AttrChange()77 MutationEvent::AttrChange()
78 {
79 return mEvent->AsMutationEvent()->mAttrChange;
80 }
81
82 NS_IMETHODIMP
GetAttrChange(uint16_t * aAttrChange)83 MutationEvent::GetAttrChange(uint16_t* aAttrChange)
84 {
85 *aAttrChange = AttrChange();
86 return NS_OK;
87 }
88
89 NS_IMETHODIMP
InitMutationEvent(const nsAString & aTypeArg,bool aCanBubbleArg,bool aCancelableArg,nsIDOMNode * aRelatedNodeArg,const nsAString & aPrevValueArg,const nsAString & aNewValueArg,const nsAString & aAttrNameArg,uint16_t aAttrChangeArg)90 MutationEvent::InitMutationEvent(const nsAString& aTypeArg,
91 bool aCanBubbleArg,
92 bool aCancelableArg,
93 nsIDOMNode* aRelatedNodeArg,
94 const nsAString& aPrevValueArg,
95 const nsAString& aNewValueArg,
96 const nsAString& aAttrNameArg,
97 uint16_t aAttrChangeArg)
98 {
99 NS_ENSURE_TRUE(!mEvent->mFlags.mIsBeingDispatched, NS_OK);
100
101 Event::InitEvent(aTypeArg, aCanBubbleArg, aCancelableArg);
102
103 InternalMutationEvent* mutation = mEvent->AsMutationEvent();
104 mutation->mRelatedNode = aRelatedNodeArg;
105 if (!aPrevValueArg.IsEmpty())
106 mutation->mPrevAttrValue = NS_Atomize(aPrevValueArg);
107 if (!aNewValueArg.IsEmpty())
108 mutation->mNewAttrValue = NS_Atomize(aNewValueArg);
109 if (!aAttrNameArg.IsEmpty()) {
110 mutation->mAttrName = NS_Atomize(aAttrNameArg);
111 }
112 mutation->mAttrChange = aAttrChangeArg;
113
114 return NS_OK;
115 }
116
117 } // namespace dom
118 } // namespace mozilla
119
120 using namespace mozilla;
121 using namespace mozilla::dom;
122
123 already_AddRefed<MutationEvent>
NS_NewDOMMutationEvent(EventTarget * aOwner,nsPresContext * aPresContext,InternalMutationEvent * aEvent)124 NS_NewDOMMutationEvent(EventTarget* aOwner,
125 nsPresContext* aPresContext,
126 InternalMutationEvent* aEvent)
127 {
128 RefPtr<MutationEvent> it = new MutationEvent(aOwner, aPresContext, aEvent);
129 return it.forget();
130 }
131