summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-22 21:22:04 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-22 21:22:04 +0000
commit5cd90e4a71c974da91156f76faf488ce59db16b0 (patch)
tree669b20b600f66d13204ca8b38bd5f9c1e3777c3e
parent3984b0c8e5948a8054d99c75654046bbd1700965 (diff)
downloadchromium_src-5cd90e4a71c974da91156f76faf488ce59db16b0.zip
chromium_src-5cd90e4a71c974da91156f76faf488ce59db16b0.tar.gz
chromium_src-5cd90e4a71c974da91156f76faf488ce59db16b0.tar.bz2
Fixes possible crash in menus and makes widgetgtk not send out
mousemove if the event is the result of a grab. BUG=45734 TEST=none Review URL: http://codereview.chromium.org/2841018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@50529 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/views/bookmark_bar_view_test.cc10
-rw-r--r--views/controls/menu/menu_host_gtk.cc7
-rw-r--r--views/controls/menu/menu_host_root_view.cc9
-rw-r--r--views/widget/widget_gtk.cc6
4 files changed, 25 insertions, 7 deletions
diff --git a/chrome/browser/views/bookmark_bar_view_test.cc b/chrome/browser/views/bookmark_bar_view_test.cc
index 46f87e0..77d24c1 100644
--- a/chrome/browser/views/bookmark_bar_view_test.cc
+++ b/chrome/browser/views/bookmark_bar_view_test.cc
@@ -34,6 +34,10 @@
// See http://crbug.com/40039 for details.
#define MAYBE_KeyEvents DISABLED_KeyEvents
+// See http://crbug.com/47089 for details.
+#define MAYBE_CloseWithModalDialog DISABLED_CloseWithModalDialog
+#define MAYBE_CloseMenuAfterClosingContextMenu \
+ DISABLED_CloseMenuAfterClosingContextMenu
#else
#define MAYBE_DND DND
@@ -41,6 +45,8 @@
#define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu
#define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu
#define MAYBE_KeyEvents KeyEvents
+#define MAYBE_CloseWithModalDialog CloseWithModalDialog
+#define MAYBE_CloseMenuAfterClosingContextMenu CloseMenuAfterClosingContextMenu
#endif
@@ -1019,7 +1025,7 @@ class BookmarkBarViewTest11 : public BookmarkBarViewEventTestBase {
ContextMenuNotificationObserver observer_;
};
-VIEW_TEST(BookmarkBarViewTest11, CloseMenuAfterClosingContextMenu)
+VIEW_TEST(BookmarkBarViewTest11, MAYBE_CloseMenuAfterClosingContextMenu)
// Tests showing a modal dialog from a context menu.
class BookmarkBarViewTest12 : public BookmarkBarViewEventTestBase {
@@ -1099,7 +1105,7 @@ class BookmarkBarViewTest12 : public BookmarkBarViewEventTestBase {
}
};
-VIEW_TEST(BookmarkBarViewTest12, CloseWithModalDialog)
+VIEW_TEST(BookmarkBarViewTest12, MAYBE_CloseWithModalDialog)
// Tests clicking on the separator of a context menu (this is for coverage of
// bug 17862).
diff --git a/views/controls/menu/menu_host_gtk.cc b/views/controls/menu/menu_host_gtk.cc
index 5571157..c3d5d1f 100644
--- a/views/controls/menu/menu_host_gtk.cc
+++ b/views/controls/menu/menu_host_gtk.cc
@@ -70,7 +70,12 @@ void MenuHostGtk::HideMenuHost() {
void MenuHostGtk::DestroyMenuHost() {
HideMenuHost();
destroying_ = true;
- CloseNow();
+ // We use Close instead of CloseNow to delay the deletion. If this invoked
+ // during a key press event, gtk still generates the release event and the
+ // AcceleratorHandler will use the window in the event. If we destroy the
+ // window now, it means AcceleratorHandler attempts to use a window that has
+ // been destroyed.
+ Close();
}
void MenuHostGtk::SetMenuHostBounds(const gfx::Rect& bounds) {
diff --git a/views/controls/menu/menu_host_root_view.cc b/views/controls/menu/menu_host_root_view.cc
index 720ea9a..d472284 100644
--- a/views/controls/menu/menu_host_root_view.cc
+++ b/views/controls/menu/menu_host_root_view.cc
@@ -28,7 +28,7 @@ bool MenuHostRootView::OnMousePressed(const MouseEvent& event) {
((event.x() < 0 || event.y() < 0 || event.x() >= width() ||
event.y() >= height()) ||
!RootView::OnMousePressed(event));
- if (forward_drag_to_menu_controller_)
+ if (forward_drag_to_menu_controller_ && GetMenuController())
GetMenuController()->OnMousePressed(submenu_, event);
return true;
}
@@ -37,7 +37,7 @@ bool MenuHostRootView::OnMouseDragged(const MouseEvent& event) {
if (suspend_events_)
return true;
- if (forward_drag_to_menu_controller_) {
+ if (forward_drag_to_menu_controller_ && GetMenuController()) {
#ifdef DEBUG_MENU
DLOG(INFO) << " MenuHostRootView::OnMouseDragged source=" << submenu_;
#endif
@@ -53,7 +53,7 @@ void MenuHostRootView::OnMouseReleased(const MouseEvent& event,
return;
RootView::OnMouseReleased(event, canceled);
- if (forward_drag_to_menu_controller_) {
+ if (forward_drag_to_menu_controller_ && GetMenuController()) {
forward_drag_to_menu_controller_ = false;
if (canceled) {
GetMenuController()->Cancel(MenuController::EXIT_ALL);
@@ -68,7 +68,8 @@ void MenuHostRootView::OnMouseMoved(const MouseEvent& event) {
return;
RootView::OnMouseMoved(event);
- GetMenuController()->OnMouseMoved(submenu_, event);
+ if (GetMenuController())
+ GetMenuController()->OnMouseMoved(submenu_, event);
}
void MenuHostRootView::ProcessOnMouseExited() {
diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc
index c3b0814..1e73e38 100644
--- a/views/widget/widget_gtk.cc
+++ b/views/widget/widget_gtk.cc
@@ -991,6 +991,12 @@ gboolean WidgetGtk::OnEnterNotify(GtkWidget* widget, GdkEventCrossing* event) {
return false;
}
+ if (has_capture_ && event->mode == GDK_CROSSING_GRAB) {
+ // Doing a grab results an async enter event, regardless of where the mouse
+ // is. We don't want to generate a mouse move in this case.
+ return false;
+ }
+
if (!last_mouse_event_was_move_ && !is_mouse_down_) {
// When a mouse button is pressed gtk generates a leave, enter, press.
// RootView expects to get a mouse move before a press, otherwise enter is