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/. */
4
5 #include "HeadlessClipboard.h"
6
7 #include "nsISupportsPrimitives.h"
8 #include "nsComponentManagerUtils.h"
9 #include "nsCOMPtr.h"
10
11 namespace mozilla {
12 namespace widget {
13
NS_IMPL_ISUPPORTS(HeadlessClipboard,nsIClipboard)14 NS_IMPL_ISUPPORTS(HeadlessClipboard, nsIClipboard)
15
16 HeadlessClipboard::HeadlessClipboard()
17 : mClipboard(MakeUnique<HeadlessClipboardData>()) {}
18
19 NS_IMETHODIMP
SetData(nsITransferable * aTransferable,nsIClipboardOwner * anOwner,int32_t aWhichClipboard)20 HeadlessClipboard::SetData(nsITransferable* aTransferable,
21 nsIClipboardOwner* anOwner,
22 int32_t aWhichClipboard) {
23 if (aWhichClipboard != kGlobalClipboard) {
24 return NS_ERROR_NOT_IMPLEMENTED;
25 }
26
27 // Clear out the clipboard in order to set the new data.
28 EmptyClipboard(aWhichClipboard);
29
30 // Only support plain text for now.
31 nsCOMPtr<nsISupports> clip;
32 nsresult rv =
33 aTransferable->GetTransferData(kUnicodeMime, getter_AddRefs(clip));
34 if (NS_FAILED(rv)) {
35 return rv;
36 }
37 nsCOMPtr<nsISupportsString> wideString = do_QueryInterface(clip);
38 if (!wideString) {
39 return NS_ERROR_NOT_IMPLEMENTED;
40 }
41 nsAutoString utf16string;
42 wideString->GetData(utf16string);
43 mClipboard->SetText(utf16string);
44
45 return NS_OK;
46 }
47
48 NS_IMETHODIMP
GetData(nsITransferable * aTransferable,int32_t aWhichClipboard)49 HeadlessClipboard::GetData(nsITransferable* aTransferable,
50 int32_t aWhichClipboard) {
51 if (aWhichClipboard != kGlobalClipboard) {
52 return NS_ERROR_NOT_IMPLEMENTED;
53 }
54
55 nsresult rv;
56 nsCOMPtr<nsISupportsString> dataWrapper =
57 do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID, &rv);
58 rv = dataWrapper->SetData(mClipboard->GetText());
59 if (NS_WARN_IF(NS_FAILED(rv))) {
60 return rv;
61 }
62 nsCOMPtr<nsISupports> genericDataWrapper = do_QueryInterface(dataWrapper);
63 rv = aTransferable->SetTransferData(kUnicodeMime, genericDataWrapper);
64 if (NS_WARN_IF(NS_FAILED(rv))) {
65 return rv;
66 }
67 return NS_OK;
68 }
69
70 NS_IMETHODIMP
EmptyClipboard(int32_t aWhichClipboard)71 HeadlessClipboard::EmptyClipboard(int32_t aWhichClipboard) {
72 if (aWhichClipboard != kGlobalClipboard) {
73 return NS_ERROR_NOT_IMPLEMENTED;
74 }
75 mClipboard->Clear();
76 return NS_OK;
77 }
78
79 NS_IMETHODIMP
HasDataMatchingFlavors(const nsTArray<nsCString> & aFlavorList,int32_t aWhichClipboard,bool * aHasType)80 HeadlessClipboard::HasDataMatchingFlavors(
81 const nsTArray<nsCString>& aFlavorList, int32_t aWhichClipboard,
82 bool* aHasType) {
83 *aHasType = false;
84 if (aWhichClipboard != kGlobalClipboard) {
85 return NS_ERROR_NOT_IMPLEMENTED;
86 }
87 // Retrieve the union of all aHasType in aFlavorList
88 for (auto& flavor : aFlavorList) {
89 if (flavor.EqualsLiteral(kUnicodeMime) && mClipboard->HasText()) {
90 *aHasType = true;
91 break;
92 }
93 }
94 return NS_OK;
95 }
96
97 NS_IMETHODIMP
SupportsSelectionClipboard(bool * aIsSupported)98 HeadlessClipboard::SupportsSelectionClipboard(bool* aIsSupported) {
99 *aIsSupported = false;
100 return NS_OK;
101 }
102
103 NS_IMETHODIMP
SupportsFindClipboard(bool * _retval)104 HeadlessClipboard::SupportsFindClipboard(bool* _retval) {
105 NS_ENSURE_ARG_POINTER(_retval);
106
107 *_retval = false;
108 return NS_OK;
109 }
110
111 } // namespace widget
112 } // namespace mozilla
113