|
|
96e0061 |
changeset: 567293:4d5e5e9f146e
|
|
|
96e0061 |
tag: tip
|
|
|
96e0061 |
parent: 567291:3bdf0c33844f
|
|
|
96e0061 |
user: stransky <stransky@redhat.com>
|
|
|
96e0061 |
date: Fri Jan 29 12:13:15 2021 +0100
|
|
|
96e0061 |
files: widget/gtk/nsClipboardWayland.cpp
|
|
|
96e0061 |
description:
|
|
|
96e0061 |
Bug 1631061 [Wayland] Clear clipboard content when gtk_clipboard_request_contents() fails, r?jhorak
|
|
|
96e0061 |
|
|
|
96e0061 |
Differential Revision: https://phabricator.services.mozilla.com/D103461
|
|
|
96e0061 |
|
|
|
96e0061 |
|
|
|
96e0061 |
diff --git a/widget/gtk/nsClipboardWayland.cpp b/widget/gtk/nsClipboardWayland.cpp
|
|
|
96e0061 |
--- a/widget/gtk/nsClipboardWayland.cpp
|
|
|
96e0061 |
+++ b/widget/gtk/nsClipboardWayland.cpp
|
|
|
96e0061 |
@@ -842,7 +842,8 @@ struct FastTrackClipboard {
|
|
|
96e0061 |
|
|
|
96e0061 |
static void wayland_clipboard_contents_received(
|
|
|
96e0061 |
GtkClipboard* clipboard, GtkSelectionData* selection_data, gpointer data) {
|
|
|
96e0061 |
- LOGCLIP(("wayland_clipboard_contents_received() callback\n"));
|
|
|
96e0061 |
+ LOGCLIP(("wayland_clipboard_contents_received() selection_data = %p\n",
|
|
|
96e0061 |
+ selection_data));
|
|
|
96e0061 |
FastTrackClipboard* fastTrack = static_cast<FastTrackClipboard*>(data);
|
|
|
96e0061 |
fastTrack->mRetrievalContex->TransferFastTrackClipboard(
|
|
|
96e0061 |
fastTrack->mClipboardRequestNumber, selection_data);
|
|
|
96e0061 |
@@ -851,24 +852,34 @@ static void wayland_clipboard_contents_r
|
|
|
96e0061 |
|
|
|
96e0061 |
void nsRetrievalContextWayland::TransferFastTrackClipboard(
|
|
|
96e0061 |
int aClipboardRequestNumber, GtkSelectionData* aSelectionData) {
|
|
|
96e0061 |
- LOGCLIP(("nsRetrievalContextWayland::TransferFastTrackClipboard()\n"));
|
|
|
96e0061 |
+ LOGCLIP(
|
|
|
96e0061 |
+ ("nsRetrievalContextWayland::TransferFastTrackClipboard(), "
|
|
|
96e0061 |
+ "aSelectionData = %p\n",
|
|
|
96e0061 |
+ aSelectionData));
|
|
|
96e0061 |
+
|
|
|
96e0061 |
+ int dataLength = gtk_selection_data_get_length(aSelectionData);
|
|
|
96e0061 |
+ if (dataLength < 0) {
|
|
|
96e0061 |
+ LOGCLIP(
|
|
|
96e0061 |
+ (" gtk_clipboard_request_contents() failed to get clipboard "
|
|
|
96e0061 |
+ "data!\n"));
|
|
|
96e0061 |
+ ReleaseClipboardData(mClipboardData);
|
|
|
96e0061 |
+ return;
|
|
|
96e0061 |
+ }
|
|
|
96e0061 |
|
|
|
96e0061 |
if (mClipboardRequestNumber == aClipboardRequestNumber) {
|
|
|
96e0061 |
LOGCLIP((" request number matches\n"));
|
|
|
96e0061 |
- int dataLength = gtk_selection_data_get_length(aSelectionData);
|
|
|
96e0061 |
- if (!dataLength) {
|
|
|
96e0061 |
- LOGCLIP(
|
|
|
96e0061 |
- (" gtk_selection_data_get_length() returned 0 data length!\n"));
|
|
|
96e0061 |
- return;
|
|
|
96e0061 |
- }
|
|
|
96e0061 |
LOGCLIP((" fastracking %d bytes of data.\n", dataLength));
|
|
|
96e0061 |
mClipboardDataLength = dataLength;
|
|
|
96e0061 |
- mClipboardData = reinterpret_cast<char*>(
|
|
|
96e0061 |
- g_malloc(sizeof(char) * (mClipboardDataLength + 1)));
|
|
|
96e0061 |
- memcpy(mClipboardData, gtk_selection_data_get_data(aSelectionData),
|
|
|
96e0061 |
- sizeof(char) * mClipboardDataLength);
|
|
|
96e0061 |
- mClipboardData[mClipboardDataLength] = '\0';
|
|
|
96e0061 |
- LOGCLIP((" done, mClipboardData = %p\n", mClipboardData));
|
|
|
96e0061 |
+ if (dataLength > 0) {
|
|
|
96e0061 |
+ mClipboardData = reinterpret_cast<char*>(
|
|
|
96e0061 |
+ g_malloc(sizeof(char) * (mClipboardDataLength + 1)));
|
|
|
96e0061 |
+ memcpy(mClipboardData, gtk_selection_data_get_data(aSelectionData),
|
|
|
96e0061 |
+ sizeof(char) * mClipboardDataLength);
|
|
|
96e0061 |
+ mClipboardData[mClipboardDataLength] = '\0';
|
|
|
96e0061 |
+ LOGCLIP((" done, mClipboardData = %p\n", mClipboardData));
|
|
|
96e0061 |
+ } else {
|
|
|
96e0061 |
+ ReleaseClipboardData(mClipboardData);
|
|
|
96e0061 |
+ }
|
|
|
96e0061 |
} else {
|
|
|
96e0061 |
LOGCLIP((" request number does not match!\n"));
|
|
|
96e0061 |
NS_WARNING("Received obsoleted clipboard data!");
|
|
|
96e0061 |
@@ -952,11 +963,10 @@ void nsRetrievalContextWayland::ReleaseC
|
|
|
96e0061 |
const char* aClipboardData) {
|
|
|
96e0061 |
LOGCLIP(("nsRetrievalContextWayland::ReleaseClipboardData [%p]\n",
|
|
|
96e0061 |
aClipboardData));
|
|
|
96e0061 |
-
|
|
|
96e0061 |
- NS_ASSERTION(aClipboardData == mClipboardData,
|
|
|
96e0061 |
- "Releasing unknown clipboard data!");
|
|
|
96e0061 |
- g_free((void*)aClipboardData);
|
|
|
96e0061 |
-
|
|
|
96e0061 |
+ if (aClipboardData != mClipboardData) {
|
|
|
96e0061 |
+ NS_WARNING("Wayland clipboard: Releasing unknown clipboard data!");
|
|
|
96e0061 |
+ }
|
|
|
96e0061 |
+ g_free((void*)mClipboardData);
|
|
|
96e0061 |
+ mClipboardDataLength = 0;
|
|
|
96e0061 |
mClipboardData = nullptr;
|
|
|
96e0061 |
- mClipboardDataLength = 0;
|
|
|
96e0061 |
}
|
|
|
96e0061 |
|