Fixed clipboard copy->paste between Firefox windows (mozbz#1434572).

This commit is contained in:
Martin Stransky 2018-02-01 11:34:48 +01:00
parent e757b29a9f
commit 86ba393fb9
2 changed files with 100 additions and 1 deletions

View File

@ -98,7 +98,7 @@ ExclusiveArch: x86_64 i686
Summary: Mozilla Firefox Web browser
Name: firefox
Version: 59.0
Release: 0.4%{?pre_tag}%{?dist}
Release: 0.5%{?pre_tag}%{?dist}
URL: https://www.mozilla.org/firefox/
License: MPLv1.1 or GPLv2+ or LGPLv2+
#Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
@ -162,6 +162,7 @@ Patch451: mozilla-1432414.patch
Patch452: mozilla-1434202.patch
Patch453: mozilla-1433081.patch
Patch454: remote-profile.patch
Patch455: mozilla-1434572.patch
# Debian patches
Patch500: mozilla-440908.patch
@ -331,6 +332,7 @@ This package contains results of tests executed during build.
%patch452 -p1 -b .1434202
%patch453 -p1 -b .1433081
%patch454 -p1 -b .remote-profile
%patch455 -p1 -b .1434572
# Patch for big endian platforms only
%if 0%{?big_endian}
@ -864,6 +866,10 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
#---------------------------------------------------------------------
%changelog
* Thu Feb 1 2018 Martin Stransky <stransky@redhat.com> - 59.0-0.5
- Fixed clipboard copy->paste between Firefox windows
(mozbz#1434572).
* Wed Jan 31 2018 Martin Stransky <stransky@redhat.com> - 59.0-0.4
- Fixed remote launch when no profile name is given.

93
mozilla-1434572.patch Normal file
View File

@ -0,0 +1,93 @@
diff --git a/widget/gtk/mozgtk/mozgtk.c b/widget/gtk/mozgtk/mozgtk.c
--- a/widget/gtk/mozgtk/mozgtk.c
+++ b/widget/gtk/mozgtk/mozgtk.c
@@ -66,16 +66,17 @@ STUB(gdk_screen_get_number)
STUB(gdk_screen_get_resolution)
STUB(gdk_screen_get_rgba_visual)
STUB(gdk_screen_get_root_window)
STUB(gdk_screen_get_system_visual)
STUB(gdk_screen_get_width)
STUB(gdk_screen_height)
STUB(gdk_screen_is_composited)
STUB(gdk_screen_width)
+STUB(gdk_selection_owner_get)
STUB(gdk_set_program_class)
STUB(gdk_unicode_to_keyval)
STUB(gdk_visual_get_depth)
STUB(gdk_visual_get_system)
STUB(gdk_window_add_filter)
STUB(gdk_window_begin_move_drag)
STUB(gdk_window_begin_resize_drag)
STUB(gdk_window_destroy)
diff --git a/widget/gtk/nsClipboardWayland.cpp b/widget/gtk/nsClipboardWayland.cpp
--- a/widget/gtk/nsClipboardWayland.cpp
+++ b/widget/gtk/nsClipboardWayland.cpp
@@ -337,21 +346,68 @@ nsRetrievalContextWayland::GetTargets(in
for (int32_t j = 0; j < length; j++) {
targetList[j] = mTargetMIMETypes[j];
}
*aTargetNum = length;
return targetList;
}
+struct fastTrackClipboardData
+{
+ char* data;
+ int dataLength;
+};
+
+static void
+wayland_clipboard_contents_received(GtkClipboard *clipboard,
+ GtkSelectionData *selection_data,
+ gpointer data)
+{
+ fastTrackClipboardData* clipboardData =
+ static_cast<fastTrackClipboardData*>(data);
+
+ int contentLength = gtk_selection_data_get_length(selection_data);
+ if (contentLength > 0) {
+ clipboardData->data = reinterpret_cast<char*>(
+ g_malloc(sizeof(char)*contentLength));
+ memcpy(clipboardData->data,
+ gtk_selection_data_get_data(selection_data),
+ sizeof(char)*contentLength);
+ }
+
+ clipboardData->dataLength = contentLength;
+}
+
const char*
nsRetrievalContextWayland::GetClipboardData(const char* aMimeType,
int32_t aWhichClipboard,
uint32_t* aContentLength)
{
+ /* 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().
+ */
+ GdkAtom selection = GetSelectionAtom(aWhichClipboard);
+ if (gdk_selection_owner_get(selection)) {
+ fastTrackClipboardData clipboardData = { nullptr, 0 };
+ gtk_clipboard_request_contents(gtk_clipboard_get(selection),
+ gdk_atom_intern(aMimeType, FALSE),
+ wayland_clipboard_contents_received,
+ &clipboardData);
+ *aContentLength = clipboardData.dataLength;
+ return static_cast<const char*>(clipboardData.data);
+ }
+
+ /* TODO: We need to implement GDK_SELECTION_PRIMARY (X11 text selection)
+ * for Wayland backend.
+ */
+ if (selection == GDK_SELECTION_PRIMARY)
+ return nullptr;
+
NS_ASSERTION(mDataOffer, "Requested data without valid data offer!");
if (!mDataOffer) {
// TODO
// Something went wrong. We're requested to provide clipboard data
// but we haven't got any from wayland. Looks like rhbz#1455915.
return nullptr;
}