This patch does the following: * It adds nsITransferable::Init(nsILoadContext*). The load context might be null, which means that the transferable is non-private, but if it's non-null, we extract the boolean value for the privacy mode and store it in the transferable. * It adds checks in debug builds to make sure that Init is always called, in form of fatal assertions. * It adds nsIDOMDocument* agruments to nsIClipboardHelper methods which represent the document that the string is coming from. nsIClipboardHelper implementation internally gets the nsILoadContext from that and passes it on to the transferable upon creation. The reason that I did this was that nsIClipboardHelper is supposed to be a high-level helper, and in most of its call sites, we have easy access to a document object. * It modifies all of the call sites of the above interfaces according to this change. * It adds a GetLoadContext helper to nsIDocument to help with changing the call sites.
127 lines
4.1 KiB
C++
127 lines
4.1 KiB
C++
/* -*- 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 "nsIServiceManager.h"
|
|
|
|
// helpers
|
|
#include "nsIClipboard.h"
|
|
#include "nsITransferable.h"
|
|
#include "nsReadableUtils.h"
|
|
#include "nsIDocument.h"
|
|
|
|
NS_IMPL_ISUPPORTS1(nsClipboardHelper, nsIClipboardHelper)
|
|
|
|
/*****************************************************************************
|
|
* nsClipboardHelper ctor / dtor
|
|
*****************************************************************************/
|
|
|
|
nsClipboardHelper::nsClipboardHelper()
|
|
{
|
|
}
|
|
|
|
nsClipboardHelper::~nsClipboardHelper()
|
|
{
|
|
// no members, nothing to destroy
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* nsIClipboardHelper methods
|
|
*****************************************************************************/
|
|
|
|
NS_IMETHODIMP
|
|
nsClipboardHelper::CopyStringToClipboard(const nsAString& aString,
|
|
nsIDOMDocument* aDocument,
|
|
PRInt32 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);
|
|
|
|
// 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) {
|
|
bool clipboardSupported;
|
|
rv = clipboard->SupportsSelectionClipboard(&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);
|
|
|
|
nsCOMPtr<nsIDocument> doc = do_QueryInterface(aDocument);
|
|
nsILoadContext* loadContext = doc ? doc->GetLoadContext() : nsnull;
|
|
trans->Init(loadContext);
|
|
|
|
// 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,
|
|
aString.Length() * 2);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
// put the transferable on the clipboard
|
|
rv = clipboard->SetData(trans, nsnull, aClipboardID);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsClipboardHelper::CopyString(const nsAString& aString, nsIDOMDocument* aDocument)
|
|
{
|
|
nsresult rv;
|
|
|
|
// copy to the global clipboard. it's bad if this fails in any way.
|
|
rv = CopyStringToClipboard(aString, aDocument, 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, aDocument, nsIClipboard::kSelectionClipboard);
|
|
|
|
return NS_OK;
|
|
}
|