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 "HeadlessClipboard.h"
7 #include "nsISupportsPrimitives.h"
8 #include "nsComponentManagerUtils.h"
11 namespace mozilla::widget
{
13 NS_IMPL_ISUPPORTS_INHERITED0(HeadlessClipboard
, nsBaseClipboard
)
15 HeadlessClipboard::HeadlessClipboard()
16 : nsBaseClipboard(mozilla::dom::ClipboardCapabilities(
17 true /* supportsSelectionClipboard */,
18 true /* supportsFindClipboard */,
19 true /* supportsSelectionCache */)) {
20 for (auto& clipboard
: mClipboards
) {
21 clipboard
= MakeUnique
<HeadlessClipboardData
>();
26 HeadlessClipboard::SetNativeClipboardData(nsITransferable
* aTransferable
,
27 int32_t aWhichClipboard
) {
28 MOZ_DIAGNOSTIC_ASSERT(aTransferable
);
29 MOZ_DIAGNOSTIC_ASSERT(
30 nsIClipboard::IsClipboardTypeSupported(aWhichClipboard
));
32 // Clear out the clipboard in order to set the new data.
33 EmptyNativeClipboardData(aWhichClipboard
);
35 nsTArray
<nsCString
> flavors
;
36 nsresult rv
= aTransferable
->FlavorsTransferableCanExport(flavors
);
41 auto& clipboard
= mClipboards
[aWhichClipboard
];
42 MOZ_ASSERT(clipboard
);
44 for (const auto& flavor
: flavors
) {
45 if (!flavor
.EqualsLiteral(kTextMime
) && !flavor
.EqualsLiteral(kHTMLMime
)) {
49 nsCOMPtr
<nsISupports
> data
;
50 rv
= aTransferable
->GetTransferData(flavor
.get(), getter_AddRefs(data
));
55 nsCOMPtr
<nsISupportsString
> wideString
= do_QueryInterface(data
);
60 nsAutoString utf16string
;
61 wideString
->GetData(utf16string
);
62 flavor
.EqualsLiteral(kTextMime
) ? clipboard
->SetText(utf16string
)
63 : clipboard
->SetHTML(utf16string
);
70 HeadlessClipboard::GetNativeClipboardData(nsITransferable
* aTransferable
,
71 int32_t aWhichClipboard
) {
72 MOZ_DIAGNOSTIC_ASSERT(aTransferable
);
73 MOZ_DIAGNOSTIC_ASSERT(
74 nsIClipboard::IsClipboardTypeSupported(aWhichClipboard
));
76 nsTArray
<nsCString
> flavors
;
77 nsresult rv
= aTransferable
->FlavorsTransferableCanImport(flavors
);
79 return NS_ERROR_FAILURE
;
82 auto& clipboard
= mClipboards
[aWhichClipboard
];
83 MOZ_ASSERT(clipboard
);
85 for (const auto& flavor
: flavors
) {
86 if (!flavor
.EqualsLiteral(kTextMime
) && !flavor
.EqualsLiteral(kHTMLMime
)) {
90 bool isText
= flavor
.EqualsLiteral(kTextMime
);
91 if (!(isText
? clipboard
->HasText() : clipboard
->HasHTML())) {
95 nsCOMPtr
<nsISupportsString
> dataWrapper
=
96 do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID
, &rv
);
97 rv
= dataWrapper
->SetData(isText
? clipboard
->GetText()
98 : clipboard
->GetHTML());
99 if (NS_WARN_IF(NS_FAILED(rv
))) {
103 nsCOMPtr
<nsISupports
> genericDataWrapper
= do_QueryInterface(dataWrapper
);
104 rv
= aTransferable
->SetTransferData(flavor
.get(), genericDataWrapper
);
105 if (NS_WARN_IF(NS_FAILED(rv
))) {
109 // XXX Other platforms only fill the first available type, too.
116 nsresult
HeadlessClipboard::EmptyNativeClipboardData(int32_t aWhichClipboard
) {
117 MOZ_DIAGNOSTIC_ASSERT(
118 nsIClipboard::IsClipboardTypeSupported(aWhichClipboard
));
119 auto& clipboard
= mClipboards
[aWhichClipboard
];
120 MOZ_ASSERT(clipboard
);
125 mozilla::Result
<int32_t, nsresult
>
126 HeadlessClipboard::GetNativeClipboardSequenceNumber(int32_t aWhichClipboard
) {
127 MOZ_DIAGNOSTIC_ASSERT(
128 nsIClipboard::IsClipboardTypeSupported(aWhichClipboard
));
129 auto& clipboard
= mClipboards
[aWhichClipboard
];
130 MOZ_ASSERT(clipboard
);
131 return clipboard
->GetChangeCount();
135 mozilla::Result
<bool, nsresult
>
136 HeadlessClipboard::HasNativeClipboardDataMatchingFlavors(
137 const nsTArray
<nsCString
>& aFlavorList
, int32_t aWhichClipboard
) {
138 MOZ_DIAGNOSTIC_ASSERT(
139 nsIClipboard::IsClipboardTypeSupported(aWhichClipboard
));
141 auto& clipboard
= mClipboards
[aWhichClipboard
];
142 MOZ_ASSERT(clipboard
);
144 // Retrieve the union of all aHasType in aFlavorList
145 for (auto& flavor
: aFlavorList
) {
146 if ((flavor
.EqualsLiteral(kTextMime
) && clipboard
->HasText()) ||
147 (flavor
.EqualsLiteral(kHTMLMime
) && clipboard
->HasHTML())) {
154 } // namespace mozilla::widget