forked from mirrors/gecko-dev
Bug 1649121: part 94) Factor adding flavors in best order out. r=m_kato
This clarifies why the flavors are added in a certain order and why retrieving the first available one is the best one. Moreover, this enables previously, accidentally disabled `NS_WARNING_ASSERTIONS`. Differential Revision: https://phabricator.services.mozilla.com/D90883
This commit is contained in:
parent
2a0b5e8022
commit
c3f9a9042c
2 changed files with 50 additions and 41 deletions
|
|
@ -1070,6 +1070,8 @@ class MOZ_STACK_CLASS HTMLEditor::HTMLTransferablePreparer {
|
||||||
nsresult Run();
|
nsresult Run();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void AddDataFlavorsInBestOrder(nsITransferable& aTransferable) const;
|
||||||
|
|
||||||
const HTMLEditor& mHTMLEditor;
|
const HTMLEditor& mHTMLEditor;
|
||||||
nsITransferable** mTransferable;
|
nsITransferable** mTransferable;
|
||||||
};
|
};
|
||||||
|
|
@ -1106,96 +1108,102 @@ nsresult HTMLEditor::HTMLTransferablePreparer::Run() {
|
||||||
RefPtr<Document> destdoc = mHTMLEditor.GetDocument();
|
RefPtr<Document> destdoc = mHTMLEditor.GetDocument();
|
||||||
nsILoadContext* loadContext = destdoc ? destdoc->GetLoadContext() : nullptr;
|
nsILoadContext* loadContext = destdoc ? destdoc->GetLoadContext() : nullptr;
|
||||||
DebugOnly<nsresult> rvIgnored = transferable->Init(loadContext);
|
DebugOnly<nsresult> rvIgnored = transferable->Init(loadContext);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::Init() failed, but ignored");
|
"nsITransferable::Init() failed, but ignored");
|
||||||
|
|
||||||
|
// See `HTMLEditor::InsertFromTransferable`.
|
||||||
|
AddDataFlavorsInBestOrder(*transferable);
|
||||||
|
|
||||||
|
transferable.forget(mTransferable);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HTMLEditor::HTMLTransferablePreparer::AddDataFlavorsInBestOrder(
|
||||||
|
nsITransferable& aTransferable) const {
|
||||||
// Create the desired DataFlavor for the type of data
|
// Create the desired DataFlavor for the type of data
|
||||||
// we want to get out of the transferable
|
// we want to get out of the transferable
|
||||||
// This should only happen in html editors, not plaintext
|
// This should only happen in html editors, not plaintext
|
||||||
if (!mHTMLEditor.IsPlaintextEditor()) {
|
if (!mHTMLEditor.IsPlaintextEditor()) {
|
||||||
rvIgnored = transferable->AddDataFlavor(kNativeHTMLMime);
|
nsresult rvIgnored = aTransferable.AddDataFlavor(kNativeHTMLMime);
|
||||||
NS_WARNING_ASSERTION(
|
NS_WARNING_ASSERTION(
|
||||||
NS_SUCCEEDED(rv),
|
NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kNativeHTMLMime) failed, but ignored");
|
"nsITransferable::AddDataFlavor(kNativeHTMLMime) failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kHTMLMime);
|
rvIgnored = aTransferable.AddDataFlavor(kHTMLMime);
|
||||||
NS_WARNING_ASSERTION(
|
NS_WARNING_ASSERTION(
|
||||||
NS_SUCCEEDED(rv),
|
NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kHTMLMime) failed, but ignored");
|
"nsITransferable::AddDataFlavor(kHTMLMime) failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kFileMime);
|
rvIgnored = aTransferable.AddDataFlavor(kFileMime);
|
||||||
NS_WARNING_ASSERTION(
|
NS_WARNING_ASSERTION(
|
||||||
NS_SUCCEEDED(rv),
|
NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kFileMime) failed, but ignored");
|
"nsITransferable::AddDataFlavor(kFileMime) failed, but ignored");
|
||||||
|
|
||||||
switch (Preferences::GetInt("clipboard.paste_image_type", 1)) {
|
switch (Preferences::GetInt("clipboard.paste_image_type", 1)) {
|
||||||
case 0: // prefer JPEG over PNG over GIF encoding
|
case 0: // prefer JPEG over PNG over GIF encoding
|
||||||
rvIgnored = transferable->AddDataFlavor(kJPEGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kJPEGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kJPEGImageMime) "
|
"nsITransferable::AddDataFlavor(kJPEGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kJPGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kJPGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kJPGImageMime) "
|
"nsITransferable::AddDataFlavor(kJPGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kPNGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kPNGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kPNGImageMime) "
|
"nsITransferable::AddDataFlavor(kPNGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kGIFImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kGIFImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kGIFImageMime) "
|
"nsITransferable::AddDataFlavor(kGIFImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
break;
|
break;
|
||||||
case 1: // prefer PNG over JPEG over GIF encoding (default)
|
case 1: // prefer PNG over JPEG over GIF encoding (default)
|
||||||
default:
|
default:
|
||||||
rvIgnored = transferable->AddDataFlavor(kPNGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kPNGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kPNGImageMime) "
|
"nsITransferable::AddDataFlavor(kPNGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kJPEGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kJPEGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kJPEGImageMime) "
|
"nsITransferable::AddDataFlavor(kJPEGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kJPGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kJPGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kJPGImageMime) "
|
"nsITransferable::AddDataFlavor(kJPGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kGIFImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kGIFImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kGIFImageMime) "
|
"nsITransferable::AddDataFlavor(kGIFImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
break;
|
break;
|
||||||
case 2: // prefer GIF over JPEG over PNG encoding
|
case 2: // prefer GIF over JPEG over PNG encoding
|
||||||
rvIgnored = transferable->AddDataFlavor(kGIFImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kGIFImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kGIFImageMime) "
|
"nsITransferable::AddDataFlavor(kGIFImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kJPEGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kJPEGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kJPEGImageMime) "
|
"nsITransferable::AddDataFlavor(kJPEGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kJPGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kJPGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kJPGImageMime) "
|
"nsITransferable::AddDataFlavor(kJPGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kPNGImageMime);
|
rvIgnored = aTransferable.AddDataFlavor(kPNGImageMime);
|
||||||
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
|
NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kPNGImageMime) "
|
"nsITransferable::AddDataFlavor(kPNGImageMime) "
|
||||||
"failed, but ignored");
|
"failed, but ignored");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rvIgnored = transferable->AddDataFlavor(kUnicodeMime);
|
nsresult rvIgnored = aTransferable.AddDataFlavor(kUnicodeMime);
|
||||||
NS_WARNING_ASSERTION(
|
NS_WARNING_ASSERTION(
|
||||||
NS_SUCCEEDED(rv),
|
NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kUnicodeMime) failed, but ignored");
|
"nsITransferable::AddDataFlavor(kUnicodeMime) failed, but ignored");
|
||||||
rvIgnored = transferable->AddDataFlavor(kMozTextInternal);
|
rvIgnored = aTransferable.AddDataFlavor(kMozTextInternal);
|
||||||
NS_WARNING_ASSERTION(
|
NS_WARNING_ASSERTION(
|
||||||
NS_SUCCEEDED(rv),
|
NS_SUCCEEDED(rvIgnored),
|
||||||
"nsITransferable::AddDataFlavor(kMozTextInternal) failed, but ignored");
|
"nsITransferable::AddDataFlavor(kMozTextInternal) failed, but ignored");
|
||||||
|
|
||||||
transferable.forget(mTransferable);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FindIntegerAfterString(const char* aLeadingString, const nsCString& aCStr,
|
bool FindIntegerAfterString(const char* aLeadingString, const nsCString& aCStr,
|
||||||
|
|
@ -1688,6 +1696,8 @@ nsresult HTMLEditor::InsertFromTransferable(nsITransferable* aTransferable,
|
||||||
bool aDoDeleteSelection) {
|
bool aDoDeleteSelection) {
|
||||||
nsAutoCString bestFlavor;
|
nsAutoCString bestFlavor;
|
||||||
nsCOMPtr<nsISupports> genericDataObj;
|
nsCOMPtr<nsISupports> genericDataObj;
|
||||||
|
|
||||||
|
// See `HTMLTransferablePreparer::AddDataFlavorsInBestOrder`.
|
||||||
nsresult rv = aTransferable->GetAnyTransferData(
|
nsresult rv = aTransferable->GetAnyTransferData(
|
||||||
bestFlavor, getter_AddRefs(genericDataObj));
|
bestFlavor, getter_AddRefs(genericDataObj));
|
||||||
NS_WARNING_ASSERTION(
|
NS_WARNING_ASSERTION(
|
||||||
|
|
|
||||||
|
|
@ -132,8 +132,7 @@ interface nsITransferable : nsISupports
|
||||||
[must_use] void getTransferData(in string aFlavor, out nsISupports aData);
|
[must_use] void getTransferData(in string aFlavor, out nsISupports aData);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the best flavor in the transferable, given those that have
|
* Returns the first flavor which has data.
|
||||||
* been added to it with |AddFlavor()|
|
|
||||||
*
|
*
|
||||||
* @param aFlavor (out parameter) the flavor of data that was retrieved
|
* @param aFlavor (out parameter) the flavor of data that was retrieved
|
||||||
* @param aData the data. Some variant of class in nsISupportsPrimitives.idl
|
* @param aData the data. Some variant of class in nsISupportsPrimitives.idl
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue