summaryrefslogtreecommitdiffstats
path: root/widget/android/nsClipboard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'widget/android/nsClipboard.cpp')
-rw-r--r--widget/android/nsClipboard.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/widget/android/nsClipboard.cpp b/widget/android/nsClipboard.cpp
new file mode 100644
index 000000000..5d70ae16b
--- /dev/null
+++ b/widget/android/nsClipboard.cpp
@@ -0,0 +1,123 @@
+/* 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"
+#include "nsClipboard.h"
+#include "nsISupportsPrimitives.h"
+#include "AndroidBridge.h"
+#include "nsCOMPtr.h"
+#include "nsComponentManagerUtils.h"
+#include "nsXULAppAPI.h"
+
+using namespace mozilla;
+using mozilla::dom::ContentChild;
+
+NS_IMPL_ISUPPORTS(nsClipboard, nsIClipboard)
+
+/* The Android clipboard only supports text and doesn't support mime types
+ * so we assume all clipboard data is text/unicode for now. Documentation
+ * indicates that support for other data types is planned for future
+ * releases.
+ */
+
+nsClipboard::nsClipboard()
+{
+}
+
+NS_IMETHODIMP
+nsClipboard::SetData(nsITransferable *aTransferable,
+ nsIClipboardOwner *anOwner, int32_t aWhichClipboard)
+{
+ if (aWhichClipboard != kGlobalClipboard)
+ return NS_ERROR_NOT_IMPLEMENTED;
+
+ nsCOMPtr<nsISupports> tmp;
+ uint32_t len;
+ nsresult rv = aTransferable->GetTransferData(kUnicodeMime, getter_AddRefs(tmp),
+ &len);
+ NS_ENSURE_SUCCESS(rv, rv);
+ nsCOMPtr<nsISupportsString> supportsString = do_QueryInterface(tmp);
+ // No support for non-text data
+ NS_ENSURE_TRUE(supportsString, NS_ERROR_NOT_IMPLEMENTED);
+ nsAutoString buffer;
+ supportsString->GetData(buffer);
+
+ java::Clipboard::SetText(buffer);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboard::GetData(nsITransferable *aTransferable, int32_t aWhichClipboard)
+{
+ if (aWhichClipboard != kGlobalClipboard)
+ return NS_ERROR_NOT_IMPLEMENTED;
+
+ nsAutoString buffer;
+ if (!AndroidBridge::Bridge())
+ return NS_ERROR_NOT_IMPLEMENTED;
+ if (!AndroidBridge::Bridge()->GetClipboardText(buffer))
+ return NS_ERROR_UNEXPECTED;
+
+ nsresult rv;
+ nsCOMPtr<nsISupportsString> dataWrapper =
+ do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = dataWrapper->SetData(buffer);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // If our data flavor has already been added, this will fail. But we don't care
+ aTransferable->AddDataFlavor(kUnicodeMime);
+
+ nsCOMPtr<nsISupports> nsisupportsDataWrapper =
+ do_QueryInterface(dataWrapper);
+ rv = aTransferable->SetTransferData(kUnicodeMime, nsisupportsDataWrapper,
+ buffer.Length() * sizeof(char16_t));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboard::EmptyClipboard(int32_t aWhichClipboard)
+{
+ if (aWhichClipboard != kGlobalClipboard)
+ return NS_ERROR_NOT_IMPLEMENTED;
+ java::Clipboard::ClearText();
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboard::HasDataMatchingFlavors(const char **aFlavorList,
+ uint32_t aLength, int32_t aWhichClipboard,
+ bool *aHasText)
+{
+ *aHasText = false;
+ if (aWhichClipboard != kGlobalClipboard)
+ return NS_ERROR_NOT_IMPLEMENTED;
+
+ for (uint32_t k = 0; k < aLength; k++) {
+ if (strcmp(aFlavorList[k], kUnicodeMime) == 0) {
+ *aHasText = java::Clipboard::HasText();
+ break;
+ }
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboard::SupportsSelectionClipboard(bool *aIsSupported)
+{
+ *aIsSupported = false;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsClipboard::SupportsFindClipboard(bool* _retval)
+{
+ *_retval = false;
+ return NS_OK;
+}