OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/views/widget/widget.h" | 5 #include "ui/views/widget/widget.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
11 #include "ui/base/events/event.h" | 11 #include "ui/base/events/event.h" |
12 #include "ui/base/hit_test.h" | 12 #include "ui/base/hit_test.h" |
13 #include "ui/base/l10n/l10n_font_util.h" | 13 #include "ui/base/l10n/l10n_font_util.h" |
14 #include "ui/base/resource/resource_bundle.h" | 14 #include "ui/base/resource/resource_bundle.h" |
15 #include "ui/compositor/compositor.h" | 15 #include "ui/compositor/compositor.h" |
16 #include "ui/compositor/layer.h" | 16 #include "ui/compositor/layer.h" |
17 #include "ui/gfx/screen.h" | 17 #include "ui/gfx/screen.h" |
18 #include "ui/views/focus/focus_manager.h" | 18 #include "ui/views/focus/focus_manager.h" |
19 #include "ui/views/focus/focus_manager_factory.h" | 19 #include "ui/views/focus/focus_manager_factory.h" |
20 #include "ui/views/focus/view_storage.h" | 20 #include "ui/views/focus/view_storage.h" |
21 #include "ui/views/focus/widget_focus_manager.h" | 21 #include "ui/views/focus/widget_focus_manager.h" |
22 #include "ui/views/ime/input_method.h" | 22 #include "ui/views/ime/input_method.h" |
23 #include "ui/views/views_delegate.h" | 23 #include "ui/views/views_delegate.h" |
24 #include "ui/views/widget/default_theme_provider.h" | 24 #include "ui/views/widget/default_theme_provider.h" |
25 #include "ui/views/widget/native_widget_private.h" | 25 #include "ui/views/widget/native_widget_private.h" |
26 #include "ui/views/widget/root_view.h" | 26 #include "ui/views/widget/root_view.h" |
27 #include "ui/views/widget/tooltip_manager.h" | 27 #include "ui/views/widget/tooltip_manager.h" |
28 #include "ui/views/widget/widget_delegate.h" | 28 #include "ui/views/widget/widget_delegate.h" |
| 29 #include "ui/views/widget/widget_deletion_observer.h" |
29 #include "ui/views/widget/widget_observer.h" | 30 #include "ui/views/widget/widget_observer.h" |
30 #include "ui/views/window/custom_frame_view.h" | 31 #include "ui/views/window/custom_frame_view.h" |
31 | 32 |
32 #if !defined(OS_MACOSX) | 33 #if !defined(OS_MACOSX) |
33 #include "ui/views/controls/menu/menu_controller.h" | 34 #include "ui/views/controls/menu/menu_controller.h" |
34 #endif | 35 #endif |
35 | 36 |
36 namespace views { | 37 namespace views { |
37 | 38 |
38 namespace { | 39 namespace { |
(...skipping 1105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1144 void Widget::OnKeyEvent(ui::KeyEvent* event) { | 1145 void Widget::OnKeyEvent(ui::KeyEvent* event) { |
1145 ScopedEvent scoped(this, *event); | 1146 ScopedEvent scoped(this, *event); |
1146 static_cast<internal::RootView*>(GetRootView())-> | 1147 static_cast<internal::RootView*>(GetRootView())-> |
1147 DispatchKeyEvent(event); | 1148 DispatchKeyEvent(event); |
1148 } | 1149 } |
1149 | 1150 |
1150 void Widget::OnMouseEvent(ui::MouseEvent* event) { | 1151 void Widget::OnMouseEvent(ui::MouseEvent* event) { |
1151 ScopedEvent scoped(this, *event); | 1152 ScopedEvent scoped(this, *event); |
1152 View* root_view = GetRootView(); | 1153 View* root_view = GetRootView(); |
1153 switch (event->type()) { | 1154 switch (event->type()) { |
1154 case ui::ET_MOUSE_PRESSED: | 1155 case ui::ET_MOUSE_PRESSED: { |
1155 last_mouse_event_was_move_ = false; | 1156 last_mouse_event_was_move_ = false; |
| 1157 |
| 1158 // We may get deleted by the time we return from OnMousePressed. So we |
| 1159 // use an observer to make sure we are still alive. |
| 1160 WidgetDeletionObserver widget_deletion_observer(this); |
1156 // Make sure we're still visible before we attempt capture as the mouse | 1161 // Make sure we're still visible before we attempt capture as the mouse |
1157 // press processing may have made the window hide (as happens with menus). | 1162 // press processing may have made the window hide (as happens with menus). |
1158 if (root_view && root_view->OnMousePressed(*event) && IsVisible()) { | 1163 if (root_view && root_view->OnMousePressed(*event) && |
| 1164 widget_deletion_observer.IsWidgetAlive() && IsVisible()) { |
1159 is_mouse_button_pressed_ = true; | 1165 is_mouse_button_pressed_ = true; |
1160 if (!native_widget_->HasCapture()) | 1166 if (!native_widget_->HasCapture()) |
1161 native_widget_->SetCapture(); | 1167 native_widget_->SetCapture(); |
1162 event->SetHandled(); | 1168 event->SetHandled(); |
1163 } | 1169 } |
1164 return; | 1170 return; |
| 1171 } |
1165 case ui::ET_MOUSE_RELEASED: | 1172 case ui::ET_MOUSE_RELEASED: |
1166 last_mouse_event_was_move_ = false; | 1173 last_mouse_event_was_move_ = false; |
1167 is_mouse_button_pressed_ = false; | 1174 is_mouse_button_pressed_ = false; |
1168 // Release capture first, to avoid confusion if OnMouseReleased blocks. | 1175 // Release capture first, to avoid confusion if OnMouseReleased blocks. |
1169 if (native_widget_->HasCapture() && | 1176 if (native_widget_->HasCapture() && |
1170 ShouldReleaseCaptureOnMouseReleased()) { | 1177 ShouldReleaseCaptureOnMouseReleased()) { |
1171 native_widget_->ReleaseCapture(); | 1178 native_widget_->ReleaseCapture(); |
1172 } | 1179 } |
1173 if (root_view) | 1180 if (root_view) |
1174 root_view->OnMouseReleased(*event); | 1181 root_view->OnMouseReleased(*event); |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1429 | 1436 |
1430 //////////////////////////////////////////////////////////////////////////////// | 1437 //////////////////////////////////////////////////////////////////////////////// |
1431 // internal::NativeWidgetPrivate, NativeWidget implementation: | 1438 // internal::NativeWidgetPrivate, NativeWidget implementation: |
1432 | 1439 |
1433 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { | 1440 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { |
1434 return this; | 1441 return this; |
1435 } | 1442 } |
1436 | 1443 |
1437 } // namespace internal | 1444 } // namespace internal |
1438 } // namespace views | 1445 } // namespace views |
OLD | NEW |