1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef ASH_ACCELERATORS_EXIT_WARNING_HANDLER_H_
6#define ASH_ACCELERATORS_EXIT_WARNING_HANDLER_H_
7
8#include "ash/ash_export.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/timer/timer.h"
11#include "ui/base/accelerators/accelerator.h"
12
13namespace views {
14class Widget;
15}
16
17namespace ash {
18
19// In order to avoid accidental exits when the user presses the exit
20// shortcut by mistake, we require the user press it twice within a
21// period of time. During that time we show a popup informing the
22// user of this.
23//
24// Notes:
25//
26// The corresponding accelerator must be non-repeatable (see
27// kNonrepeatableActions in accelerator_table.cc). Otherwise the "Double Press
28// Exit" will be activated just by holding it down, i.e. probably every time.
29//
30// State Transition Diagrams:
31//
32//  IDLE
33//   | Press
34//  WAIT_FOR_DOUBLE_PRESS action: show ui & start timers
35//   | Press (before time limit )
36//  EXITING action: hide ui, stop timer, exit
37//
38//  IDLE
39//   | Press
40//  WAIT_FOR_DOUBLE_PRESS action: show ui & start timers
41//   | T timer expires
42//  IDLE action: hide ui
43//
44
45class AcceleratorControllerTest;
46
47class ASH_EXPORT ExitWarningHandler {
48 public:
49  ExitWarningHandler();
50
51  ~ExitWarningHandler();
52
53  // Handles accelerator for exit (Ctrl-Shift-Q).
54  void HandleAccelerator();
55
56 private:
57  friend class AcceleratorControllerTest;
58
59  enum State {
60    IDLE,
61    WAIT_FOR_DOUBLE_PRESS,
62    EXITING
63  };
64
65  // Performs actions when the time limit is exceeded.
66  void TimerAction();
67
68  void StartTimer();
69  void CancelTimer();
70
71  void Show();
72  void Hide();
73
74  State state_;
75  scoped_ptr<views::Widget> widget_;
76  base::OneShotTimer<ExitWarningHandler> timer_;
77
78  // Flag to suppress starting the timer for testing. For test we call
79  // TimerAction() directly to simulate the expiration of the timer.
80  bool stub_timer_for_test_;
81
82  DISALLOW_COPY_AND_ASSIGN(ExitWarningHandler);
83};
84
85}  // namespace ash
86
87#endif  // ASH_ACCELERATORS_EXIT_WARNING_HANDLER_H_
88