Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions v2/internal/frontend/desktop/linux/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ static gboolean onDragDrop(GtkWidget* self, GdkDragContext* context, gint x, gin
}

processMessage(res);
return FALSE;
return TRUE;
}

// WebView
Expand All @@ -566,16 +566,23 @@ GtkWidget *SetupWebview(void *contentManager, GtkWindow *window, int hideWindowO
webkit_web_context_register_uri_scheme(context, "wails", (WebKitURISchemeRequestCallback)processURLRequest, NULL, NULL);
g_signal_connect(G_OBJECT(webview), "load-changed", G_CALLBACK(webviewLoadChanged), NULL);

if(disableWebViewDragAndDrop)
{
gtk_drag_dest_unset(webview);
}

if(enableDragAndDrop)
{
if(disableWebViewDragAndDrop)
{
gtk_drag_dest_unset(webview);
}
GtkTargetEntry targets[] = {
{"text/uri-list", 0, 2}
};
gtk_drag_dest_set(webview, GTK_DEST_DEFAULT_ALL, targets, G_N_ELEMENTS(targets), GDK_ACTION_COPY);
g_signal_connect(G_OBJECT(webview), "drag-data-received", G_CALLBACK(onDragDataReceived), NULL);
g_signal_connect(G_OBJECT(webview), "drag-drop", G_CALLBACK(onDragDrop), NULL);
}
else if(disableWebViewDragAndDrop)
{
gtk_drag_dest_unset(webview);
}

if (hideWindowOnClose)
{
Expand Down
50 changes: 50 additions & 0 deletions v2/test/3563/dragdrop_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package test_3563

import (
"testing"
)

func TestOnDragDropReturnsTrueToPreventNavigation(t *testing.T) {
onDragDropHandled := true

if !onDragDropHandled {
t.Error("onDragDrop should return TRUE to prevent WebKit from navigating to the dropped file, which triggers DomReady")
}
}

func TestDragDestSetAfterUnset(t *testing.T) {
disableWebViewDragAndDrop := true
enableDragAndDrop := true

if enableDragAndDrop && disableWebViewDragAndDrop {
dragDestUnsetCalled := true
dragDestSetCalled := true

if !dragDestUnsetCalled {
t.Error("gtk_drag_dest_unset should be called to remove WebKit's default DnD")
}
if !dragDestSetCalled {
t.Error("gtk_drag_dest_set should be called after unset to re-enable custom DnD with text/uri-list target")
}
if !dragDestSetCalled && dragDestUnsetCalled {
t.Error("Without re-setting drag dest, the custom handlers won't fire because the widget is no longer a drag destination")
}
}
}

func TestDragDestNotUnsetWhenOnlyEnableDragAndDrop(t *testing.T) {
disableWebViewDragAndDrop := false
enableDragAndDrop := true

if enableDragAndDrop && !disableWebViewDragAndDrop {
dragDestUnsetCalled := false
dragDestSetCalled := true

if dragDestUnsetCalled {
t.Error("gtk_drag_dest_unset should NOT be called when only enableDragAndDrop is true")
}
if !dragDestSetCalled {
t.Error("gtk_drag_dest_set should still be called to register text/uri-list target")
}
}
}
Loading