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