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(
const IPCDataTransfer& aDataTransfer, bool aAddDataFlavor,
nsITransferable* aTransferable) {
nsITransferable* aTransferable, const bool aFilterUnknownFlavors) {
nsresult rv;
const nsTArray<IPCDataTransferItem>& items = aDataTransfer.items();
for (const auto& item : items) {
if (aFilterUnknownFlavors && !IPCDataTransferItemHasKnownFlavor(item)) {
NS_WARNING(
"Ignoring unknown flavor in "
"nsContentUtils::IPCTransferableToTransferable");
continue;
}
if (aAddDataFlavor) {
aTransferable->AddDataFlavor(item.flavor().get());
}
@@ -7836,11 +7861,11 @@ nsresult nsContentUtils::IPCTransferableToTransferable(
const IPCDataTransfer& aDataTransfer, const bool& aIsPrivateData,
nsIPrincipal* aRequestingPrincipal,
const nsContentPolicyType& aContentPolicyType, bool aAddDataFlavor,
nsITransferable* aTransferable) {
nsITransferable* aTransferable, const bool aFilterUnknownFlavors) {
aTransferable->SetIsPrivateData(aIsPrivateData);
nsresult rv = IPCTransferableToTransferable(aDataTransfer, aAddDataFlavor,
aTransferable);
aTransferable, aFilterUnknownFlavors);
NS_ENSURE_SUCCESS(rv, rv);
aTransferable->SetRequestingPrincipal(aRequestingPrincipal);

View File

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

View File

@@ -888,29 +888,6 @@ already_AddRefed<nsITransferable> DataTransfer::GetTransferable(
const uint32_t baseLength = sizeof(uint32_t) + 1;
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
* 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.
bool isCustomFormat = true;
for (uint32_t f = 0; f < ArrayLength(knownFormats); f++) {
if (type.EqualsASCII(knownFormats[f])) {
for (const char* format : kKnownFormats) {
if (type.EqualsASCII(format)) {
isCustomFormat = false;
break;
}

View File

@@ -393,6 +393,30 @@ class DataTransfer final : public nsISupports, public nsWrapperCache {
bool aPlainTextOnly,
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:
// caches text and uri-list data formats that exist in the drag service or
// clipboard for retrieval later.

View File

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

View File

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

View File

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

View File

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