Bug 1799156 - Filter unknown DataTransferItem flavors. r=nika
Differential Revision: https://phabricator.services.mozilla.com/D161487
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user