diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /widget/nsClipboardHelper.cpp | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | widget/nsClipboardHelper.cpp | 124 |
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; +} |