diff --git a/widget/android/nsWindow.cpp b/widget/android/nsWindow.cpp index 9e59a4000ee1..fceb57587f63 100644 --- a/widget/android/nsWindow.cpp +++ b/widget/android/nsWindow.cpp @@ -2701,12 +2701,9 @@ void nsWindow::OnDragEvent(int32_t aAction, int64_t aTime, float aX, float aY, if (message == eDragEnter) { nsIWidget* widget = this; - dragService->StartDragSession(widget); - // For compatibility, we have to set temporary data. dragSession = - static_cast(dragService->GetCurrentSession(this)); - MOZ_ASSERT(dragSession); - + static_cast(dragService->StartDragSession(widget)); + // For compatibility, we have to set temporary data. auto dropData = mozilla::java::GeckoDragAndDrop::DropData::Ref::From(aDropData); dragSession->SetDropData(dropData); diff --git a/widget/cocoa/nsChildView.mm b/widget/cocoa/nsChildView.mm index a5bae195c863..7ec96a46a4b7 100644 --- a/widget/cocoa/nsChildView.mm +++ b/widget/cocoa/nsChildView.mm @@ -4126,13 +4126,14 @@ static gfx::IntPoint GetIntegerDeltaForEvent(NSEvent* aEvent) { if (!mDragService) return NSDragOperationNone; } + nsCOMPtr dragSession; if (aMessage == eDragEnter) { nsIWidget* widget = mGeckoChild; - mDragService->StartDragSession(widget); + dragSession = mDragService->StartDragSession(widget); + } else { + dragSession = mDragService->GetCurrentSession(mGeckoChild); } - nsCOMPtr dragSession = - mDragService->GetCurrentSession(mGeckoChild); if (dragSession) { if (aMessage == eDragOver) { // fire the drag event at the source. Just ignore whether it was diff --git a/widget/gtk/nsDragService.cpp b/widget/gtk/nsDragService.cpp index 6723c24d5dd5..54cfd21e9080 100644 --- a/widget/gtk/nsDragService.cpp +++ b/widget/gtk/nsDragService.cpp @@ -901,8 +901,7 @@ bool nsDragSession::SetAlphaPixmap(SourceSurface* aSurface, return true; } -NS_IMETHODIMP -nsDragService::StartDragSession(nsISupports* aWidgetProvider) { +nsIDragSession* nsDragService::StartDragSession(nsISupports* aWidgetProvider) { LOGDRAGSERVICE("nsDragService::StartDragSession"); return nsBaseDragService::StartDragSession(aWidgetProvider); } diff --git a/widget/gtk/nsDragService.h b/widget/gtk/nsDragService.h index 37937ae8c931..043ca73333da 100644 --- a/widget/gtk/nsDragService.h +++ b/widget/gtk/nsDragService.h @@ -391,7 +391,7 @@ class nsDragSession : public nsBaseDragSession, public nsIObserver { class nsDragService : public nsBaseDragService { public: static already_AddRefed GetInstance(); - NS_IMETHOD StartDragSession(nsISupports* aWidgetProvider) override; + nsIDragSession* StartDragSession(nsISupports* aWidgetProvider) override; protected: already_AddRefed CreateDragSession() override; diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp index e5ab81f7f779..640ceaa62ac0 100644 --- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -8718,9 +8718,8 @@ gboolean WindowDragMotionHandler(GtkWidget* aWidget, if (!dragSession) { // This may be the start of an external drag session. nsIWidget* widget = window; - static_cast(dragService->StartDragSession(widget)); dragSession = - static_cast(dragService->GetCurrentSession(window)); + static_cast(dragService->StartDragSession(widget)); } NS_ENSURE_TRUE(dragSession, FALSE); diff --git a/widget/nsBaseDragService.cpp b/widget/nsBaseDragService.cpp index a8b40817a77c..7e99d9ebaa3d 100644 --- a/widget/nsBaseDragService.cpp +++ b/widget/nsBaseDragService.cpp @@ -614,21 +614,18 @@ nsBaseDragService::GetCurrentSession(nsISupports* aWidgetProvider, } //------------------------------------------------------------------------- -NS_IMETHODIMP -nsBaseDragService::StartDragSession(nsISupports* aWidgetProvider) { +nsIDragSession* nsBaseDragService::StartDragSession(nsISupports* aWidgetProvider) { MOZ_ASSERT(XRE_IsParentProcess()); if (!aWidgetProvider) { - return NS_ERROR_NULL_POINTER; + return nullptr; } if (mCurrentParentDragSession) { - return NS_ERROR_ALREADY_INITIALIZED; + return mCurrentParentDragSession; } RefPtr session = CreateDragSession(); - if (XRE_IsParentProcess()) { - mCurrentParentDragSession = session; - } - return NS_OK; + mCurrentParentDragSession = session; + return session; } NS_IMETHODIMP @@ -644,11 +641,7 @@ NS_IMETHODIMP nsBaseDragService::StartDragSessionForTests( // This method must set mSessionIsSynthesizedForTests MOZ_ASSERT(!mNeverAllowSessionIsSynthesizedForTests); - nsresult rv = StartDragSession(aWidgetProvider); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr session; - GetCurrentSession(aWidgetProvider, getter_AddRefs(session)); + RefPtr session = StartDragSession(aWidgetProvider); MOZ_ASSERT(session); session->InitForTests(aAllowedEffect); return NS_OK; diff --git a/widget/nsDragServiceProxy.cpp b/widget/nsDragServiceProxy.cpp index f21574410bbb..cff2b00344c8 100644 --- a/widget/nsDragServiceProxy.cpp +++ b/widget/nsDragServiceProxy.cpp @@ -118,23 +118,23 @@ nsresult nsDragSessionProxy::InvokeDragSessionImpl( return NS_OK; } -NS_IMETHODIMP +nsIDragSession* nsDragServiceProxy::StartDragSession(nsISupports* aWidgetProvider) { nsIWidget* widget = GetWidgetFromWidgetProvider(aWidgetProvider); - NS_ENSURE_TRUE(widget, NS_ERROR_INVALID_ARG); + NS_ENSURE_TRUE(widget, nullptr); BrowserChild* targetBrowser = widget->GetOwningBrowserChild(); - NS_ENSURE_TRUE(targetBrowser, NS_ERROR_INVALID_ARG); + NS_ENSURE_TRUE(targetBrowser, nullptr); RefPtr session = targetBrowser->GetDragSession(); if (session) { // session already exists on the browser - return NS_OK; + return session; } session = CreateDragSession(); MOZ_ASSERT(session); static_cast(session.get())->SetDragTarget(targetBrowser); targetBrowser->SetDragSession(session); - return NS_OK; + return session; } NS_IMETHODIMP diff --git a/widget/nsDragServiceProxy.h b/widget/nsDragServiceProxy.h index 5cda4de6ffb4..3db978a1317b 100644 --- a/widget/nsDragServiceProxy.h +++ b/widget/nsDragServiceProxy.h @@ -45,7 +45,7 @@ class nsDragServiceProxy : public nsBaseDragService { already_AddRefed CreateDragSession() override; - NS_IMETHOD StartDragSession(nsISupports* aWidgetProvider) override; + nsIDragSession* StartDragSession(nsISupports* aWidgetProvider) override; NS_IMETHOD GetCurrentSession(nsISupports* aWidgetProvider, nsIDragSession** aSession) override; diff --git a/widget/nsIDragService.idl b/widget/nsIDragService.idl index 096591037cbe..2cc5031c3d4a 100644 --- a/widget/nsIDragService.idl +++ b/widget/nsIDragService.idl @@ -143,9 +143,10 @@ interface nsIDragService : nsISupports * @param aWidgetProvider Either the nsIWidget that will be the target of * the drag, or an nsIDOMWindowProxy for a * window that is on that widget. + * @returns the new (or pre-existing) session */ - [noscript] - void startDragSession(in nsISupports aWidgetProvider); + [notxpcom, nostdcall] + nsIDragSession startDragSession(in nsISupports aWidgetProvider); /** * Similar to startDragSession(), automated tests may want to start diff --git a/widget/windows/nsNativeDragTarget.cpp b/widget/windows/nsNativeDragTarget.cpp index 6f487cd196dd..ef60457e0173 100644 --- a/widget/windows/nsNativeDragTarget.cpp +++ b/widget/windows/nsNativeDragTarget.cpp @@ -249,7 +249,9 @@ nsNativeDragTarget::DragEnter(LPDATAOBJECT pIDataSource, DWORD grfKeyState, // tell the drag service about this drag (it may have come from an // outside app). - mDragService->StartDragSession(mWidget); + RefPtr session = + static_cast(mDragService->StartDragSession(mWidget)); + MOZ_ASSERT(session); void* tempOutData = nullptr; uint32_t tempDataLen = 0; @@ -264,9 +266,7 @@ nsNativeDragTarget::DragEnter(LPDATAOBJECT pIDataSource, DWORD grfKeyState, mEffectsPreferred = DROPEFFECT_NONE; } - // Set the native data object into drag service - RefPtr session = - static_cast(mDragService->GetCurrentSession(mWidget)); + // Set the native data object into drag session session->SetIDataObject(pIDataSource); // Now process the native drag state and then dispatch the event