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