Line data Source code
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 "mozilla/dom/ClipboardEvent.h"
8 : #include "mozilla/ContentEvents.h"
9 : #include "mozilla/dom/DataTransfer.h"
10 : #include "nsIClipboard.h"
11 :
12 : namespace mozilla {
13 : namespace dom {
14 :
15 0 : ClipboardEvent::ClipboardEvent(EventTarget* aOwner,
16 : nsPresContext* aPresContext,
17 0 : InternalClipboardEvent* aEvent)
18 : : Event(aOwner, aPresContext,
19 0 : aEvent ? aEvent : new InternalClipboardEvent(false, eVoidEvent))
20 : {
21 0 : if (aEvent) {
22 0 : mEventIsInternal = false;
23 : } else {
24 0 : mEventIsInternal = true;
25 0 : mEvent->mTime = PR_Now();
26 : }
27 0 : }
28 :
29 0 : NS_INTERFACE_MAP_BEGIN(ClipboardEvent)
30 0 : NS_INTERFACE_MAP_ENTRY(nsIDOMClipboardEvent)
31 0 : NS_INTERFACE_MAP_END_INHERITING(Event)
32 :
33 0 : NS_IMPL_ADDREF_INHERITED(ClipboardEvent, Event)
34 0 : NS_IMPL_RELEASE_INHERITED(ClipboardEvent, Event)
35 :
36 : nsresult
37 0 : ClipboardEvent::InitClipboardEvent(const nsAString& aType,
38 : bool aCanBubble,
39 : bool aCancelable,
40 : nsIDOMDataTransfer* aClipboardData)
41 : {
42 0 : nsCOMPtr<DataTransfer> clipboardData = do_QueryInterface(aClipboardData);
43 : // Null clipboardData is OK
44 :
45 0 : ErrorResult rv;
46 0 : InitClipboardEvent(aType, aCanBubble, aCancelable, clipboardData);
47 :
48 0 : return rv.StealNSResult();
49 : }
50 :
51 : void
52 0 : ClipboardEvent::InitClipboardEvent(const nsAString& aType, bool aCanBubble,
53 : bool aCancelable,
54 : DataTransfer* aClipboardData)
55 : {
56 0 : NS_ENSURE_TRUE_VOID(!mEvent->mFlags.mIsBeingDispatched);
57 :
58 0 : Event::InitEvent(aType, aCanBubble, aCancelable);
59 0 : mEvent->AsClipboardEvent()->mClipboardData = aClipboardData;
60 : }
61 :
62 : already_AddRefed<ClipboardEvent>
63 0 : ClipboardEvent::Constructor(const GlobalObject& aGlobal,
64 : const nsAString& aType,
65 : const ClipboardEventInit& aParam,
66 : ErrorResult& aRv)
67 : {
68 0 : nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports());
69 0 : RefPtr<ClipboardEvent> e = new ClipboardEvent(t, nullptr, nullptr);
70 0 : bool trusted = e->Init(t);
71 :
72 0 : RefPtr<DataTransfer> clipboardData;
73 0 : if (e->mEventIsInternal) {
74 0 : InternalClipboardEvent* event = e->mEvent->AsClipboardEvent();
75 0 : if (event) {
76 : // Always create a clipboardData for the copy event. If this is changed to
77 : // support other types of events, make sure that read/write privileges are
78 : // checked properly within DataTransfer.
79 0 : clipboardData = new DataTransfer(ToSupports(e), eCopy, false, -1);
80 0 : clipboardData->SetData(aParam.mDataType, aParam.mData,
81 0 : *aGlobal.GetSubjectPrincipal(), aRv);
82 0 : NS_ENSURE_TRUE(!aRv.Failed(), nullptr);
83 : }
84 : }
85 :
86 0 : e->InitClipboardEvent(aType, aParam.mBubbles, aParam.mCancelable,
87 0 : clipboardData);
88 0 : e->SetTrusted(trusted);
89 0 : e->SetComposed(aParam.mComposed);
90 0 : return e.forget();
91 : }
92 :
93 : NS_IMETHODIMP
94 0 : ClipboardEvent::GetClipboardData(nsIDOMDataTransfer** aClipboardData)
95 : {
96 0 : NS_IF_ADDREF(*aClipboardData = GetClipboardData());
97 0 : return NS_OK;
98 : }
99 :
100 : DataTransfer*
101 0 : ClipboardEvent::GetClipboardData()
102 : {
103 0 : InternalClipboardEvent* event = mEvent->AsClipboardEvent();
104 :
105 0 : if (!event->mClipboardData) {
106 0 : if (mEventIsInternal) {
107 : event->mClipboardData =
108 0 : new DataTransfer(ToSupports(this), eCopy, false, -1);
109 : } else {
110 : event->mClipboardData =
111 0 : new DataTransfer(ToSupports(this), event->mMessage,
112 0 : event->mMessage == ePaste,
113 0 : nsIClipboard::kGlobalClipboard);
114 : }
115 : }
116 :
117 0 : return event->mClipboardData;
118 : }
119 :
120 : } // namespace dom
121 : } // namespace mozilla
122 :
123 : using namespace mozilla;
124 : using namespace mozilla::dom;
125 :
126 : already_AddRefed<ClipboardEvent>
127 0 : NS_NewDOMClipboardEvent(EventTarget* aOwner,
128 : nsPresContext* aPresContext,
129 : InternalClipboardEvent* aEvent)
130 : {
131 : RefPtr<ClipboardEvent> it =
132 0 : new ClipboardEvent(aOwner, aPresContext, aEvent);
133 0 : return it.forget();
134 : }
|