focus_controller_unittest.cc revision 010d83a9304c5a91596085d917d248abff47903a
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/focus_controller.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/client/aura_constants.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/default_capture_client.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_change_observer.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/event_generator.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/test_windows.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_tracker.h"
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/base/ime/dummy_text_input_client.h"
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/base/ime/text_input_focus_manager.h"
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/base_focus_rules.h"
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/wm_state.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_change_observer.h"
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_client.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace wm {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusNotificationObserver : public aura::client::ActivationChangeObserver,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  public aura::client::FocusChangeObserver {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusNotificationObserver()
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : activation_changed_count_(0),
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        focus_changed_count_(0),
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        reactivation_count_(0),
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        reactivation_requested_window_(NULL),
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        reactivation_actual_window_(NULL) {}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FocusNotificationObserver() {}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectCounts(int activation_changed_count, int focus_changed_count) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(activation_changed_count, activation_changed_count_);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(focus_changed_count, focus_changed_count_);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int reactivation_count() const {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return reactivation_count_;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* reactivation_requested_window() const {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return reactivation_requested_window_;
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* reactivation_actual_window() const {
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return reactivation_actual_window_;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::client::ActivationChangeObserver:
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowActivated(aura::Window* gained_active,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 aura::Window* lost_active) OVERRIDE {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++activation_changed_count_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnAttemptToReactivateWindow(
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::Window* request_active,
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      aura::Window* actual_active) OVERRIDE {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ++reactivation_count_;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    reactivation_requested_window_ = request_active;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    reactivation_actual_window_ = actual_active;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::client::FocusChangeObserver:
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowFocused(aura::Window* gained_focus,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               aura::Window* lost_focus) OVERRIDE {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++focus_changed_count_;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int activation_changed_count_;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int focus_changed_count_;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int reactivation_count_;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* reactivation_requested_window_;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* reactivation_actual_window_;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusNotificationObserver);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WindowDeleter {
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual aura::Window* GetDeletedWindow() = 0;
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~WindowDeleter() {}
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ActivationChangeObserver and FocusChangeObserver that keeps track of whether
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// it was notified about activation changes or focus changes with a deleted
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// window.
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RecordingActivationAndFocusChangeObserver
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public aura::client::ActivationChangeObserver,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      public aura::client::FocusChangeObserver {
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RecordingActivationAndFocusChangeObserver(aura::Window* root,
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            WindowDeleter* deleter)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : root_(root),
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        deleter_(deleter),
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        was_notified_with_deleted_window_(false) {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::GetActivationClient(root_)->AddObserver(this);
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::GetFocusClient(root_)->AddObserver(this);
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~RecordingActivationAndFocusChangeObserver() {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::GetActivationClient(root_)->RemoveObserver(this);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::GetFocusClient(root_)->RemoveObserver(this);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool was_notified_with_deleted_window() const {
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return was_notified_with_deleted_window_;
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overridden from aura::client::ActivationChangeObserver:
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnWindowActivated(aura::Window* gained_active,
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 aura::Window* lost_active) OVERRIDE {
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (lost_active && lost_active == deleter_->GetDeletedWindow())
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      was_notified_with_deleted_window_ = true;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overridden from aura::client::FocusChangeObserver:
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnWindowFocused(aura::Window* gained_focus,
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               aura::Window* lost_focus) OVERRIDE {
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (lost_focus && lost_focus == deleter_->GetDeletedWindow())
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      was_notified_with_deleted_window_ = true;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* root_;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Not owned.
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WindowDeleter* deleter_;
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Whether the observer was notified about the loss of activation or the
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // loss of focus with a window already deleted by |deleter_| as the
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |lost_active| or |lost_focus| parameter.
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool was_notified_with_deleted_window_;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RecordingActivationAndFocusChangeObserver);
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ActivationChangeObserver that deletes the window losing activation.
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DeleteOnLoseActivationChangeObserver :
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    public aura::client::ActivationChangeObserver,
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    public WindowDeleter {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit DeleteOnLoseActivationChangeObserver(aura::Window* window)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : root_(window->GetRootWindow()),
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_(window),
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        did_delete_(false) {
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::GetActivationClient(root_)->AddObserver(this);
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~DeleteOnLoseActivationChangeObserver() {
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::GetActivationClient(root_)->RemoveObserver(this);
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overridden from aura::client::ActivationChangeObserver:
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnWindowActivated(aura::Window* gained_active,
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 aura::Window* lost_active) OVERRIDE {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (window_ && lost_active == window_) {
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      delete lost_active;
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      did_delete_ = true;
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overridden from WindowDeleter:
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual aura::Window* GetDeletedWindow() OVERRIDE {
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return did_delete_ ? window_ : NULL;
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* root_;
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* window_;
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool did_delete_;
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeleteOnLoseActivationChangeObserver);
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// FocusChangeObserver that deletes the window losing focus.
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DeleteOnLoseFocusChangeObserver
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public aura::client::FocusChangeObserver,
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      public WindowDeleter {
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit DeleteOnLoseFocusChangeObserver(aura::Window* window)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : root_(window->GetRootWindow()),
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window_(window),
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        did_delete_(false) {
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::GetFocusClient(root_)->AddObserver(this);
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~DeleteOnLoseFocusChangeObserver() {
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::GetFocusClient(root_)->RemoveObserver(this);
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overridden from aura::client::FocusChangeObserver:
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnWindowFocused(aura::Window* gained_focus,
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               aura::Window* lost_focus) OVERRIDE {
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (window_ && lost_focus == window_) {
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      delete lost_focus;
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      did_delete_ = true;
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overridden from WindowDeleter:
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual aura::Window* GetDeletedWindow() OVERRIDE {
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return did_delete_ ? window_ : NULL;
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* root_;
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::Window* window_;
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool did_delete_;
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeleteOnLoseFocusChangeObserver);
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScopedFocusNotificationObserver : public FocusNotificationObserver {
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedFocusNotificationObserver(aura::Window* root_window)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : root_window_(root_window) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetActivationClient(root_window_)->AddObserver(this);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetFocusClient(root_window_)->AddObserver(this);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ScopedFocusNotificationObserver() {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetActivationClient(root_window_)->RemoveObserver(this);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetFocusClient(root_window_)->RemoveObserver(this);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* root_window_;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedFocusNotificationObserver);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScopedTargetFocusNotificationObserver : public FocusNotificationObserver {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ScopedTargetFocusNotificationObserver(aura::Window* root_window, int id)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : target_(root_window->GetChildById(id)) {
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::SetActivationChangeObserver(target_, this);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::SetFocusChangeObserver(target_, this);
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tracker_.Add(target_);
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ScopedTargetFocusNotificationObserver() {
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (tracker_.Contains(target_)) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::SetActivationChangeObserver(target_, NULL);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::SetFocusChangeObserver(target_, NULL);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target_;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::WindowTracker tracker_;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedTargetFocusNotificationObserver);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ScopedFocusedTextInputClientChanger
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : public ScopedFocusNotificationObserver {
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScopedFocusedTextInputClientChanger(aura::Window* root_window,
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      ui::TextInputClient* text_input_client)
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      : ScopedFocusNotificationObserver(root_window),
263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        text_input_client_(text_input_client) {}
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Overridden from aura::client::FocusChangeObserver:
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void OnWindowFocused(aura::Window* gained_focus,
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               aura::Window* lost_focus) OVERRIDE {
269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::TextInputFocusManager::GetInstance()->FocusTextInputClient(
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        text_input_client_);
271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ui::TextInputClient* text_input_client_;
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusShiftingActivationObserver
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public aura::client::ActivationChangeObserver {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit FocusShiftingActivationObserver(aura::Window* activated_window)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : activated_window_(activated_window),
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shift_focus_to_(NULL) {}
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FocusShiftingActivationObserver() {}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_shift_focus_to(aura::Window* shift_focus_to) {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shift_focus_to_ = shift_focus_to;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::client::ActivationChangeObserver:
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowActivated(aura::Window* gained_active,
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 aura::Window* lost_active) OVERRIDE {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Shift focus to a child. This should prevent the default focusing from
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // occurring in FocusController::FocusWindow().
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (gained_active == activated_window_) {
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::FocusClient* client =
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          aura::client::GetFocusClient(gained_active);
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client->FocusWindow(shift_focus_to_);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* activated_window_;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* shift_focus_to_;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusShiftingActivationObserver);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// BaseFocusRules subclass that allows basic overrides of focus/activation to
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// be tested. This is intended more as a test that the override system works at
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// all, rather than as an exhaustive set of use cases, those should be covered
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// in tests for those FocusRules implementations.
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestFocusRules : public BaseFocusRules {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestFocusRules() : focus_restriction_(NULL) {}
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Restricts focus and activation to this window and its child hierarchy.
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_focus_restriction(aura::Window* focus_restriction) {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    focus_restriction_ = focus_restriction;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from BaseFocusRules:
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SupportsChildActivation(aura::Window* window) const OVERRIDE {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // In FocusControllerTests, only the RootWindow has activatable children.
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return window->GetRootWindow() == window;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CanActivateWindow(aura::Window* window) const OVERRIDE {
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Restricting focus to a non-activatable child window means the activatable
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // parent outside the focus restriction is activatable.
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool can_activate =
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CanFocusOrActivate(window) || window->Contains(focus_restriction_);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return can_activate ? BaseFocusRules::CanActivateWindow(window) : false;
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CanFocusWindow(aura::Window* window) const OVERRIDE {
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CanFocusOrActivate(window) ?
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BaseFocusRules::CanFocusWindow(window) : false;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual aura::Window* GetActivatableWindow(
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::Window* window) const OVERRIDE {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BaseFocusRules::GetActivatableWindow(
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CanFocusOrActivate(window) ? window : focus_restriction_);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual aura::Window* GetFocusableWindow(
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::Window* window) const OVERRIDE {
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return BaseFocusRules::GetFocusableWindow(
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CanFocusOrActivate(window) ? window : focus_restriction_);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual aura::Window* GetNextActivatableWindow(
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::Window* ignore) const OVERRIDE {
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* next_activatable =
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BaseFocusRules::GetNextActivatableWindow(ignore);
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CanFocusOrActivate(next_activatable) ?
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        next_activatable : GetActivatableWindow(focus_restriction_);
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanFocusOrActivate(aura::Window* window) const {
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return !focus_restriction_ || focus_restriction_->Contains(window);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* focus_restriction_;
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestFocusRules);
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Common infrastructure shared by all FocusController test types.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerTestBase : public aura::test::AuraTestBase {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerTestBase() {}
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::test::AuraTestBase:
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    wm_state_.reset(new wm::WMState);
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // FocusController registers itself as an Env observer so it can catch all
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // window initializations, including the root_window()'s, so we create it
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // before allowing the base setup.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules_ = new TestFocusRules;
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    focus_controller_.reset(new FocusController(test_focus_rules_));
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::AuraTestBase::SetUp();
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window()->AddPreTargetHandler(focus_controller_.get());
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::SetFocusClient(root_window(), focus_controller_.get());
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::SetActivationClient(root_window(), focus_controller_.get());
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Hierarchy used by all tests:
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // root_window
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //       +-- w1
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //       |    +-- w11
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //       |    +-- w12
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //       +-- w2
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //       |    +-- w21
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //       |         +-- w211
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //       +-- w3
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w1 = aura::test::CreateTestWindowWithDelegate(
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 1,
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect(0, 0, 50, 50), root_window());
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::CreateTestWindowWithDelegate(
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 11,
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect(5, 5, 10, 10), w1);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::CreateTestWindowWithDelegate(
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 12,
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect(15, 15, 10, 10), w1);
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w2 = aura::test::CreateTestWindowWithDelegate(
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 2,
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect(75, 75, 50, 50), root_window());
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w21 = aura::test::CreateTestWindowWithDelegate(
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 21,
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect(5, 5, 10, 10), w2);
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::CreateTestWindowWithDelegate(
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 211,
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect(1, 1, 5, 5), w21);
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::CreateTestWindowWithDelegate(
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 3,
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect(125, 125, 50, 50), root_window());
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window()->RemovePreTargetHandler(focus_controller_.get());
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::AuraTestBase::TearDown();
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules_ = NULL;  // Owned by FocusController.
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    focus_controller_.reset();
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    wm_state_.reset();
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FocusWindow(aura::Window* window) {
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetFocusClient(root_window())->FocusWindow(window);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* GetFocusedWindow() {
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return aura::client::GetFocusClient(root_window())->GetFocusedWindow();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int GetFocusedWindowId() {
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    aura::Window* focused_window = GetFocusedWindow();
42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return focused_window ? focused_window->id() : -1;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ActivateWindow(aura::Window* window) {
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetActivationClient(root_window())->ActivateWindow(window);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DeactivateWindow(aura::Window* window) {
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetActivationClient(root_window())->DeactivateWindow(window);
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* GetActiveWindow() {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return aura::client::GetActivationClient(root_window())->GetActiveWindow();
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int GetActiveWindowId() {
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* active_window = GetActiveWindow();
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return active_window ? active_window->id() : -1;
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestFocusRules* test_focus_rules() { return test_focus_rules_; }
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test functions.
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BasicFocus() = 0;
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BasicActivation() = 0;
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusEvents() = 0;
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DuplicateFocusEvents() {}
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivationEvents() = 0;
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ReactivationEvents() {}
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DuplicateActivationEvents() {}
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShiftFocusWithinActiveWindow() {}
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShiftFocusToChildOfInactiveWindow() {}
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShiftFocusToParentOfFocusedWindow() {}
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusRulesOverride() = 0;
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivationRulesOverride() = 0;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShiftFocusOnActivation() {}
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ShiftFocusOnActivationDueToHide() {}
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NoShiftActiveOnActivation() {}
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NoFocusChangeOnClickOnCaptureWindow() {}
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void ChangeFocusWhenNothingFocusedAndCaptured() {}
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DontPassDeletedWindow() {}
466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void FocusedTextInputClient() {}
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FocusController> focus_controller_;
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestFocusRules* test_focus_rules_;
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<wm::WMState> wm_state_;
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerTestBase);
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test base for tests where focus is directly set to a target window.
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerDirectTestBase : public FocusControllerTestBase {
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerDirectTestBase() {}
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Different test types shift focus in different ways.
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusWindowDirect(aura::Window* window) = 0;
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivateWindowDirect(aura::Window* window) = 0;
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeactivateWindowDirect(aura::Window* window) = 0;
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Input events do not change focus if the window can not be focused.
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsInputEvent() = 0;
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FocusWindowById(int id) {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* window = root_window()->GetChildById(id);
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(window);
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowDirect(window);
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ActivateWindowById(int id) {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* window = root_window()->GetChildById(id);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(window);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowDirect(window);
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from FocusControllerTestBase:
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BasicFocus() OVERRIDE {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(NULL, GetFocusedWindow());
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(1);
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(2);
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetFocusedWindowId());
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BasicActivation() OVERRIDE {
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(NULL, GetActiveWindow());
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetActiveWindowId());
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Verify that attempting to deactivate NULL does not crash and does not
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // change activation.
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DeactivateWindow(NULL);
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetActiveWindowId());
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DeactivateWindow(GetActiveWindow());
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusEvents() OVERRIDE {
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedFocusNotificationObserver root_observer(root_window());
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer1(root_window(), 1);
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer2(root_window(), 2);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(0, 0);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(0, 0);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(0, 0);
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(1);
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(1, 1);
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(1, 1);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(0, 0);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(2);
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(2, 2);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(2, 2);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(1, 1);
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DuplicateFocusEvents() OVERRIDE {
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Focusing an existing focused window should not resend focus events.
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedFocusNotificationObserver root_observer(root_window());
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer1(root_window(), 1);
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(0, 0);
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(0, 0);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(1);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(1, 1);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(1, 1);
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(1);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(1, 1);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(1, 1);
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivationEvents() OVERRIDE {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedFocusNotificationObserver root_observer(root_window());
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer1(root_window(), 1);
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer2(root_window(), 2);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(0, 0);
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(0, 0);
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(0, 0);
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(1, 1);
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(1, 1);
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(1, 1);
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ReactivationEvents() OVERRIDE {
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ActivateWindowById(1);
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedFocusNotificationObserver root_observer(root_window());
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, root_observer.reactivation_count());
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_window()->GetChildById(2)->Hide();
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // When we attempt to activate "2", which cannot be activated because it
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // is not visible, "1" will be reactivated.
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ActivateWindowById(2);
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, root_observer.reactivation_count());
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(root_window()->GetChildById(2),
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              root_observer.reactivation_requested_window());
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(root_window()->GetChildById(1),
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              root_observer.reactivation_actual_window());
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DuplicateActivationEvents() OVERRIDE {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Activating an existing active window should not resend activation events.
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedFocusNotificationObserver root_observer(root_window());
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer1(root_window(), 1);
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer2(root_window(), 2);
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(0, 0);
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(0, 0);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(0, 0);
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(1, 1);
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(1, 1);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(1, 1);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(1, 1);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer1.ExpectCounts(1, 1);
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(1, 1);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShiftFocusWithinActiveWindow() OVERRIDE {
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(11);
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(11, GetFocusedWindowId());
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(12);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(12, GetFocusedWindowId());
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShiftFocusToChildOfInactiveWindow() OVERRIDE {
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetActiveWindowId());
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetFocusedWindowId());
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(11);
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(11, GetFocusedWindowId());
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShiftFocusToParentOfFocusedWindow() OVERRIDE {
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(11);
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(11, GetFocusedWindowId());
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(1);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Focus should _not_ shift to the parent of the already-focused window.
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(11, GetFocusedWindowId());
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusRulesOverride() OVERRIDE {
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(NULL, GetFocusedWindow());
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(11);
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(11, GetFocusedWindowId());
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules()->set_focus_restriction(root_window()->GetChildById(211));
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(12);
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Input events leave focus unchanged; direct API calls will change focus
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // to the restricted window.
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int focused_window = IsInputEvent() ? 11 : 211;
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(focused_window, GetFocusedWindowId());
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules()->set_focus_restriction(NULL);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindowById(12);
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(12, GetFocusedWindowId());
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivationRulesOverride() OVERRIDE {
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w3 = root_window()->GetChildById(3);
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules()->set_focus_restriction(w3);
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Input events leave activation unchanged; direct API calls will activate
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the restricted window.
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int active_window = IsInputEvent() ? 1 : 3;
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(active_window, GetActiveWindowId());
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(active_window, GetFocusedWindowId());
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules()->set_focus_restriction(NULL);
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetActiveWindowId());
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetFocusedWindowId());
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ShiftFocusOnActivation() OVERRIDE {
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When a window is activated, by default that window is also focused.
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // An ActivationChangeObserver may shift focus to another window within the
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // same activatable window.
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetFocusedWindowId());
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* target = root_window()->GetChildById(1);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::ActivationClient* client =
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        aura::client::GetActivationClient(root_window());
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<FocusShiftingActivationObserver> observer(
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new FocusShiftingActivationObserver(target));
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer->set_shift_focus_to(target->GetChildById(11));
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client->AddObserver(observer.get());
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // w1's ActivationChangeObserver shifted focus to this child, pre-empting
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // FocusController's default setting.
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(11, GetFocusedWindowId());
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetFocusedWindowId());
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Simulate a focus reset by the ActivationChangeObserver. This should
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // trigger the default setting in FocusController.
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer->set_shift_focus_to(NULL);
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client->RemoveObserver(observer.get());
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(2);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetFocusedWindowId());
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void ShiftFocusOnActivationDueToHide() OVERRIDE {
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Similar to ShiftFocusOnActivation except the activation change is
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // triggered by hiding the active window.
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ActivateWindowById(1);
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Removes window 3 as candidate for next activatable window.
719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_window()->GetChildById(3)->Hide();
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::Window* target = root_window()->GetChildById(2);
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::client::ActivationClient* client =
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        aura::client::GetActivationClient(root_window());
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<FocusShiftingActivationObserver> observer(
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new FocusShiftingActivationObserver(target));
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer->set_shift_focus_to(target->GetChildById(21));
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client->AddObserver(observer.get());
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Hide the active window.
732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    root_window()->GetChildById(1)->Hide();
733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(21, GetFocusedWindowId());
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    client->RemoveObserver(observer.get());
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NoShiftActiveOnActivation() OVERRIDE {
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When a window is activated, we need to prevent any change to activation
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // from being made in response to an activation change notification.
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void NoFocusChangeOnClickOnCaptureWindow() OVERRIDE {
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<aura::client::DefaultCaptureClient> capture_client(
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new aura::client::DefaultCaptureClient(root_window()));
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Clicking on a window which has capture should not cause a focus change
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // to the window. This test verifies whether that is indeed the case.
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindowById(1);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w2 = root_window()->GetChildById(2);
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetCaptureClient(root_window())->SetCapture(w2);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::EventGenerator generator(root_window(), w2);
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.ClickLeftButton();
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::client::GetCaptureClient(root_window())->ReleaseCapture(w2);
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Verifies focus change is honored while capture held.
76458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void ChangeFocusWhenNothingFocusedAndCaptured() OVERRIDE {
76558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<aura::client::DefaultCaptureClient> capture_client(
76658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        new aura::client::DefaultCaptureClient(root_window()));
76758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    aura::Window* w1 = root_window()->GetChildById(1);
76858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    aura::client::GetCaptureClient(root_window())->SetCapture(w1);
76958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
77058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(-1, GetActiveWindowId());
77158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(-1, GetFocusedWindowId());
77258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
77358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FocusWindowById(1);
77458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
77558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
77658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
77758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
77858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    aura::client::GetCaptureClient(root_window())->ReleaseCapture(w1);
77958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
78058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Verifies if a window that loses activation or focus is deleted during
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // observer notification we don't pass the deleted window to other observers.
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DontPassDeletedWindow() OVERRIDE {
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FocusWindowById(1);
7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    {
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::Window* to_delete = root_window()->GetChildById(1);
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DeleteOnLoseActivationChangeObserver observer1(to_delete);
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordingActivationAndFocusChangeObserver observer2(root_window(),
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                          &observer1);
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FocusWindowById(2);
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(2, GetActiveWindowId());
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(2, GetFocusedWindowId());
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(to_delete, observer1.GetDeletedWindow());
8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(observer2.was_notified_with_deleted_window());
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    {
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      aura::Window* to_delete = root_window()->GetChildById(2);
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DeleteOnLoseFocusChangeObserver observer1(to_delete);
8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RecordingActivationAndFocusChangeObserver observer2(root_window(),
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                          &observer1);
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FocusWindowById(3);
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(3, GetActiveWindowId());
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(3, GetFocusedWindowId());
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(to_delete, observer1.GetDeletedWindow());
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(observer2.was_notified_with_deleted_window());
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Verifies if the focused text input client is cleared when a window gains
821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // or loses the focus.
822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void FocusedTextInputClient() OVERRIDE {
823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::TextInputFocusManager* text_input_focus_manager =
824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ui::TextInputFocusManager::GetInstance();
825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::DummyTextInputClient text_input_client;
826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::TextInputClient* null_text_input_client = NULL;
827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(null_text_input_client,
829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              text_input_focus_manager->GetFocusedTextInputClient());
830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    text_input_focus_manager->FocusTextInputClient(&text_input_client);
832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(&text_input_client,
833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              text_input_focus_manager->GetFocusedTextInputClient());
834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    FocusWindowById(1);
835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // The focused text input client gets cleared when a window gets focused
836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // unless any of observers sets the focused text input client.
837010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(null_text_input_client,
838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              text_input_focus_manager->GetFocusedTextInputClient());
839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScopedFocusedTextInputClientChanger text_input_focus_changer(
841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        root_window(), &text_input_client);
842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(null_text_input_client,
843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              text_input_focus_manager->GetFocusedTextInputClient());
844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    FocusWindowById(2);
845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // |text_input_focus_changer| sets the focused text input client.
846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(&text_input_client,
847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              text_input_focus_manager->GetFocusedTextInputClient());
848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    FocusWindow(NULL);
850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // The focused text input client gets cleared when a window loses the focus.
851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(null_text_input_client,
852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              text_input_focus_manager->GetFocusedTextInputClient());
853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerDirectTestBase);
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Focus and Activation changes via aura::client::ActivationClient API.
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerApiTest : public FocusControllerDirectTestBase {
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerApiTest() {}
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from FocusControllerTestBase:
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusWindowDirect(aura::Window* window) OVERRIDE {
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindow(window);
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE {
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindow(window);
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE {
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DeactivateWindow(window);
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsInputEvent() OVERRIDE { return false; }
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerApiTest);
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Focus and Activation changes via input events.
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerMouseEventTest : public FocusControllerDirectTestBase {
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerMouseEventTest() {}
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from FocusControllerTestBase:
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusWindowDirect(aura::Window* window) OVERRIDE {
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::EventGenerator generator(root_window(), window);
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.ClickLeftButton();
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE {
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::EventGenerator generator(root_window(), window);
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.ClickLeftButton();
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE {
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* next_activatable =
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_focus_rules()->GetNextActivatableWindow(window);
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::EventGenerator generator(root_window(), next_activatable);
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.ClickLeftButton();
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsInputEvent() OVERRIDE { return true; }
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerMouseEventTest);
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerGestureEventTest : public FocusControllerDirectTestBase {
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerGestureEventTest() {}
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from FocusControllerTestBase:
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusWindowDirect(aura::Window* window) OVERRIDE {
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::EventGenerator generator(root_window(), window);
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.GestureTapAt(window->bounds().CenterPoint());
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE {
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::EventGenerator generator(root_window(), window);
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.GestureTapAt(window->bounds().CenterPoint());
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE {
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* next_activatable =
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        test_focus_rules()->GetNextActivatableWindow(window);
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::EventGenerator generator(root_window(), next_activatable);
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator.GestureTapAt(window->bounds().CenterPoint());
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsInputEvent() OVERRIDE { return true; }
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerGestureEventTest);
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test base for tests where focus is implicitly set to a window as the result
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of a disposition change to the focused window or the hierarchy that contains
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// it.
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerImplicitTestBase : public FocusControllerTestBase {
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit FocusControllerImplicitTestBase(bool parent) : parent_(parent) {}
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* GetDispositionWindow(aura::Window* window) {
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return parent_ ? window->parent() : window;
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Change the disposition of |window| in such a way as it will lose focus.
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ChangeWindowDisposition(aura::Window* window) = 0;
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allow each disposition change test to add additional post-disposition
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // change expectations.
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void PostDispostionChangeExpectations() {}
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from FocusControllerTestBase:
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BasicFocus() OVERRIDE {
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(NULL, GetFocusedWindow());
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w211 = root_window()->GetChildById(211);
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindow(w211);
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(211, GetFocusedWindowId());
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChangeWindowDisposition(w211);
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // BasicFocusRules passes focus to the parent.
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_ ? 2 : 21, GetFocusedWindowId());
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void BasicActivation() OVERRIDE {
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!parent_) << "Activation tests don't support parent changes.";
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(NULL, GetActiveWindow());
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w2 = root_window()->GetChildById(2);
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindow(w2);
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetActiveWindowId());
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChangeWindowDisposition(w2);
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3, GetActiveWindowId());
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostDispostionChangeExpectations();
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusEvents() OVERRIDE {
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w211 = root_window()->GetChildById(211);
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindow(w211);
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedFocusNotificationObserver root_observer(root_window());
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer211(root_window(), 211);
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(0, 0);
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer211.ExpectCounts(0, 0);
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChangeWindowDisposition(w211);
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(0, 1);
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer211.ExpectCounts(0, 1);
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivationEvents() OVERRIDE {
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!parent_) << "Activation tests don't support parent changes.";
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w2 = root_window()->GetChildById(2);
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindow(w2);
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedFocusNotificationObserver root_observer(root_window());
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer2(root_window(), 2);
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedTargetFocusNotificationObserver observer3(root_window(), 3);
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(0, 0);
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(0, 0);
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer3.ExpectCounts(0, 0);
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChangeWindowDisposition(w2);
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_observer.ExpectCounts(1, 1);
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer2.ExpectCounts(1, 1);
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer3.ExpectCounts(1, 1);
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FocusRulesOverride() OVERRIDE {
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(NULL, GetFocusedWindow());
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w211 = root_window()->GetChildById(211);
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusWindow(w211);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(211, GetFocusedWindowId());
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules()->set_focus_restriction(root_window()->GetChildById(11));
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChangeWindowDisposition(w211);
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Normally, focus would shift to the parent (w21) but the override shifts
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // it to 11.
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(11, GetFocusedWindowId());
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules()->set_focus_restriction(NULL);
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivationRulesOverride() OVERRIDE {
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!parent_) << "Activation tests don't support parent changes.";
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w1 = root_window()->GetChildById(1);
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindow(w1);
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetActiveWindowId());
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, GetFocusedWindowId());
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* w3 = root_window()->GetChildById(3);
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules()->set_focus_restriction(w3);
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Normally, activation/focus would move to w2, but since we have a focus
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // restriction, it should move to w3 instead.
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChangeWindowDisposition(w1);
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3, GetActiveWindowId());
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(3, GetFocusedWindowId());
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_focus_rules()->set_focus_restriction(NULL);
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ActivateWindow(root_window()->GetChildById(2));
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetActiveWindowId());
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, GetFocusedWindowId());
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When true, the disposition change occurs to the parent of the window
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // instead of to the window. This verifies that changes occurring in the
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // hierarchy that contains the window affect the window's focus.
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool parent_;
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerImplicitTestBase);
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Focus and Activation changes in response to window visibility changes.
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerHideTest : public FocusControllerImplicitTestBase {
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerHideTest() : FocusControllerImplicitTestBase(false) {}
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerHideTest(bool parent)
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : FocusControllerImplicitTestBase(parent) {}
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from FocusControllerImplicitTestBase:
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ChangeWindowDisposition(aura::Window* window) OVERRIDE {
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetDispositionWindow(window)->Hide();
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerHideTest);
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Focus and Activation changes in response to window parent visibility
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// changes.
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerParentHideTest : public FocusControllerHideTest {
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerParentHideTest() : FocusControllerHideTest(true) {}
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerParentHideTest);
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Focus and Activation changes in response to window destruction.
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerDestructionTest : public FocusControllerImplicitTestBase {
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerDestructionTest() : FocusControllerImplicitTestBase(false) {}
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerDestructionTest(bool parent)
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : FocusControllerImplicitTestBase(parent) {}
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from FocusControllerImplicitTestBase:
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ChangeWindowDisposition(aura::Window* window) OVERRIDE {
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete GetDispositionWindow(window);
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerDestructionTest);
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Focus and Activation changes in response to window parent destruction.
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerParentDestructionTest
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public FocusControllerDestructionTest {
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerParentDestructionTest()
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : FocusControllerDestructionTest(true) {}
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerParentDestructionTest);
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Focus and Activation changes in response to window removal.
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerRemovalTest : public FocusControllerImplicitTestBase {
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerRemovalTest() : FocusControllerImplicitTestBase(false) {}
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerRemovalTest(bool parent)
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : FocusControllerImplicitTestBase(parent) {}
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from FocusControllerImplicitTestBase:
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ChangeWindowDisposition(aura::Window* window) OVERRIDE {
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* disposition_window = GetDispositionWindow(window);
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    disposition_window->parent()->RemoveChild(disposition_window);
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_owner_.reset(disposition_window);
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_owner_.reset();
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FocusControllerImplicitTestBase::TearDown();
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window_owner_;
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerRemovalTest);
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Focus and Activation changes in response to window parent removal.
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FocusControllerParentRemovalTest : public FocusControllerRemovalTest {
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FocusControllerParentRemovalTest() : FocusControllerRemovalTest(true) {}
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FocusControllerParentRemovalTest);
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define FOCUS_CONTROLLER_TEST(TESTCLASS, TESTNAME) \
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TEST_F(TESTCLASS, TESTNAME) { TESTNAME(); }
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Runs direct focus change tests (input events and API calls).
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DIRECT_FOCUS_CHANGE_TESTS(TESTNAME) \
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerApiTest, TESTNAME) \
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerMouseEventTest, TESTNAME) \
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerGestureEventTest, TESTNAME)
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Runs implicit focus change tests for disposition changes to target.
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define IMPLICIT_FOCUS_CHANGE_TARGET_TESTS(TESTNAME) \
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerHideTest, TESTNAME) \
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerDestructionTest, TESTNAME) \
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerRemovalTest, TESTNAME)
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Runs implicit focus change tests for disposition changes to target's parent
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// hierarchy.
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define IMPLICIT_FOCUS_CHANGE_PARENT_TESTS(TESTNAME) \
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /* TODO(beng): parent destruction tests are not supported at
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       present due to workspace manager issues. \
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerParentDestructionTest, TESTNAME) */ \
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerParentHideTest, TESTNAME) \
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FOCUS_CONTROLLER_TEST(FocusControllerParentRemovalTest, TESTNAME)
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Runs all implicit focus change tests (changes to the target and target's
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// parent hierarchy)
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define IMPLICIT_FOCUS_CHANGE_TESTS(TESTNAME) \
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IMPLICIT_FOCUS_CHANGE_TARGET_TESTS(TESTNAME) \
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IMPLICIT_FOCUS_CHANGE_PARENT_TESTS(TESTNAME)
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Runs all possible focus change tests.
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ALL_FOCUS_TESTS(TESTNAME) \
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DIRECT_FOCUS_CHANGE_TESTS(TESTNAME) \
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IMPLICIT_FOCUS_CHANGE_TESTS(TESTNAME)
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Runs focus change tests that apply only to the target. For example,
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// implicit activation changes caused by window disposition changes do not
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// occur when changes to the containing hierarchy happen.
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define TARGET_FOCUS_TESTS(TESTNAME) \
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DIRECT_FOCUS_CHANGE_TESTS(TESTNAME) \
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IMPLICIT_FOCUS_CHANGE_TARGET_TESTS(TESTNAME)
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Focuses a window, verifies that focus changed.
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FOCUS_TESTS(BasicFocus);
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Activates a window, verifies that activation changed.
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TARGET_FOCUS_TESTS(BasicActivation);
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Focuses a window, verifies that focus events were dispatched.
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FOCUS_TESTS(FocusEvents);
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Focuses or activates a window multiple times, verifies that events are only
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   dispatched when focus/activation actually changes.
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(DuplicateFocusEvents);
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(DuplicateActivationEvents);
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Activates a window, verifies that activation events were dispatched.
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TARGET_FOCUS_TESTS(ActivationEvents);
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// - Attempts to active a hidden window, verifies that current window is
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//   attempted to be reactivated and the appropriate event dispatched.
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)FOCUS_CONTROLLER_TEST(FocusControllerApiTest, ReactivationEvents);
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Input events/API calls shift focus between focusable windows within the
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   active window.
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusWithinActiveWindow);
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Input events/API calls to a child window of an inactive window shifts
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   activation to the activatable parent and focuses the child.
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusToChildOfInactiveWindow);
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Input events/API calls to focus the parent of the focused window do not
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   shift focus away from the child.
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusToParentOfFocusedWindow);
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Verifies that FocusRules determine what can be focused.
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FOCUS_TESTS(FocusRulesOverride);
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Verifies that FocusRules determine what can be activated.
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TARGET_FOCUS_TESTS(ActivationRulesOverride);
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - Verifies that attempts to change focus or activation from a focus or
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   activation change observer are ignored.
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusOnActivation);
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusOnActivationDueToHide);
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(NoShiftActiveOnActivation);
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Clicking on a window which has capture should not result in a focus change.
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DIRECT_FOCUS_CHANGE_TESTS(NoFocusChangeOnClickOnCaptureWindow);
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
123558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FOCUS_CONTROLLER_TEST(FocusControllerApiTest,
123658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      ChangeFocusWhenNothingFocusedAndCaptured);
123758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// See description above DontPassDeletedWindow() for details.
12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FOCUS_CONTROLLER_TEST(FocusControllerApiTest, DontPassDeletedWindow);
12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// - Verifies that the focused text input client is cleard when the window focus
1242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)//   changes.
1243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ALL_FOCUS_TESTS(FocusedTextInputClient);
1244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace wm
1246