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
, nsIAsyncClipboardRequestCallback
)
24 ClipboardWriteRequestParent::ClipboardWriteRequestParent(
25 ContentParent
* aManager
)
26 : mManager(aManager
) {}
28 ClipboardWriteRequestParent::~ClipboardWriteRequestParent() = default;
30 nsresult
ClipboardWriteRequestParent::Init(
31 const nsIClipboard::ClipboardType aClipboardType
,
32 mozilla::dom::WindowContext
* aSettingWindowContext
) {
33 nsCOMPtr
<nsIClipboard
> clipboard(do_GetService(kCClipboardCID
));
35 Unused
<< PClipboardWriteRequestParent::Send__delete__(this,
37 return NS_ERROR_FAILURE
;
41 clipboard
->AsyncSetData(aClipboardType
, aSettingWindowContext
, this,
42 getter_AddRefs(mAsyncSetClipboardData
));
44 Unused
<< PClipboardWriteRequestParent::Send__delete__(this, rv
);
51 NS_IMETHODIMP
ClipboardWriteRequestParent::OnComplete(nsresult aResult
) {
52 nsCOMPtr
<nsIAsyncSetClipboardData
> clipboardData
=
53 std::move(mAsyncSetClipboardData
);
55 Unused
<< PClipboardWriteRequestParent::Send__delete__(this, aResult
);
60 IPCResult
ClipboardWriteRequestParent::RecvSetData(
61 const IPCTransferable
& aTransferable
) {
62 if (!mManager
->ValidatePrincipal(
63 aTransferable
.dataPrincipal(),
64 {ContentParent::ValidatePrincipalOptions::AllowNullPtr
,
65 ContentParent::ValidatePrincipalOptions::AllowExpanded
,
66 ContentParent::ValidatePrincipalOptions::AllowSystem
})) {
67 ContentParent::LogAndAssertFailedPrincipalValidationInfo(
68 aTransferable
.dataPrincipal(), __func__
);
71 if (!mAsyncSetClipboardData
) {
75 nsresult rv
= NS_ERROR_FAILURE
;
76 nsCOMPtr
<nsITransferable
> trans
=
77 do_CreateInstance("@mozilla.org/widget/transferable;1", &rv
);
79 mAsyncSetClipboardData
->Abort(rv
);
84 rv
= nsContentUtils::IPCTransferableToTransferable(
85 aTransferable
, true /* aAddDataFlavor */, trans
,
86 true /* aFilterUnknownFlavors */);
88 mAsyncSetClipboardData
->Abort(rv
);
92 mAsyncSetClipboardData
->SetData(trans
, nullptr);
96 IPCResult
ClipboardWriteRequestParent::Recv__delete__(nsresult aReason
) {
97 #ifndef FUZZING_SNAPSHOT
98 MOZ_DIAGNOSTIC_ASSERT(NS_FAILED(aReason
));
100 nsCOMPtr
<nsIAsyncSetClipboardData
> clipboardData
=
101 std::move(mAsyncSetClipboardData
);
103 clipboardData
->Abort(aReason
);
108 void ClipboardWriteRequestParent::ActorDestroy(ActorDestroyReason aReason
) {
109 nsCOMPtr
<nsIAsyncSetClipboardData
> clipboardData
=
110 std::move(mAsyncSetClipboardData
);
112 clipboardData
->Abort(NS_ERROR_ABORT
);
116 } // namespace mozilla