| Index: ui/views/corewm/focus_controller_unittest.cc
|
| diff --git a/ui/views/corewm/focus_controller_unittest.cc b/ui/views/corewm/focus_controller_unittest.cc
|
| deleted file mode 100644
|
| index c845592bf969a80642aa0bcd4c59b91f9719ac61..0000000000000000000000000000000000000000
|
| --- a/ui/views/corewm/focus_controller_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1204 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "ui/views/corewm/focus_controller.h"
|
| -
|
| -#include <map>
|
| -
|
| -#include "ui/aura/client/activation_change_observer.h"
|
| -#include "ui/aura/client/activation_client.h"
|
| -#include "ui/aura/client/aura_constants.h"
|
| -#include "ui/aura/client/default_capture_client.h"
|
| -#include "ui/aura/client/focus_change_observer.h"
|
| -#include "ui/aura/test/aura_test_base.h"
|
| -#include "ui/aura/test/event_generator.h"
|
| -#include "ui/aura/test/test_window_delegate.h"
|
| -#include "ui/aura/test/test_windows.h"
|
| -#include "ui/aura/window.h"
|
| -#include "ui/aura/window_event_dispatcher.h"
|
| -#include "ui/aura/window_tracker.h"
|
| -#include "ui/events/event_handler.h"
|
| -#include "ui/views/corewm/base_focus_rules.h"
|
| -#include "ui/views/corewm/wm_state.h"
|
| -
|
| -namespace views {
|
| -namespace corewm {
|
| -
|
| -class FocusNotificationObserver : public aura::client::ActivationChangeObserver,
|
| - public aura::client::FocusChangeObserver {
|
| - public:
|
| - FocusNotificationObserver()
|
| - : activation_changed_count_(0),
|
| - focus_changed_count_(0),
|
| - reactivation_count_(0),
|
| - reactivation_requested_window_(NULL),
|
| - reactivation_actual_window_(NULL) {}
|
| - virtual ~FocusNotificationObserver() {}
|
| -
|
| - void ExpectCounts(int activation_changed_count, int focus_changed_count) {
|
| - EXPECT_EQ(activation_changed_count, activation_changed_count_);
|
| - EXPECT_EQ(focus_changed_count, focus_changed_count_);
|
| - }
|
| - int reactivation_count() const {
|
| - return reactivation_count_;
|
| - }
|
| - aura::Window* reactivation_requested_window() const {
|
| - return reactivation_requested_window_;
|
| - }
|
| - aura::Window* reactivation_actual_window() const {
|
| - return reactivation_actual_window_;
|
| - }
|
| -
|
| - private:
|
| - // Overridden from aura::client::ActivationChangeObserver:
|
| - virtual void OnWindowActivated(aura::Window* gained_active,
|
| - aura::Window* lost_active) OVERRIDE {
|
| - ++activation_changed_count_;
|
| - }
|
| - virtual void OnAttemptToReactivateWindow(
|
| - aura::Window* request_active,
|
| - aura::Window* actual_active) OVERRIDE {
|
| - ++reactivation_count_;
|
| - reactivation_requested_window_ = request_active;
|
| - reactivation_actual_window_ = actual_active;
|
| - }
|
| -
|
| - // Overridden from aura::client::FocusChangeObserver:
|
| - virtual void OnWindowFocused(aura::Window* gained_focus,
|
| - aura::Window* lost_focus) OVERRIDE {
|
| - ++focus_changed_count_;
|
| - }
|
| -
|
| - int activation_changed_count_;
|
| - int focus_changed_count_;
|
| - int reactivation_count_;
|
| - aura::Window* reactivation_requested_window_;
|
| - aura::Window* reactivation_actual_window_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusNotificationObserver);
|
| -};
|
| -
|
| -class WindowDeleter {
|
| - public:
|
| - virtual aura::Window* GetDeletedWindow() = 0;
|
| -
|
| - protected:
|
| - virtual ~WindowDeleter() {}
|
| -};
|
| -
|
| -// ActivationChangeObserver and FocusChangeObserver that keeps track of whether
|
| -// it was notified about activation changes or focus changes with a deleted
|
| -// window.
|
| -class RecordingActivationAndFocusChangeObserver
|
| - : public aura::client::ActivationChangeObserver,
|
| - public aura::client::FocusChangeObserver {
|
| - public:
|
| - RecordingActivationAndFocusChangeObserver(aura::Window* root,
|
| - WindowDeleter* deleter)
|
| - : root_(root),
|
| - deleter_(deleter),
|
| - was_notified_with_deleted_window_(false) {
|
| - aura::client::GetActivationClient(root_)->AddObserver(this);
|
| - aura::client::GetFocusClient(root_)->AddObserver(this);
|
| - }
|
| - virtual ~RecordingActivationAndFocusChangeObserver() {
|
| - aura::client::GetActivationClient(root_)->RemoveObserver(this);
|
| - aura::client::GetFocusClient(root_)->RemoveObserver(this);
|
| - }
|
| -
|
| - bool was_notified_with_deleted_window() const {
|
| - return was_notified_with_deleted_window_;
|
| - }
|
| -
|
| - // Overridden from aura::client::ActivationChangeObserver:
|
| - virtual void OnWindowActivated(aura::Window* gained_active,
|
| - aura::Window* lost_active) OVERRIDE {
|
| - if (lost_active && lost_active == deleter_->GetDeletedWindow())
|
| - was_notified_with_deleted_window_ = true;
|
| - }
|
| -
|
| - // Overridden from aura::client::FocusChangeObserver:
|
| - virtual void OnWindowFocused(aura::Window* gained_focus,
|
| - aura::Window* lost_focus) OVERRIDE {
|
| - if (lost_focus && lost_focus == deleter_->GetDeletedWindow())
|
| - was_notified_with_deleted_window_ = true;
|
| - }
|
| -
|
| - private:
|
| - aura::Window* root_;
|
| -
|
| - // Not owned.
|
| - WindowDeleter* deleter_;
|
| -
|
| - // Whether the observer was notified about the loss of activation or the
|
| - // loss of focus with a window already deleted by |deleter_| as the
|
| - // |lost_active| or |lost_focus| parameter.
|
| - bool was_notified_with_deleted_window_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RecordingActivationAndFocusChangeObserver);
|
| -};
|
| -
|
| -// ActivationChangeObserver that deletes the window losing activation.
|
| -class DeleteOnLoseActivationChangeObserver :
|
| - public aura::client::ActivationChangeObserver,
|
| - public WindowDeleter {
|
| - public:
|
| - explicit DeleteOnLoseActivationChangeObserver(aura::Window* window)
|
| - : root_(window->GetRootWindow()),
|
| - window_(window),
|
| - did_delete_(false) {
|
| - aura::client::GetActivationClient(root_)->AddObserver(this);
|
| - }
|
| - virtual ~DeleteOnLoseActivationChangeObserver() {
|
| - aura::client::GetActivationClient(root_)->RemoveObserver(this);
|
| - }
|
| -
|
| - // Overridden from aura::client::ActivationChangeObserver:
|
| - virtual void OnWindowActivated(aura::Window* gained_active,
|
| - aura::Window* lost_active) OVERRIDE {
|
| - if (window_ && lost_active == window_) {
|
| - delete lost_active;
|
| - did_delete_ = true;
|
| - }
|
| - }
|
| -
|
| - // Overridden from WindowDeleter:
|
| - virtual aura::Window* GetDeletedWindow() OVERRIDE {
|
| - return did_delete_ ? window_ : NULL;
|
| - }
|
| -
|
| - private:
|
| - aura::Window* root_;
|
| - aura::Window* window_;
|
| - bool did_delete_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DeleteOnLoseActivationChangeObserver);
|
| -};
|
| -
|
| -// FocusChangeObserver that deletes the window losing focus.
|
| -class DeleteOnLoseFocusChangeObserver
|
| - : public aura::client::FocusChangeObserver,
|
| - public WindowDeleter {
|
| - public:
|
| - explicit DeleteOnLoseFocusChangeObserver(aura::Window* window)
|
| - : root_(window->GetRootWindow()),
|
| - window_(window),
|
| - did_delete_(false) {
|
| - aura::client::GetFocusClient(root_)->AddObserver(this);
|
| - }
|
| - virtual ~DeleteOnLoseFocusChangeObserver() {
|
| - aura::client::GetFocusClient(root_)->RemoveObserver(this);
|
| - }
|
| -
|
| - // Overridden from aura::client::FocusChangeObserver:
|
| - virtual void OnWindowFocused(aura::Window* gained_focus,
|
| - aura::Window* lost_focus) OVERRIDE {
|
| - if (window_ && lost_focus == window_) {
|
| - delete lost_focus;
|
| - did_delete_ = true;
|
| - }
|
| - }
|
| -
|
| - // Overridden from WindowDeleter:
|
| - virtual aura::Window* GetDeletedWindow() OVERRIDE {
|
| - return did_delete_ ? window_ : NULL;
|
| - }
|
| -
|
| - private:
|
| - aura::Window* root_;
|
| - aura::Window* window_;
|
| - bool did_delete_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DeleteOnLoseFocusChangeObserver);
|
| -};
|
| -
|
| -class ScopedFocusNotificationObserver : public FocusNotificationObserver {
|
| - public:
|
| - ScopedFocusNotificationObserver(aura::Window* root_window)
|
| - : root_window_(root_window) {
|
| - aura::client::GetActivationClient(root_window_)->AddObserver(this);
|
| - aura::client::GetFocusClient(root_window_)->AddObserver(this);
|
| - }
|
| - virtual ~ScopedFocusNotificationObserver() {
|
| - aura::client::GetActivationClient(root_window_)->RemoveObserver(this);
|
| - aura::client::GetFocusClient(root_window_)->RemoveObserver(this);
|
| - }
|
| -
|
| - private:
|
| - aura::Window* root_window_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedFocusNotificationObserver);
|
| -};
|
| -
|
| -class ScopedTargetFocusNotificationObserver : public FocusNotificationObserver {
|
| - public:
|
| - ScopedTargetFocusNotificationObserver(aura::Window* root_window, int id)
|
| - : target_(root_window->GetChildById(id)) {
|
| - aura::client::SetActivationChangeObserver(target_, this);
|
| - aura::client::SetFocusChangeObserver(target_, this);
|
| - tracker_.Add(target_);
|
| - }
|
| - virtual ~ScopedTargetFocusNotificationObserver() {
|
| - if (tracker_.Contains(target_)) {
|
| - aura::client::SetActivationChangeObserver(target_, NULL);
|
| - aura::client::SetFocusChangeObserver(target_, NULL);
|
| - }
|
| - }
|
| -
|
| - private:
|
| - aura::Window* target_;
|
| - aura::WindowTracker tracker_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedTargetFocusNotificationObserver);
|
| -};
|
| -
|
| -class FocusShiftingActivationObserver
|
| - : public aura::client::ActivationChangeObserver {
|
| - public:
|
| - explicit FocusShiftingActivationObserver(aura::Window* activated_window)
|
| - : activated_window_(activated_window),
|
| - shift_focus_to_(NULL) {}
|
| - virtual ~FocusShiftingActivationObserver() {}
|
| -
|
| - void set_shift_focus_to(aura::Window* shift_focus_to) {
|
| - shift_focus_to_ = shift_focus_to;
|
| - }
|
| -
|
| - private:
|
| - // Overridden from aura::client::ActivationChangeObserver:
|
| - virtual void OnWindowActivated(aura::Window* gained_active,
|
| - aura::Window* lost_active) OVERRIDE {
|
| - // Shift focus to a child. This should prevent the default focusing from
|
| - // occurring in FocusController::FocusWindow().
|
| - if (gained_active == activated_window_) {
|
| - aura::client::FocusClient* client =
|
| - aura::client::GetFocusClient(gained_active);
|
| - client->FocusWindow(shift_focus_to_);
|
| - }
|
| - }
|
| -
|
| - aura::Window* activated_window_;
|
| - aura::Window* shift_focus_to_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusShiftingActivationObserver);
|
| -};
|
| -
|
| -// BaseFocusRules subclass that allows basic overrides of focus/activation to
|
| -// be tested. This is intended more as a test that the override system works at
|
| -// all, rather than as an exhaustive set of use cases, those should be covered
|
| -// in tests for those FocusRules implementations.
|
| -class TestFocusRules : public BaseFocusRules {
|
| - public:
|
| - TestFocusRules() : focus_restriction_(NULL) {}
|
| -
|
| - // Restricts focus and activation to this window and its child hierarchy.
|
| - void set_focus_restriction(aura::Window* focus_restriction) {
|
| - focus_restriction_ = focus_restriction;
|
| - }
|
| -
|
| - // Overridden from BaseFocusRules:
|
| - virtual bool SupportsChildActivation(aura::Window* window) const OVERRIDE {
|
| - // In FocusControllerTests, only the RootWindow has activatable children.
|
| - return window->GetRootWindow() == window;
|
| - }
|
| - virtual bool CanActivateWindow(aura::Window* window) const OVERRIDE {
|
| - // Restricting focus to a non-activatable child window means the activatable
|
| - // parent outside the focus restriction is activatable.
|
| - bool can_activate =
|
| - CanFocusOrActivate(window) || window->Contains(focus_restriction_);
|
| - return can_activate ? BaseFocusRules::CanActivateWindow(window) : false;
|
| - }
|
| - virtual bool CanFocusWindow(aura::Window* window) const OVERRIDE {
|
| - return CanFocusOrActivate(window) ?
|
| - BaseFocusRules::CanFocusWindow(window) : false;
|
| - }
|
| - virtual aura::Window* GetActivatableWindow(
|
| - aura::Window* window) const OVERRIDE {
|
| - return BaseFocusRules::GetActivatableWindow(
|
| - CanFocusOrActivate(window) ? window : focus_restriction_);
|
| - }
|
| - virtual aura::Window* GetFocusableWindow(
|
| - aura::Window* window) const OVERRIDE {
|
| - return BaseFocusRules::GetFocusableWindow(
|
| - CanFocusOrActivate(window) ? window : focus_restriction_);
|
| - }
|
| - virtual aura::Window* GetNextActivatableWindow(
|
| - aura::Window* ignore) const OVERRIDE {
|
| - aura::Window* next_activatable =
|
| - BaseFocusRules::GetNextActivatableWindow(ignore);
|
| - return CanFocusOrActivate(next_activatable) ?
|
| - next_activatable : GetActivatableWindow(focus_restriction_);
|
| - }
|
| -
|
| - private:
|
| - bool CanFocusOrActivate(aura::Window* window) const {
|
| - return !focus_restriction_ || focus_restriction_->Contains(window);
|
| - }
|
| -
|
| - aura::Window* focus_restriction_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestFocusRules);
|
| -};
|
| -
|
| -// Common infrastructure shared by all FocusController test types.
|
| -class FocusControllerTestBase : public aura::test::AuraTestBase {
|
| - protected:
|
| - FocusControllerTestBase() {}
|
| -
|
| - // Overridden from aura::test::AuraTestBase:
|
| - virtual void SetUp() OVERRIDE {
|
| - wm_state_.reset(new views::corewm::WMState);
|
| - // FocusController registers itself as an Env observer so it can catch all
|
| - // window initializations, including the root_window()'s, so we create it
|
| - // before allowing the base setup.
|
| - test_focus_rules_ = new TestFocusRules;
|
| - focus_controller_.reset(new FocusController(test_focus_rules_));
|
| - aura::test::AuraTestBase::SetUp();
|
| - root_window()->AddPreTargetHandler(focus_controller_.get());
|
| - aura::client::SetFocusClient(root_window(), focus_controller_.get());
|
| - aura::client::SetActivationClient(root_window(), focus_controller_.get());
|
| -
|
| - // Hierarchy used by all tests:
|
| - // root_window
|
| - // +-- w1
|
| - // | +-- w11
|
| - // | +-- w12
|
| - // +-- w2
|
| - // | +-- w21
|
| - // | +-- w211
|
| - // +-- w3
|
| - aura::Window* w1 = aura::test::CreateTestWindowWithDelegate(
|
| - aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 1,
|
| - gfx::Rect(0, 0, 50, 50), root_window());
|
| - aura::test::CreateTestWindowWithDelegate(
|
| - aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 11,
|
| - gfx::Rect(5, 5, 10, 10), w1);
|
| - aura::test::CreateTestWindowWithDelegate(
|
| - aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 12,
|
| - gfx::Rect(15, 15, 10, 10), w1);
|
| - aura::Window* w2 = aura::test::CreateTestWindowWithDelegate(
|
| - aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 2,
|
| - gfx::Rect(75, 75, 50, 50), root_window());
|
| - aura::Window* w21 = aura::test::CreateTestWindowWithDelegate(
|
| - aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 21,
|
| - gfx::Rect(5, 5, 10, 10), w2);
|
| - aura::test::CreateTestWindowWithDelegate(
|
| - aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 211,
|
| - gfx::Rect(1, 1, 5, 5), w21);
|
| - aura::test::CreateTestWindowWithDelegate(
|
| - aura::test::TestWindowDelegate::CreateSelfDestroyingDelegate(), 3,
|
| - gfx::Rect(125, 125, 50, 50), root_window());
|
| - }
|
| - virtual void TearDown() OVERRIDE {
|
| - root_window()->RemovePreTargetHandler(focus_controller_.get());
|
| - aura::test::AuraTestBase::TearDown();
|
| - test_focus_rules_ = NULL; // Owned by FocusController.
|
| - focus_controller_.reset();
|
| - wm_state_.reset();
|
| - }
|
| -
|
| - void FocusWindow(aura::Window* window) {
|
| - aura::client::GetFocusClient(root_window())->FocusWindow(window);
|
| - }
|
| - aura::Window* GetFocusedWindow() {
|
| - return aura::client::GetFocusClient(root_window())->GetFocusedWindow();
|
| - }
|
| - int GetFocusedWindowId() {
|
| - aura::Window* focused_window = GetFocusedWindow();
|
| - return focused_window ? focused_window->id() : -1;
|
| - }
|
| - void ActivateWindow(aura::Window* window) {
|
| - aura::client::GetActivationClient(root_window())->ActivateWindow(window);
|
| - }
|
| - void DeactivateWindow(aura::Window* window) {
|
| - aura::client::GetActivationClient(root_window())->DeactivateWindow(window);
|
| - }
|
| - aura::Window* GetActiveWindow() {
|
| - return aura::client::GetActivationClient(root_window())->GetActiveWindow();
|
| - }
|
| - int GetActiveWindowId() {
|
| - aura::Window* active_window = GetActiveWindow();
|
| - return active_window ? active_window->id() : -1;
|
| - }
|
| -
|
| - TestFocusRules* test_focus_rules() { return test_focus_rules_; }
|
| -
|
| - // Test functions.
|
| - virtual void BasicFocus() = 0;
|
| - virtual void BasicActivation() = 0;
|
| - virtual void FocusEvents() = 0;
|
| - virtual void DuplicateFocusEvents() {}
|
| - virtual void ActivationEvents() = 0;
|
| - virtual void ReactivationEvents() {}
|
| - virtual void DuplicateActivationEvents() {}
|
| - virtual void ShiftFocusWithinActiveWindow() {}
|
| - virtual void ShiftFocusToChildOfInactiveWindow() {}
|
| - virtual void ShiftFocusToParentOfFocusedWindow() {}
|
| - virtual void FocusRulesOverride() = 0;
|
| - virtual void ActivationRulesOverride() = 0;
|
| - virtual void ShiftFocusOnActivation() {}
|
| - virtual void ShiftFocusOnActivationDueToHide() {}
|
| - virtual void NoShiftActiveOnActivation() {}
|
| - virtual void NoFocusChangeOnClickOnCaptureWindow() {}
|
| - virtual void ChangeFocusWhenNothingFocusedAndCaptured() {}
|
| - virtual void DontPassDeletedWindow() {}
|
| -
|
| - private:
|
| - scoped_ptr<FocusController> focus_controller_;
|
| - TestFocusRules* test_focus_rules_;
|
| - scoped_ptr<views::corewm::WMState> wm_state_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerTestBase);
|
| -};
|
| -
|
| -// Test base for tests where focus is directly set to a target window.
|
| -class FocusControllerDirectTestBase : public FocusControllerTestBase {
|
| - protected:
|
| - FocusControllerDirectTestBase() {}
|
| -
|
| - // Different test types shift focus in different ways.
|
| - virtual void FocusWindowDirect(aura::Window* window) = 0;
|
| - virtual void ActivateWindowDirect(aura::Window* window) = 0;
|
| - virtual void DeactivateWindowDirect(aura::Window* window) = 0;
|
| -
|
| - // Input events do not change focus if the window can not be focused.
|
| - virtual bool IsInputEvent() = 0;
|
| -
|
| - void FocusWindowById(int id) {
|
| - aura::Window* window = root_window()->GetChildById(id);
|
| - DCHECK(window);
|
| - FocusWindowDirect(window);
|
| - }
|
| - void ActivateWindowById(int id) {
|
| - aura::Window* window = root_window()->GetChildById(id);
|
| - DCHECK(window);
|
| - ActivateWindowDirect(window);
|
| - }
|
| -
|
| - // Overridden from FocusControllerTestBase:
|
| - virtual void BasicFocus() OVERRIDE {
|
| - EXPECT_EQ(NULL, GetFocusedWindow());
|
| - FocusWindowById(1);
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| - FocusWindowById(2);
|
| - EXPECT_EQ(2, GetFocusedWindowId());
|
| - }
|
| - virtual void BasicActivation() OVERRIDE {
|
| - EXPECT_EQ(NULL, GetActiveWindow());
|
| - ActivateWindowById(1);
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - ActivateWindowById(2);
|
| - EXPECT_EQ(2, GetActiveWindowId());
|
| - // Verify that attempting to deactivate NULL does not crash and does not
|
| - // change activation.
|
| - DeactivateWindow(NULL);
|
| - EXPECT_EQ(2, GetActiveWindowId());
|
| - DeactivateWindow(GetActiveWindow());
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - }
|
| - virtual void FocusEvents() OVERRIDE {
|
| - ScopedFocusNotificationObserver root_observer(root_window());
|
| - ScopedTargetFocusNotificationObserver observer1(root_window(), 1);
|
| - ScopedTargetFocusNotificationObserver observer2(root_window(), 2);
|
| -
|
| - root_observer.ExpectCounts(0, 0);
|
| - observer1.ExpectCounts(0, 0);
|
| - observer2.ExpectCounts(0, 0);
|
| -
|
| - FocusWindowById(1);
|
| - root_observer.ExpectCounts(1, 1);
|
| - observer1.ExpectCounts(1, 1);
|
| - observer2.ExpectCounts(0, 0);
|
| -
|
| - FocusWindowById(2);
|
| - root_observer.ExpectCounts(2, 2);
|
| - observer1.ExpectCounts(2, 2);
|
| - observer2.ExpectCounts(1, 1);
|
| - }
|
| - virtual void DuplicateFocusEvents() OVERRIDE {
|
| - // Focusing an existing focused window should not resend focus events.
|
| - ScopedFocusNotificationObserver root_observer(root_window());
|
| - ScopedTargetFocusNotificationObserver observer1(root_window(), 1);
|
| -
|
| - root_observer.ExpectCounts(0, 0);
|
| - observer1.ExpectCounts(0, 0);
|
| -
|
| - FocusWindowById(1);
|
| - root_observer.ExpectCounts(1, 1);
|
| - observer1.ExpectCounts(1, 1);
|
| -
|
| - FocusWindowById(1);
|
| - root_observer.ExpectCounts(1, 1);
|
| - observer1.ExpectCounts(1, 1);
|
| - }
|
| - virtual void ActivationEvents() OVERRIDE {
|
| - ActivateWindowById(1);
|
| -
|
| - ScopedFocusNotificationObserver root_observer(root_window());
|
| - ScopedTargetFocusNotificationObserver observer1(root_window(), 1);
|
| - ScopedTargetFocusNotificationObserver observer2(root_window(), 2);
|
| -
|
| - root_observer.ExpectCounts(0, 0);
|
| - observer1.ExpectCounts(0, 0);
|
| - observer2.ExpectCounts(0, 0);
|
| -
|
| - ActivateWindowById(2);
|
| - root_observer.ExpectCounts(1, 1);
|
| - observer1.ExpectCounts(1, 1);
|
| - observer2.ExpectCounts(1, 1);
|
| - }
|
| - virtual void ReactivationEvents() OVERRIDE {
|
| - ActivateWindowById(1);
|
| - ScopedFocusNotificationObserver root_observer(root_window());
|
| - EXPECT_EQ(0, root_observer.reactivation_count());
|
| - root_window()->GetChildById(2)->Hide();
|
| - // When we attempt to activate "2", which cannot be activated because it
|
| - // is not visible, "1" will be reactivated.
|
| - ActivateWindowById(2);
|
| - EXPECT_EQ(1, root_observer.reactivation_count());
|
| - EXPECT_EQ(root_window()->GetChildById(2),
|
| - root_observer.reactivation_requested_window());
|
| - EXPECT_EQ(root_window()->GetChildById(1),
|
| - root_observer.reactivation_actual_window());
|
| - }
|
| - virtual void DuplicateActivationEvents() OVERRIDE {
|
| - // Activating an existing active window should not resend activation events.
|
| - ActivateWindowById(1);
|
| -
|
| - ScopedFocusNotificationObserver root_observer(root_window());
|
| - ScopedTargetFocusNotificationObserver observer1(root_window(), 1);
|
| - ScopedTargetFocusNotificationObserver observer2(root_window(), 2);
|
| -
|
| - root_observer.ExpectCounts(0, 0);
|
| - observer1.ExpectCounts(0, 0);
|
| - observer2.ExpectCounts(0, 0);
|
| -
|
| - ActivateWindowById(2);
|
| - root_observer.ExpectCounts(1, 1);
|
| - observer1.ExpectCounts(1, 1);
|
| - observer2.ExpectCounts(1, 1);
|
| -
|
| - ActivateWindowById(2);
|
| - root_observer.ExpectCounts(1, 1);
|
| - observer1.ExpectCounts(1, 1);
|
| - observer2.ExpectCounts(1, 1);
|
| - }
|
| - virtual void ShiftFocusWithinActiveWindow() OVERRIDE {
|
| - ActivateWindowById(1);
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| - FocusWindowById(11);
|
| - EXPECT_EQ(11, GetFocusedWindowId());
|
| - FocusWindowById(12);
|
| - EXPECT_EQ(12, GetFocusedWindowId());
|
| - }
|
| - virtual void ShiftFocusToChildOfInactiveWindow() OVERRIDE {
|
| - ActivateWindowById(2);
|
| - EXPECT_EQ(2, GetActiveWindowId());
|
| - EXPECT_EQ(2, GetFocusedWindowId());
|
| - FocusWindowById(11);
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - EXPECT_EQ(11, GetFocusedWindowId());
|
| - }
|
| - virtual void ShiftFocusToParentOfFocusedWindow() OVERRIDE {
|
| - ActivateWindowById(1);
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| - FocusWindowById(11);
|
| - EXPECT_EQ(11, GetFocusedWindowId());
|
| - FocusWindowById(1);
|
| - // Focus should _not_ shift to the parent of the already-focused window.
|
| - EXPECT_EQ(11, GetFocusedWindowId());
|
| - }
|
| - virtual void FocusRulesOverride() OVERRIDE {
|
| - EXPECT_EQ(NULL, GetFocusedWindow());
|
| - FocusWindowById(11);
|
| - EXPECT_EQ(11, GetFocusedWindowId());
|
| -
|
| - test_focus_rules()->set_focus_restriction(root_window()->GetChildById(211));
|
| - FocusWindowById(12);
|
| - // Input events leave focus unchanged; direct API calls will change focus
|
| - // to the restricted window.
|
| - int focused_window = IsInputEvent() ? 11 : 211;
|
| - EXPECT_EQ(focused_window, GetFocusedWindowId());
|
| -
|
| - test_focus_rules()->set_focus_restriction(NULL);
|
| - FocusWindowById(12);
|
| - EXPECT_EQ(12, GetFocusedWindowId());
|
| - }
|
| - virtual void ActivationRulesOverride() OVERRIDE {
|
| - ActivateWindowById(1);
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - aura::Window* w3 = root_window()->GetChildById(3);
|
| - test_focus_rules()->set_focus_restriction(w3);
|
| -
|
| - ActivateWindowById(2);
|
| - // Input events leave activation unchanged; direct API calls will activate
|
| - // the restricted window.
|
| - int active_window = IsInputEvent() ? 1 : 3;
|
| - EXPECT_EQ(active_window, GetActiveWindowId());
|
| - EXPECT_EQ(active_window, GetFocusedWindowId());
|
| -
|
| - test_focus_rules()->set_focus_restriction(NULL);
|
| - ActivateWindowById(2);
|
| - EXPECT_EQ(2, GetActiveWindowId());
|
| - EXPECT_EQ(2, GetFocusedWindowId());
|
| - }
|
| - virtual void ShiftFocusOnActivation() OVERRIDE {
|
| - // When a window is activated, by default that window is also focused.
|
| - // An ActivationChangeObserver may shift focus to another window within the
|
| - // same activatable window.
|
| - ActivateWindowById(2);
|
| - EXPECT_EQ(2, GetFocusedWindowId());
|
| - ActivateWindowById(1);
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - ActivateWindowById(2);
|
| -
|
| - aura::Window* target = root_window()->GetChildById(1);
|
| - aura::client::ActivationClient* client =
|
| - aura::client::GetActivationClient(root_window());
|
| -
|
| - scoped_ptr<FocusShiftingActivationObserver> observer(
|
| - new FocusShiftingActivationObserver(target));
|
| - observer->set_shift_focus_to(target->GetChildById(11));
|
| - client->AddObserver(observer.get());
|
| -
|
| - ActivateWindowById(1);
|
| -
|
| - // w1's ActivationChangeObserver shifted focus to this child, pre-empting
|
| - // FocusController's default setting.
|
| - EXPECT_EQ(11, GetFocusedWindowId());
|
| -
|
| - ActivateWindowById(2);
|
| - EXPECT_EQ(2, GetFocusedWindowId());
|
| -
|
| - // Simulate a focus reset by the ActivationChangeObserver. This should
|
| - // trigger the default setting in FocusController.
|
| - observer->set_shift_focus_to(NULL);
|
| - ActivateWindowById(1);
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - client->RemoveObserver(observer.get());
|
| -
|
| - ActivateWindowById(2);
|
| - EXPECT_EQ(2, GetFocusedWindowId());
|
| - ActivateWindowById(1);
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| - }
|
| - virtual void ShiftFocusOnActivationDueToHide() OVERRIDE {
|
| - // Similar to ShiftFocusOnActivation except the activation change is
|
| - // triggered by hiding the active window.
|
| - ActivateWindowById(1);
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - // Removes window 3 as candidate for next activatable window.
|
| - root_window()->GetChildById(3)->Hide();
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - aura::Window* target = root_window()->GetChildById(2);
|
| - aura::client::ActivationClient* client =
|
| - aura::client::GetActivationClient(root_window());
|
| -
|
| - scoped_ptr<FocusShiftingActivationObserver> observer(
|
| - new FocusShiftingActivationObserver(target));
|
| - observer->set_shift_focus_to(target->GetChildById(21));
|
| - client->AddObserver(observer.get());
|
| -
|
| - // Hide the active window.
|
| - root_window()->GetChildById(1)->Hide();
|
| -
|
| - EXPECT_EQ(21, GetFocusedWindowId());
|
| -
|
| - client->RemoveObserver(observer.get());
|
| - }
|
| - virtual void NoShiftActiveOnActivation() OVERRIDE {
|
| - // When a window is activated, we need to prevent any change to activation
|
| - // from being made in response to an activation change notification.
|
| - }
|
| -
|
| - virtual void NoFocusChangeOnClickOnCaptureWindow() OVERRIDE {
|
| - scoped_ptr<aura::client::DefaultCaptureClient> capture_client(
|
| - new aura::client::DefaultCaptureClient(root_window()));
|
| - // Clicking on a window which has capture should not cause a focus change
|
| - // to the window. This test verifies whether that is indeed the case.
|
| - ActivateWindowById(1);
|
| -
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - aura::Window* w2 = root_window()->GetChildById(2);
|
| - aura::client::GetCaptureClient(root_window())->SetCapture(w2);
|
| - aura::test::EventGenerator generator(root_window(), w2);
|
| - generator.ClickLeftButton();
|
| -
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| - aura::client::GetCaptureClient(root_window())->ReleaseCapture(w2);
|
| - }
|
| -
|
| - // Verifies focus change is honored while capture held.
|
| - virtual void ChangeFocusWhenNothingFocusedAndCaptured() OVERRIDE {
|
| - scoped_ptr<aura::client::DefaultCaptureClient> capture_client(
|
| - new aura::client::DefaultCaptureClient(root_window()));
|
| - aura::Window* w1 = root_window()->GetChildById(1);
|
| - aura::client::GetCaptureClient(root_window())->SetCapture(w1);
|
| -
|
| - EXPECT_EQ(-1, GetActiveWindowId());
|
| - EXPECT_EQ(-1, GetFocusedWindowId());
|
| -
|
| - FocusWindowById(1);
|
| -
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - aura::client::GetCaptureClient(root_window())->ReleaseCapture(w1);
|
| - }
|
| -
|
| - // Verifies if a window that loses activation or focus is deleted during
|
| - // observer notification we don't pass the deleted window to other observers.
|
| - virtual void DontPassDeletedWindow() OVERRIDE {
|
| - FocusWindowById(1);
|
| -
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - {
|
| - aura::Window* to_delete = root_window()->GetChildById(1);
|
| - DeleteOnLoseActivationChangeObserver observer1(to_delete);
|
| - RecordingActivationAndFocusChangeObserver observer2(root_window(),
|
| - &observer1);
|
| -
|
| - FocusWindowById(2);
|
| -
|
| - EXPECT_EQ(2, GetActiveWindowId());
|
| - EXPECT_EQ(2, GetFocusedWindowId());
|
| -
|
| - EXPECT_EQ(to_delete, observer1.GetDeletedWindow());
|
| - EXPECT_FALSE(observer2.was_notified_with_deleted_window());
|
| - }
|
| -
|
| - {
|
| - aura::Window* to_delete = root_window()->GetChildById(2);
|
| - DeleteOnLoseFocusChangeObserver observer1(to_delete);
|
| - RecordingActivationAndFocusChangeObserver observer2(root_window(),
|
| - &observer1);
|
| -
|
| - FocusWindowById(3);
|
| -
|
| - EXPECT_EQ(3, GetActiveWindowId());
|
| - EXPECT_EQ(3, GetFocusedWindowId());
|
| -
|
| - EXPECT_EQ(to_delete, observer1.GetDeletedWindow());
|
| - EXPECT_FALSE(observer2.was_notified_with_deleted_window());
|
| - }
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerDirectTestBase);
|
| -};
|
| -
|
| -// Focus and Activation changes via aura::client::ActivationClient API.
|
| -class FocusControllerApiTest : public FocusControllerDirectTestBase {
|
| - public:
|
| - FocusControllerApiTest() {}
|
| -
|
| - private:
|
| - // Overridden from FocusControllerTestBase:
|
| - virtual void FocusWindowDirect(aura::Window* window) OVERRIDE {
|
| - FocusWindow(window);
|
| - }
|
| - virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE {
|
| - ActivateWindow(window);
|
| - }
|
| - virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE {
|
| - DeactivateWindow(window);
|
| - }
|
| - virtual bool IsInputEvent() OVERRIDE { return false; }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerApiTest);
|
| -};
|
| -
|
| -// Focus and Activation changes via input events.
|
| -class FocusControllerMouseEventTest : public FocusControllerDirectTestBase {
|
| - public:
|
| - FocusControllerMouseEventTest() {}
|
| -
|
| - private:
|
| - // Overridden from FocusControllerTestBase:
|
| - virtual void FocusWindowDirect(aura::Window* window) OVERRIDE {
|
| - aura::test::EventGenerator generator(root_window(), window);
|
| - generator.ClickLeftButton();
|
| - }
|
| - virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE {
|
| - aura::test::EventGenerator generator(root_window(), window);
|
| - generator.ClickLeftButton();
|
| - }
|
| - virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE {
|
| - aura::Window* next_activatable =
|
| - test_focus_rules()->GetNextActivatableWindow(window);
|
| - aura::test::EventGenerator generator(root_window(), next_activatable);
|
| - generator.ClickLeftButton();
|
| - }
|
| - virtual bool IsInputEvent() OVERRIDE { return true; }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerMouseEventTest);
|
| -};
|
| -
|
| -class FocusControllerGestureEventTest : public FocusControllerDirectTestBase {
|
| - public:
|
| - FocusControllerGestureEventTest() {}
|
| -
|
| - private:
|
| - // Overridden from FocusControllerTestBase:
|
| - virtual void FocusWindowDirect(aura::Window* window) OVERRIDE {
|
| - aura::test::EventGenerator generator(root_window(), window);
|
| - generator.GestureTapAt(window->bounds().CenterPoint());
|
| - }
|
| - virtual void ActivateWindowDirect(aura::Window* window) OVERRIDE {
|
| - aura::test::EventGenerator generator(root_window(), window);
|
| - generator.GestureTapAt(window->bounds().CenterPoint());
|
| - }
|
| - virtual void DeactivateWindowDirect(aura::Window* window) OVERRIDE {
|
| - aura::Window* next_activatable =
|
| - test_focus_rules()->GetNextActivatableWindow(window);
|
| - aura::test::EventGenerator generator(root_window(), next_activatable);
|
| - generator.GestureTapAt(window->bounds().CenterPoint());
|
| - }
|
| - virtual bool IsInputEvent() OVERRIDE { return true; }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerGestureEventTest);
|
| -};
|
| -
|
| -// Test base for tests where focus is implicitly set to a window as the result
|
| -// of a disposition change to the focused window or the hierarchy that contains
|
| -// it.
|
| -class FocusControllerImplicitTestBase : public FocusControllerTestBase {
|
| - protected:
|
| - explicit FocusControllerImplicitTestBase(bool parent) : parent_(parent) {}
|
| -
|
| - aura::Window* GetDispositionWindow(aura::Window* window) {
|
| - return parent_ ? window->parent() : window;
|
| - }
|
| -
|
| - // Change the disposition of |window| in such a way as it will lose focus.
|
| - virtual void ChangeWindowDisposition(aura::Window* window) = 0;
|
| -
|
| - // Allow each disposition change test to add additional post-disposition
|
| - // change expectations.
|
| - virtual void PostDispostionChangeExpectations() {}
|
| -
|
| - // Overridden from FocusControllerTestBase:
|
| - virtual void BasicFocus() OVERRIDE {
|
| - EXPECT_EQ(NULL, GetFocusedWindow());
|
| -
|
| - aura::Window* w211 = root_window()->GetChildById(211);
|
| - FocusWindow(w211);
|
| - EXPECT_EQ(211, GetFocusedWindowId());
|
| -
|
| - ChangeWindowDisposition(w211);
|
| - // BasicFocusRules passes focus to the parent.
|
| - EXPECT_EQ(parent_ ? 2 : 21, GetFocusedWindowId());
|
| - }
|
| - virtual void BasicActivation() OVERRIDE {
|
| - DCHECK(!parent_) << "Activation tests don't support parent changes.";
|
| -
|
| - EXPECT_EQ(NULL, GetActiveWindow());
|
| -
|
| - aura::Window* w2 = root_window()->GetChildById(2);
|
| - ActivateWindow(w2);
|
| - EXPECT_EQ(2, GetActiveWindowId());
|
| -
|
| - ChangeWindowDisposition(w2);
|
| - EXPECT_EQ(3, GetActiveWindowId());
|
| - PostDispostionChangeExpectations();
|
| - }
|
| - virtual void FocusEvents() OVERRIDE {
|
| - aura::Window* w211 = root_window()->GetChildById(211);
|
| - FocusWindow(w211);
|
| -
|
| - ScopedFocusNotificationObserver root_observer(root_window());
|
| - ScopedTargetFocusNotificationObserver observer211(root_window(), 211);
|
| - root_observer.ExpectCounts(0, 0);
|
| - observer211.ExpectCounts(0, 0);
|
| -
|
| - ChangeWindowDisposition(w211);
|
| - root_observer.ExpectCounts(0, 1);
|
| - observer211.ExpectCounts(0, 1);
|
| - }
|
| - virtual void ActivationEvents() OVERRIDE {
|
| - DCHECK(!parent_) << "Activation tests don't support parent changes.";
|
| -
|
| - aura::Window* w2 = root_window()->GetChildById(2);
|
| - ActivateWindow(w2);
|
| -
|
| - ScopedFocusNotificationObserver root_observer(root_window());
|
| - ScopedTargetFocusNotificationObserver observer2(root_window(), 2);
|
| - ScopedTargetFocusNotificationObserver observer3(root_window(), 3);
|
| - root_observer.ExpectCounts(0, 0);
|
| - observer2.ExpectCounts(0, 0);
|
| - observer3.ExpectCounts(0, 0);
|
| -
|
| - ChangeWindowDisposition(w2);
|
| - root_observer.ExpectCounts(1, 1);
|
| - observer2.ExpectCounts(1, 1);
|
| - observer3.ExpectCounts(1, 1);
|
| - }
|
| - virtual void FocusRulesOverride() OVERRIDE {
|
| - EXPECT_EQ(NULL, GetFocusedWindow());
|
| - aura::Window* w211 = root_window()->GetChildById(211);
|
| - FocusWindow(w211);
|
| - EXPECT_EQ(211, GetFocusedWindowId());
|
| -
|
| - test_focus_rules()->set_focus_restriction(root_window()->GetChildById(11));
|
| - ChangeWindowDisposition(w211);
|
| - // Normally, focus would shift to the parent (w21) but the override shifts
|
| - // it to 11.
|
| - EXPECT_EQ(11, GetFocusedWindowId());
|
| -
|
| - test_focus_rules()->set_focus_restriction(NULL);
|
| - }
|
| - virtual void ActivationRulesOverride() OVERRIDE {
|
| - DCHECK(!parent_) << "Activation tests don't support parent changes.";
|
| -
|
| - aura::Window* w1 = root_window()->GetChildById(1);
|
| - ActivateWindow(w1);
|
| -
|
| - EXPECT_EQ(1, GetActiveWindowId());
|
| - EXPECT_EQ(1, GetFocusedWindowId());
|
| -
|
| - aura::Window* w3 = root_window()->GetChildById(3);
|
| - test_focus_rules()->set_focus_restriction(w3);
|
| -
|
| - // Normally, activation/focus would move to w2, but since we have a focus
|
| - // restriction, it should move to w3 instead.
|
| - ChangeWindowDisposition(w1);
|
| - EXPECT_EQ(3, GetActiveWindowId());
|
| - EXPECT_EQ(3, GetFocusedWindowId());
|
| -
|
| - test_focus_rules()->set_focus_restriction(NULL);
|
| - ActivateWindow(root_window()->GetChildById(2));
|
| - EXPECT_EQ(2, GetActiveWindowId());
|
| - EXPECT_EQ(2, GetFocusedWindowId());
|
| - }
|
| -
|
| - private:
|
| - // When true, the disposition change occurs to the parent of the window
|
| - // instead of to the window. This verifies that changes occurring in the
|
| - // hierarchy that contains the window affect the window's focus.
|
| - bool parent_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerImplicitTestBase);
|
| -};
|
| -
|
| -// Focus and Activation changes in response to window visibility changes.
|
| -class FocusControllerHideTest : public FocusControllerImplicitTestBase {
|
| - public:
|
| - FocusControllerHideTest() : FocusControllerImplicitTestBase(false) {}
|
| -
|
| - protected:
|
| - FocusControllerHideTest(bool parent)
|
| - : FocusControllerImplicitTestBase(parent) {}
|
| -
|
| - // Overridden from FocusControllerImplicitTestBase:
|
| - virtual void ChangeWindowDisposition(aura::Window* window) OVERRIDE {
|
| - GetDispositionWindow(window)->Hide();
|
| - }
|
| - virtual void PostDispostionChangeExpectations() OVERRIDE {
|
| - // BasicActivation() starts with the stacking order: 1, 2, 3 (3 topmost)
|
| - // and then activates 2. After 2 is hidden in ChangeWindowDisposition
|
| - // above, 3 is activated, but code in
|
| - // FocusController::OnWindowVisibilityChanging keeps 2's layer above 3's
|
| - // until a hide animation completes (e.g. a fade-out transition).
|
| - aura::Window* w2 = root_window()->GetChildById(2);
|
| - aura::Window* w3 = root_window()->GetChildById(3);
|
| -
|
| - // W2 was hidden, but its layer should still be stacked above W3's.
|
| - typedef std::vector<ui::Layer*> Layers;
|
| - const Layers& children = w3->parent()->layer()->children();
|
| - Layers::const_iterator w3_iter =
|
| - std::find(children.begin(), children.end(), w3->layer());
|
| - Layers::const_iterator w2_iter =
|
| - std::find(children.begin(), children.end(), w2->layer());
|
| - EXPECT_TRUE(w2_iter > w3_iter);
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerHideTest);
|
| -};
|
| -
|
| -// Focus and Activation changes in response to window parent visibility
|
| -// changes.
|
| -class FocusControllerParentHideTest : public FocusControllerHideTest {
|
| - public:
|
| - FocusControllerParentHideTest() : FocusControllerHideTest(true) {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerParentHideTest);
|
| -};
|
| -
|
| -// Focus and Activation changes in response to window destruction.
|
| -class FocusControllerDestructionTest : public FocusControllerImplicitTestBase {
|
| - public:
|
| - FocusControllerDestructionTest() : FocusControllerImplicitTestBase(false) {}
|
| -
|
| - protected:
|
| - FocusControllerDestructionTest(bool parent)
|
| - : FocusControllerImplicitTestBase(parent) {}
|
| -
|
| - // Overridden from FocusControllerImplicitTestBase:
|
| - virtual void ChangeWindowDisposition(aura::Window* window) OVERRIDE {
|
| - delete GetDispositionWindow(window);
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerDestructionTest);
|
| -};
|
| -
|
| -// Focus and Activation changes in response to window parent destruction.
|
| -class FocusControllerParentDestructionTest
|
| - : public FocusControllerDestructionTest {
|
| - public:
|
| - FocusControllerParentDestructionTest()
|
| - : FocusControllerDestructionTest(true) {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerParentDestructionTest);
|
| -};
|
| -
|
| -// Focus and Activation changes in response to window removal.
|
| -class FocusControllerRemovalTest : public FocusControllerImplicitTestBase {
|
| - public:
|
| - FocusControllerRemovalTest() : FocusControllerImplicitTestBase(false) {}
|
| -
|
| - protected:
|
| - FocusControllerRemovalTest(bool parent)
|
| - : FocusControllerImplicitTestBase(parent) {}
|
| -
|
| - // Overridden from FocusControllerImplicitTestBase:
|
| - virtual void ChangeWindowDisposition(aura::Window* window) OVERRIDE {
|
| - aura::Window* disposition_window = GetDispositionWindow(window);
|
| - disposition_window->parent()->RemoveChild(disposition_window);
|
| - window_owner_.reset(disposition_window);
|
| - }
|
| - virtual void TearDown() OVERRIDE {
|
| - window_owner_.reset();
|
| - FocusControllerImplicitTestBase::TearDown();
|
| - }
|
| -
|
| - private:
|
| - scoped_ptr<aura::Window> window_owner_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerRemovalTest);
|
| -};
|
| -
|
| -// Focus and Activation changes in response to window parent removal.
|
| -class FocusControllerParentRemovalTest : public FocusControllerRemovalTest {
|
| - public:
|
| - FocusControllerParentRemovalTest() : FocusControllerRemovalTest(true) {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(FocusControllerParentRemovalTest);
|
| -};
|
| -
|
| -
|
| -#define FOCUS_CONTROLLER_TEST(TESTCLASS, TESTNAME) \
|
| - TEST_F(TESTCLASS, TESTNAME) { TESTNAME(); }
|
| -
|
| -// Runs direct focus change tests (input events and API calls).
|
| -#define DIRECT_FOCUS_CHANGE_TESTS(TESTNAME) \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerApiTest, TESTNAME) \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerMouseEventTest, TESTNAME) \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerGestureEventTest, TESTNAME)
|
| -
|
| -// Runs implicit focus change tests for disposition changes to target.
|
| -#define IMPLICIT_FOCUS_CHANGE_TARGET_TESTS(TESTNAME) \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerHideTest, TESTNAME) \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerDestructionTest, TESTNAME) \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerRemovalTest, TESTNAME)
|
| -
|
| -// Runs implicit focus change tests for disposition changes to target's parent
|
| -// hierarchy.
|
| -#define IMPLICIT_FOCUS_CHANGE_PARENT_TESTS(TESTNAME) \
|
| - /* TODO(beng): parent destruction tests are not supported at
|
| - present due to workspace manager issues. \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerParentDestructionTest, TESTNAME) */ \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerParentHideTest, TESTNAME) \
|
| - FOCUS_CONTROLLER_TEST(FocusControllerParentRemovalTest, TESTNAME)
|
| -
|
| -// Runs all implicit focus change tests (changes to the target and target's
|
| -// parent hierarchy)
|
| -#define IMPLICIT_FOCUS_CHANGE_TESTS(TESTNAME) \
|
| - IMPLICIT_FOCUS_CHANGE_TARGET_TESTS(TESTNAME) \
|
| - IMPLICIT_FOCUS_CHANGE_PARENT_TESTS(TESTNAME)
|
| -
|
| -// Runs all possible focus change tests.
|
| -#define ALL_FOCUS_TESTS(TESTNAME) \
|
| - DIRECT_FOCUS_CHANGE_TESTS(TESTNAME) \
|
| - IMPLICIT_FOCUS_CHANGE_TESTS(TESTNAME)
|
| -
|
| -// Runs focus change tests that apply only to the target. For example,
|
| -// implicit activation changes caused by window disposition changes do not
|
| -// occur when changes to the containing hierarchy happen.
|
| -#define TARGET_FOCUS_TESTS(TESTNAME) \
|
| - DIRECT_FOCUS_CHANGE_TESTS(TESTNAME) \
|
| - IMPLICIT_FOCUS_CHANGE_TARGET_TESTS(TESTNAME)
|
| -
|
| -// - Focuses a window, verifies that focus changed.
|
| -ALL_FOCUS_TESTS(BasicFocus);
|
| -
|
| -// - Activates a window, verifies that activation changed.
|
| -TARGET_FOCUS_TESTS(BasicActivation);
|
| -
|
| -// - Focuses a window, verifies that focus events were dispatched.
|
| -ALL_FOCUS_TESTS(FocusEvents);
|
| -
|
| -// - Focuses or activates a window multiple times, verifies that events are only
|
| -// dispatched when focus/activation actually changes.
|
| -DIRECT_FOCUS_CHANGE_TESTS(DuplicateFocusEvents);
|
| -DIRECT_FOCUS_CHANGE_TESTS(DuplicateActivationEvents);
|
| -
|
| -// - Activates a window, verifies that activation events were dispatched.
|
| -TARGET_FOCUS_TESTS(ActivationEvents);
|
| -
|
| -// - Attempts to active a hidden window, verifies that current window is
|
| -// attempted to be reactivated and the appropriate event dispatched.
|
| -FOCUS_CONTROLLER_TEST(FocusControllerApiTest, ReactivationEvents);
|
| -
|
| -// - Input events/API calls shift focus between focusable windows within the
|
| -// active window.
|
| -DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusWithinActiveWindow);
|
| -
|
| -// - Input events/API calls to a child window of an inactive window shifts
|
| -// activation to the activatable parent and focuses the child.
|
| -DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusToChildOfInactiveWindow);
|
| -
|
| -// - Input events/API calls to focus the parent of the focused window do not
|
| -// shift focus away from the child.
|
| -DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusToParentOfFocusedWindow);
|
| -
|
| -// - Verifies that FocusRules determine what can be focused.
|
| -ALL_FOCUS_TESTS(FocusRulesOverride);
|
| -
|
| -// - Verifies that FocusRules determine what can be activated.
|
| -TARGET_FOCUS_TESTS(ActivationRulesOverride);
|
| -
|
| -// - Verifies that attempts to change focus or activation from a focus or
|
| -// activation change observer are ignored.
|
| -DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusOnActivation);
|
| -DIRECT_FOCUS_CHANGE_TESTS(ShiftFocusOnActivationDueToHide);
|
| -DIRECT_FOCUS_CHANGE_TESTS(NoShiftActiveOnActivation);
|
| -
|
| -// Clicking on a window which has capture should not result in a focus change.
|
| -DIRECT_FOCUS_CHANGE_TESTS(NoFocusChangeOnClickOnCaptureWindow);
|
| -
|
| -FOCUS_CONTROLLER_TEST(FocusControllerApiTest,
|
| - ChangeFocusWhenNothingFocusedAndCaptured);
|
| -
|
| -// See description above DontPassDeletedWindow() for details.
|
| -FOCUS_CONTROLLER_TEST(FocusControllerApiTest, DontPassDeletedWindow);
|
| -
|
| -} // namespace corewm
|
| -} // namespace views
|
|
|