summaryrefslogtreecommitdiffstats
path: root/widget/nsClipboardProxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--widget/nsClipboardProxy.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/widget/nsClipboardProxy.cpp b/widget/nsClipboardProxy.cpp
new file mode 100644
index 0000000000..9c58b9d413
--- /dev/null
+++ b/widget/nsClipboardProxy.cpp
@@ -0,0 +1,163 @@
+/* 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/. */
+
+#if defined(ACCESSIBILITY) && defined(XP_WIN)
+# include "mozilla/a11y/Compatibility.h"
+#endif
+#include "mozilla/dom/ContentChild.h"
+#include "mozilla/Unused.h"
+#include "nsArrayUtils.h"
+#include "nsClipboardProxy.h"
+#include "nsISupportsPrimitives.h"
+#include "nsCOMPtr.h"
+#include "nsComponentManagerUtils.h"
+#include "nsXULAppAPI.h"
+#include "nsContentUtils.h"
+#include "PermissionMessageUtils.h"
+
+using namespace mozilla;
+using namespace mozilla::dom;
+
+NS_IMPL_ISUPPORTS(nsClipboardProxy, nsIClipboard, nsIClipboardProxy)
+
+nsClipboardProxy::nsClipboardProxy() : mClipboardCaps(false, false) {}
+
+NS_IMETHODIMP
+nsClipboardProxy::SetData(nsITransferable* aTransferable,
+ nsIClipboardOwner* anOwner, int32_t aWhichClipboard) {
+#if defined(ACCESSIBILITY) && defined(XP_WIN)
+ a11y::Compatibility::SuppressA11yForClipboardCopy();
+#endif
+
+ ContentChild* child = ContentChild::GetSingleton();
+
+ IPCDataTransfer ipcDataTransfer;
+ nsContentUtils::TransferableToIPCTransferable(aTransferable, &ipcDataTransfer,
+ false, child, nullptr);
+
+ bool isPrivateData = aTransferable->GetIsPrivateData();
+ nsCOMPtr<nsIPrincipal> requestingPrincipal =
+ aTransferable->GetRequestingPrincipal();
+ nsContentPolicyType contentPolicyType = aTransferable->GetContentPolicyType();
+ child->SendSetClipboard(std::move(ipcDataTransfer), isPrivateData,
+ requestingPrincipal, contentPolicyType,
+ aWhichClipboard);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboardProxy::GetData(nsITransferable* aTransferable,
+ int32_t aWhichClipboard) {
+ nsTArray<nsCString> types;
+ aTransferable->FlavorsTransferableCanImport(types);
+
+ IPCDataTransfer dataTransfer;
+ ContentChild::GetSingleton()->SendGetClipboard(types, aWhichClipboard,
+ &dataTransfer);
+ return nsContentUtils::IPCTransferableToTransferable(
+ dataTransfer, false /* aAddDataFlavor */, aTransferable,
+ false /* aFilterUnknownFlavors */);
+}
+
+NS_IMETHODIMP
+nsClipboardProxy::EmptyClipboard(int32_t aWhichClipboard) {
+ ContentChild::GetSingleton()->SendEmptyClipboard(aWhichClipboard);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboardProxy::HasDataMatchingFlavors(const nsTArray<nsCString>& aFlavorList,
+ int32_t aWhichClipboard,
+ bool* aHasType) {
+ *aHasType = false;
+
+ ContentChild::GetSingleton()->SendClipboardHasType(aFlavorList,
+ aWhichClipboard, aHasType);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboardProxy::SupportsSelectionClipboard(bool* aIsSupported) {
+ *aIsSupported = mClipboardCaps.supportsSelectionClipboard();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboardProxy::SupportsFindClipboard(bool* aIsSupported) {
+ *aIsSupported = mClipboardCaps.supportsFindClipboard();
+ return NS_OK;
+}
+
+void nsClipboardProxy::SetCapabilities(
+ const ClipboardCapabilities& aClipboardCaps) {
+ mClipboardCaps = aClipboardCaps;
+}
+
+RefPtr<DataFlavorsPromise> nsClipboardProxy::AsyncHasDataMatchingFlavors(
+ const nsTArray<nsCString>& aFlavorList, int32_t aWhichClipboard) {
+ auto promise = MakeRefPtr<DataFlavorsPromise::Private>(__func__);
+ ContentChild::GetSingleton()
+ ->SendClipboardHasTypesAsync(aFlavorList, aWhichClipboard)
+ ->Then(
+ GetMainThreadSerialEventTarget(), __func__,
+ /* resolve */
+ [promise](nsTArray<nsCString> types) {
+ promise->Resolve(std::move(types), __func__);
+ },
+ /* reject */
+ [promise](mozilla::ipc::ResponseRejectReason aReason) {
+ promise->Reject(NS_ERROR_FAILURE, __func__);
+ });
+
+ return promise.forget();
+}
+
+RefPtr<GenericPromise> nsClipboardProxy::AsyncGetData(
+ nsITransferable* aTransferable, int32_t aWhichClipboard) {
+ if (!aTransferable) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ // Get a list of flavors this transferable can import
+ nsTArray<nsCString> flavors;
+ nsresult rv = aTransferable->FlavorsTransferableCanImport(flavors);
+ if (NS_FAILED(rv)) {
+ return GenericPromise::CreateAndReject(rv, __func__);
+ }
+
+ nsCOMPtr<nsITransferable> transferable(aTransferable);
+ auto promise = MakeRefPtr<GenericPromise::Private>(__func__);
+ ContentChild::GetSingleton()
+ ->SendGetClipboardAsync(flavors, aWhichClipboard)
+ ->Then(
+ GetMainThreadSerialEventTarget(), __func__,
+ /* resolve */
+ [promise,
+ transferable](const IPCDataTransferOrError& ipcDataTransferOrError) {
+ if (ipcDataTransferOrError.type() ==
+ IPCDataTransferOrError::Tnsresult) {
+ promise->Reject(ipcDataTransferOrError.get_nsresult(), __func__);
+ return;
+ }
+
+ nsresult rv = nsContentUtils::IPCTransferableToTransferable(
+ ipcDataTransferOrError.get_IPCDataTransfer(),
+ false /* aAddDataFlavor */, transferable,
+ false /* aFilterUnknownFlavors */);
+ if (NS_FAILED(rv)) {
+ promise->Reject(rv, __func__);
+ return;
+ }
+
+ promise->Resolve(true, __func__);
+ },
+ /* reject */
+ [promise](mozilla::ipc::ResponseRejectReason aReason) {
+ promise->Reject(NS_ERROR_FAILURE, __func__);
+ });
+
+ return promise.forget();
+}