summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorerg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-20 20:21:12 +0000
committererg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-20 20:21:12 +0000
commit9f50a2f07eb717f613b7cada7e25bfa6e3c79de2 (patch)
treee58abef1e8358d36f848cc14207624d824584680
parent0f52fdcc6f27784e8041cac26a2119b4deab0952 (diff)
downloadchromium_src-9f50a2f07eb717f613b7cada7e25bfa6e3c79de2.zip
chromium_src-9f50a2f07eb717f613b7cada7e25bfa6e3c79de2.tar.gz
chromium_src-9f50a2f07eb717f613b7cada7e25bfa6e3c79de2.tar.bz2
Fix crash in bookmark bar where we had conflicting ids.
http://crbug.com/12304 Review URL: http://codereview.chromium.org/115581 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16519 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.cc23
-rw-r--r--chrome/browser/gtk/dnd_registry.h26
-rw-r--r--chrome/browser/gtk/tabs/tab_gtk.cc4
3 files changed, 42 insertions, 11 deletions
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.cc b/chrome/browser/gtk/bookmark_bar_gtk.cc
index 64069cb..b86d7e2 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.cc
+++ b/chrome/browser/gtk/bookmark_bar_gtk.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/bookmarks/bookmark_utils.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/gtk/custom_button.h"
+#include "chrome/browser/gtk/dnd_registry.h"
#include "chrome/browser/gtk/gtk_chrome_button.h"
#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/profile.h"
@@ -42,19 +43,13 @@ const int kBitsInAByte = 8;
// Dictionary key used to store a BookmarkNode* on a GtkWidget.
const char kBookmarkNode[] = "bookmark-node";
-// Integers representing the various types of items that the bookmark bar
-// accepts as DnD types.
-enum BookmarkType {
- DROP_TARGET_INTERNAL
-};
-
// Mime types for DnD. Used to synchronize across applications.
const char kInternalURIType[] = "application/x-chrome-bookmark-item";
// Table of the mime types that we accept with their options.
const GtkTargetEntry kTargetTable[] = {
{ const_cast<char*>(kInternalURIType), GTK_TARGET_SAME_APP,
- DROP_TARGET_INTERNAL }
+ dnd::X_CHROME_BOOKMARK_ITEM }
// TODO(erg): Add "text/uri-list" support.
};
@@ -581,7 +576,7 @@ void BookmarkBarGtk::OnButtonDragGet(GtkWidget* widget, GdkDragContext* context,
DCHECK(node);
switch (target_type) {
- case DROP_TARGET_INTERNAL: {
+ case dnd::X_CHROME_BOOKMARK_ITEM: {
BookmarkDragData data(node);
Pickle pickle;
data.WriteToPickle(bar->profile_, &pickle);
@@ -649,6 +644,14 @@ gboolean BookmarkBarGtk::OnToolbarDragMotion(GtkToolbar* toolbar,
gint y,
guint time,
BookmarkBarGtk* bar) {
+ GdkAtom target_type =
+ gtk_drag_dest_find_target(GTK_WIDGET(toolbar), context, NULL);
+ if (target_type == GDK_NONE) {
+ // We shouldn't act like a drop target when something that we can't deal
+ // with is dragged over the toolbar.
+ return FALSE;
+ }
+
if (!bar->toolbar_drop_item_) {
bar->toolbar_drop_item_ = bar->CreateBookmarkToolItem(bar->dragged_node_);
g_object_ref_sink(GTK_OBJECT(bar->toolbar_drop_item_));
@@ -685,7 +688,7 @@ gboolean BookmarkBarGtk::OnToolbarDragDrop(
if (context->targets) {
GdkAtom target_type =
GDK_POINTER_TO_ATOM(g_list_nth_data(context->targets,
- DROP_TARGET_INTERNAL));
+ dnd::X_CHROME_BOOKMARK_ITEM));
gtk_drag_get_data(widget, context, target_type, time);
is_valid_drop_site = TRUE;
@@ -711,7 +714,7 @@ void BookmarkBarGtk::OnToolbarDragReceived(GtkWidget* widget,
}
switch (target_type) {
- case DROP_TARGET_INTERNAL: {
+ case dnd::X_CHROME_BOOKMARK_ITEM: {
Pickle pickle(reinterpret_cast<char*>(selection_data->data),
selection_data->length);
BookmarkDragData drag_data;
diff --git a/chrome/browser/gtk/dnd_registry.h b/chrome/browser/gtk/dnd_registry.h
new file mode 100644
index 0000000..1500c44
--- /dev/null
+++ b/chrome/browser/gtk/dnd_registry.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_GTK_DND_REGISTRY_H_
+#define CHROME_BROWSER_GTK_DND_REGISTRY_H_
+
+// We wrap all of these constants in a namespace to prevent pollution.
+namespace dnd {
+
+// Registry of all internal int codes for drag and drop.
+//
+// These ids need to be unique app wide. Simply adding a GtkTargetEntry with an
+// id of 0 should be an error and it will conflict with X_CHROME_TAB below.
+enum {
+ // Tab DND items:
+ X_CHROME_TAB = 0,
+
+ // Bookmark DND items:
+ X_CHROME_BOOKMARK_ITEM
+};
+
+};
+
+#endif // CHROME_BROWSER_GTK_DND_REGISTRY_H_
+
diff --git a/chrome/browser/gtk/tabs/tab_gtk.cc b/chrome/browser/gtk/tabs/tab_gtk.cc
index 7981759..6e2e0d9 100644
--- a/chrome/browser/gtk/tabs/tab_gtk.cc
+++ b/chrome/browser/gtk/tabs/tab_gtk.cc
@@ -7,6 +7,7 @@
#include "app/gfx/path.h"
#include "app/l10n_util.h"
#include "app/resource_bundle.h"
+#include "chrome/browser/gtk/dnd_registry.h"
#include "chrome/browser/gtk/menu_gtk.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
@@ -15,7 +16,8 @@ namespace {
// The targets available for drag n' drop.
GtkTargetEntry target_table[] = {
- { const_cast<char*>("application/x-chrome-tab"), GTK_TARGET_SAME_APP, 0 }
+ { const_cast<char*>("application/x-chrome-tab"), GTK_TARGET_SAME_APP,
+ dnd::X_CHROME_TAB }
};
} // namespace