diff --git a/widget/gtk/nsDragService.h b/widget/gtk/nsDragService.h
--- a/widget/gtk/nsDragService.h
+++ b/widget/gtk/nsDragService.h
@@ -328,21 +328,17 @@
   void SourceBeginDrag(GdkDragContext* aContext);
 
   // set the drag icon during drag-begin
   void SetDragIcon(GdkDragContext* aContext);
 
-  void MarkAsActive();
-  bool IsActive() const;
-  RefPtr<GdkDragContext> GetSourceDragContext();
+  void MarkAsActive() { mActive = true; }
+  bool IsActive() const { return mActive; }
 
  protected:
   virtual ~nsDragSession();
 
  private:
-  // Used to cancel initiated D&D operation from nsWindow.
-  RefPtr<GdkDragContext> mSourceDragContext;
-
   // target/destination side vars
   // These variables keep track of the state of the current drag.
 
   // mCachedDragData/mCachedDragFlavors are tied to mCachedDragContext.
   // mCachedDragContext is not ref counted and may be already deleted
@@ -367,10 +363,13 @@
 
   // source side vars
 
   // the source of our drags
   GtkWidget* mHiddenWidget;
+  // Workaround for Bug 1979719. We consider D&D session running only after
+  // first "move" event on Wayland.
+  bool mActive = false;
 
   // get a list of the sources in gtk's format
   GtkTargetList* GetSourceList(void);
 
   // attempts to create a semi-transparent drag image. Returns TRUE if
diff --git a/widget/gtk/nsDragService.cpp b/widget/gtk/nsDragService.cpp
--- a/widget/gtk/nsDragService.cpp
+++ b/widget/gtk/nsDragService.cpp
@@ -562,10 +562,13 @@
   g_signal_connect(mHiddenWidget, "drag-failed",
                    G_CALLBACK(invisibleSourceDragFailed), this);
 
   // set up our logging module
   mTempFileTimerID = 0;
+#ifdef MOZ_X11
+  mActive = widget::GdkIsX11Display();
+#endif
 
   static std::once_flag onceFlag;
   std::call_once(onceFlag, [] {
     sJPEGImageMimeAtom = gdk_atom_intern(kJPEGImageMime, FALSE);
     sJPGImageMimeAtom = gdk_atom_intern(kJPGImageMime, FALSE);
@@ -2414,13 +2417,10 @@
   nsresult rv = transferable->FlavorsTransferableCanImport(flavors);
   if (NS_FAILED(rv)) {
     LOGDRAGSERVICE("  FlavorsTransferableCanImport failed!");
     return;
   }
-  if (widget::GdkIsWaylandDisplay()) {
-    mSourceDragContext = aContext;
-  }
 
   for (uint32_t i = 0; i < flavors.Length(); ++i) {
     if (flavors[i].EqualsLiteral(kFilePromiseDestFilename)) {
       nsCOMPtr<nsISupports> data;
       rv = transferable->GetTransferData(kFilePromiseDestFilename,
@@ -2530,18 +2530,10 @@
   } else {
     LOGDRAGSERVICE("  Surface is missing!");
   }
 }
 
-void nsDragSession::MarkAsActive() { mSourceDragContext = nullptr; }
-
-bool nsDragSession::IsActive() const { return !!mSourceDragContext; }
-
-RefPtr<GdkDragContext> nsDragSession::GetSourceDragContext() {
-  return mSourceDragContext;
-}
-
 static void invisibleSourceDragBegin(GtkWidget* aWidget,
                                      GdkDragContext* aContext, gpointer aData) {
   LOGDRAGSERVICESTATIC("invisibleSourceDragBegin (%p)", aContext);
   nsDragSession* dragSession = (nsDragSession*)aData;
 
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
--- a/widget/gtk/nsWindow.cpp
+++ b/widget/gtk/nsWindow.cpp
@@ -7534,28 +7534,20 @@
   if (!dragService) {
     return;
   }
   nsCOMPtr<nsIDragSession> currentDragSession =
       dragService->GetCurrentSession(aWindow);
-
-  RefPtr<nsDragSession> session =
-      currentDragSession ? static_cast<nsDragSession*>(currentDragSession.get())
-                         : nullptr;
-  if (!session || session->IsActive()) {
+  if (!currentDragSession ||
+      static_cast<nsDragSession*>(currentDragSession.get())->IsActive()) {
     return;
   }
 
   LOGDRAG("WaylandDragWorkaround applied, quit D&D session");
   NS_WARNING(
       "Quit unfinished Wayland Drag and Drop operation. Buggy Wayland "
       "compositor?");
-
-  nsDragSession::AutoEventLoop loop(session);
-  session->SetCanDrop(false);
-  session->SetDragAction(nsIDragService::DRAGDROP_ACTION_NONE);
-  session->ScheduleDropEvent(aWindow, session->GetSourceDragContext().get(),
-                             LayoutDeviceIntPoint(), 0);
+  currentDragSession->EndDragSession(true, 0);
 }
 
 static nsWindow* get_window_for_gtk_widget(GtkWidget* widget) {
   gpointer user_data = g_object_get_data(G_OBJECT(widget), "nsWindow");
   return static_cast<nsWindow*>(user_data);

