Bug 1892041 - Part 3: Update test exclusions. r=spidermonkey-reviewers,dminor
[gecko.git] / widget / ClipboardWriteRequestParent.cpp
blob7f49ebe2e1cd914cacf2949ecd178fa7616005ea
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;
20 namespace mozilla {
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 int32_t& aClipboardType,
32 mozilla::dom::WindowContext* aSettingWindowContext) {
33 nsCOMPtr<nsIClipboard> clipboard(do_GetService(kCClipboardCID));
34 if (!clipboard) {
35 Unused << PClipboardWriteRequestParent::Send__delete__(this,
36 NS_ERROR_FAILURE);
37 return NS_ERROR_FAILURE;
40 nsresult rv =
41 clipboard->AsyncSetData(aClipboardType, aSettingWindowContext, this,
42 getter_AddRefs(mAsyncSetClipboardData));
43 if (NS_FAILED(rv)) {
44 Unused << PClipboardWriteRequestParent::Send__delete__(this, rv);
45 return rv;
48 return NS_OK;
51 NS_IMETHODIMP ClipboardWriteRequestParent::OnComplete(nsresult aResult) {
52 nsCOMPtr<nsIAsyncSetClipboardData> clipboardData =
53 std::move(mAsyncSetClipboardData);
54 if (clipboardData) {
55 Unused << PClipboardWriteRequestParent::Send__delete__(this, aResult);
57 return NS_OK;
60 IPCResult ClipboardWriteRequestParent::RecvSetData(
61 const IPCTransferable& aTransferable) {
62 if (!mManager->ValidatePrincipal(
63 aTransferable.requestingPrincipal(),
64 {ContentParent::ValidatePrincipalOptions::AllowNullPtr,
65 ContentParent::ValidatePrincipalOptions::AllowExpanded,
66 ContentParent::ValidatePrincipalOptions::AllowSystem})) {
67 ContentParent::LogAndAssertFailedPrincipalValidationInfo(
68 aTransferable.requestingPrincipal(), __func__);
71 if (!mAsyncSetClipboardData) {
72 return IPC_OK();
75 nsresult rv = NS_ERROR_FAILURE;
76 nsCOMPtr<nsITransferable> trans =
77 do_CreateInstance("@mozilla.org/widget/transferable;1", &rv);
78 if (NS_FAILED(rv)) {
79 mAsyncSetClipboardData->Abort(rv);
80 return IPC_OK();
83 trans->Init(nullptr);
84 rv = nsContentUtils::IPCTransferableToTransferable(
85 aTransferable, true /* aAddDataFlavor */, trans,
86 true /* aFilterUnknownFlavors */);
87 if (NS_FAILED(rv)) {
88 mAsyncSetClipboardData->Abort(rv);
89 return IPC_OK();
92 mAsyncSetClipboardData->SetData(trans, nullptr);
93 return IPC_OK();
96 IPCResult ClipboardWriteRequestParent::Recv__delete__(nsresult aReason) {
97 #ifndef FUZZING_SNAPSHOT
98 MOZ_DIAGNOSTIC_ASSERT(NS_FAILED(aReason));
99 #endif
100 nsCOMPtr<nsIAsyncSetClipboardData> clipboardData =
101 std::move(mAsyncSetClipboardData);
102 if (clipboardData) {
103 clipboardData->Abort(aReason);
105 return IPC_OK();
108 void ClipboardWriteRequestParent::ActorDestroy(ActorDestroyReason aReason) {
109 nsCOMPtr<nsIAsyncSetClipboardData> clipboardData =
110 std::move(mAsyncSetClipboardData);
111 if (clipboardData) {
112 clipboardData->Abort(NS_ERROR_ABORT);
116 } // namespace mozilla