diff options
author | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-20 20:21:12 +0000 |
---|---|---|
committer | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-20 20:21:12 +0000 |
commit | 9f50a2f07eb717f613b7cada7e25bfa6e3c79de2 (patch) | |
tree | e58abef1e8358d36f848cc14207624d824584680 | |
parent | 0f52fdcc6f27784e8041cac26a2119b4deab0952 (diff) | |
download | chromium_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.cc | 23 | ||||
-rw-r--r-- | chrome/browser/gtk/dnd_registry.h | 26 | ||||
-rw-r--r-- | chrome/browser/gtk/tabs/tab_gtk.cc | 4 |
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 |