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