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