summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorflackr@chromium.org <flackr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-04 02:34:10 +0000
committerflackr@chromium.org <flackr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-04 02:34:10 +0000
commitf45a508837c9a2a8be235377f926e10747c037de (patch)
tree3ffb57dfca8703f8663de870b3b055cc6bf8b85e /ash
parent19a28c8c8f29e8801b0672b0d242f43849d1af77 (diff)
downloadchromium_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.cc44
-rw-r--r--ash/wm/overview/window_selector.h6
-rw-r--r--ash/wm/overview/window_selector_controller.cc44
-rw-r--r--ash/wm/overview/window_selector_controller.h9
-rw-r--r--ash/wm/overview/window_selector_unittest.cc3
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() {