diff options
author | flackr@chromium.org <flackr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-04 02:34:10 +0000 |
---|---|---|
committer | flackr@chromium.org <flackr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-04 02:34:10 +0000 |
commit | f45a508837c9a2a8be235377f926e10747c037de (patch) | |
tree | 3ffb57dfca8703f8663de870b3b055cc6bf8b85e /ash | |
parent | 19a28c8c8f29e8801b0672b0d242f43849d1af77 (diff) | |
download | chromium_src-f45a508837c9a2a8be235377f926e10747c037de.zip chromium_src-f45a508837c9a2a8be235377f926e10747c037de.tar.gz chromium_src-f45a508837c9a2a8be235377f926e10747c037de.tar.bz2 |
Move event handler to window_selector to ensure correct lifetime.
BUG=279562
TEST=With --ash-enable-overview-mode, start alt-tabbing, click a window, then press and release alt. There should be no crash.
Review URL: https://chromiumcodereview.appspot.com/23529006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221123 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/wm/overview/window_selector.cc | 44 | ||||
-rw-r--r-- | ash/wm/overview/window_selector.h | 6 | ||||
-rw-r--r-- | ash/wm/overview/window_selector_controller.cc | 44 | ||||
-rw-r--r-- | ash/wm/overview/window_selector_controller.h | 9 | ||||
-rw-r--r-- | ash/wm/overview/window_selector_unittest.cc | 3 |
5 files changed, 49 insertions, 57 deletions
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc index 0118e5d..a39c145 100644 --- a/ash/wm/overview/window_selector.cc +++ b/ash/wm/overview/window_selector.cc @@ -17,6 +17,8 @@ #include "ui/aura/client/focus_client.h" #include "ui/aura/root_window.h" #include "ui/aura/window.h" +#include "ui/base/events/event.h" +#include "ui/base/events/event_handler.h" namespace ash { @@ -38,6 +40,42 @@ struct WindowSelectorWindowComparator const aura::Window* target; }; +// Filter to watch for the termination of a keyboard gesture to cycle through +// multiple windows. +class WindowSelectorEventFilter : public ui::EventHandler { + public: + WindowSelectorEventFilter(WindowSelector* selector); + virtual ~WindowSelectorEventFilter(); + + // Overridden from ui::EventHandler: + virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; + + private: + // A weak pointer to the WindowSelector which owns this instance. + WindowSelector* selector_; + + DISALLOW_COPY_AND_ASSIGN(WindowSelectorEventFilter); +}; + +// Watch for all keyboard events by filtering the root window. +WindowSelectorEventFilter::WindowSelectorEventFilter(WindowSelector* selector) + : selector_(selector) { + Shell::GetInstance()->AddPreTargetHandler(this); +} + +WindowSelectorEventFilter::~WindowSelectorEventFilter() { + Shell::GetInstance()->RemovePreTargetHandler(this); +} + +void WindowSelectorEventFilter::OnKeyEvent(ui::KeyEvent* event) { + // Views uses VKEY_MENU for both left and right Alt keys. + if (event->key_code() == ui::VKEY_MENU && + event->type() == ui::ET_KEY_RELEASED) { + selector_->SelectWindow(); + // Warning: |this| will be deleted from here on. + } +} + } // namespace WindowSelector::WindowSelector(const WindowList& windows, @@ -73,10 +111,12 @@ WindowSelector::WindowSelector(const WindowList& windows, } } - if (mode == WindowSelector::CYCLE) + if (mode == WindowSelector::CYCLE) { + event_handler_.reset(new WindowSelectorEventFilter(this)); start_overview_timer_.Reset(); - else + } else { StartOverview(); + } } WindowSelector::~WindowSelector() { diff --git a/ash/wm/overview/window_selector.h b/ash/wm/overview/window_selector.h index 7536f41..4059540 100644 --- a/ash/wm/overview/window_selector.h +++ b/ash/wm/overview/window_selector.h @@ -20,7 +20,7 @@ class RootWindow; } namespace ui { -class LocatedEvent; +class EventHandler; } namespace ash { @@ -101,6 +101,10 @@ class ASH_EXPORT WindowSelector // The window selection mode. Mode mode_; + // An event handler listening for the release of the alt key during alt-tab + // cycling. + scoped_ptr<ui::EventHandler> event_handler_; + base::DelayTimer<WindowSelector> start_overview_timer_; scoped_ptr<WindowOverview> window_overview_; diff --git a/ash/wm/overview/window_selector_controller.cc b/ash/wm/overview/window_selector_controller.cc index 490e570..84c83d2 100644 --- a/ash/wm/overview/window_selector_controller.cc +++ b/ash/wm/overview/window_selector_controller.cc @@ -9,47 +9,9 @@ #include "ash/wm/mru_window_tracker.h" #include "ash/wm/overview/window_selector.h" #include "ash/wm/window_util.h" -#include "ui/base/events/event.h" -#include "ui/base/events/event_handler.h" namespace ash { -namespace { - -// Filter to watch for the termination of a keyboard gesture to cycle through -// multiple windows. -class WindowSelectorEventFilter : public ui::EventHandler { - public: - WindowSelectorEventFilter(); - virtual ~WindowSelectorEventFilter(); - - // Overridden from ui::EventHandler: - virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; - - private: - DISALLOW_COPY_AND_ASSIGN(WindowSelectorEventFilter); -}; - -// Watch for all keyboard events by filtering the root window. -WindowSelectorEventFilter::WindowSelectorEventFilter() { - Shell::GetInstance()->AddPreTargetHandler(this); -} - -WindowSelectorEventFilter::~WindowSelectorEventFilter() { - Shell::GetInstance()->RemovePreTargetHandler(this); -} - -void WindowSelectorEventFilter::OnKeyEvent(ui::KeyEvent* event) { - // Views uses VKEY_MENU for both left and right Alt keys. - if (event->key_code() == ui::VKEY_MENU && - event->type() == ui::ET_KEY_RELEASED) { - Shell::GetInstance()->window_selector_controller()->AltKeyReleased(); - // Warning: |this| will be deleted from here on. - } -} - -} // namespace - WindowSelectorController::WindowSelectorController() { } @@ -86,7 +48,6 @@ void WindowSelectorController::HandleCycleWindow( return; if (!IsSelecting()) { - event_handler_.reset(new WindowSelectorEventFilter()); std::vector<aura::Window*> windows = ash::Shell::GetInstance()-> mru_window_tracker()->BuildMruWindowList(); // Removing focus will hide popup windows like the omnibar or open menus. @@ -98,11 +59,6 @@ void WindowSelectorController::HandleCycleWindow( } } -void WindowSelectorController::AltKeyReleased() { - event_handler_.reset(); - window_selector_->SelectWindow(); -} - bool WindowSelectorController::IsSelecting() { return window_selector_.get() != NULL; } diff --git a/ash/wm/overview/window_selector_controller.h b/ash/wm/overview/window_selector_controller.h index 6f03de6..6b16892 100644 --- a/ash/wm/overview/window_selector_controller.h +++ b/ash/wm/overview/window_selector_controller.h @@ -19,10 +19,6 @@ namespace aura { class Window; } -namespace ui { -class EventHandler; -} - namespace ash { namespace internal { @@ -53,10 +49,6 @@ class ASH_EXPORT WindowSelectorController // released. void HandleCycleWindow(WindowSelector::Direction direction); - // Informs the controller that the Alt key has been released and it can - // terminate the existing multi-step cycle. - void AltKeyReleased(); - // Returns true if window selection mode is active. bool IsSelecting(); @@ -68,7 +60,6 @@ class ASH_EXPORT WindowSelectorController friend class internal::WindowSelectorTest; scoped_ptr<WindowSelector> window_selector_; - scoped_ptr<ui::EventHandler> event_handler_; DISALLOW_COPY_AND_ASSIGN(WindowSelectorController); }; diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc index d9a3d61..3210259 100644 --- a/ash/wm/overview/window_selector_unittest.cc +++ b/ash/wm/overview/window_selector_unittest.cc @@ -54,7 +54,8 @@ class WindowSelectorTest : public test::AshTestBase { } void StopCycling() { - ash::Shell::GetInstance()->window_selector_controller()->AltKeyReleased(); + ash::Shell::GetInstance()->window_selector_controller()->window_selector_-> + SelectWindow(); } void FireOverviewStartTimer() { |