2014-02-10 04:13:10 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#include "mozilla/dom/ContentChild.h"
|
2016-08-23 07:09:32 +03:00
|
|
|
#include "mozilla/Unused.h"
|
2016-10-16 22:43:56 +03:00
|
|
|
#include "nsArrayUtils.h"
|
2014-02-10 04:13:10 +04:00
|
|
|
#include "nsClipboardProxy.h"
|
|
|
|
#include "nsISupportsPrimitives.h"
|
|
|
|
#include "nsCOMPtr.h"
|
|
|
|
#include "nsComponentManagerUtils.h"
|
|
|
|
#include "nsXULAppAPI.h"
|
2015-04-16 22:38:12 +03:00
|
|
|
#include "nsContentUtils.h"
|
|
|
|
#include "nsStringStream.h"
|
2014-02-10 04:13:10 +04:00
|
|
|
|
|
|
|
using namespace mozilla;
|
2014-10-22 13:50:00 +04:00
|
|
|
using namespace mozilla::dom;
|
2014-02-10 04:13:10 +04:00
|
|
|
|
2014-10-22 13:50:00 +04:00
|
|
|
NS_IMPL_ISUPPORTS(nsClipboardProxy, nsIClipboard, nsIClipboardProxy)
|
2014-02-10 04:13:10 +04:00
|
|
|
|
|
|
|
nsClipboardProxy::nsClipboardProxy()
|
2014-10-22 13:50:00 +04:00
|
|
|
: mClipboardCaps(false, false)
|
2014-02-10 04:13:10 +04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsClipboardProxy::SetData(nsITransferable *aTransferable,
|
2014-10-22 13:50:00 +04:00
|
|
|
nsIClipboardOwner *anOwner, int32_t aWhichClipboard)
|
2014-02-10 04:13:10 +04:00
|
|
|
{
|
2015-04-16 22:38:12 +03:00
|
|
|
ContentChild* child = ContentChild::GetSingleton();
|
|
|
|
|
|
|
|
IPCDataTransfer ipcDataTransfer;
|
|
|
|
nsContentUtils::TransferableToIPCTransferable(aTransferable, &ipcDataTransfer,
|
2015-10-28 00:41:58 +03:00
|
|
|
false, child, nullptr);
|
2014-02-10 04:13:10 +04:00
|
|
|
|
2018-11-20 04:17:54 +03:00
|
|
|
bool isPrivateData = aTransferable->GetIsPrivateData();
|
|
|
|
nsCOMPtr<nsIPrincipal> requestingPrincipal =
|
|
|
|
aTransferable->GetRequestingPrincipal();
|
|
|
|
nsContentPolicyType contentPolicyType = aTransferable->GetContentPolicyType();
|
2016-06-30 10:12:56 +03:00
|
|
|
child->SendSetClipboard(ipcDataTransfer, isPrivateData,
|
2018-03-14 11:44:36 +03:00
|
|
|
IPC::Principal(requestingPrincipal),
|
|
|
|
contentPolicyType, aWhichClipboard);
|
2014-02-10 04:13:10 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsClipboardProxy::GetData(nsITransferable *aTransferable, int32_t aWhichClipboard)
|
|
|
|
{
|
2018-10-10 23:25:54 +03:00
|
|
|
nsTArray<nsCString> types;
|
|
|
|
aTransferable->FlavorsTransferableCanImport(types);
|
2014-02-10 04:13:10 +04:00
|
|
|
|
|
|
|
nsresult rv;
|
2015-04-16 22:38:12 +03:00
|
|
|
IPCDataTransfer dataTransfer;
|
|
|
|
ContentChild::GetSingleton()->SendGetClipboard(types, aWhichClipboard, &dataTransfer);
|
|
|
|
|
|
|
|
auto& items = dataTransfer.items();
|
|
|
|
for (uint32_t j = 0; j < items.Length(); ++j) {
|
|
|
|
const IPCDataTransferItem& item = items[j];
|
|
|
|
|
|
|
|
if (item.data().type() == IPCDataTransferData::TnsString) {
|
|
|
|
nsCOMPtr<nsISupportsString> dataWrapper =
|
|
|
|
do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2018-04-11 02:07:40 +03:00
|
|
|
const nsString& data = item.data().get_nsString();
|
2015-04-16 22:38:12 +03:00
|
|
|
rv = dataWrapper->SetData(data);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2018-11-20 18:13:18 +03:00
|
|
|
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper,
|
|
|
|
data.Length() * sizeof(char16_t));
|
2015-04-16 22:38:12 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2016-06-15 19:57:46 +03:00
|
|
|
} else if (item.data().type() == IPCDataTransferData::TShmem) {
|
2015-04-16 22:38:12 +03:00
|
|
|
// If this is an image, convert it into an nsIInputStream.
|
2018-04-11 02:07:40 +03:00
|
|
|
const nsCString& flavor = item.flavor();
|
2016-06-15 19:57:46 +03:00
|
|
|
mozilla::ipc::Shmem data = item.data().get_Shmem();
|
2015-04-16 22:38:12 +03:00
|
|
|
if (flavor.EqualsLiteral(kJPEGImageMime) ||
|
|
|
|
flavor.EqualsLiteral(kJPGImageMime) ||
|
|
|
|
flavor.EqualsLiteral(kPNGImageMime) ||
|
|
|
|
flavor.EqualsLiteral(kGIFImageMime)) {
|
|
|
|
nsCOMPtr<nsIInputStream> stream;
|
2016-06-15 19:57:46 +03:00
|
|
|
|
|
|
|
NS_NewCStringInputStream(getter_AddRefs(stream),
|
2018-07-19 23:14:50 +03:00
|
|
|
nsDependentCSubstring(data.get<char>(), data.Size<char>()));
|
2015-04-16 22:38:12 +03:00
|
|
|
|
2018-11-20 18:13:18 +03:00
|
|
|
rv = aTransferable->SetTransferData(flavor.get(), stream, sizeof(nsISupports*));
|
2015-04-16 22:38:12 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2015-11-23 22:04:26 +03:00
|
|
|
} else if (flavor.EqualsLiteral(kNativeHTMLMime) ||
|
2016-04-21 21:11:14 +03:00
|
|
|
flavor.EqualsLiteral(kRTFMime) ||
|
|
|
|
flavor.EqualsLiteral(kCustomTypesMime)) {
|
2015-04-16 22:38:12 +03:00
|
|
|
nsCOMPtr<nsISupportsCString> dataWrapper =
|
|
|
|
do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2018-07-19 23:14:50 +03:00
|
|
|
rv = dataWrapper->SetData(nsDependentCSubstring(data.get<char>(), data.Size<char>()));
|
2015-04-16 22:38:12 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2018-11-20 18:13:18 +03:00
|
|
|
rv = aTransferable->SetTransferData(item.flavor().get(), dataWrapper,
|
|
|
|
data.Size<char>());
|
2015-04-16 22:38:12 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
2016-06-15 19:57:46 +03:00
|
|
|
|
|
|
|
mozilla::Unused << ContentChild::GetSingleton()->DeallocShmem(data);
|
2015-04-16 22:38:12 +03:00
|
|
|
}
|
|
|
|
}
|
2014-02-10 04:13:10 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsClipboardProxy::EmptyClipboard(int32_t aWhichClipboard)
|
|
|
|
{
|
|
|
|
ContentChild::GetSingleton()->SendEmptyClipboard(aWhichClipboard);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsClipboardProxy::HasDataMatchingFlavors(const char **aFlavorList,
|
2015-04-16 22:38:12 +03:00
|
|
|
uint32_t aLength, int32_t aWhichClipboard,
|
|
|
|
bool *aHasType)
|
2014-02-10 04:13:10 +04:00
|
|
|
{
|
2015-04-16 22:38:12 +03:00
|
|
|
*aHasType = false;
|
|
|
|
|
|
|
|
nsTArray<nsCString> types;
|
2015-11-18 18:55:41 +03:00
|
|
|
nsCString* t = types.AppendElements(aLength);
|
2015-04-16 22:38:12 +03:00
|
|
|
for (uint32_t j = 0; j < aLength; ++j) {
|
2015-11-18 18:55:41 +03:00
|
|
|
t[j].Rebind(aFlavorList[j], nsCharTraits<char>::length(aFlavorList[j]));
|
2015-04-16 22:38:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
ContentChild::GetSingleton()->SendClipboardHasType(types, aWhichClipboard, aHasType);
|
|
|
|
|
2014-02-10 04:13:10 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsClipboardProxy::SupportsSelectionClipboard(bool *aIsSupported)
|
|
|
|
{
|
2014-10-22 13:50:00 +04:00
|
|
|
*aIsSupported = mClipboardCaps.supportsSelectionClipboard();
|
2014-02-10 04:13:10 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2014-02-28 19:07:30 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsClipboardProxy::SupportsFindClipboard(bool *aIsSupported)
|
|
|
|
{
|
2014-10-22 13:50:00 +04:00
|
|
|
*aIsSupported = mClipboardCaps.supportsFindClipboard();
|
2014-02-28 19:07:30 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2014-10-22 13:50:00 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
nsClipboardProxy::SetCapabilities(const ClipboardCapabilities& aClipboardCaps)
|
|
|
|
{
|
|
|
|
mClipboardCaps = aClipboardCaps;
|
|
|
|
}
|