accelerator_controller_unittest.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_controller.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_table.h"
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/accessibility_delegate.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/ash_switches.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ime_control_delegate.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/screen_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/system/brightness_control_delegate.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/keyboard_brightness/keyboard_brightness_control_delegate.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/display_manager_test_api.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/test/test_screenshot_delegate.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/test_shell_delegate.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/volume_control_delegate.h"
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/event_processor.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/screen.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h>
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/test/events_test_utils_x11.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestTarget : public ui::AcceleratorTarget {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TestTarget() : accelerator_pressed_count_(0) {}
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~TestTarget() {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int accelerator_pressed_count() const {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return accelerator_pressed_count_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_accelerator_pressed_count(int accelerator_pressed_count) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    accelerator_pressed_count_ = accelerator_pressed_count;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ui::AcceleratorTarget:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CanHandleAccelerators() const OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int accelerator_pressed_count_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestTarget);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReleaseAccelerator : public ui::Accelerator {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReleaseAccelerator(ui::KeyboardCode keycode, int modifiers)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui::Accelerator(keycode, modifiers) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_type(ui::ET_KEY_RELEASED);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyVolumeControlDelegate : public VolumeControlDelegate {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DummyVolumeControlDelegate(bool consume)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : consume_(consume),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_volume_mute_count_(0),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_volume_down_count_(0),
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_volume_up_count_(0) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DummyVolumeControlDelegate() {}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleVolumeMute(const ui::Accelerator& accelerator) OVERRIDE {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_volume_mute_count_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_accelerator_ = accelerator;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleVolumeDown(const ui::Accelerator& accelerator) OVERRIDE {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_volume_down_count_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_accelerator_ = accelerator;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleVolumeUp(const ui::Accelerator& accelerator) OVERRIDE {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_volume_up_count_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_accelerator_ = accelerator;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_volume_mute_count() const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_volume_mute_count_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_volume_down_count() const {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_volume_down_count_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_volume_up_count() const {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_volume_up_count_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator& last_accelerator() const {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_accelerator_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool consume_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_volume_mute_count_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_volume_down_count_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_volume_up_count_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator last_accelerator_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DummyVolumeControlDelegate);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyBrightnessControlDelegate : public BrightnessControlDelegate {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DummyBrightnessControlDelegate(bool consume)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : consume_(consume),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_brightness_down_count_(0),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_brightness_up_count_(0) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DummyBrightnessControlDelegate() {}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleBrightnessDown(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ui::Accelerator& accelerator) OVERRIDE {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_brightness_down_count_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_accelerator_ = accelerator;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleBrightnessUp(const ui::Accelerator& accelerator) OVERRIDE {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_brightness_up_count_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_accelerator_ = accelerator;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBrightnessPercent(double percent, bool gradual) OVERRIDE {}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetBrightnessPercent(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Callback<void(double)>& callback) OVERRIDE {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(100.0);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_brightness_down_count() const {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_brightness_down_count_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_brightness_up_count() const {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_brightness_up_count_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator& last_accelerator() const {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_accelerator_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool consume_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_brightness_down_count_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_brightness_up_count_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator last_accelerator_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DummyBrightnessControlDelegate);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyImeControlDelegate : public ImeControlDelegate {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DummyImeControlDelegate(bool consume)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : consume_(consume),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_next_ime_count_(0),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_previous_ime_count_(0),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_switch_ime_count_(0) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DummyImeControlDelegate() {}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleNextIme() OVERRIDE {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_next_ime_count_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
180a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  virtual bool HandlePreviousIme(const ui::Accelerator& accelerator) OVERRIDE {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_previous_ime_count_;
182a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    last_accelerator_ = accelerator;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleSwitchIme(const ui::Accelerator& accelerator) OVERRIDE {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_switch_ime_count_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_accelerator_ = accelerator;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_next_ime_count() const {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_next_ime_count_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_previous_ime_count() const {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_previous_ime_count_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_switch_ime_count() const {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_switch_ime_count_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator& last_accelerator() const {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_accelerator_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ui::Accelerator RemapAccelerator(
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ui::Accelerator& accelerator) OVERRIDE {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui::Accelerator(accelerator);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool consume_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_next_ime_count_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_previous_ime_count_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_switch_ime_count_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator last_accelerator_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DummyImeControlDelegate);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyKeyboardBrightnessControlDelegate
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public KeyboardBrightnessControlDelegate {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DummyKeyboardBrightnessControlDelegate(bool consume)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : consume_(consume),
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_keyboard_brightness_down_count_(0),
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_keyboard_brightness_up_count_(0) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DummyKeyboardBrightnessControlDelegate() {}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleKeyboardBrightnessDown(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ui::Accelerator& accelerator) OVERRIDE {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_keyboard_brightness_down_count_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_accelerator_ = accelerator;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleKeyboardBrightnessUp(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ui::Accelerator& accelerator) OVERRIDE {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++handle_keyboard_brightness_up_count_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_accelerator_ = accelerator;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return consume_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_keyboard_brightness_down_count() const {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_keyboard_brightness_down_count_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_keyboard_brightness_up_count() const {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return handle_keyboard_brightness_up_count_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator& last_accelerator() const {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_accelerator_;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool consume_;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_keyboard_brightness_down_count_;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle_keyboard_brightness_up_count_;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator last_accelerator_;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DummyKeyboardBrightnessControlDelegate);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestTarget::AcceleratorPressed(const ui::Accelerator& accelerator) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++accelerator_pressed_count_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestTarget::CanHandleAccelerators() const {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AcceleratorControllerTest : public test::AshTestBase {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AcceleratorControllerTest() {}
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~AcceleratorControllerTest() {}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnableInternalDisplay() {
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test::DisplayManagerTestApi(Shell::GetInstance()->display_manager()).
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SetFirstDisplayAsInternalDisplay();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AcceleratorController* GetController();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool ProcessWithContext(const ui::Accelerator& accelerator);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Several functions to access ExitWarningHandler (as friend).
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static void StubForTest(ExitWarningHandler* ewh) {
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ewh->stub_timer_for_test_ = true;
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static void Reset(ExitWarningHandler* ewh) {
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ewh->state_ = ExitWarningHandler::IDLE;
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static void SimulateTimerExpired(ExitWarningHandler* ewh) {
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ewh->TimerAction();
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static bool is_ui_shown(ExitWarningHandler* ewh) {
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return !!ewh->widget_;
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static bool is_idle(ExitWarningHandler* ewh) {
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return ewh->state_ == ExitWarningHandler::IDLE;
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static bool is_exiting(ExitWarningHandler* ewh) {
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return ewh->state_ == ExitWarningHandler::EXITING;
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AcceleratorControllerTest);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AcceleratorController* AcceleratorControllerTest::GetController() {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Shell::GetInstance()->accelerator_controller();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AcceleratorControllerTest::ProcessWithContext(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator& accelerator) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AcceleratorController* controller = GetController();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller->context()->UpdateContext(accelerator);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller->Process(accelerator);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if !defined(OS_WIN)
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Double press of exit shortcut => exiting
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(AcceleratorControllerTest, ExitWarningHandlerTestDoublePress) {
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::Accelerator press(ui::VKEY_Q, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::Accelerator release(press);
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  release.set_type(ui::ET_KEY_RELEASED);
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExitWarningHandler* ewh = GetController()->GetExitWarningHandlerForTest();
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(!!ewh);
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  StubForTest(ewh);
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_idle(ewh));
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_ui_shown(ewh));
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(press));
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(release));
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_idle(ewh));
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_ui_shown(ewh));
3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(press));  // second press before timer.
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(release));
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateTimerExpired(ewh);
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_exiting(ewh));
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_ui_shown(ewh));
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Reset(ewh);
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Single press of exit shortcut before timer => idle
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(AcceleratorControllerTest, ExitWarningHandlerTestSinglePress) {
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::Accelerator press(ui::VKEY_Q, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui::Accelerator release(press);
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  release.set_type(ui::ET_KEY_RELEASED);
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExitWarningHandler* ewh = GetController()->GetExitWarningHandlerForTest();
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(!!ewh);
35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  StubForTest(ewh);
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_idle(ewh));
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_ui_shown(ewh));
35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(press));
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(release));
35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_idle(ewh));
35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_ui_shown(ewh));
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateTimerExpired(ewh);
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_idle(ewh));
36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_ui_shown(ewh));
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Reset(ewh);
36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Shutdown ash with exit warning bubble open should not crash.
3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(AcceleratorControllerTest, LingeringExitWarningBubble) {
3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ExitWarningHandler* ewh = GetController()->GetExitWarningHandlerForTest();
3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(!!ewh);
3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  StubForTest(ewh);
3713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Trigger once to show the bubble.
3733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ewh->HandleAccelerator();
3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(is_idle(ewh));
3753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(is_ui_shown(ewh));
3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Exit ash and there should be no crash
3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // !defined(OS_WIN)
38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, Register) {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_a(ui::VKEY_A, ui::EF_NONE);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_a, &target);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The registered accelerator is processed.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(accelerator_a));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, target.accelerator_pressed_count());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, RegisterMultipleTarget) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_a(ui::VKEY_A, ui::EF_NONE);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target1;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_a, &target1);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target2;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_a, &target2);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If multiple targets are registered with the same accelerator, the target
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // registered later processes the accelerator.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(accelerator_a));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, target1.accelerator_pressed_count());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, target2.accelerator_pressed_count());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, Unregister) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_a(ui::VKEY_A, ui::EF_NONE);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_a, &target);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_b(ui::VKEY_B, ui::EF_NONE);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_b, &target);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregistering a different accelerator does not affect the other
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // accelerator.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Unregister(accelerator_b, &target);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(accelerator_a));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, target.accelerator_pressed_count());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unregistered accelerator is no longer processed.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target.set_accelerator_pressed_count(0);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Unregister(accelerator_a, &target);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(accelerator_a));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, target.accelerator_pressed_count());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, UnregisterAll) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_a(ui::VKEY_A, ui::EF_NONE);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target1;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_a, &target1);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_b(ui::VKEY_B, ui::EF_NONE);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_b, &target1);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_c(ui::VKEY_C, ui::EF_NONE);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target2;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_c, &target2);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->UnregisterAll(&target1);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All the accelerators registered for |target1| are no longer processed.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(accelerator_a));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(accelerator_b));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, target1.accelerator_pressed_count());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UnregisterAll with a different target does not affect the other target.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(accelerator_c));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, target2.accelerator_pressed_count());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, Process) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_a(ui::VKEY_A, ui::EF_NONE);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target1;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_a, &target1);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The registered accelerator is processed.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(accelerator_a));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, target1.accelerator_pressed_count());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The non-registered accelerator is not processed.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_b(ui::VKEY_B, ui::EF_NONE);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(accelerator_b));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, IsRegistered) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_a(ui::VKEY_A, ui::EF_NONE);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator_shift_a(ui::VKEY_A, ui::EF_SHIFT_DOWN);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_a, &target);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetController()->IsRegistered(accelerator_a));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->IsRegistered(accelerator_shift_a));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->UnregisterAll(&target);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->IsRegistered(accelerator_a));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, WindowSnap) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window(
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator dummy;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window.get());
47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
47868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  window_state->Activate();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(WINDOW_SNAP_LEFT, dummy);
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect expected_bounds = wm::GetDefaultLeftSnappedWindowBoundsInParent(
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        window.get());
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(expected_bounds.ToString(), window->bounds().ToString());
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(WINDOW_SNAP_RIGHT, dummy);
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect expected_bounds = wm::GetDefaultRightSnappedWindowBoundsInParent(
489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        window.get());
490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(expected_bounds.ToString(), window->bounds().ToString());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    gfx::Rect normal_bounds = window_state->GetRestoreBoundsInParent();
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(TOGGLE_MAXIMIZED, dummy);
49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(window_state->IsMaximized());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(normal_bounds.ToString(), window->bounds().ToString());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(TOGGLE_MAXIMIZED, dummy);
50068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(window_state->IsMaximized());
501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Window gets restored to its restore bounds since side-maximized state
502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // is treated as a "maximized" state.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(normal_bounds.ToString(), window->bounds().ToString());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(TOGGLE_MAXIMIZED, dummy);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(WINDOW_SNAP_LEFT, dummy);
50768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(window_state->IsMaximized());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(TOGGLE_MAXIMIZED, dummy);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(WINDOW_SNAP_RIGHT, dummy);
51168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(window_state->IsMaximized());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(TOGGLE_MAXIMIZED, dummy);
51468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(window_state->IsMaximized());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(WINDOW_MINIMIZE, dummy);
51668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_FALSE(window_state->IsMaximized());
51768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(window_state->IsMinimized());
51868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    window_state->Restore();
51968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    window_state->Activate();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->PerformAction(WINDOW_MINIMIZE, dummy);
52368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(window_state->IsMinimized());
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(AcceleratorControllerTest, CenterWindowAccelerator) {
528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<aura::Window> window(
529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const ui::Accelerator dummy;
531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window.get());
532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_state->Activate();
533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Center the window using accelerator.
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetController()->PerformAction(WINDOW_POSITION_CENTER, dummy);
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect work_area =
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Shell::GetScreen()->GetDisplayNearestWindow(window.get()).work_area();
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect bounds = window->GetBoundsInScreen();
539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NEAR(bounds.x() - work_area.x(),
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              work_area.right() - bounds.right(),
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              1);
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_NEAR(bounds.y() - work_area.y(),
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              work_area.bottom() - bounds.bottom(),
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              1);
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add the window to docked container and try to center it.
547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window->SetBounds(gfx::Rect(0, 0, 20, 20));
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* docked_container = Shell::GetContainer(
549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      window->GetRootWindow(), kShellWindowId_DockedContainer);
550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  docked_container->AddChild(window.get());
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect docked_bounds = window->GetBoundsInScreen();
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetController()->PerformAction(WINDOW_POSITION_CENTER, dummy);
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // It should not get centered and should remain docked.
554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(kShellWindowId_DockedContainer, window->parent()->id());
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(docked_bounds.ToString(), window->GetBoundsInScreen().ToString());
556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
5578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(AcceleratorControllerTest, ControllerContext) {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator accelerator_a(ui::VKEY_A, ui::EF_NONE);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator accelerator_a2(ui::VKEY_A, ui::EF_NONE);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator accelerator_b(ui::VKEY_B, ui::EF_NONE);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accelerator_a.set_type(ui::ET_KEY_PRESSED);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accelerator_a2.set_type(ui::ET_KEY_RELEASED);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accelerator_b.set_type(ui::ET_KEY_PRESSED);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->context()->repeated());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::ET_UNKNOWN,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetController()->context()->previous_accelerator().type());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->context()->UpdateContext(accelerator_a);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->context()->repeated());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::ET_UNKNOWN,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetController()->context()->previous_accelerator().type());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->context()->UpdateContext(accelerator_a2);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->context()->repeated());
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::ET_KEY_PRESSED,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetController()->context()->previous_accelerator().type());
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->context()->UpdateContext(accelerator_a2);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetController()->context()->repeated());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::ET_KEY_RELEASED,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetController()->context()->previous_accelerator().type());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->context()->UpdateContext(accelerator_b);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->context()->repeated());
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::ET_KEY_RELEASED,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetController()->context()->previous_accelerator().type());
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
5930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// crbug.com/314674
5940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#define MAYBE_SuppressToggleMaximized DISABLED_SuppressToggleMaximized
5950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#else
5960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#define MAYBE_SuppressToggleMaximized SuppressToggleMaximized
5970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
5980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST_F(AcceleratorControllerTest, MAYBE_SuppressToggleMaximized) {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window(
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(window.get());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator accelerator(ui::VKEY_A, ui::EF_NONE);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator empty_accelerator;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  wm::WindowState* window_state = wm::GetWindowState(window.get());
60768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Toggling not suppressed.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->context()->UpdateContext(accelerator);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->PerformAction(TOGGLE_MAXIMIZED, accelerator);
61168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMaximized());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The same accelerator - toggling suppressed.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->context()->UpdateContext(accelerator);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->PerformAction(TOGGLE_MAXIMIZED, accelerator);
61668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMaximized());
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Suppressed but not for gesture events.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->PerformAction(TOGGLE_MAXIMIZED, empty_accelerator);
62068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsMaximized());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA)
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// crbug.com/317592
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_ProcessOnce DISABLED_ProcessOnce
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_ProcessOnce ProcessOnce
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(USE_X11)
631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(AcceleratorControllerTest, MAYBE_ProcessOnce) {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::Accelerator accelerator_a(ui::VKEY_A, ui::EF_NONE);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestTarget target;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetController()->Register(accelerator_a, &target);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The accelerator is processed only once.
637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ui::EventProcessor* dispatcher =
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Shell::GetPrimaryRootWindow()->GetHost()->event_processor();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MSG msg1 = { NULL, WM_KEYDOWN, ui::VKEY_A, 0 };
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TranslatedKeyEvent key_event1(msg1, false);
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&key_event1);
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(key_event1.handled() || details.dispatcher_destroyed);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MSG msg2 = { NULL, WM_CHAR, L'A', 0 };
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TranslatedKeyEvent key_event2(msg2, true);
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  details = dispatcher->OnEventFromSource(&key_event2);
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(key_event2.handled() || details.dispatcher_destroyed);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MSG msg3 = { NULL, WM_KEYUP, ui::VKEY_A, 0 };
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TranslatedKeyEvent key_event3(msg3, false);
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  details = dispatcher->OnEventFromSource(&key_event3);
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(key_event3.handled() || details.dispatcher_destroyed);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11)
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::ScopedXI2Event key_event;
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  key_event.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_A, 0);
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::TranslatedKeyEvent key_event1(key_event, false);
6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&key_event1);
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(key_event1.handled() || details.dispatcher_destroyed);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::TranslatedKeyEvent key_event2(key_event, true);
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  details = dispatcher->OnEventFromSource(&key_event2);
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(key_event2.handled() || details.dispatcher_destroyed);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  key_event.InitKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_A, 0);
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::TranslatedKeyEvent key_event3(key_event, false);
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  details = dispatcher->OnEventFromSource(&key_event3);
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(key_event3.handled() || details.dispatcher_destroyed);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, target.accelerator_pressed_count());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, GlobalAccelerators) {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CycleBackward
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_TAB, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN)));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CycleForward
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_TAB, ui::EF_ALT_DOWN)));
68158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // CycleLinear
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE)));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_CHROMEOS)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Take screenshot / partial screenshot
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True should always be returned regardless of the existence of the delegate.
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    test::TestScreenshotDelegate* delegate = GetScreenshotDelegate();
6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->set_can_take_screenshot(false);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN)));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::Accelerator(ui::VKEY_PRINT, ui::EF_NONE)));
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1,
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)));
6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->set_can_take_screenshot(true);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_take_screenshot_count());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN)));
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_take_screenshot_count());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::Accelerator(ui::VKEY_PRINT, ui::EF_NONE)));
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_take_screenshot_count());
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1,
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_take_screenshot_count());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator volume_mute(ui::VKEY_VOLUME_MUTE, ui::EF_NONE);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator volume_down(ui::VKEY_VOLUME_DOWN, ui::EF_NONE);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator volume_up(ui::VKEY_VOLUME_UP, ui::EF_NONE);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyVolumeControlDelegate* delegate =
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyVolumeControlDelegate(false);
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->SetVolumeControlDelegate(
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<VolumeControlDelegate>(delegate).Pass());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_mute_count());
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(volume_mute));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_mute_count());
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(volume_mute, delegate->last_accelerator());
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_down_count());
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(volume_down));
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_down_count());
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(volume_down, delegate->last_accelerator());
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_up_count());
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(volume_up));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_up_count());
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(volume_up, delegate->last_accelerator());
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyVolumeControlDelegate* delegate = new DummyVolumeControlDelegate(true);
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->SetVolumeControlDelegate(
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<VolumeControlDelegate>(delegate).Pass());
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_mute_count());
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_mute));
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_mute_count());
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(volume_mute, delegate->last_accelerator());
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_down_count());
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_down));
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_down_count());
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(volume_down, delegate->last_accelerator());
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_up_count());
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_up));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_up_count());
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(volume_up, delegate->last_accelerator());
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Brightness
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ui::VKEY_BRIGHTNESS_DOWN/UP are not defined on Windows.
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator brightness_down(ui::VKEY_BRIGHTNESS_DOWN, ui::EF_NONE);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator brightness_up(ui::VKEY_BRIGHTNESS_UP, ui::EF_NONE);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyBrightnessControlDelegate* delegate =
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyBrightnessControlDelegate(false);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetBrightnessControlDelegate(
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<BrightnessControlDelegate>(delegate).Pass());
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_brightness_down_count());
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(brightness_down));
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_brightness_down_count());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(brightness_down, delegate->last_accelerator());
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_brightness_up_count());
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(brightness_up));
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_brightness_up_count());
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(brightness_up, delegate->last_accelerator());
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyBrightnessControlDelegate* delegate =
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyBrightnessControlDelegate(true);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetBrightnessControlDelegate(
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<BrightnessControlDelegate>(delegate).Pass());
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_brightness_down_count());
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(brightness_down));
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_brightness_down_count());
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(brightness_down, delegate->last_accelerator());
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_brightness_up_count());
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(brightness_up));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_brightness_up_count());
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(brightness_up, delegate->last_accelerator());
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keyboard brightness
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator alt_brightness_down(ui::VKEY_BRIGHTNESS_DOWN,
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            ui::EF_ALT_DOWN);
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator alt_brightness_up(ui::VKEY_BRIGHTNESS_UP,
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          ui::EF_ALT_DOWN);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(alt_brightness_down));
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(alt_brightness_up));
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyKeyboardBrightnessControlDelegate* delegate =
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyKeyboardBrightnessControlDelegate(false);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetKeyboardBrightnessControlDelegate(
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<KeyboardBrightnessControlDelegate>(delegate).Pass());
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_keyboard_brightness_down_count());
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(alt_brightness_down));
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_keyboard_brightness_down_count());
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(alt_brightness_down, delegate->last_accelerator());
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_keyboard_brightness_up_count());
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(alt_brightness_up));
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_keyboard_brightness_up_count());
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(alt_brightness_up, delegate->last_accelerator());
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyKeyboardBrightnessControlDelegate* delegate =
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyKeyboardBrightnessControlDelegate(true);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetKeyboardBrightnessControlDelegate(
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<KeyboardBrightnessControlDelegate>(delegate).Pass());
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_keyboard_brightness_down_count());
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(alt_brightness_down));
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_keyboard_brightness_down_count());
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(alt_brightness_down, delegate->last_accelerator());
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_keyboard_brightness_up_count());
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(alt_brightness_up));
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_keyboard_brightness_up_count());
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(alt_brightness_up, delegate->last_accelerator());
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NDEBUG)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ToggleDesktopBackgroundMode
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_B, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_LINUX)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ToggleDesktopFullScreen (not implemented yet on Linux)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_F11, ui::EF_CONTROL_DOWN)));
8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // OS_LINUX
8313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // !NDEBUG
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_WIN)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exit
83590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExitWarningHandler* ewh = GetController()->GetExitWarningHandlerForTest();
83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(!!ewh);
83790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  StubForTest(ewh);
83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_idle(ewh));
83990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_ui_shown(ewh));
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_Q, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)));
84290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_idle(ewh));
84390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_ui_shown(ewh));
84490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateTimerExpired(ewh);
84590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(is_idle(ewh));
84690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(is_ui_shown(ewh));
84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Reset(ewh);
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New tab
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_T, ui::EF_CONTROL_DOWN)));
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New incognito window
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_N, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)));
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New window
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_N, ui::EF_CONTROL_DOWN)));
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore tab
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_T, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)));
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show task manager
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN)));
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Open file manager
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Accelerator(ui::VKEY_M, ui::EF_SHIFT_DOWN  | ui::EF_ALT_DOWN)));
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock screen
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: Accelerators that do not work on the lock screen need to be
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tested before the sequence below is invoked because it causes a side
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // effect of locking the screen.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_L, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)));
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AcceleratorControllerTest, GlobalAcceleratorsToggleAppList) {
8851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AccessibilityDelegate* delegate =
8861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          ash::Shell::GetInstance()->accessibility_delegate();
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ash::Shell::GetInstance()->GetAppListTargetVisibility());
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The press event should not open the AppList, the release should instead.
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Accelerator(ui::VKEY_LWIN, ui::EF_NONE)));
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ReleaseAccelerator(ui::VKEY_LWIN, ui::EF_NONE)));
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ash::Shell::GetInstance()->GetAppListTargetVisibility());
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When spoken feedback is on, the AppList should not toggle.
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE);
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Accelerator(ui::VKEY_LWIN, ui::EF_NONE)));
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ReleaseAccelerator(ui::VKEY_LWIN, ui::EF_NONE)));
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE);
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ash::Shell::GetInstance()->GetAppListTargetVisibility());
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Accelerator(ui::VKEY_LWIN, ui::EF_NONE)));
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ProcessWithContext(
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ReleaseAccelerator(ui::VKEY_LWIN, ui::EF_NONE)));
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ash::Shell::GetInstance()->GetAppListTargetVisibility());
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When spoken feedback is on, the AppList should not toggle.
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE);
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::Accelerator(ui::VKEY_LWIN, ui::EF_NONE)));
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ReleaseAccelerator(ui::VKEY_LWIN, ui::EF_NONE)));
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE);
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(ash::Shell::GetInstance()->GetAppListTargetVisibility());
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, ImeGlobalAccelerators) {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test IME shortcuts.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator control_space(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator convert(ui::VKEY_CONVERT, ui::EF_NONE);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator non_convert(ui::VKEY_NONCONVERT, ui::EF_NONE);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator wide_half_1(ui::VKEY_DBE_SBCSCHAR, ui::EF_NONE);
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator wide_half_2(ui::VKEY_DBE_DBCSCHAR, ui::EF_NONE);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator hangul(ui::VKEY_HANGUL, ui::EF_NONE);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(control_space));
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(convert));
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(non_convert));
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(wide_half_1));
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(wide_half_2));
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(hangul));
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyImeControlDelegate* delegate = new DummyImeControlDelegate(true);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetImeControlDelegate(
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<ImeControlDelegate>(delegate).Pass());
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_previous_ime_count());
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(control_space));
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_previous_ime_count());
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_switch_ime_count());
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(convert));
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_switch_ime_count());
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(non_convert));
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_switch_ime_count());
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(wide_half_1));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, delegate->handle_switch_ime_count());
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(wide_half_2));
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, delegate->handle_switch_ime_count());
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(hangul));
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(5, delegate->handle_switch_ime_count());
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test IME shortcuts that are triggered on key release.
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator shift_alt_press(ui::VKEY_MENU,
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ReleaseAccelerator shift_alt(ui::VKEY_MENU, ui::EF_SHIFT_DOWN);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator alt_shift_press(ui::VKEY_SHIFT,
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ReleaseAccelerator alt_shift(ui::VKEY_SHIFT, ui::EF_ALT_DOWN);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyImeControlDelegate* delegate = new DummyImeControlDelegate(true);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetImeControlDelegate(
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<ImeControlDelegate>(delegate).Pass());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_next_ime_count());
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_press));
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(shift_alt));
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_next_ime_count());
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(alt_shift_press));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(alt_shift));
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_next_ime_count());
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should NOT switch IME when e.g. Shift+Alt+X is pressed and X is
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // released.
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator shift_alt_x_press(
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::VKEY_X,
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ReleaseAccelerator shift_alt_x(ui::VKEY_X,
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_press));
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_x_press));
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_x));
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt));
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_next_ime_count());
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // But we _should_ if X is either VKEY_RETURN or VKEY_SPACE.
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(nona|mazda): Remove this when crbug.com/139556 in a better way.
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator shift_alt_return_press(
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::VKEY_RETURN,
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ReleaseAccelerator shift_alt_return(
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::VKEY_RETURN,
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_press));
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_return_press));
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_return));
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(shift_alt));
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, delegate->handle_next_ime_count());
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator shift_alt_space_press(
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::VKEY_SPACE,
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ReleaseAccelerator shift_alt_space(
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::VKEY_SPACE,
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_press));
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_space_press));
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_space));
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(shift_alt));
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(4, delegate->handle_next_ime_count());
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test IME shortcuts again with unnormalized accelerators (Chrome OS only).
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator shift_alt_press(ui::VKEY_MENU, ui::EF_SHIFT_DOWN);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ReleaseAccelerator shift_alt(ui::VKEY_MENU, ui::EF_SHIFT_DOWN);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator alt_shift_press(ui::VKEY_SHIFT, ui::EF_ALT_DOWN);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ReleaseAccelerator alt_shift(ui::VKEY_SHIFT, ui::EF_ALT_DOWN);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyImeControlDelegate* delegate = new DummyImeControlDelegate(true);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetImeControlDelegate(
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<ImeControlDelegate>(delegate).Pass());
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_next_ime_count());
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_press));
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(shift_alt));
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_next_ime_count());
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(alt_shift_press));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(alt_shift));
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_next_ime_count());
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should NOT switch IME when e.g. Shift+Alt+X is pressed and X is
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // released.
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator shift_alt_x_press(
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::VKEY_X,
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ReleaseAccelerator shift_alt_x(ui::VKEY_X,
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_press));
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_x_press));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt_x));
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(shift_alt));
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_next_ime_count());
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(nona|mazda): Remove this when crbug.com/139556 in a better way.
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, ImeGlobalAcceleratorsWorkaround139556) {
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The workaround for crbug.com/139556 depends on the fact that we don't
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use Shift+Alt+Enter/Space with ET_KEY_PRESSED as an accelerator. Test it.
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator shift_alt_return_press(
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::VKEY_RETURN,
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(shift_alt_return_press));
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator shift_alt_space_press(
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::VKEY_SPACE,
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ProcessWithContext(shift_alt_space_press));
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, ReservedAccelerators) {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Shift+)Alt+Tab and Chrome OS top-row keys are reserved.
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetController()->IsReservedAccelerator(
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_TAB, ui::EF_ALT_DOWN)));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetController()->IsReservedAccelerator(
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_TAB, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN)));
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetController()->IsReservedAccelerator(
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_POWER, ui::EF_NONE)));
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Others are not reserved.
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->IsReservedAccelerator(
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_PRINT, ui::EF_NONE)));
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->IsReservedAccelerator(
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_TAB, ui::EF_NONE)));
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetController()->IsReservedAccelerator(
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_A, ui::EF_NONE)));
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AcceleratorControllerTest, DisallowedAtModalWindow) {
108990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::set<AcceleratorAction> all_actions;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0 ; i < kAcceleratorDataLength; ++i)
109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    all_actions.insert(kAcceleratorData[i].action);
109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if !defined(NDEBUG)
109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::set<AcceleratorAction> all_desktop_actions;
109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (size_t i = 0 ; i < kDesktopAcceleratorDataLength; ++i)
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    all_desktop_actions.insert(kDesktopAcceleratorData[i].action);
109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<AcceleratorAction> actionsAllowedAtModalWindow;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t k = 0 ; k < kActionsAllowedAtModalWindowLength; ++k)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    actionsAllowedAtModalWindow.insert(kActionsAllowedAtModalWindow[k]);
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<AcceleratorAction>::const_iterator it =
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           actionsAllowedAtModalWindow.begin();
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != actionsAllowedAtModalWindow.end(); ++it) {
110490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_TRUE(all_actions.find(*it) != all_actions.end()
110590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
110690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if !defined(NDEBUG)
110790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                || all_desktop_actions.find(*it) != all_desktop_actions.end()
110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
110990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                )
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << " action from kActionsAllowedAtModalWindow"
111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        << " not found in kAcceleratorData or kDesktopAcceleratorData. "
111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        << "action: " << *it;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::Window> window(
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::Accelerator dummy;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wm::ActivateWindow(window.get());
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::GetInstance()->SimulateModalWindowOpenForTesting(true);
111990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (std::set<AcceleratorAction>::const_iterator it = all_actions.begin();
112090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       it != all_actions.end(); ++it) {
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (actionsAllowedAtModalWindow.find(*it) ==
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actionsAllowedAtModalWindow.end()) {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(GetController()->PerformAction(*it, dummy))
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << " for action (disallowed at modal window): " << *it;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  Testing of top row (F5-F10) accelerators that should still work
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  when a modal window is open
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Screenshot
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    test::TestScreenshotDelegate* delegate = GetScreenshotDelegate();
11334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->set_can_take_screenshot(false);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN)));
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::Accelerator(ui::VKEY_PRINT, ui::EF_NONE)));
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1,
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)));
11414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delegate->set_can_take_screenshot(true);
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_take_screenshot_count());
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN)));
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_take_screenshot_count());
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui::Accelerator(ui::VKEY_PRINT, ui::EF_NONE)));
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_take_screenshot_count());
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::Accelerator(ui::VKEY_MEDIA_LAUNCH_APP1,
11513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN)));
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, delegate->handle_take_screenshot_count());
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Brightness
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator brightness_down(ui::VKEY_BRIGHTNESS_DOWN, ui::EF_NONE);
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator brightness_up(ui::VKEY_BRIGHTNESS_UP, ui::EF_NONE);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyBrightnessControlDelegate* delegate =
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyBrightnessControlDelegate(false);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetBrightnessControlDelegate(
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<BrightnessControlDelegate>(delegate).Pass());
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_brightness_down_count());
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(brightness_down));
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_brightness_down_count());
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(brightness_down, delegate->last_accelerator());
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_brightness_up_count());
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(brightness_up));
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_brightness_up_count());
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(brightness_up, delegate->last_accelerator());
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyBrightnessControlDelegate* delegate =
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyBrightnessControlDelegate(true);
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetController()->SetBrightnessControlDelegate(
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<BrightnessControlDelegate>(delegate).Pass());
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_brightness_down_count());
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(brightness_down));
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_brightness_down_count());
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(brightness_down, delegate->last_accelerator());
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_brightness_up_count());
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(brightness_up));
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_brightness_up_count());
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(brightness_up, delegate->last_accelerator());
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Volume
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator volume_mute(ui::VKEY_VOLUME_MUTE, ui::EF_NONE);
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator volume_down(ui::VKEY_VOLUME_DOWN, ui::EF_NONE);
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::Accelerator volume_up(ui::VKEY_VOLUME_UP, ui::EF_NONE);
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_mute));
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_down));
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_up));
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyVolumeControlDelegate* delegate =
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new DummyVolumeControlDelegate(false);
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->SetVolumeControlDelegate(
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<VolumeControlDelegate>(delegate).Pass());
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_mute_count());
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(volume_mute));
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_mute_count());
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(volume_mute, delegate->last_accelerator());
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_down_count());
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(volume_down));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_down_count());
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(volume_down, delegate->last_accelerator());
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_up_count());
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(ProcessWithContext(volume_up));
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_up_count());
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(volume_up, delegate->last_accelerator());
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DummyVolumeControlDelegate* delegate = new DummyVolumeControlDelegate(true);
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->system_tray_delegate()->SetVolumeControlDelegate(
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<VolumeControlDelegate>(delegate).Pass());
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_mute_count());
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_mute));
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_mute_count());
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(volume_mute, delegate->last_accelerator());
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_down_count());
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_down));
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_down_count());
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(volume_down, delegate->last_accelerator());
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, delegate->handle_volume_up_count());
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ProcessWithContext(volume_up));
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, delegate->handle_volume_up_count());
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(volume_up, delegate->last_accelerator());
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(AcceleratorControllerTest, DisallowedWithNoWindow) {
1231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const ui::Accelerator dummy;
1232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AccessibilityDelegate* delegate =
1233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ash::Shell::GetInstance()->accessibility_delegate();
1234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < kActionsNeedingWindowLength; ++i) {
1236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate->TriggerAccessibilityAlert(A11Y_ALERT_NONE);
1237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(
1238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        GetController()->PerformAction(kActionsNeedingWindow[i], dummy));
1239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(delegate->GetLastAccessibilityAlert(), A11Y_ALERT_WINDOW_NEEDED);
1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Make sure we don't alert if we do have a window.
1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<aura::Window> window(
1244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
1245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  wm::ActivateWindow(window.get());
1246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < kActionsNeedingWindowLength; ++i) {
1247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate->TriggerAccessibilityAlert(A11Y_ALERT_NONE);
1248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GetController()->PerformAction(kActionsNeedingWindow[i], dummy);
1249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(delegate->GetLastAccessibilityAlert(), A11Y_ALERT_NONE);
1250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Don't alert if we have a minimized window either.
1253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetController()->PerformAction(WINDOW_MINIMIZE, dummy);
1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < kActionsNeedingWindowLength; ++i) {
1255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delegate->TriggerAccessibilityAlert(A11Y_ALERT_NONE);
1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GetController()->PerformAction(kActionsNeedingWindow[i], dummy);
1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(delegate->GetLastAccessibilityAlert(), A11Y_ALERT_NONE);
1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1262