Bug 1799156 - Filter unknown DataTransferItem flavors. r=nika

Differential Revision: https://phabricator.services.mozilla.com/D161487
This commit is contained in:
Tom Schuster
2022-11-21 10:18:38 +00:00
parent a39b770ecc
commit 4a41fcbbbd
8 changed files with 72 additions and 34 deletions

View File

@@ -7761,12 +7761,37 @@ void nsContentUtils::SetKeyboardIndicatorsOnRemoteChildren(
}); });
} }
bool nsContentUtils::IPCDataTransferItemHasKnownFlavor(
const IPCDataTransferItem& aItem) {
// Unknown types are converted to kCustomTypesMime.
// FIXME(bug 1776879) text/plain is converted to text/unicode still.
if (aItem.flavor().EqualsASCII(kCustomTypesMime) ||
aItem.flavor().EqualsASCII(kUnicodeMime)) {
return true;
}
for (const char* format : DataTransfer::kKnownFormats) {
if (aItem.flavor().EqualsASCII(format)) {
return true;
}
}
return false;
}
nsresult nsContentUtils::IPCTransferableToTransferable( nsresult nsContentUtils::IPCTransferableToTransferable(
const IPCDataTransfer& aDataTransfer, bool aAddDataFlavor, const IPCDataTransfer& aDataTransfer, bool aAddDataFlavor,
nsITransferable* aTransferable) { nsITransferable* aTransferable, const bool aFilterUnknownFlavors) {
nsresult rv; nsresult rv;
const nsTArray<IPCDataTransferItem>& items = aDataTransfer.items(); const nsTArray<IPCDataTransferItem>& items = aDataTransfer.items();
for (const auto& item : items) { for (const auto& item : items) {
if (aFilterUnknownFlavors && !IPCDataTransferItemHasKnownFlavor(item)) {
NS_WARNING(
"Ignoring unknown flavor in "
"nsContentUtils::IPCTransferableToTransferable");
continue;
}
if (aAddDataFlavor) { if (aAddDataFlavor) {
aTransferable->AddDataFlavor(item.flavor().get()); aTransferable->AddDataFlavor(item.flavor().get());
} }
@@ -7836,11 +7861,11 @@ nsresult nsContentUtils::IPCTransferableToTransferable(
const IPCDataTransfer& aDataTransfer, const bool& aIsPrivateData, const IPCDataTransfer& aDataTransfer, const bool& aIsPrivateData,
nsIPrincipal* aRequestingPrincipal, nsIPrincipal* aRequestingPrincipal,
const nsContentPolicyType& aContentPolicyType, bool aAddDataFlavor, const nsContentPolicyType& aContentPolicyType, bool aAddDataFlavor,
nsITransferable* aTransferable) { nsITransferable* aTransferable, const bool aFilterUnknownFlavors) {
aTransferable->SetIsPrivateData(aIsPrivateData); aTransferable->SetIsPrivateData(aIsPrivateData);
nsresult rv = IPCTransferableToTransferable(aDataTransfer, aAddDataFlavor, nsresult rv = IPCTransferableToTransferable(aDataTransfer, aAddDataFlavor,
aTransferable); aTransferable, aFilterUnknownFlavors);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
aTransferable->SetRequestingPrincipal(aRequestingPrincipal); aTransferable->SetRequestingPrincipal(aRequestingPrincipal);

View File

@@ -2872,15 +2872,18 @@ class nsContentUtils {
*/ */
static bool IsFlavorImage(const nsACString& aFlavor); static bool IsFlavorImage(const nsACString& aFlavor);
static bool IPCDataTransferItemHasKnownFlavor(
const mozilla::dom::IPCDataTransferItem& aItem);
static nsresult IPCTransferableToTransferable( static nsresult IPCTransferableToTransferable(
const mozilla::dom::IPCDataTransfer& aDataTransfer, bool aAddDataFlavor, const mozilla::dom::IPCDataTransfer& aDataTransfer, bool aAddDataFlavor,
nsITransferable* aTransferable); nsITransferable* aTransferable, const bool aFilterUnknownFlavors);
static nsresult IPCTransferableToTransferable( static nsresult IPCTransferableToTransferable(
const mozilla::dom::IPCDataTransfer& aDataTransfer, const mozilla::dom::IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData, nsIPrincipal* aRequestingPrincipal, const bool& aIsPrivateData, nsIPrincipal* aRequestingPrincipal,
const nsContentPolicyType& aContentPolicyType, bool aAddDataFlavor, const nsContentPolicyType& aContentPolicyType, bool aAddDataFlavor,
nsITransferable* aTransferable); nsITransferable* aTransferable, const bool aFilterUnknownFlavors);
static nsresult IPCTransferableItemToVariant( static nsresult IPCTransferableItemToVariant(
const mozilla::dom::IPCDataTransferItem& aDataTransferItem, const mozilla::dom::IPCDataTransferItem& aDataTransferItem,

View File

@@ -888,29 +888,6 @@ already_AddRefed<nsITransferable> DataTransfer::GetTransferable(
const uint32_t baseLength = sizeof(uint32_t) + 1; const uint32_t baseLength = sizeof(uint32_t) + 1;
uint32_t totalCustomLength = baseLength; uint32_t totalCustomLength = baseLength;
const char* knownFormats[] = {kTextMime,
kHTMLMime,
kNativeHTMLMime,
kRTFMime,
kURLMime,
kURLDataMime,
kURLDescriptionMime,
kURLPrivateMime,
kPNGImageMime,
kJPEGImageMime,
kGIFImageMime,
kNativeImageMime,
kFileMime,
kFilePromiseMime,
kFilePromiseURLMime,
kFilePromiseDestFilename,
kFilePromiseDirectoryMime,
kMozTextInternal,
kHTMLContext,
kHTMLInfo,
kImageRequestMime,
kPDFJSMime};
/* /*
* Two passes are made here to iterate over all of the types. First, look for * Two passes are made here to iterate over all of the types. First, look for
* any types that are not in the list of known types. For this pass, * any types that are not in the list of known types. For this pass,
@@ -946,8 +923,8 @@ already_AddRefed<nsITransferable> DataTransfer::GetTransferable(
// If the data is of one of the well-known formats, use it directly. // If the data is of one of the well-known formats, use it directly.
bool isCustomFormat = true; bool isCustomFormat = true;
for (uint32_t f = 0; f < ArrayLength(knownFormats); f++) { for (const char* format : kKnownFormats) {
if (type.EqualsASCII(knownFormats[f])) { if (type.EqualsASCII(format)) {
isCustomFormat = false; isCustomFormat = false;
break; break;
} }

View File

@@ -393,6 +393,30 @@ class DataTransfer final : public nsISupports, public nsWrapperCache {
bool aPlainTextOnly, bool aPlainTextOnly,
nsTArray<nsCString>* aResult); nsTArray<nsCString>* aResult);
// Formats that are "known" and won't be converted to the kCustomTypesMime.
static inline const char* const kKnownFormats[] = {kTextMime,
kHTMLMime,
kNativeHTMLMime,
kRTFMime,
kURLMime,
kURLDataMime,
kURLDescriptionMime,
kURLPrivateMime,
kPNGImageMime,
kJPEGImageMime,
kGIFImageMime,
kNativeImageMime,
kFileMime,
kFilePromiseMime,
kFilePromiseURLMime,
kFilePromiseDestFilename,
kFilePromiseDirectoryMime,
kMozTextInternal,
kHTMLContext,
kHTMLInfo,
kImageRequestMime,
kPDFJSMime};
protected: protected:
// caches text and uri-list data formats that exist in the drag service or // caches text and uri-list data formats that exist in the drag service or
// clipboard for retrieval later. // clipboard for retrieval later.

View File

@@ -43,6 +43,13 @@ void RemoteDragStartData::AddInitialDnDDataTo(
for (uint32_t i = 0; i < mDataTransfer.Length(); ++i) { for (uint32_t i = 0; i < mDataTransfer.Length(); ++i) {
nsTArray<IPCDataTransferItem>& itemArray = mDataTransfer[i].items(); nsTArray<IPCDataTransferItem>& itemArray = mDataTransfer[i].items();
for (auto& item : itemArray) { for (auto& item : itemArray) {
if (!nsContentUtils::IPCDataTransferItemHasKnownFlavor(item)) {
NS_WARNING(
"Ignoring unknown flavor in "
"RemoteDragStartData::AddInitialDnDDataTo");
continue;
}
RefPtr<nsVariantCC> variant = new nsVariantCC(); RefPtr<nsVariantCC> variant = new nsVariantCC();
// Special case kFilePromiseMime so that we get the right // Special case kFilePromiseMime so that we get the right
// nsIFlavorDataProvider for it. // nsIFlavorDataProvider for it.

View File

@@ -2242,7 +2242,7 @@ mozilla::ipc::IPCResult BrowserChild::RecvPasteTransferable(
rv = nsContentUtils::IPCTransferableToTransferable( rv = nsContentUtils::IPCTransferableToTransferable(
aDataTransfer, aIsPrivateData, aRequestingPrincipal, aContentPolicyType, aDataTransfer, aIsPrivateData, aRequestingPrincipal, aContentPolicyType,
true /* aAddDataFlavor */, trans); true /* aAddDataFlavor */, trans, false /* aFilterUnknownFlavors */);
NS_ENSURE_SUCCESS(rv, IPC_OK()); NS_ENSURE_SUCCESS(rv, IPC_OK());
nsCOMPtr<nsIDocShell> ourDocShell = do_GetInterface(WebNavigation()); nsCOMPtr<nsIDocShell> ourDocShell = do_GetInterface(WebNavigation());

View File

@@ -3417,7 +3417,7 @@ mozilla::ipc::IPCResult ContentParent::RecvSetClipboard(
rv = nsContentUtils::IPCTransferableToTransferable( rv = nsContentUtils::IPCTransferableToTransferable(
aDataTransfer, aIsPrivateData, aRequestingPrincipal, aContentPolicyType, aDataTransfer, aIsPrivateData, aRequestingPrincipal, aContentPolicyType,
true /* aAddDataFlavor */, trans); true /* aAddDataFlavor */, trans, true /* aFilterUnknownFlavors */);
NS_ENSURE_SUCCESS(rv, IPC_OK()); NS_ENSURE_SUCCESS(rv, IPC_OK());
clipboard->SetData(trans, nullptr, aWhichClipboard); clipboard->SetData(trans, nullptr, aWhichClipboard);

View File

@@ -57,7 +57,8 @@ nsClipboardProxy::GetData(nsITransferable* aTransferable,
ContentChild::GetSingleton()->SendGetClipboard(types, aWhichClipboard, ContentChild::GetSingleton()->SendGetClipboard(types, aWhichClipboard,
&dataTransfer); &dataTransfer);
return nsContentUtils::IPCTransferableToTransferable( return nsContentUtils::IPCTransferableToTransferable(
dataTransfer, false /* aAddDataFlavor */, aTransferable); dataTransfer, false /* aAddDataFlavor */, aTransferable,
false /* aFilterUnknownFlavors */);
} }
NS_IMETHODIMP NS_IMETHODIMP
@@ -136,7 +137,8 @@ RefPtr<GenericPromise> nsClipboardProxy::AsyncGetData(
/* resolve */ /* resolve */
[promise, transferable](const IPCDataTransfer& ipcDataTransfer) { [promise, transferable](const IPCDataTransfer& ipcDataTransfer) {
nsresult rv = nsContentUtils::IPCTransferableToTransferable( nsresult rv = nsContentUtils::IPCTransferableToTransferable(
ipcDataTransfer, false /* aAddDataFlavor */, transferable); ipcDataTransfer, false /* aAddDataFlavor */, transferable,
false /* aFilterUnknownFlavors */);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
promise->Reject(rv, __func__); promise->Reject(rv, __func__);
return; return;