Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(753)

Unified Diff: ui/views/controls/menu/menu_host.cc

Issue 1565013002: Don't send touch events to windows like menus when the touch occurs outside the menu bounds. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Restore DCHECK Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/views/controls/menu/menu_host.cc
diff --git a/ui/views/controls/menu/menu_host.cc b/ui/views/controls/menu/menu_host.cc
index 9840abbdf0f650848ddac72fd05b68470f8eb1bf..d07d1efcc758ffbfc90ad68b9ed5f31d86a7b8c9 100644
--- a/ui/views/controls/menu/menu_host.cc
+++ b/ui/views/controls/menu/menu_host.cc
@@ -5,8 +5,10 @@
#include "ui/views/controls/menu/menu_host.h"
#include "base/auto_reset.h"
+#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
+#include "ui/aura/window_observer.h"
#include "ui/events/gestures/gesture_recognizer.h"
#include "ui/gfx/path.h"
#include "ui/native_theme/native_theme.h"
@@ -19,8 +21,67 @@
#include "ui/views/widget/native_widget_private.h"
#include "ui/views/widget/widget.h"
+#if !defined(OS_MACOSX)
+#include "ui/aura/window.h"
+#endif
+
namespace views {
+namespace internal {
+
+#if !defined(OS_MACOSX)
+// This class adds itself as the pre target handler for the |window|
+// passed in. It currently handles touch events and forwards them to the
+// controller. Reason for this approach is views does not get raw touch
+// events which we need to determine if a touch happened outside the bounds
+// of the menu.
+class PreMenuEventDispatchHandler : public ui::EventHandler,
+ aura::WindowObserver {
+ public:
+ PreMenuEventDispatchHandler(const MenuController* controller,
+ SubmenuView* submenu,
+ aura::Window* window)
+ : menu_controller_(const_cast<MenuController*>(controller)),
+ submenu_(submenu),
+ window_(window) {
+ window_->AddPreTargetHandler(this);
+ window_->AddObserver(this);
+ }
+
+ ~PreMenuEventDispatchHandler() override {
+ StopObserving();
+ }
+
+ // ui::EventHandler overrides.
+ void OnTouchEvent(ui::TouchEvent* event) override {
+ menu_controller_->OnTouchEvent(submenu_, event);
+ }
+
+ // aura::WindowObserver overrides.
+ void OnWindowDestroying(aura::Window* window) override {
+ DCHECK(window_ == window);
+ StopObserving();
+ }
+
+ private:
+ void StopObserving() {
+ if (!window_)
+ return;
+ window_->RemovePreTargetHandler(this);
+ window_->RemoveObserver(this);
+ window_ = nullptr;
+ }
+
+ MenuController* menu_controller_;
+ SubmenuView* submenu_;
+ aura::Window* window_;
+
+ DISALLOW_COPY_AND_ASSIGN(PreMenuEventDispatchHandler);
+};
+#endif // OS_MACOSX
+
+} // namespace internal
+
////////////////////////////////////////////////////////////////////////////////
// MenuHost, public:
@@ -61,6 +122,11 @@ void MenuHost::InitMenuHost(Widget* parent,
#endif
Init(params);
+#if !defined(OS_MACOSX)
+ pre_dispatch_handler_.reset(new internal::PreMenuEventDispatchHandler(
+ menu_controller, submenu_, GetNativeView()));
+#endif
+
SetContentsView(contents_view);
ShowMenuHost(do_capture);
}
@@ -93,6 +159,9 @@ void MenuHost::DestroyMenuHost() {
HideMenuHost();
destroying_ = true;
static_cast<MenuHostRootView*>(GetRootView())->ClearSubmenu();
+#if !defined(OS_MACOSX)
+ pre_dispatch_handler_.reset();
+#endif
Close();
}

Powered by Google App Engine
This is Rietveld 408576698