summaryrefslogtreecommitdiffstats
path: root/ui/aura
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-28 19:46:22 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-28 19:46:22 +0000
commit995d3145768f6f2c171546853be7359e46e1f444 (patch)
treef89bc85f412afa25452c3e28e328fa36cdd8ba5f /ui/aura
parent7c34d000dcd44dcf76f43aaa97c684f37c43b526 (diff)
downloadchromium_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.gyp2
-rw-r--r--ui/aura/client/default_activation_client.cc128
-rw-r--r--ui/aura/client/default_activation_client.h69
-rw-r--r--ui/aura/test/aura_test_helper.cc4
-rw-r--r--ui/aura/test/aura_test_helper.h2
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_;