Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/widget/nsClipboardProxy.cpp
Line
Count
Source (jump to first uncovered line)
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 "mozilla/dom/ContentChild.h"
6
#include "mozilla/Unused.h"
7
#include "nsArrayUtils.h"
8
#include "nsClipboardProxy.h"
9
#include "nsISupportsPrimitives.h"
10
#include "nsCOMPtr.h"
11
#include "nsComponentManagerUtils.h"
12
#include "nsXULAppAPI.h"
13
#include "nsContentUtils.h"
14
#include "nsStringStream.h"
15
16
using namespace mozilla;
17
using namespace mozilla::dom;
18
19
NS_IMPL_ISUPPORTS(nsClipboardProxy, nsIClipboard, nsIClipboardProxy)
20
21
nsClipboardProxy::nsClipboardProxy()
22
  : mClipboardCaps(false, false)
23
0
{
24
0
}
25
26
NS_IMETHODIMP
27
nsClipboardProxy::SetData(nsITransferable *aTransferable,
28
                          nsIClipboardOwner *anOwner, int32_t aWhichClipboard)
29
0
{
30
0
  ContentChild* child = ContentChild::GetSingleton();
31
0
32
0
  IPCDataTransfer ipcDataTransfer;
33
0
  nsContentUtils::TransferableToIPCTransferable(aTransferable, &ipcDataTransfer,
34
0
                                                false, child, nullptr);
35
0
36
0
  bool isPrivateData = false;
37
0
  aTransferable->GetIsPrivateData(&isPrivateData);
38
0
  nsCOMPtr<nsIPrincipal> requestingPrincipal;
39
0
  aTransferable->GetRequestingPrincipal(getter_AddRefs(requestingPrincipal));
40
0
  nsContentPolicyType contentPolicyType = nsIContentPolicy::TYPE_OTHER;
41
0
  aTransferable->GetContentPolicyType(&contentPolicyType);
42
0
  child->SendSetClipboard(ipcDataTransfer, isPrivateData,
43
0
                          IPC::Principal(requestingPrincipal),
44
0
                          contentPolicyType, aWhichClipboard);
45
0
46
0
  return NS_OK;
47
0
}
48
49
NS_IMETHODIMP
50
nsClipboardProxy::GetData(nsITransferable *aTransferable, int32_t aWhichClipboard)
51
0
{
52
0
   nsTArray<nsCString> types;
53
0
  
54
0
  nsCOMPtr<nsIArray> flavorList;
55
0
  aTransferable->FlavorsTransferableCanImport(getter_AddRefs(flavorList));
56
0
  if (flavorList) {
57
0
    uint32_t flavorCount = 0;
58
0
    flavorList->GetLength(&flavorCount);
59
0
    for (uint32_t j = 0; j < flavorCount; ++j) {
60
0
      nsCOMPtr<nsISupportsCString> flavor = do_QueryElementAt(flavorList, j);
61
0
      if (flavor) {
62
0
        nsAutoCString flavorStr;
63
0
        flavor->GetData(flavorStr);
64
0
        if (flavorStr.Length()) {
65
0
          types.AppendElement(flavorStr);
66
0
        }
67
0
      }
68
0
    }
69
0
  }
70
0
71
0
  nsresult rv;
72
0
  IPCDataTransfer dataTransfer;
73
0
  ContentChild::GetSingleton()->SendGetClipboard(types, aWhichClipboard, &dataTransfer);
74
0
75
0
  auto& items = dataTransfer.items();
76
0
  for (uint32_t j = 0; j < items.Length(); ++j) {
77
0
    const IPCDataTransferItem& item = items[j];
78
0
79
0
    if (item.data().type() == IPCDataTransferData::TnsString) {
80
0
      nsCOMPtr<nsISupportsString> dataWrapper =
81
0
        do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID, &rv);
82
0
      NS_ENSURE_SUCCESS(rv, rv);
83
0
84
0
      const nsString& data = item.data().get_nsString();
85
0
      rv = dataWrapper->SetData(data);
86
0
      NS_ENSURE_SUCCESS(rv, rv);
87
0
88
0
      rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper,
89
0
                                          data.Length() * sizeof(char16_t));
90
0
      NS_ENSURE_SUCCESS(rv, rv);
91
0
    } else if (item.data().type() == IPCDataTransferData::TShmem) {
92
0
      // If this is an image, convert it into an nsIInputStream.
93
0
      const nsCString& flavor = item.flavor();
94
0
      mozilla::ipc::Shmem data = item.data().get_Shmem();
95
0
      if (flavor.EqualsLiteral(kJPEGImageMime) ||
96
0
          flavor.EqualsLiteral(kJPGImageMime) ||
97
0
          flavor.EqualsLiteral(kPNGImageMime) ||
98
0
          flavor.EqualsLiteral(kGIFImageMime)) {
99
0
        nsCOMPtr<nsIInputStream> stream;
100
0
101
0
        NS_NewCStringInputStream(getter_AddRefs(stream),
102
0
                                 nsDependentCSubstring(data.get<char>(), data.Size<char>()));
103
0
104
0
        rv = aTransferable->SetTransferData(flavor.get(), stream, sizeof(nsISupports*));
105
0
        NS_ENSURE_SUCCESS(rv, rv);
106
0
      } else if (flavor.EqualsLiteral(kNativeHTMLMime) ||
107
0
                 flavor.EqualsLiteral(kRTFMime) ||
108
0
                 flavor.EqualsLiteral(kCustomTypesMime)) {
109
0
        nsCOMPtr<nsISupportsCString> dataWrapper =
110
0
          do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID, &rv);
111
0
        NS_ENSURE_SUCCESS(rv, rv);
112
0
113
0
        rv = dataWrapper->SetData(nsDependentCSubstring(data.get<char>(), data.Size<char>()));
114
0
        NS_ENSURE_SUCCESS(rv, rv);
115
0
116
0
        rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper,
117
0
                                            data.Size<char>());
118
0
        NS_ENSURE_SUCCESS(rv, rv);
119
0
      }
120
0
121
0
      mozilla::Unused << ContentChild::GetSingleton()->DeallocShmem(data);
122
0
    }
123
0
  }
124
0
125
0
  return NS_OK;
126
0
}
127
128
NS_IMETHODIMP
129
nsClipboardProxy::EmptyClipboard(int32_t aWhichClipboard)
130
0
{
131
0
  ContentChild::GetSingleton()->SendEmptyClipboard(aWhichClipboard);
132
0
  return NS_OK;
133
0
}
134
135
NS_IMETHODIMP
136
nsClipboardProxy::HasDataMatchingFlavors(const char **aFlavorList,
137
                                         uint32_t aLength, int32_t aWhichClipboard,
138
                                         bool *aHasType)
139
0
{
140
0
  *aHasType = false;
141
0
142
0
  nsTArray<nsCString> types;
143
0
  nsCString* t = types.AppendElements(aLength);
144
0
  for (uint32_t j = 0; j < aLength; ++j) {
145
0
    t[j].Rebind(aFlavorList[j], nsCharTraits<char>::length(aFlavorList[j]));
146
0
  }
147
0
148
0
  ContentChild::GetSingleton()->SendClipboardHasType(types, aWhichClipboard, aHasType);
149
0
150
0
  return NS_OK;
151
0
}
152
153
NS_IMETHODIMP
154
nsClipboardProxy::SupportsSelectionClipboard(bool *aIsSupported)
155
0
{
156
0
  *aIsSupported = mClipboardCaps.supportsSelectionClipboard();
157
0
  return NS_OK;
158
0
}
159
160
161
NS_IMETHODIMP
162
nsClipboardProxy::SupportsFindClipboard(bool *aIsSupported)
163
0
{
164
0
  *aIsSupported = mClipboardCaps.supportsFindClipboard();
165
0
  return NS_OK;
166
0
}
167
168
void
169
nsClipboardProxy::SetCapabilities(const ClipboardCapabilities& aClipboardCaps)
170
0
{
171
0
  mClipboardCaps = aClipboardCaps;
172
0
}