[tbb-commits] [tor-browser] 40/46: Bug 1798160 - Avoid flushing the clipboard sync for images and files. r=smaug, a=dmeehan

gitolite role git at cupani.torproject.org
Wed Nov 16 20:43:20 UTC 2022


This is an automated email from the git hooks/post-receive script.

richard pushed a commit to branch base-browser-102.5.0esr-12.0-1
in repository tor-browser.

commit 4b795f652e487f5cc22ecc84e1e4d7a041ff9fe1
Author: Emilio Cobos Álvarez <emilio at crisal.io>
AuthorDate: Sat Oct 29 19:48:32 2022 +0000

    Bug 1798160 - Avoid flushing the clipboard sync for images and files. r=smaug, a=dmeehan
    
    Differential Revision: https://phabricator.services.mozilla.com/D160666
---
 widget/windows/nsClipboard.cpp | 67 ++++++++++++++++++++++++------------------
 widget/windows/nsClipboard.h   |  7 +++--
 2 files changed, 44 insertions(+), 30 deletions(-)

diff --git a/widget/windows/nsClipboard.cpp b/widget/windows/nsClipboard.cpp
index 87c3eac895d7..3cd1102a16da 100644
--- a/widget/windows/nsClipboard.cpp
+++ b/widget/windows/nsClipboard.cpp
@@ -126,29 +126,22 @@ UINT nsClipboard::GetFormat(const char* aMimeStr, bool aMapHTMLMime) {
 
 //-------------------------------------------------------------------------
 // static
-nsresult nsClipboard::CreateNativeDataObject(nsITransferable* aTransferable,
-                                             IDataObject** aDataObj,
-                                             nsIURI* uri) {
-  if (nullptr == aTransferable) {
+nsresult nsClipboard::CreateNativeDataObject(
+    nsITransferable* aTransferable, IDataObject** aDataObj, nsIURI* aUri,
+    MightNeedToFlush* aMightNeedToFlush) {
+  MOZ_ASSERT(aTransferable);
+  if (!aTransferable) {
     return NS_ERROR_FAILURE;
   }
 
-  // Create our native DataObject that implements
-  // the OLE IDataObject interface
-  nsDataObj* dataObj = new nsDataObj(uri);
-
-  if (!dataObj) {
-    return NS_ERROR_OUT_OF_MEMORY;
-  }
-
-  dataObj->AddRef();
+  // Create our native DataObject that implements the OLE IDataObject interface
+  RefPtr<nsDataObj> dataObj = new nsDataObj(aUri);
 
   // Now set it up with all the right data flavors & enums
-  nsresult res = SetupNativeDataObject(aTransferable, dataObj);
-  if (NS_OK == res) {
-    *aDataObj = dataObj;
-  } else {
-    dataObj->Release();
+  nsresult res =
+      SetupNativeDataObject(aTransferable, dataObj, aMightNeedToFlush);
+  if (NS_SUCCEEDED(res)) {
+    dataObj.forget(aDataObj);
   }
   return res;
 }
@@ -177,13 +170,26 @@ static nsresult StoreValueInDataObject(nsDataObj* aObj,
 }
 
 //-------------------------------------------------------------------------
-nsresult nsClipboard::SetupNativeDataObject(nsITransferable* aTransferable,
-                                            IDataObject* aDataObj) {
-  if (nullptr == aTransferable || nullptr == aDataObj) {
+nsresult nsClipboard::SetupNativeDataObject(
+    nsITransferable* aTransferable, IDataObject* aDataObj,
+    MightNeedToFlush* aMightNeedToFlush) {
+  MOZ_ASSERT(aTransferable);
+  MOZ_ASSERT(aDataObj);
+  if (!aTransferable || !aDataObj) {
     return NS_ERROR_FAILURE;
   }
 
-  nsDataObj* dObj = static_cast<nsDataObj*>(aDataObj);
+  auto* dObj = static_cast<nsDataObj*>(aDataObj);
+
+  if (aMightNeedToFlush) {
+    *aMightNeedToFlush = MightNeedToFlush::No;
+  }
+
+  auto MarkAsPotentiallyNeedingToFlush = [&] {
+    if (aMightNeedToFlush) {
+      *aMightNeedToFlush = MightNeedToFlush::Yes;
+    }
+  };
 
   // Now give the Transferable to the DataObject
   // for getting the data out of it
@@ -218,6 +224,7 @@ nsresult nsClipboard::SetupNativeDataObject(nsITransferable* aTransferable,
       FORMATETC textFE;
       SET_FORMATETC(textFE, CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL);
       dObj->AddDataFlavor(kTextMime, &textFE);
+      MarkAsPotentiallyNeedingToFlush();
     } else if (flavorStr.EqualsLiteral(kHTMLMime)) {
       // if we find text/html, also advertise win32's html flavor (which we will
       // convert on our own in nsDataObj::GetText().
@@ -225,6 +232,7 @@ nsresult nsClipboard::SetupNativeDataObject(nsITransferable* aTransferable,
       SET_FORMATETC(htmlFE, GetHtmlClipboardFormat(), 0, DVASPECT_CONTENT, -1,
                     TYMED_HGLOBAL);
       dObj->AddDataFlavor(kHTMLMime, &htmlFE);
+      MarkAsPotentiallyNeedingToFlush();
     } else if (flavorStr.EqualsLiteral(kURLMime)) {
       // if we're a url, in addition to also being text, we need to register
       // the "file" flavors so that the win32 shell knows to create an internet
@@ -247,6 +255,7 @@ nsresult nsClipboard::SetupNativeDataObject(nsITransferable* aTransferable,
       SET_FORMATETC(shortcutFE, ::RegisterClipboardFormat(CFSTR_INETURLW), 0,
                     DVASPECT_CONTENT, -1, TYMED_HGLOBAL)
       dObj->AddDataFlavor(kURLMime, &shortcutFE);
+      MarkAsPotentiallyNeedingToFlush();
     } else if (flavorStr.EqualsLiteral(kPNGImageMime) ||
                flavorStr.EqualsLiteral(kJPEGImageMime) ||
                flavorStr.EqualsLiteral(kJPGImageMime) ||
@@ -481,7 +490,7 @@ NS_IMETHODIMP nsClipboard::SetNativeClipboardData(int32_t aWhichClipboard) {
   mIgnoreEmptyNotification = true;
 
   // make sure we have a good transferable
-  if (nullptr == mTransferable) {
+  if (!mTransferable) {
     return NS_ERROR_FAILURE;
   }
 
@@ -489,12 +498,14 @@ NS_IMETHODIMP nsClipboard::SetNativeClipboardData(int32_t aWhichClipboard) {
   a11y::Compatibility::SuppressA11yForClipboardCopy();
 #endif
 
-  IDataObject* dataObj;
-  if (NS_SUCCEEDED(CreateNativeDataObject(mTransferable, &dataObj,
-                                          nullptr))) {  // this add refs dataObj
+  RefPtr<IDataObject> dataObj;
+  auto mightNeedToFlush = MightNeedToFlush::No;
+  if (NS_SUCCEEDED(CreateNativeDataObject(mTransferable,
+                                          getter_AddRefs(dataObj), nullptr,
+                                          &mightNeedToFlush))) {
     RepeatedlyTryOleSetClipboard(dataObj);
-    dataObj->Release();
-    if (ShouldFlushClipboardAfterWriting()) {
+    if (mightNeedToFlush == MightNeedToFlush::Yes &&
+        ShouldFlushClipboardAfterWriting()) {
       RepeatedlyTry(::OleFlushClipboard, [](HRESULT) {});
     }
   } else {
diff --git a/widget/windows/nsClipboard.h b/widget/windows/nsClipboard.h
index 4bd2ffbba251..75bf1765a5cf 100644
--- a/widget/windows/nsClipboard.h
+++ b/widget/windows/nsClipboard.h
@@ -40,10 +40,13 @@ class nsClipboard : public nsBaseClipboard, public nsIObserver {
   NS_IMETHOD EmptyClipboard(int32_t aWhichClipboard) override;
 
   // Internal Native Routines
+  enum class MightNeedToFlush : bool { No, Yes };
   static nsresult CreateNativeDataObject(nsITransferable* aTransferable,
-                                         IDataObject** aDataObj, nsIURI* uri);
+                                         IDataObject** aDataObj, nsIURI* aUri,
+                                         MightNeedToFlush* = nullptr);
   static nsresult SetupNativeDataObject(nsITransferable* aTransferable,
-                                        IDataObject* aDataObj);
+                                        IDataObject* aDataObj,
+                                        MightNeedToFlush* = nullptr);
   static nsresult GetDataFromDataObject(IDataObject* aDataObject, UINT anIndex,
                                         nsIWidget* aWindow,
                                         nsITransferable* aTransferable);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the tbb-commits mailing list