diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-22 21:22:04 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-22 21:22:04 +0000 |
commit | 5cd90e4a71c974da91156f76faf488ce59db16b0 (patch) | |
tree | 669b20b600f66d13204ca8b38bd5f9c1e3777c3e /views | |
parent | 3984b0c8e5948a8054d99c75654046bbd1700965 (diff) | |
download | chromium_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
Diffstat (limited to 'views')
-rw-r--r-- | views/controls/menu/menu_host_gtk.cc | 7 | ||||
-rw-r--r-- | views/controls/menu/menu_host_root_view.cc | 9 | ||||
-rw-r--r-- | views/widget/widget_gtk.cc | 6 |
3 files changed, 17 insertions, 5 deletions
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 |