Bug 1712122 - Part 3: Cancel pending write request when a new write request is made; r=nika,geckoview-reviewers,m_kato
The Async Clipboard API now allows using arbitrary promises for passing write data,
potentially enabling websites to delay writing data to an arbitrary future, which
may surprise the user. This patch introduces a solution: a new write request will
automatically cancel any previous pending request.
To implement that, this patch introduces a new method to nsIClipboard, new XPCOM
interfaces, and new IPC to efficiently track individual write requests. Additionally,
a new helper base class, ClipboardSetDataHelper, is introduced in widget to facilitate
platform code sharing.
Differential Revision: https://phabricator.services.mozilla.com/D174090
2023-05-15 00:02:08 +03:00
|
|
|
/* -*- 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 "mozilla/ClipboardWriteRequestParent.h"
|
|
|
|
|
|
|
|
#include "mozilla/dom/ContentParent.h"
|
|
|
|
#include "mozilla/net/CookieJarSettings.h"
|
|
|
|
#include "nsComponentManagerUtils.h"
|
|
|
|
#include "nsIClipboard.h"
|
|
|
|
#include "nsITransferable.h"
|
|
|
|
#include "nsWidgetsCID.h"
|
|
|
|
|
|
|
|
static NS_DEFINE_CID(kCClipboardCID, NS_CLIPBOARD_CID);
|
|
|
|
|
|
|
|
using mozilla::dom::ContentParent;
|
|
|
|
using mozilla::ipc::IPCResult;
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS(ClipboardWriteRequestParent, nsIAsyncSetClipboardDataCallback)
|
|
|
|
|
|
|
|
ClipboardWriteRequestParent::ClipboardWriteRequestParent(
|
|
|
|
ContentParent* aManager)
|
|
|
|
: mManager(aManager) {}
|
|
|
|
|
|
|
|
ClipboardWriteRequestParent::~ClipboardWriteRequestParent() = default;
|
|
|
|
|
|
|
|
nsresult ClipboardWriteRequestParent::Init(const int32_t& aClipboardType) {
|
|
|
|
nsCOMPtr<nsIClipboard> clipboard(do_GetService(kCClipboardCID));
|
|
|
|
if (!clipboard) {
|
|
|
|
Unused << PClipboardWriteRequestParent::Send__delete__(this,
|
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult rv = clipboard->AsyncSetData(aClipboardType, this,
|
|
|
|
getter_AddRefs(mAsyncSetClipboardData));
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
Unused << PClipboardWriteRequestParent::Send__delete__(this, rv);
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP ClipboardWriteRequestParent::OnComplete(nsresult aResult) {
|
|
|
|
nsCOMPtr<nsIAsyncSetClipboardData> clipboardData =
|
|
|
|
std::move(mAsyncSetClipboardData);
|
|
|
|
if (clipboardData) {
|
|
|
|
Unused << PClipboardWriteRequestParent::Send__delete__(this, aResult);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
IPCResult ClipboardWriteRequestParent::RecvSetData(
|
2023-05-17 00:25:37 +03:00
|
|
|
const IPCTransferable& aTransferable) {
|
Bug 1712122 - Part 3: Cancel pending write request when a new write request is made; r=nika,geckoview-reviewers,m_kato
The Async Clipboard API now allows using arbitrary promises for passing write data,
potentially enabling websites to delay writing data to an arbitrary future, which
may surprise the user. This patch introduces a solution: a new write request will
automatically cancel any previous pending request.
To implement that, this patch introduces a new method to nsIClipboard, new XPCOM
interfaces, and new IPC to efficiently track individual write requests. Additionally,
a new helper base class, ClipboardSetDataHelper, is introduced in widget to facilitate
platform code sharing.
Differential Revision: https://phabricator.services.mozilla.com/D174090
2023-05-15 00:02:08 +03:00
|
|
|
if (!mManager->ValidatePrincipal(
|
2023-05-17 00:25:37 +03:00
|
|
|
aTransferable.requestingPrincipal(),
|
Bug 1712122 - Part 3: Cancel pending write request when a new write request is made; r=nika,geckoview-reviewers,m_kato
The Async Clipboard API now allows using arbitrary promises for passing write data,
potentially enabling websites to delay writing data to an arbitrary future, which
may surprise the user. This patch introduces a solution: a new write request will
automatically cancel any previous pending request.
To implement that, this patch introduces a new method to nsIClipboard, new XPCOM
interfaces, and new IPC to efficiently track individual write requests. Additionally,
a new helper base class, ClipboardSetDataHelper, is introduced in widget to facilitate
platform code sharing.
Differential Revision: https://phabricator.services.mozilla.com/D174090
2023-05-15 00:02:08 +03:00
|
|
|
{ContentParent::ValidatePrincipalOptions::AllowNullPtr})) {
|
|
|
|
ContentParent::LogAndAssertFailedPrincipalValidationInfo(
|
2023-05-17 00:25:37 +03:00
|
|
|
aTransferable.requestingPrincipal(), __func__);
|
Bug 1712122 - Part 3: Cancel pending write request when a new write request is made; r=nika,geckoview-reviewers,m_kato
The Async Clipboard API now allows using arbitrary promises for passing write data,
potentially enabling websites to delay writing data to an arbitrary future, which
may surprise the user. This patch introduces a solution: a new write request will
automatically cancel any previous pending request.
To implement that, this patch introduces a new method to nsIClipboard, new XPCOM
interfaces, and new IPC to efficiently track individual write requests. Additionally,
a new helper base class, ClipboardSetDataHelper, is introduced in widget to facilitate
platform code sharing.
Differential Revision: https://phabricator.services.mozilla.com/D174090
2023-05-15 00:02:08 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!mAsyncSetClipboardData) {
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult rv = NS_ERROR_FAILURE;
|
|
|
|
nsCOMPtr<nsITransferable> trans =
|
|
|
|
do_CreateInstance("@mozilla.org/widget/transferable;1", &rv);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
mAsyncSetClipboardData->Abort(rv);
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
|
|
|
trans->Init(nullptr);
|
2023-05-17 00:25:37 +03:00
|
|
|
rv = nsContentUtils::IPCTransferableToTransferable(
|
|
|
|
aTransferable, true /* aAddDataFlavor */, trans,
|
2023-05-17 00:25:37 +03:00
|
|
|
true /* aFilterUnknownFlavors */);
|
Bug 1712122 - Part 3: Cancel pending write request when a new write request is made; r=nika,geckoview-reviewers,m_kato
The Async Clipboard API now allows using arbitrary promises for passing write data,
potentially enabling websites to delay writing data to an arbitrary future, which
may surprise the user. This patch introduces a solution: a new write request will
automatically cancel any previous pending request.
To implement that, this patch introduces a new method to nsIClipboard, new XPCOM
interfaces, and new IPC to efficiently track individual write requests. Additionally,
a new helper base class, ClipboardSetDataHelper, is introduced in widget to facilitate
platform code sharing.
Differential Revision: https://phabricator.services.mozilla.com/D174090
2023-05-15 00:02:08 +03:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
mAsyncSetClipboardData->Abort(rv);
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
|
|
|
mAsyncSetClipboardData->SetData(trans, nullptr);
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
|
|
|
IPCResult ClipboardWriteRequestParent::Recv__delete__(nsresult aReason) {
|
2023-06-15 12:42:08 +03:00
|
|
|
#ifndef FUZZING_SNAPSHOT
|
Bug 1712122 - Part 3: Cancel pending write request when a new write request is made; r=nika,geckoview-reviewers,m_kato
The Async Clipboard API now allows using arbitrary promises for passing write data,
potentially enabling websites to delay writing data to an arbitrary future, which
may surprise the user. This patch introduces a solution: a new write request will
automatically cancel any previous pending request.
To implement that, this patch introduces a new method to nsIClipboard, new XPCOM
interfaces, and new IPC to efficiently track individual write requests. Additionally,
a new helper base class, ClipboardSetDataHelper, is introduced in widget to facilitate
platform code sharing.
Differential Revision: https://phabricator.services.mozilla.com/D174090
2023-05-15 00:02:08 +03:00
|
|
|
MOZ_DIAGNOSTIC_ASSERT(NS_FAILED(aReason));
|
2023-06-15 12:42:08 +03:00
|
|
|
#endif
|
Bug 1712122 - Part 3: Cancel pending write request when a new write request is made; r=nika,geckoview-reviewers,m_kato
The Async Clipboard API now allows using arbitrary promises for passing write data,
potentially enabling websites to delay writing data to an arbitrary future, which
may surprise the user. This patch introduces a solution: a new write request will
automatically cancel any previous pending request.
To implement that, this patch introduces a new method to nsIClipboard, new XPCOM
interfaces, and new IPC to efficiently track individual write requests. Additionally,
a new helper base class, ClipboardSetDataHelper, is introduced in widget to facilitate
platform code sharing.
Differential Revision: https://phabricator.services.mozilla.com/D174090
2023-05-15 00:02:08 +03:00
|
|
|
nsCOMPtr<nsIAsyncSetClipboardData> clipboardData =
|
|
|
|
std::move(mAsyncSetClipboardData);
|
|
|
|
if (clipboardData) {
|
|
|
|
clipboardData->Abort(aReason);
|
|
|
|
}
|
|
|
|
return IPC_OK();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ClipboardWriteRequestParent::ActorDestroy(ActorDestroyReason aReason) {
|
|
|
|
nsCOMPtr<nsIAsyncSetClipboardData> clipboardData =
|
|
|
|
std::move(mAsyncSetClipboardData);
|
|
|
|
if (clipboardData) {
|
|
|
|
clipboardData->Abort(NS_ERROR_ABORT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace mozilla
|