Commit c310de99 authored by Sandor Molnar's avatar Sandor Molnar
Browse files

Backed out changeset d641e4ee14e4 (bug 1743365) for causing mochitest failures...

Backed out changeset d641e4ee14e4 (bug 1743365) for causing mochitest failures in test_pasteImgTextarea. CLOSED TREE
parent 6e2101cf
Loading
Loading
Loading
Loading
+0 −97
Original line number Diff line number Diff line
@@ -90,103 +90,6 @@ int GetGeckoClipboardType(GtkClipboard* aGtkClipboard) {
  return -1;  // THAT AIN'T NO CLIPBOARD I EVER HEARD OF
}

void nsRetrievalContext::ClipboardOwnerChanged() {
  LOGCLIP("nsRetrievalContext::ClipboardOwnerChanged()");
  g_clear_pointer(&mTargets, g_free);
  mTargetNum = 0;
}

void nsRetrievalContext::PrimaryOwnerChanged() {
  LOGCLIP("nsRetrievalContext::PrimaryOwnerChanged()");
  g_clear_pointer(&mTargetsPrimary, g_free);
  mTargetPrimaryNum = 0;
}

GdkAtom* nsRetrievalContext::GetStoredTargets(int32_t aWhichClipboard,
                                              int* aTargetNum) {
  GdkAtom* storedTargets;
  if (aWhichClipboard == nsClipboard::kGlobalClipboard) {
    storedTargets = mTargets;
    *aTargetNum = mTargetNum;
  } else {
    storedTargets = mTargetsPrimary;
    *aTargetNum = mTargetPrimaryNum;
  }
  if (storedTargets && *aTargetNum) {
    return (GdkAtom*)g_memdup(storedTargets, sizeof(GdkAtom) * (*aTargetNum));
  }
  return nullptr;
}

void nsRetrievalContext::StoreTargets(int32_t aWhichClipboard,
                                      GdkAtom* aTargets, int aTargetNum) {
  GdkAtom** storedTargets;
  int* storedTargetNum;

  if (aWhichClipboard == nsClipboard::kGlobalClipboard) {
    storedTargets = &mTargets;
    storedTargetNum = &mTargetNum;
  } else {
    storedTargets = &mTargetsPrimary;
    storedTargetNum = &mTargetPrimaryNum;
  }

  g_clear_pointer(storedTargets, g_free);
  *storedTargetNum = 0;

  if (aTargets && aTargetNum) {
    *storedTargets = (GdkAtom*)g_memdup(aTargets, sizeof(GdkAtom) * aTargetNum);
    *storedTargetNum = aTargetNum;
  }
}

GdkAtom* nsRetrievalContext::GetTargets(int32_t aWhichClipboard,
                                        int* aTargetNum) {
  LOGCLIP("nsRetrievalContext::GetTargets(%s)\n",
          aWhichClipboard == nsClipboard::kSelectionClipboard ? "primary"
                                                              : "clipboard");

  GdkAtom* targets = GetStoredTargets(aWhichClipboard, aTargetNum);
  if (targets && *aTargetNum > 0) {
    LOGCLIP("    returned %d cached targets.", *aTargetNum);
    return targets;
  }
  targets = GetTargetsImpl(aWhichClipboard, aTargetNum);
  StoreTargets(aWhichClipboard, targets, *aTargetNum);
  return targets;
}

static void ClipboardOwnerChangedProc(GtkClipboard* aClipboard,
                                      GdkEvent* aEvent, gpointer data) {
  auto* context = static_cast<nsRetrievalContext*>(data);
  context->ClipboardOwnerChanged();
}

static void PrimaryOwnerChangedProc(GtkClipboard* aClipboard, GdkEvent* aEvent,
                                    gpointer data) {
  auto* context = static_cast<nsRetrievalContext*>(data);
  context->PrimaryOwnerChanged();
}

nsRetrievalContext::nsRetrievalContext() {
  g_signal_connect(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), "owner-change",
                   G_CALLBACK(ClipboardOwnerChangedProc), this);
  g_signal_connect(gtk_clipboard_get(GDK_SELECTION_PRIMARY), "owner-change",
                   G_CALLBACK(PrimaryOwnerChangedProc), this);
}

nsRetrievalContext::~nsRetrievalContext() {
  g_signal_handlers_disconnect_by_func(
      gtk_clipboard_get(GDK_SELECTION_CLIPBOARD),
      FuncToGpointer(ClipboardOwnerChangedProc), this);
  g_signal_handlers_disconnect_by_func(gtk_clipboard_get(GDK_SELECTION_PRIMARY),
                                       FuncToGpointer(PrimaryOwnerChangedProc),
                                       this);
  // Clear cached clipboard targets.
  ClipboardOwnerChanged();
  PrimaryOwnerChanged();
}

nsClipboard::nsClipboard() = default;

nsClipboard::~nsClipboard() {
+2 −21
Original line number Diff line number Diff line
@@ -42,31 +42,12 @@ class nsRetrievalContext {

  // Get data mime types which can be obtained from clipboard.
  // The returned array has to be released by g_free().
  GdkAtom* GetTargets(int32_t aWhichClipboard, int* aTargetNum);

  virtual GdkAtom* GetTargetsImpl(int32_t aWhichClipboard, int* aTargetNum) = 0;
  virtual GdkAtom* GetTargets(int32_t aWhichClipboard, int* aTargetNum) = 0;

  virtual bool HasSelectionSupport(void) = 0;

  // Clipboard/Primary selection owner changed. Clear internal cached data.
  void ClipboardOwnerChanged();
  void PrimaryOwnerChanged();

  GdkAtom* GetStoredTargets(int32_t aWhichClipboard, int* aTargetNum);
  void StoreTargets(int32_t aWhichClipboard, GdkAtom* aTargets, int aTargetNum);

  nsRetrievalContext();

 protected:
  virtual ~nsRetrievalContext();

 private:
  // Cached targets
  GdkAtom* mTargets = nullptr;
  int mTargetNum = 0;

  GdkAtom* mTargetsPrimary = nullptr;
  int mTargetPrimaryNum = 0;
  virtual ~nsRetrievalContext() = default;
};

class nsClipboard : public nsIClipboard, public nsIObserver {
+2 −5
Original line number Diff line number Diff line
@@ -974,11 +974,8 @@ void nsRetrievalContextWayland::TransferFastTrackClipboard(
  }
}

GdkAtom* nsRetrievalContextWayland::GetTargetsImpl(int32_t aWhichClipboard,
GdkAtom* nsRetrievalContextWayland::GetTargets(int32_t aWhichClipboard,
                                               int* aTargetNum) {
  LOGCLIP("nsRetrievalContextWayland::GetTargetsImpl(%s)\n",
          aWhichClipboard == nsClipboard::kSelectionClipboard ? "primary"
                                                              : "clipboard");
  /* 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().
+2 −2
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ class nsRetrievalContextWayland : public nsRetrievalContext {
  virtual const char* GetClipboardText(int32_t aWhichClipboard) override;
  virtual void ReleaseClipboardData(const char* aClipboardData) override;

  virtual GdkAtom* GetTargetsImpl(int32_t aWhichClipboard,
  virtual GdkAtom* GetTargets(int32_t aWhichClipboard,
                              int* aTargetNum) override;
  virtual bool HasSelectionSupport(void) override;

+2 −2
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ void nsRetrievalContextWaylandAsync::TransferAsyncClipboardData(
  }
}

GdkAtom* nsRetrievalContextWaylandAsync::GetTargetsImpl(int32_t aWhichClipboard,
GdkAtom* nsRetrievalContextWaylandAsync::GetTargets(int32_t aWhichClipboard,
                                                    int* aTargetNum) {
  LOGCLIP("nsRetrievalContextWaylandAsync::GetTargets()\n");

Loading