summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiyuan Xia <xiyuan@chromium.org>2015-09-04 08:19:15 -0700
committerXiyuan Xia <xiyuan@chromium.org>2015-09-04 15:20:44 +0000
commitea4472b177d1cfdea2eebf8d05002df468ac56e2 (patch)
tree9d5c2edd5afeb7220dac30ba63aa78bf04cb4e0b
parent8f757d2cd1612259a6cb9ed92e3fcac6d33c81f8 (diff)
downloadchromium_src-ea4472b177d1cfdea2eebf8d05002df468ac56e2.zip
chromium_src-ea4472b177d1cfdea2eebf8d05002df468ac56e2.tar.gz
chromium_src-ea4472b177d1cfdea2eebf8d05002df468ac56e2.tar.bz2
Merge "ash: Make SpokenFeedbackToggler pass through events"
> BUG=526729 > > Review URL: https://codereview.chromium.org/1323103002 > > Cr-Commit-Position: refs/heads/master@{#346971} > (cherry picked from commit 1041df16625a1235394263626af7fbb4c8a795e0) Review URL: https://codereview.chromium.org/1325173004 . Cr-Commit-Position: refs/branch-heads/2490@{#163} Cr-Branched-From: 7790a3535f2a81a03685eca31a32cf69ae0c114f-refs/heads/master@{#344925}
-rw-r--r--ash/accelerators/key_hold_detector.cc20
-rw-r--r--ash/accelerators/key_hold_detector.h3
-rw-r--r--ash/accelerators/magnifier_key_scroller.cc4
-rw-r--r--ash/accelerators/magnifier_key_scroller.h1
-rw-r--r--ash/accelerators/spoken_feedback_toggler.cc5
-rw-r--r--ash/accelerators/spoken_feedback_toggler.h1
-rw-r--r--ash/accelerators/spoken_feedback_toggler_unittest.cc28
7 files changed, 55 insertions, 7 deletions
diff --git a/ash/accelerators/key_hold_detector.cc b/ash/accelerators/key_hold_detector.cc
index 46c17ea..99a9abb 100644
--- a/ash/accelerators/key_hold_detector.cc
+++ b/ash/accelerators/key_hold_detector.cc
@@ -61,16 +61,19 @@ void KeyHoldDetector::OnKeyEvent(ui::KeyEvent* event) {
return;
}
state_ = PRESSED;
- // Don't process ET_KEY_PRESSED event yet. The ET_KEY_PRESSED
- // event will be generated upon ET_KEY_RELEASEED event below.
- event->StopPropagation();
+ if (delegate_->ShouldStopEventPropagation()) {
+ // Don't process ET_KEY_PRESSED event yet. The ET_KEY_PRESSED
+ // event will be generated upon ET_KEY_RELEASEED event below.
+ event->StopPropagation();
+ }
break;
case PRESSED:
state_ = HOLD;
// pass through
case HOLD:
delegate_->OnKeyHold(event);
- event->StopPropagation();
+ if (delegate_->ShouldStopEventPropagation())
+ event->StopPropagation();
break;
}
} else if (event->type() == ui::ET_KEY_RELEASED) {
@@ -78,13 +81,16 @@ void KeyHoldDetector::OnKeyEvent(ui::KeyEvent* event) {
case INITIAL:
break;
case PRESSED: {
- PostPressedEvent(event);
- event->StopPropagation();
+ if (delegate_->ShouldStopEventPropagation()) {
+ PostPressedEvent(event);
+ event->StopPropagation();
+ }
break;
}
case HOLD: {
delegate_->OnKeyUnhold(event);
- event->StopPropagation();
+ if (delegate_->ShouldStopEventPropagation())
+ event->StopPropagation();
break;
}
}
diff --git a/ash/accelerators/key_hold_detector.h b/ash/accelerators/key_hold_detector.h
index cad7e9f..4a21547 100644
--- a/ash/accelerators/key_hold_detector.h
+++ b/ash/accelerators/key_hold_detector.h
@@ -31,6 +31,9 @@ class ASH_EXPORT KeyHoldDetector : public ui::EventHandler {
// This should return true if the event should start the state transition.
virtual bool IsStartEvent(const ui::KeyEvent* event) const = 0;
+ // Whether to stop event propagation after processing.
+ virtual bool ShouldStopEventPropagation() const = 0;
+
// Called when the key is held.
virtual void OnKeyHold(const ui::KeyEvent* event) = 0;
diff --git a/ash/accelerators/magnifier_key_scroller.cc b/ash/accelerators/magnifier_key_scroller.cc
index 2e33950..f5198dc 100644
--- a/ash/accelerators/magnifier_key_scroller.cc
+++ b/ash/accelerators/magnifier_key_scroller.cc
@@ -52,6 +52,10 @@ bool MagnifierKeyScroller::IsStartEvent(const ui::KeyEvent* event) const {
event->flags() & ui::EF_SHIFT_DOWN;
}
+bool MagnifierKeyScroller::ShouldStopEventPropagation() const {
+ return true;
+}
+
void MagnifierKeyScroller::OnKeyHold(const ui::KeyEvent* event) {
MagnificationController* controller =
Shell::GetInstance()->magnification_controller();
diff --git a/ash/accelerators/magnifier_key_scroller.h b/ash/accelerators/magnifier_key_scroller.h
index 2e16533..41f5ce15 100644
--- a/ash/accelerators/magnifier_key_scroller.h
+++ b/ash/accelerators/magnifier_key_scroller.h
@@ -41,6 +41,7 @@ class ASH_EXPORT MagnifierKeyScroller : public KeyHoldDetector::Delegate {
// KeyHoldDetector overrides:
bool ShouldProcessEvent(const ui::KeyEvent* event) const override;
bool IsStartEvent(const ui::KeyEvent* event) const override;
+ bool ShouldStopEventPropagation() const override;
void OnKeyHold(const ui::KeyEvent* event) override;
void OnKeyUnhold(const ui::KeyEvent* event) override;
diff --git a/ash/accelerators/spoken_feedback_toggler.cc b/ash/accelerators/spoken_feedback_toggler.cc
index 32ef929..5cd9eba 100644
--- a/ash/accelerators/spoken_feedback_toggler.cc
+++ b/ash/accelerators/spoken_feedback_toggler.cc
@@ -40,6 +40,11 @@ bool SpokenFeedbackToggler::IsStartEvent(const ui::KeyEvent* event) const {
event->flags() & ui::EF_SHIFT_DOWN;
}
+bool SpokenFeedbackToggler::ShouldStopEventPropagation() const {
+ // Let hotkey events pass through. See http://crbug.com/526729
+ return false;
+}
+
void SpokenFeedbackToggler::OnKeyHold(const ui::KeyEvent* event) {
if (!toggled_) {
toggled_ = true;
diff --git a/ash/accelerators/spoken_feedback_toggler.h b/ash/accelerators/spoken_feedback_toggler.h
index 51bf985..dd0bb99 100644
--- a/ash/accelerators/spoken_feedback_toggler.h
+++ b/ash/accelerators/spoken_feedback_toggler.h
@@ -41,6 +41,7 @@ class ASH_EXPORT SpokenFeedbackToggler : public KeyHoldDetector::Delegate {
// KeyHoldDetector overrides:
bool ShouldProcessEvent(const ui::KeyEvent* event) const override;
bool IsStartEvent(const ui::KeyEvent* event) const override;
+ bool ShouldStopEventPropagation() const override;
void OnKeyHold(const ui::KeyEvent* event) override;
void OnKeyUnhold(const ui::KeyEvent* event) override;
diff --git a/ash/accelerators/spoken_feedback_toggler_unittest.cc b/ash/accelerators/spoken_feedback_toggler_unittest.cc
index 20df051..6263089 100644
--- a/ash/accelerators/spoken_feedback_toggler_unittest.cc
+++ b/ash/accelerators/spoken_feedback_toggler_unittest.cc
@@ -47,4 +47,32 @@ TEST_F(SpokenFeedbackTogglerTest, Basic) {
EXPECT_FALSE(delegate->IsSpokenFeedbackEnabled());
}
+TEST_F(SpokenFeedbackTogglerTest, PassThroughEvents) {
+ SpokenFeedbackToggler::ScopedEnablerForTest scoped;
+
+ aura::test::EventCountDelegate delegate;
+ scoped_ptr<aura::Window> window(CreateTestWindowInShellWithDelegate(
+ &delegate, 0, gfx::Rect(0, 0, 100, 100)));
+ window->Focus();
+
+ ui::test::EventGenerator& generator = GetEventGenerator();
+
+ // None hotkey events.
+ generator.PressKey(ui::VKEY_A, 0);
+ generator.ReleaseKey(ui::VKEY_F6, 0);
+ EXPECT_EQ("1 1", delegate.GetKeyCountsAndReset());
+
+ // Single hotkey press and release.
+ generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
+ generator.ReleaseKey(ui::VKEY_F6, 0);
+ EXPECT_EQ("1 1", delegate.GetKeyCountsAndReset());
+
+ // Hotkey press and hold.
+ generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
+ generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
+ generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
+ generator.ReleaseKey(ui::VKEY_F6, 0);
+ EXPECT_EQ("3 1", delegate.GetKeyCountsAndReset());
+}
+
} // namespace ash