1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "mozilla/dom/ContentChild.h"
6 #include "mozilla/Unused.h"
7 #include "nsArrayUtils.h"
8 #include "nsClipboardProxy.h"
9 #include "nsISupportsPrimitives.h"
11 #include "nsComponentManagerUtils.h"
12 #include "nsXULAppAPI.h"
13 #include "nsContentUtils.h"
14 #include "nsStringStream.h"
16 using namespace mozilla
;
17 using namespace mozilla::dom
;
19 NS_IMPL_ISUPPORTS(nsClipboardProxy
, nsIClipboard
, nsIClipboardProxy
)
21 nsClipboardProxy::nsClipboardProxy()
22 : mClipboardCaps(false, false)
27 nsClipboardProxy::SetData(nsITransferable
*aTransferable
,
28 nsIClipboardOwner
*anOwner
, int32_t aWhichClipboard
)
30 ContentChild
* child
= ContentChild::GetSingleton();
32 IPCDataTransfer ipcDataTransfer
;
33 nsContentUtils::TransferableToIPCTransferable(aTransferable
, &ipcDataTransfer
,
34 false, child
, nullptr);
36 bool isPrivateData
= false;
37 aTransferable
->GetIsPrivateData(&isPrivateData
);
38 nsCOMPtr
<nsIPrincipal
> requestingPrincipal
;
39 aTransferable
->GetRequestingPrincipal(getter_AddRefs(requestingPrincipal
));
40 child
->SendSetClipboard(ipcDataTransfer
, isPrivateData
,
41 IPC::Principal(requestingPrincipal
), aWhichClipboard
);
47 nsClipboardProxy::GetData(nsITransferable
*aTransferable
, int32_t aWhichClipboard
)
49 nsTArray
<nsCString
> types
;
51 nsCOMPtr
<nsIArray
> flavorList
;
52 aTransferable
->FlavorsTransferableCanImport(getter_AddRefs(flavorList
));
54 uint32_t flavorCount
= 0;
55 flavorList
->GetLength(&flavorCount
);
56 for (uint32_t j
= 0; j
< flavorCount
; ++j
) {
57 nsCOMPtr
<nsISupportsCString
> flavor
= do_QueryElementAt(flavorList
, j
);
59 nsAutoCString flavorStr
;
60 flavor
->GetData(flavorStr
);
61 if (flavorStr
.Length()) {
62 types
.AppendElement(flavorStr
);
69 IPCDataTransfer dataTransfer
;
70 ContentChild::GetSingleton()->SendGetClipboard(types
, aWhichClipboard
, &dataTransfer
);
72 auto& items
= dataTransfer
.items();
73 for (uint32_t j
= 0; j
< items
.Length(); ++j
) {
74 const IPCDataTransferItem
& item
= items
[j
];
76 if (item
.data().type() == IPCDataTransferData::TnsString
) {
77 nsCOMPtr
<nsISupportsString
> dataWrapper
=
78 do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID
, &rv
);
79 NS_ENSURE_SUCCESS(rv
, rv
);
81 nsString data
= item
.data().get_nsString();
82 rv
= dataWrapper
->SetData(data
);
83 NS_ENSURE_SUCCESS(rv
, rv
);
85 rv
= aTransferable
->SetTransferData(item
.flavor().get(), dataWrapper
,
86 data
.Length() * sizeof(char16_t
));
87 NS_ENSURE_SUCCESS(rv
, rv
);
88 } else if (item
.data().type() == IPCDataTransferData::TShmem
) {
89 // If this is an image, convert it into an nsIInputStream.
90 nsCString flavor
= item
.flavor();
91 mozilla::ipc::Shmem data
= item
.data().get_Shmem();
92 if (flavor
.EqualsLiteral(kJPEGImageMime
) ||
93 flavor
.EqualsLiteral(kJPGImageMime
) ||
94 flavor
.EqualsLiteral(kPNGImageMime
) ||
95 flavor
.EqualsLiteral(kGIFImageMime
)) {
96 nsCOMPtr
<nsIInputStream
> stream
;
98 NS_NewCStringInputStream(getter_AddRefs(stream
),
99 nsDependentCString(data
.get
<char>(), data
.Size
<char>()));
101 rv
= aTransferable
->SetTransferData(flavor
.get(), stream
, sizeof(nsISupports
*));
102 NS_ENSURE_SUCCESS(rv
, rv
);
103 } else if (flavor
.EqualsLiteral(kNativeHTMLMime
) ||
104 flavor
.EqualsLiteral(kRTFMime
) ||
105 flavor
.EqualsLiteral(kCustomTypesMime
)) {
106 nsCOMPtr
<nsISupportsCString
> dataWrapper
=
107 do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID
, &rv
);
108 NS_ENSURE_SUCCESS(rv
, rv
);
110 rv
= dataWrapper
->SetData(nsDependentCString(data
.get
<char>(), data
.Size
<char>()));
111 NS_ENSURE_SUCCESS(rv
, rv
);
113 rv
= aTransferable
->SetTransferData(item
.flavor().get(), dataWrapper
,
115 NS_ENSURE_SUCCESS(rv
, rv
);
118 mozilla::Unused
<< ContentChild::GetSingleton()->DeallocShmem(data
);
126 nsClipboardProxy::EmptyClipboard(int32_t aWhichClipboard
)
128 ContentChild::GetSingleton()->SendEmptyClipboard(aWhichClipboard
);
133 nsClipboardProxy::HasDataMatchingFlavors(const char **aFlavorList
,
134 uint32_t aLength
, int32_t aWhichClipboard
,
139 nsTArray
<nsCString
> types
;
140 nsCString
* t
= types
.AppendElements(aLength
);
141 for (uint32_t j
= 0; j
< aLength
; ++j
) {
142 t
[j
].Rebind(aFlavorList
[j
], nsCharTraits
<char>::length(aFlavorList
[j
]));
145 ContentChild::GetSingleton()->SendClipboardHasType(types
, aWhichClipboard
, aHasType
);
151 nsClipboardProxy::SupportsSelectionClipboard(bool *aIsSupported
)
153 *aIsSupported
= mClipboardCaps
.supportsSelectionClipboard();
159 nsClipboardProxy::SupportsFindClipboard(bool *aIsSupported
)
161 *aIsSupported
= mClipboardCaps
.supportsFindClipboard();
166 nsClipboardProxy::SetCapabilities(const ClipboardCapabilities
& aClipboardCaps
)
168 mClipboardCaps
= aClipboardCaps
;