From ea4472b177d1cfdea2eebf8d05002df468ac56e2 Mon Sep 17 00:00:00 2001 From: Xiyuan Xia Date: Fri, 4 Sep 2015 08:19:15 -0700 Subject: 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} --- ash/accelerators/key_hold_detector.cc | 20 ++++++++++------ ash/accelerators/key_hold_detector.h | 3 +++ ash/accelerators/magnifier_key_scroller.cc | 4 ++++ ash/accelerators/magnifier_key_scroller.h | 1 + ash/accelerators/spoken_feedback_toggler.cc | 5 ++++ ash/accelerators/spoken_feedback_toggler.h | 1 + .../spoken_feedback_toggler_unittest.cc | 28 ++++++++++++++++++++++ 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 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 -- cgit v1.1