Backed out changeset e8c18967320c (bug 1631061) for causing Bug 1683989

This commit is contained in:
Narcis Beleuzu 2020-12-23 12:50:06 +02:00
Родитель d387ee0067
Коммит f2b3650083
2 изменённых файлов: 72 добавлений и 18 удалений

Просмотреть файл

@ -749,6 +749,7 @@ nsRetrievalContextWayland::nsRetrievalContextWayland(void)
mClipboardOffer(nullptr),
mPrimaryOffer(nullptr),
mDragContext(nullptr),
mClipboardRequestNumber(0),
mClipboardData(nullptr),
mClipboardDataLength(0) {
wl_data_device* dataDevice = wl_data_device_manager_get_data_device(
@ -806,6 +807,42 @@ GdkAtom* nsRetrievalContextWayland::GetTargets(int32_t aWhichClipboard,
return nullptr;
}
struct FastTrackClipboard {
FastTrackClipboard(int aClipboardRequestNumber,
nsRetrievalContextWayland* aRetrievalContex)
: mClipboardRequestNumber(aClipboardRequestNumber),
mRetrievalContex(aRetrievalContex) {}
int mClipboardRequestNumber;
nsRetrievalContextWayland* mRetrievalContex;
};
static void wayland_clipboard_contents_received(
GtkClipboard* clipboard, GtkSelectionData* selection_data, gpointer data) {
LOGCLIP(("wayland_clipboard_contents_received() callback\n"));
FastTrackClipboard* fastTrack = static_cast<FastTrackClipboard*>(data);
fastTrack->mRetrievalContex->TransferFastTrackClipboard(
fastTrack->mClipboardRequestNumber, selection_data);
delete fastTrack;
}
void nsRetrievalContextWayland::TransferFastTrackClipboard(
int aClipboardRequestNumber, GtkSelectionData* aSelectionData) {
if (mClipboardRequestNumber == aClipboardRequestNumber) {
int dataLength = gtk_selection_data_get_length(aSelectionData);
if (dataLength > 0) {
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';
}
} else {
NS_WARNING("Received obsoleted clipboard data!");
}
}
const char* nsRetrievalContextWayland::GetClipboardData(
const char* aMimeType, int32_t aWhichClipboard, uint32_t* aContentLength) {
NS_ASSERTION(mClipboardData == nullptr && mClipboardDataLength == 0,
@ -814,20 +851,33 @@ const char* nsRetrievalContextWayland::GetClipboardData(
LOGCLIP(("nsRetrievalContextWayland::GetClipboardData [%p] mime %s\n", this,
aMimeType));
const auto& dataOffer =
(GetSelectionAtom(aWhichClipboard) == GDK_SELECTION_PRIMARY)
? mPrimaryOffer
: mClipboardOffer;
if (!dataOffer) {
// Something went wrong. We're requested to provide clipboard data
// but we haven't got any from wayland.
NS_WARNING("Requested data without valid DataOffer!");
if (mClipboardData) {
ReleaseClipboardData(mClipboardData);
}
/* 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().
* see gtk_selection_convert() at gtk+/gtkselection.c.
*/
GdkAtom selection = GetSelectionAtom(aWhichClipboard);
if (gdk_selection_owner_get(selection)) {
LOGCLIP((" Internal clipboard content\n"));
mClipboardRequestNumber++;
gtk_clipboard_request_contents(
gtk_clipboard_get(selection), gdk_atom_intern(aMimeType, FALSE),
wayland_clipboard_contents_received,
new FastTrackClipboard(mClipboardRequestNumber, this));
} else {
mClipboardData = dataOffer->GetData(mDisplay->GetDisplay(), aMimeType,
&mClipboardDataLength);
LOGCLIP((" Remote clipboard content\n"));
const auto& dataOffer =
(selection == GDK_SELECTION_PRIMARY) ? mPrimaryOffer : mClipboardOffer;
if (!dataOffer) {
// Something went wrong. We're requested to provide clipboard data
// but we haven't got any from wayland.
NS_WARNING("Requested data without valid DataOffer!");
mClipboardData = nullptr;
mClipboardDataLength = 0;
} else {
mClipboardData = dataOffer->GetData(mDisplay->GetDisplay(), aMimeType,
&mClipboardDataLength);
}
}
*aContentLength = mClipboardDataLength;
@ -858,10 +908,8 @@ void nsRetrievalContextWayland::ReleaseClipboardData(
NS_ASSERTION(aClipboardData == mClipboardData,
"Releasing unknown clipboard data!");
g_free((void*)aClipboardData);
if (mClipboardData) {
g_free((void*)aClipboardData);
mClipboardData = nullptr;
mClipboardDataLength = 0;
}
mClipboardData = nullptr;
mClipboardDataLength = 0;
}

Просмотреть файл

@ -16,6 +16,8 @@
#include "nsClipboard.h"
#include "nsWaylandDisplay.h"
struct FastTrackClipboard;
class DataOffer {
public:
void AddMIMEType(const char* aMimeType);
@ -132,6 +134,9 @@ class nsRetrievalContextWayland : public nsRetrievalContext {
void ClearDragAndDropDataOffer();
void TransferFastTrackClipboard(int aClipboardRequestNumber,
GtkSelectionData* aSelectionData);
virtual ~nsRetrievalContextWayland() override;
private:
@ -144,6 +149,7 @@ class nsRetrievalContextWayland : public nsRetrievalContext {
mozilla::UniquePtr<DataOffer> mPrimaryOffer;
RefPtr<nsWaylandDragContext> mDragContext;
int mClipboardRequestNumber;
char* mClipboardData;
uint32_t mClipboardDataLength;