diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 19:46:22 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 19:46:22 +0000 |
commit | 995d3145768f6f2c171546853be7359e46e1f444 (patch) | |
tree | f89bc85f412afa25452c3e28e328fa36cdd8ba5f /ui/aura | |
parent | 7c34d000dcd44dcf76f43aaa97c684f37c43b526 (diff) | |
download | chromium_src-995d3145768f6f2c171546853be7359e46e1f444.zip chromium_src-995d3145768f6f2c171546853be7359e46e1f444.tar.gz chromium_src-995d3145768f6f2c171546853be7359e46e1f444.tar.bz2 |
Revert 266616 "Move DefaultActivationClient to wm/core"
> Move DefaultActivationClient to wm/core
>
> Several tests are using AuraTestHelper and were relying on it to set up the DefaultActivationClient, so I had to have them instantiate the DAC directly after calling SetUp() on the helper. I also had to make the DAC delete itself after the root window it's bound to is destroyed.
>
> R=sky@chromium.org
> http://crbug.com/308710
>
> Review URL: https://codereview.chromium.org/250113002
TBR=ben@chromium.org
Review URL: https://codereview.chromium.org/259103003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266632 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/aura')
-rw-r--r-- | ui/aura/aura.gyp | 2 | ||||
-rw-r--r-- | ui/aura/client/default_activation_client.cc | 128 | ||||
-rw-r--r-- | ui/aura/client/default_activation_client.h | 69 | ||||
-rw-r--r-- | ui/aura/test/aura_test_helper.cc | 4 | ||||
-rw-r--r-- | ui/aura/test/aura_test_helper.h | 2 |
5 files changed, 205 insertions, 0 deletions
diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp index a8900f8..9ddb104 100644 --- a/ui/aura/aura.gyp +++ b/ui/aura/aura.gyp @@ -36,6 +36,8 @@ 'client/cursor_client.h', 'client/cursor_client_observer.h', 'client/cursor_client_observer.cc', + 'client/default_activation_client.cc', + 'client/default_activation_client.h', 'client/default_capture_client.cc', 'client/default_capture_client.h', 'client/event_client.cc', diff --git a/ui/aura/client/default_activation_client.cc b/ui/aura/client/default_activation_client.cc new file mode 100644 index 0000000..b11d7bf --- /dev/null +++ b/ui/aura/client/default_activation_client.cc @@ -0,0 +1,128 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/aura/client/default_activation_client.h" + +#include "ui/aura/window.h" +#include "ui/wm/public/activation_change_observer.h" +#include "ui/wm/public/activation_delegate.h" + +namespace aura { +namespace client { + +//////////////////////////////////////////////////////////////////////////////// +// DefaultActivationClient, public: + +DefaultActivationClient::DefaultActivationClient(Window* root_window) + : last_active_(NULL) { + client::SetActivationClient(root_window, this); +} + +DefaultActivationClient::~DefaultActivationClient() { + for (unsigned int i = 0; i < active_windows_.size(); ++i) { + active_windows_[i]->RemoveObserver(this); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// DefaultActivationClient, client::ActivationClient implementation: + +void DefaultActivationClient::AddObserver( + client::ActivationChangeObserver* observer) { + observers_.AddObserver(observer); +} + +void DefaultActivationClient::RemoveObserver( + client::ActivationChangeObserver* observer) { + observers_.RemoveObserver(observer); +} + +void DefaultActivationClient::ActivateWindow(Window* window) { + Window* last_active = GetActiveWindow(); + if (last_active == window) + return; + + last_active_ = last_active; + RemoveActiveWindow(window); + active_windows_.push_back(window); + window->parent()->StackChildAtTop(window); + window->AddObserver(this); + + FOR_EACH_OBSERVER(client::ActivationChangeObserver, + observers_, + OnWindowActivated(window, last_active)); + + aura::client::ActivationChangeObserver* observer = + aura::client::GetActivationChangeObserver(last_active); + if (observer) + observer->OnWindowActivated(window, last_active); + observer = aura::client::GetActivationChangeObserver(window); + if (observer) + observer->OnWindowActivated(window, last_active); +} + +void DefaultActivationClient::DeactivateWindow(Window* window) { + aura::client::ActivationChangeObserver* observer = + aura::client::GetActivationChangeObserver(window); + if (observer) + observer->OnWindowActivated(NULL, window); + if (last_active_) + ActivateWindow(last_active_); +} + +Window* DefaultActivationClient::GetActiveWindow() { + if (active_windows_.empty()) + return NULL; + return active_windows_.back(); +} + +Window* DefaultActivationClient::GetActivatableWindow(Window* window) { + return NULL; +} + +Window* DefaultActivationClient::GetToplevelWindow(Window* window) { + return NULL; +} + +bool DefaultActivationClient::OnWillFocusWindow(Window* window, + const ui::Event* event) { + return true; +} + +bool DefaultActivationClient::CanActivateWindow(Window* window) const { + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// DefaultActivationClient, WindowObserver implementation: + +void DefaultActivationClient::OnWindowDestroyed(Window* window) { + if (window == last_active_) + last_active_ = NULL; + + if (window == GetActiveWindow()) { + active_windows_.pop_back(); + Window* next_active = GetActiveWindow(); + if (next_active && aura::client::GetActivationChangeObserver(next_active)) { + aura::client::GetActivationChangeObserver(next_active)->OnWindowActivated( + next_active, NULL); + } + return; + } + + RemoveActiveWindow(window); +} + +void DefaultActivationClient::RemoveActiveWindow(Window* window) { + for (unsigned int i = 0; i < active_windows_.size(); ++i) { + if (active_windows_[i] == window) { + active_windows_.erase(active_windows_.begin() + i); + window->RemoveObserver(this); + return; + } + } +} + +} // namespace client +} // namespace aura diff --git a/ui/aura/client/default_activation_client.h b/ui/aura/client/default_activation_client.h new file mode 100644 index 0000000..47e19dbc --- /dev/null +++ b/ui/aura/client/default_activation_client.h @@ -0,0 +1,69 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_AURA_CLIENT_DEFAULT_ACTIVATION_CLIENT_H_ +#define UI_AURA_CLIENT_DEFAULT_ACTIVATION_CLIENT_H_ + +#include <vector> + +#include "base/compiler_specific.h" +#include "base/logging.h" +#include "base/observer_list.h" +#include "ui/aura/aura_export.h" +#include "ui/aura/window_observer.h" +#include "ui/wm/public/activation_client.h" + +namespace aura { +namespace client { +class ActivationChangeObserver; +} + +namespace client { + +// Simple ActivationClient implementation for use by tests and other targets +// that just need basic behavior (e.g. activate windows whenever requested, +// restack windows at the top when they're activated, etc.). +class AURA_EXPORT DefaultActivationClient : public client::ActivationClient, + public WindowObserver { + public: + explicit DefaultActivationClient(Window* root_window); + virtual ~DefaultActivationClient(); + + // Overridden from client::ActivationClient: + virtual void AddObserver(client::ActivationChangeObserver* observer) OVERRIDE; + virtual void RemoveObserver( + client::ActivationChangeObserver* observer) OVERRIDE; + virtual void ActivateWindow(Window* window) OVERRIDE; + virtual void DeactivateWindow(Window* window) OVERRIDE; + virtual Window* GetActiveWindow() OVERRIDE; + virtual Window* GetActivatableWindow(Window* window) OVERRIDE; + virtual Window* GetToplevelWindow(Window* window) OVERRIDE; + virtual bool OnWillFocusWindow(Window* window, + const ui::Event* event) OVERRIDE; + virtual bool CanActivateWindow(Window* window) const OVERRIDE; + + // Overridden from WindowObserver: + virtual void OnWindowDestroyed(Window* window) OVERRIDE; + + private: + void RemoveActiveWindow(Window* window); + + // This class explicitly does NOT store the active window in a window property + // to make sure that ActivationChangeObserver is not treated as part of the + // aura API. Assumptions to that end will cause tests that use this client to + // fail. + std::vector<Window*> active_windows_; + + // The window which was active before the currently active one. + Window* last_active_; + + ObserverList<client::ActivationChangeObserver> observers_; + + DISALLOW_COPY_AND_ASSIGN(DefaultActivationClient); +}; + +} // namespace client +} // namespace aura + +#endif // UI_AURA_CLIENT_DEFAULT_ACTIVATION_CLIENT_H_ diff --git a/ui/aura/test/aura_test_helper.cc b/ui/aura/test/aura_test_helper.cc index 34183db..b300dcf 100644 --- a/ui/aura/test/aura_test_helper.cc +++ b/ui/aura/test/aura_test_helper.cc @@ -7,6 +7,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "ui/aura/client/aura_constants.h" +#include "ui/aura/client/default_activation_client.h" #include "ui/aura/client/default_capture_client.h" #include "ui/aura/client/focus_client.h" #include "ui/aura/env.h" @@ -70,6 +71,8 @@ void AuraTestHelper::SetUp() { focus_client_.reset(new TestFocusClient); client::SetFocusClient(root_window(), focus_client_.get()); stacking_client_.reset(new TestWindowTreeClient(root_window())); + activation_client_.reset( + new client::DefaultActivationClient(root_window())); capture_client_.reset(new client::DefaultCaptureClient(root_window())); test_input_method_.reset(new ui::DummyInputMethod); root_window()->SetProperty( @@ -85,6 +88,7 @@ void AuraTestHelper::TearDown() { teardown_called_ = true; test_input_method_.reset(); stacking_client_.reset(); + activation_client_.reset(); capture_client_.reset(); focus_client_.reset(); client::SetFocusClient(root_window(), NULL); diff --git a/ui/aura/test/aura_test_helper.h b/ui/aura/test/aura_test_helper.h index 05d59ab..f79ca76 100644 --- a/ui/aura/test/aura_test_helper.h +++ b/ui/aura/test/aura_test_helper.h @@ -22,6 +22,7 @@ class ScopedAnimationDurationScaleMode; namespace aura { class TestScreen; namespace client { +class DefaultActivationClient; class DefaultCaptureClient; class FocusClient; } @@ -59,6 +60,7 @@ class AuraTestHelper { bool owns_host_; scoped_ptr<WindowTreeHost> host_; scoped_ptr<TestWindowTreeClient> stacking_client_; + scoped_ptr<client::DefaultActivationClient> activation_client_; scoped_ptr<client::DefaultCaptureClient> capture_client_; scoped_ptr<ui::InputMethod> test_input_method_; scoped_ptr<client::FocusClient> focus_client_; |