From c3f9a9042c2328f270d38d9d2c1655c2eee49335 Mon Sep 17 00:00:00 2001 From: Mirko Brodesser Date: Wed, 23 Sep 2020 14:46:20 +0000 Subject: [PATCH] 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 --- editor/libeditor/HTMLEditorDataTransfer.cpp | 88 ++++++++++++--------- widget/nsITransferable.idl | 3 +- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/editor/libeditor/HTMLEditorDataTransfer.cpp b/editor/libeditor/HTMLEditorDataTransfer.cpp index e8ec05b01efa..b2e02894af36 100644 --- a/editor/libeditor/HTMLEditorDataTransfer.cpp +++ b/editor/libeditor/HTMLEditorDataTransfer.cpp @@ -1070,6 +1070,8 @@ class MOZ_STACK_CLASS HTMLEditor::HTMLTransferablePreparer { nsresult Run(); private: + void AddDataFlavorsInBestOrder(nsITransferable& aTransferable) const; + const HTMLEditor& mHTMLEditor; nsITransferable** mTransferable; }; @@ -1106,96 +1108,102 @@ nsresult HTMLEditor::HTMLTransferablePreparer::Run() { RefPtr destdoc = mHTMLEditor.GetDocument(); nsILoadContext* loadContext = destdoc ? destdoc->GetLoadContext() : nullptr; DebugOnly rvIgnored = transferable->Init(loadContext); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "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 // we want to get out of the transferable // This should only happen in html editors, not plaintext if (!mHTMLEditor.IsPlaintextEditor()) { - rvIgnored = transferable->AddDataFlavor(kNativeHTMLMime); + nsresult rvIgnored = aTransferable.AddDataFlavor(kNativeHTMLMime); NS_WARNING_ASSERTION( - NS_SUCCEEDED(rv), + NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kNativeHTMLMime) failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kHTMLMime); + rvIgnored = aTransferable.AddDataFlavor(kHTMLMime); NS_WARNING_ASSERTION( - NS_SUCCEEDED(rv), + NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kHTMLMime) failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kFileMime); + rvIgnored = aTransferable.AddDataFlavor(kFileMime); NS_WARNING_ASSERTION( - NS_SUCCEEDED(rv), + NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kFileMime) failed, but ignored"); switch (Preferences::GetInt("clipboard.paste_image_type", 1)) { case 0: // prefer JPEG over PNG over GIF encoding - rvIgnored = transferable->AddDataFlavor(kJPEGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kJPEGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kJPEGImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kJPGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kJPGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kJPGImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kPNGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kPNGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kPNGImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kGIFImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kGIFImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kGIFImageMime) " "failed, but ignored"); break; case 1: // prefer PNG over JPEG over GIF encoding (default) default: - rvIgnored = transferable->AddDataFlavor(kPNGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kPNGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kPNGImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kJPEGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kJPEGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kJPEGImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kJPGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kJPGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kJPGImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kGIFImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kGIFImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kGIFImageMime) " "failed, but ignored"); break; case 2: // prefer GIF over JPEG over PNG encoding - rvIgnored = transferable->AddDataFlavor(kGIFImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kGIFImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kGIFImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kJPEGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kJPEGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kJPEGImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kJPGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kJPGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kJPGImageMime) " "failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kPNGImageMime); - NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + rvIgnored = aTransferable.AddDataFlavor(kPNGImageMime); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kPNGImageMime) " "failed, but ignored"); break; } } - rvIgnored = transferable->AddDataFlavor(kUnicodeMime); + nsresult rvIgnored = aTransferable.AddDataFlavor(kUnicodeMime); NS_WARNING_ASSERTION( - NS_SUCCEEDED(rv), + NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kUnicodeMime) failed, but ignored"); - rvIgnored = transferable->AddDataFlavor(kMozTextInternal); + rvIgnored = aTransferable.AddDataFlavor(kMozTextInternal); NS_WARNING_ASSERTION( - NS_SUCCEEDED(rv), + NS_SUCCEEDED(rvIgnored), "nsITransferable::AddDataFlavor(kMozTextInternal) failed, but ignored"); - - transferable.forget(mTransferable); - - return NS_OK; } bool FindIntegerAfterString(const char* aLeadingString, const nsCString& aCStr, @@ -1688,6 +1696,8 @@ nsresult HTMLEditor::InsertFromTransferable(nsITransferable* aTransferable, bool aDoDeleteSelection) { nsAutoCString bestFlavor; nsCOMPtr genericDataObj; + + // See `HTMLTransferablePreparer::AddDataFlavorsInBestOrder`. nsresult rv = aTransferable->GetAnyTransferData( bestFlavor, getter_AddRefs(genericDataObj)); NS_WARNING_ASSERTION( diff --git a/widget/nsITransferable.idl b/widget/nsITransferable.idl index 203e200d563e..3b4a91db6fcf 100644 --- a/widget/nsITransferable.idl +++ b/widget/nsITransferable.idl @@ -132,8 +132,7 @@ interface nsITransferable : nsISupports [must_use] void getTransferData(in string aFlavor, out nsISupports aData); /** - * Returns the best flavor in the transferable, given those that have - * been added to it with |AddFlavor()| + * Returns the first flavor which has data. * * @param aFlavor (out parameter) the flavor of data that was retrieved * @param aData the data. Some variant of class in nsISupportsPrimitives.idl