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/ClipboardWriteRequestParent.h"
8 #include "mozilla/dom/ContentParent.h"
9 #include "mozilla/net/CookieJarSettings.h"
10 #include "nsComponentManagerUtils.h"
11 #include "nsIClipboard.h"
12 #include "nsITransferable.h"
13 #include "nsWidgetsCID.h"
15 static NS_DEFINE_CID(kCClipboardCID
, NS_CLIPBOARD_CID
);
17 using mozilla::dom::ContentParent
;
18 using mozilla::ipc::IPCResult
;
22 NS_IMPL_ISUPPORTS(ClipboardWriteRequestParent
, nsIAsyncSetClipboardDataCallback
)
24 ClipboardWriteRequestParent::ClipboardWriteRequestParent(
25 ContentParent
* aManager
)
26 : mManager(aManager
) {}
28 ClipboardWriteRequestParent::~ClipboardWriteRequestParent() = default;
30 nsresult
ClipboardWriteRequestParent::Init(const int32_t& aClipboardType
) {
31 nsCOMPtr
<nsIClipboard
> clipboard(do_GetService(kCClipboardCID
));
33 Unused
<< PClipboardWriteRequestParent::Send__delete__(this,
35 return NS_ERROR_FAILURE
;
38 nsresult rv
= clipboard
->AsyncSetData(aClipboardType
, this,
39 getter_AddRefs(mAsyncSetClipboardData
));
41 Unused
<< PClipboardWriteRequestParent::Send__delete__(this, rv
);
48 NS_IMETHODIMP
ClipboardWriteRequestParent::OnComplete(nsresult aResult
) {
49 nsCOMPtr
<nsIAsyncSetClipboardData
> clipboardData
=
50 std::move(mAsyncSetClipboardData
);
52 Unused
<< PClipboardWriteRequestParent::Send__delete__(this, aResult
);
57 IPCResult
ClipboardWriteRequestParent::RecvSetData(
58 const IPCTransferable
& aTransferable
) {
59 if (!mManager
->ValidatePrincipal(
60 aTransferable
.requestingPrincipal(),
61 {ContentParent::ValidatePrincipalOptions::AllowNullPtr
})) {
62 ContentParent::LogAndAssertFailedPrincipalValidationInfo(
63 aTransferable
.requestingPrincipal(), __func__
);
66 if (!mAsyncSetClipboardData
) {
70 nsresult rv
= NS_ERROR_FAILURE
;
71 nsCOMPtr
<nsITransferable
> trans
=
72 do_CreateInstance("@mozilla.org/widget/transferable;1", &rv
);
74 mAsyncSetClipboardData
->Abort(rv
);
79 rv
= nsContentUtils::IPCTransferableToTransferable(
80 aTransferable
, true /* aAddDataFlavor */, trans
,
81 true /* aFilterUnknownFlavors */);
83 mAsyncSetClipboardData
->Abort(rv
);
87 mAsyncSetClipboardData
->SetData(trans
, nullptr);
91 IPCResult
ClipboardWriteRequestParent::Recv__delete__(nsresult aReason
) {
92 #ifndef FUZZING_SNAPSHOT
93 MOZ_DIAGNOSTIC_ASSERT(NS_FAILED(aReason
));
95 nsCOMPtr
<nsIAsyncSetClipboardData
> clipboardData
=
96 std::move(mAsyncSetClipboardData
);
98 clipboardData
->Abort(aReason
);
103 void ClipboardWriteRequestParent::ActorDestroy(ActorDestroyReason aReason
) {
104 nsCOMPtr
<nsIAsyncSetClipboardData
> clipboardData
=
105 std::move(mAsyncSetClipboardData
);
107 clipboardData
->Abort(NS_ERROR_ABORT
);
111 } // namespace mozilla