churchyard / rpms / firefox

Forked from rpms/firefox 3 years ago
Clone
Blob Blame History Raw
changeset:   563258:ed4b271af277
tag:         tip
parent:      563255:2c9db4cd3d89
user:        stransky <stransky@redhat.com>
date:        Tue Dec 22 11:03:28 2020 +0100
files:       widget/gtk/nsClipboardWayland.cpp widget/gtk/nsClipboardWayland.h
description:
Bug 1631061 [Wayland] Remove fast track clipboard and always ask compositor for clipboard data, r?rmader

Differential Revision: https://phabricator.services.mozilla.com/D100317


diff --git a/widget/gtk/nsClipboardWayland.cpp b/widget/gtk/nsClipboardWayland.cpp
--- a/widget/gtk/nsClipboardWayland.cpp
+++ b/widget/gtk/nsClipboardWayland.cpp
@@ -749,7 +749,6 @@ nsRetrievalContextWayland::nsRetrievalCo
       mClipboardOffer(nullptr),
       mPrimaryOffer(nullptr),
       mDragContext(nullptr),
-      mClipboardRequestNumber(0),
       mClipboardData(nullptr),
       mClipboardDataLength(0) {
   wl_data_device* dataDevice = wl_data_device_manager_get_data_device(
@@ -807,42 +806,6 @@ GdkAtom* nsRetrievalContextWayland::GetT
   return nullptr;
 }
 
-struct FastTrackClipboard {
-  FastTrackClipboard(int aClipboardRequestNumber,
-                     nsRetrievalContextWayland* aRetrievalContex)
-      : mClipboardRequestNumber(aClipboardRequestNumber),
-        mRetrievalContex(aRetrievalContex) {}
-
-  int mClipboardRequestNumber;
-  nsRetrievalContextWayland* mRetrievalContex;
-};
-
-static void wayland_clipboard_contents_received(
-    GtkClipboard* clipboard, GtkSelectionData* selection_data, gpointer data) {
-  LOGCLIP(("wayland_clipboard_contents_received() callback\n"));
-  FastTrackClipboard* fastTrack = static_cast<FastTrackClipboard*>(data);
-  fastTrack->mRetrievalContex->TransferFastTrackClipboard(
-      fastTrack->mClipboardRequestNumber, selection_data);
-  delete fastTrack;
-}
-
-void nsRetrievalContextWayland::TransferFastTrackClipboard(
-    int aClipboardRequestNumber, GtkSelectionData* aSelectionData) {
-  if (mClipboardRequestNumber == aClipboardRequestNumber) {
-    int dataLength = gtk_selection_data_get_length(aSelectionData);
-    if (dataLength > 0) {
-      mClipboardDataLength = dataLength;
-      mClipboardData = reinterpret_cast<char*>(
-          g_malloc(sizeof(char) * (mClipboardDataLength + 1)));
-      memcpy(mClipboardData, gtk_selection_data_get_data(aSelectionData),
-             sizeof(char) * mClipboardDataLength);
-      mClipboardData[mClipboardDataLength] = '\0';
-    }
-  } else {
-    NS_WARNING("Received obsoleted clipboard data!");
-  }
-}
-
 const char* nsRetrievalContextWayland::GetClipboardData(
     const char* aMimeType, int32_t aWhichClipboard, uint32_t* aContentLength) {
   NS_ASSERTION(mClipboardData == nullptr && mClipboardDataLength == 0,
@@ -851,33 +814,20 @@ const char* nsRetrievalContextWayland::G
   LOGCLIP(("nsRetrievalContextWayland::GetClipboardData [%p] mime %s\n", this,
            aMimeType));
 
-  /* If actual clipboard data is owned by us we don't need to go
-   * through Wayland but we ask Gtk+ to directly call data
-   * getter callback nsClipboard::SelectionGetEvent().
-   * see gtk_selection_convert() at gtk+/gtkselection.c.
-   */
-  GdkAtom selection = GetSelectionAtom(aWhichClipboard);
-  if (gdk_selection_owner_get(selection)) {
-    LOGCLIP(("  Internal clipboard content\n"));
-    mClipboardRequestNumber++;
-    gtk_clipboard_request_contents(
-        gtk_clipboard_get(selection), gdk_atom_intern(aMimeType, FALSE),
-        wayland_clipboard_contents_received,
-        new FastTrackClipboard(mClipboardRequestNumber, this));
+  const auto& dataOffer =
+      (GetSelectionAtom(aWhichClipboard) == GDK_SELECTION_PRIMARY)
+          ? mPrimaryOffer
+          : mClipboardOffer;
+  if (!dataOffer) {
+    // Something went wrong. We're requested to provide clipboard data
+    // but we haven't got any from wayland.
+    NS_WARNING("Requested data without valid DataOffer!");
+    if (mClipboardData) {
+      ReleaseClipboardData(mClipboardData);
+    }
   } else {
-    LOGCLIP(("  Remote clipboard content\n"));
-    const auto& dataOffer =
-        (selection == GDK_SELECTION_PRIMARY) ? mPrimaryOffer : mClipboardOffer;
-    if (!dataOffer) {
-      // Something went wrong. We're requested to provide clipboard data
-      // but we haven't got any from wayland.
-      NS_WARNING("Requested data without valid DataOffer!");
-      mClipboardData = nullptr;
-      mClipboardDataLength = 0;
-    } else {
-      mClipboardData = dataOffer->GetData(mDisplay->GetDisplay(), aMimeType,
-                                          &mClipboardDataLength);
-    }
+    mClipboardData = dataOffer->GetData(mDisplay->GetDisplay(), aMimeType,
+                                        &mClipboardDataLength);
   }
 
   *aContentLength = mClipboardDataLength;
@@ -908,8 +858,10 @@ void nsRetrievalContextWayland::ReleaseC
 
   NS_ASSERTION(aClipboardData == mClipboardData,
                "Releasing unknown clipboard data!");
-  g_free((void*)aClipboardData);
 
-  mClipboardData = nullptr;
-  mClipboardDataLength = 0;
+  if (mClipboardData) {
+    g_free((void*)aClipboardData);
+    mClipboardData = nullptr;
+    mClipboardDataLength = 0;
+  }
 }
diff --git a/widget/gtk/nsClipboardWayland.h b/widget/gtk/nsClipboardWayland.h
--- a/widget/gtk/nsClipboardWayland.h
+++ b/widget/gtk/nsClipboardWayland.h
@@ -16,8 +16,6 @@
 #include "nsClipboard.h"
 #include "nsWaylandDisplay.h"
 
-struct FastTrackClipboard;
-
 class DataOffer {
  public:
   void AddMIMEType(const char* aMimeType);
@@ -134,9 +132,6 @@ class nsRetrievalContextWayland : public
 
   void ClearDragAndDropDataOffer();
 
-  void TransferFastTrackClipboard(int aClipboardRequestNumber,
-                                  GtkSelectionData* aSelectionData);
-
   virtual ~nsRetrievalContextWayland() override;
 
  private:
@@ -149,7 +144,6 @@ class nsRetrievalContextWayland : public
   mozilla::UniquePtr<DataOffer> mPrimaryOffer;
   RefPtr<nsWaylandDragContext> mDragContext;
 
-  int mClipboardRequestNumber;
   char* mClipboardData;
   uint32_t mClipboardDataLength;