summaryrefslogtreecommitdiffstats
path: root/widget/nsClipboardHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'widget/nsClipboardHelper.cpp')
-rw-r--r--widget/nsClipboardHelper.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/widget/nsClipboardHelper.cpp b/widget/nsClipboardHelper.cpp
new file mode 100644
index 0000000000..3f42800a28
--- /dev/null
+++ b/widget/nsClipboardHelper.cpp
@@ -0,0 +1,124 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * 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 "nsClipboardHelper.h"
+
+// basics
+#include "nsCOMPtr.h"
+#include "nsXPCOM.h"
+#include "nsISupportsPrimitives.h"
+#include "nsServiceManagerUtils.h"
+
+// helpers
+#include "nsIClipboard.h"
+#include "mozilla/dom/Document.h"
+#include "nsITransferable.h"
+#include "nsReadableUtils.h"
+
+NS_IMPL_ISUPPORTS(nsClipboardHelper, nsIClipboardHelper)
+
+/*****************************************************************************
+ * nsClipboardHelper ctor / dtor
+ *****************************************************************************/
+
+nsClipboardHelper::nsClipboardHelper() = default;
+
+nsClipboardHelper::~nsClipboardHelper() {
+ // no members, nothing to destroy
+}
+
+/*****************************************************************************
+ * nsIClipboardHelper methods
+ *****************************************************************************/
+
+NS_IMETHODIMP
+nsClipboardHelper::CopyStringToClipboard(const nsAString& aString,
+ int32_t aClipboardID) {
+ nsresult rv;
+
+ // get the clipboard
+ nsCOMPtr<nsIClipboard> clipboard(
+ do_GetService("@mozilla.org/widget/clipboard;1", &rv));
+ NS_ENSURE_SUCCESS(rv, rv);
+ NS_ENSURE_TRUE(clipboard, NS_ERROR_FAILURE);
+
+ bool clipboardSupported;
+ // don't go any further if they're asking for the selection
+ // clipboard on a platform which doesn't support it (i.e., unix)
+ if (nsIClipboard::kSelectionClipboard == aClipboardID) {
+ rv = clipboard->SupportsSelectionClipboard(&clipboardSupported);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!clipboardSupported) return NS_ERROR_FAILURE;
+ }
+
+ // don't go any further if they're asking for the find clipboard on a platform
+ // which doesn't support it (i.e., non-osx)
+ if (nsIClipboard::kFindClipboard == aClipboardID) {
+ rv = clipboard->SupportsFindClipboard(&clipboardSupported);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!clipboardSupported) return NS_ERROR_FAILURE;
+ }
+
+ // create a transferable for putting data on the clipboard
+ nsCOMPtr<nsITransferable> trans(
+ do_CreateInstance("@mozilla.org/widget/transferable;1", &rv));
+ NS_ENSURE_SUCCESS(rv, rv);
+ NS_ENSURE_TRUE(trans, NS_ERROR_FAILURE);
+
+ trans->Init(nullptr);
+
+ // Add the text data flavor to the transferable
+ rv = trans->AddDataFlavor(kUnicodeMime);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // get wStrings to hold clip data
+ nsCOMPtr<nsISupportsString> data(
+ do_CreateInstance("@mozilla.org/supports-string;1", &rv));
+ NS_ENSURE_SUCCESS(rv, rv);
+ NS_ENSURE_TRUE(data, NS_ERROR_FAILURE);
+
+ // populate the string
+ rv = data->SetData(aString);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // qi the data object an |nsISupports| so that when the transferable holds
+ // onto it, it will addref the correct interface.
+ nsCOMPtr<nsISupports> genericData(do_QueryInterface(data, &rv));
+ NS_ENSURE_SUCCESS(rv, rv);
+ NS_ENSURE_TRUE(genericData, NS_ERROR_FAILURE);
+
+ // set the transfer data
+ rv = trans->SetTransferData(kUnicodeMime, genericData);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // put the transferable on the clipboard
+ rv = clipboard->SetData(trans, nullptr, aClipboardID);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboardHelper::CopyString(const nsAString& aString) {
+ nsresult rv;
+
+ // copy to the global clipboard. it's bad if this fails in any way.
+ rv = CopyStringToClipboard(aString, nsIClipboard::kGlobalClipboard);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // unix also needs us to copy to the selection clipboard. this will
+ // fail in CopyStringToClipboard if we're not on a platform that
+ // supports the selection clipboard. (this could have been #ifdef
+ // XP_UNIX, but using the SupportsSelectionClipboard call is the
+ // more correct thing to do.
+ //
+ // if this fails in any way other than "not being unix", we'll get
+ // the assertion we need in CopyStringToClipboard, and we needn't
+ // assert again here.
+ CopyStringToClipboard(aString, nsIClipboard::kSelectionClipboard);
+
+ return NS_OK;
+}