chore: cherry-pick 2ca6d60a from chromium (#44753)
This commit is contained in:
parent
b293c3b23f
commit
0c42bf5743
2 changed files with 98 additions and 0 deletions
|
@ -135,3 +135,4 @@ ui_add_missing_shortcut_text_for_vkey_command_on_linux.patch
|
||||||
osr_shared_texture_remove_keyed_mutex_on_win_dxgi.patch
|
osr_shared_texture_remove_keyed_mutex_on_win_dxgi.patch
|
||||||
cherry-pick-923797bac925.patch
|
cherry-pick-923797bac925.patch
|
||||||
refactor_unfilter_unresponsive_events.patch
|
refactor_unfilter_unresponsive_events.patch
|
||||||
|
wayland_support_outgoing_dnd_sessions_with_no_offered_mime_types.patch
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nick Diego Yamane <nickdiego@igalia.com>
|
||||||
|
Date: Thu, 7 Nov 2024 23:11:14 +0000
|
||||||
|
Subject: wayland: support outgoing dnd sessions with no offered mime types
|
||||||
|
|
||||||
|
Even though the Wayland spec says that dnd sessions with no accepted
|
||||||
|
mime type should always end as cancelled [1], W3C's counterpart does not
|
||||||
|
enforce such behavior [2]. In order to ensure compatibility for web
|
||||||
|
apps already relying on such behavior, this CL uses a placeholder mime
|
||||||
|
type to make it possible for outgoing drag-and-drop sessions with empty
|
||||||
|
mime types list (not set by the application) to end successfully.
|
||||||
|
|
||||||
|
The minimal sample at [3] was used to validate it, in addition to
|
||||||
|
vscode.dev web app, by rearranging its left-side bar action items. Refer
|
||||||
|
to linked crbug and comments at [4] for further repro steps and
|
||||||
|
expectations.
|
||||||
|
|
||||||
|
[1] https://wayland.app/protocols/wayland#wl_data_offer:request:accept.
|
||||||
|
[2] https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#drag_data
|
||||||
|
[3] https://people.igalia.com/nickdiego/samples/dnd-empty-drag-data/
|
||||||
|
[4] https://github.com/microsoft/vscode/issues/156723#issuecomment-2460617294
|
||||||
|
|
||||||
|
R=orko@igalia.com, thomasanderson
|
||||||
|
|
||||||
|
Bug: 377760837
|
||||||
|
Test: Manually, by rearranging left side bar items of https://vscode.dev and the minimal sample at [3].
|
||||||
|
Change-Id: I3fd5dd2ab9a9f3482334371af35bde554fd3d1a3
|
||||||
|
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6000277
|
||||||
|
Commit-Queue: Nick Yamane <nickdiego@igalia.com>
|
||||||
|
Reviewed-by: Orko Garai <orko@igalia.com>
|
||||||
|
Cr-Commit-Position: refs/heads/main@{#1380008}
|
||||||
|
|
||||||
|
diff --git a/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc b/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
|
||||||
|
index 3d63985300269fb33707ead548665d5e99ebdbf3..22cb6406bc4f667b949c23690bedf1f59d988faa 100644
|
||||||
|
--- a/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
|
||||||
|
+++ b/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
|
||||||
|
@@ -54,6 +54,16 @@ namespace {
|
||||||
|
using mojom::DragEventSource;
|
||||||
|
using mojom::DragOperation;
|
||||||
|
|
||||||
|
+// Used for compatibility between W3C and Wayland drag-and-drop specifications.
|
||||||
|
+// Since wl_data_offer version >= 3, Wayland dnd sessions with no accepted mime
|
||||||
|
+// type always end as cancelled. W3C drag-and-drop spec on the other hand does
|
||||||
|
+// not require drag data to be set in order to proceed with drop and drag-end
|
||||||
|
+// events. Thus, the special mime type below is used to ensure such behavior is
|
||||||
|
+// supported by the Wayland backend. Further context can be found at
|
||||||
|
+// https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API and
|
||||||
|
+// https://wayland.app/protocols/wayland#wl_data_offer:request:accept.
|
||||||
|
+constexpr char kMimeTypeEmptyDragData[] = "chromium/x-empty-drag-data";
|
||||||
|
+
|
||||||
|
DragOperation DndActionToDragOperation(uint32_t action) {
|
||||||
|
// Prevent the usage of this function for an operation mask.
|
||||||
|
DCHECK_LE(std::bitset<32>(action).count(), 1u);
|
||||||
|
@@ -158,9 +168,17 @@ bool WaylandDataDragController::StartSession(const OSExchangeData& data,
|
||||||
|
<< ", serial tracker=" << connection_->serial_tracker().ToString();
|
||||||
|
|
||||||
|
// Create new data source and offers |data|.
|
||||||
|
- SetOfferedExchangeDataProvider(data);
|
||||||
|
+ offered_exchange_data_provider_ = data.provider().Clone();
|
||||||
|
+ auto mime_types = GetOfferedExchangeDataProvider()->BuildMimeTypesList();
|
||||||
|
+ if (mime_types.empty()) {
|
||||||
|
+ // Add placeholder mime type to ensure the drag-and-drop session can end
|
||||||
|
+ // successfully, even if no drag data was set by the application. See
|
||||||
|
+ // `kMimeTypeEmptyDragData` declaration for more details.
|
||||||
|
+ mime_types.push_back(kMimeTypeEmptyDragData);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
data_source_ = data_device_manager_->CreateSource(this);
|
||||||
|
- data_source_->Offer(GetOfferedExchangeDataProvider()->BuildMimeTypesList());
|
||||||
|
+ data_source_->Offer(mime_types);
|
||||||
|
data_source_->SetDndActions(DragOperationsToDndActions(operations));
|
||||||
|
|
||||||
|
// Create drag icon surface (if any) and store the data to be exchanged.
|
||||||
|
@@ -788,11 +806,6 @@ WaylandDataDragController::GetAndValidateSerialForDrag(DragEventSource source) {
|
||||||
|
: std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void WaylandDataDragController::SetOfferedExchangeDataProvider(
|
||||||
|
- const OSExchangeData& data) {
|
||||||
|
- offered_exchange_data_provider_ = data.provider().Clone();
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
const WaylandExchangeDataProvider*
|
||||||
|
WaylandDataDragController::GetOfferedExchangeDataProvider() const {
|
||||||
|
DCHECK(offered_exchange_data_provider_);
|
||||||
|
diff --git a/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h b/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h
|
||||||
|
index fd64adeeec3a715c278957e1ef934a8e53d07953..a7453424c0e3de7c62b912c4bce86156914d93f3 100644
|
||||||
|
--- a/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h
|
||||||
|
+++ b/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h
|
||||||
|
@@ -216,7 +216,6 @@ class WaylandDataDragController : public WaylandDataDevice::DragDelegate,
|
||||||
|
std::optional<wl::Serial> GetAndValidateSerialForDrag(
|
||||||
|
mojom::DragEventSource source);
|
||||||
|
|
||||||
|
- void SetOfferedExchangeDataProvider(const OSExchangeData& data);
|
||||||
|
const WaylandExchangeDataProvider* GetOfferedExchangeDataProvider() const;
|
||||||
|
|
||||||
|
// Checks whether |data| holds information about a window dragging session.
|
Loading…
Reference in a new issue