Index: mojo/services/window_manager/window_manager_apptest.cc |
diff --git a/mojo/services/window_manager/window_manager_apptest.cc b/mojo/services/window_manager/window_manager_apptest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..12a9aca9ff7b6f28c45e8276a6db9e00fe8aceda |
--- /dev/null |
+++ b/mojo/services/window_manager/window_manager_apptest.cc |
@@ -0,0 +1,212 @@ |
+// Copyright 2014 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 "base/bind.h" |
+#include "base/run_loop.h" |
+#include "mojo/public/cpp/application/application_delegate.h" |
+#include "mojo/public/cpp/application/application_impl.h" |
+#include "mojo/public/cpp/application/application_test_base.h" |
+#include "mojo/public/cpp/application/service_provider_impl.h" |
+#include "mojo/public/cpp/system/macros.h" |
+#include "third_party/mojo_services/src/view_manager/public/cpp/view.h" |
+#include "third_party/mojo_services/src/view_manager/public/cpp/view_manager_client_factory.h" |
+#include "third_party/mojo_services/src/view_manager/public/cpp/view_manager_delegate.h" |
+#include "third_party/mojo_services/src/window_manager/public/interfaces/window_manager.mojom.h" |
+ |
+namespace mojo { |
+namespace { |
+ |
+// TestApplication's view is embedded by the window manager. |
+class TestApplication : public ApplicationDelegate, public ViewManagerDelegate { |
+ public: |
+ TestApplication() : root_(nullptr) {} |
+ ~TestApplication() override {} |
+ |
+ View* root() const { return root_; } |
+ |
+ void set_embed_callback(const base::Closure& callback) { |
+ embed_callback_ = callback; |
+ } |
+ |
+ private: |
+ // ApplicationDelegate: |
+ void Initialize(ApplicationImpl* app) override { |
+ view_manager_client_factory_.reset( |
+ new ViewManagerClientFactory(app->shell(), this)); |
+ } |
+ |
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override { |
+ connection->AddService(view_manager_client_factory_.get()); |
+ return true; |
+ } |
+ |
+ // ViewManagerDelegate: |
+ void OnEmbed(View* root, |
+ InterfaceRequest<ServiceProvider> services, |
+ ServiceProviderPtr exposed_services) override { |
+ root_ = root; |
+ embed_callback_.Run(); |
+ } |
+ void OnViewManagerDisconnected(ViewManager* view_manager) override {} |
+ |
+ View* root_; |
+ base::Closure embed_callback_; |
+ scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_; |
+ |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(TestApplication); |
+}; |
+ |
+class TestWindowManagerObserver : public WindowManagerObserver { |
+ public: |
+ explicit TestWindowManagerObserver( |
+ InterfaceRequest<WindowManagerObserver> observer_request) |
+ : binding_(this, observer_request.Pass()) {} |
+ ~TestWindowManagerObserver() override {} |
+ |
+ private: |
+ // Overridden from WindowManagerClient: |
+ void OnCaptureChanged(Id new_capture_node_id) override {} |
+ void OnFocusChanged(Id focused_node_id) override {} |
+ void OnActiveWindowChanged(Id active_window) override {} |
+ |
+ Binding<WindowManagerObserver> binding_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestWindowManagerObserver); |
+}; |
+ |
+class WindowManagerApplicationTest : public test::ApplicationTestBase { |
+ public: |
+ WindowManagerApplicationTest() {} |
+ ~WindowManagerApplicationTest() override {} |
+ |
+ protected: |
+ // ApplicationTestBase: |
+ void SetUp() override { |
+ ApplicationTestBase::SetUp(); |
+ application_impl()->ConnectToService("mojo:window_manager", |
+ &window_manager_); |
+ } |
+ ApplicationDelegate* GetApplicationDelegate() override { |
+ return &test_application_; |
+ } |
+ |
+ void EmbedApplicationWithURL(const std::string& url) { |
+ window_manager_->Embed(url, nullptr, nullptr); |
+ |
+ base::RunLoop run_loop; |
+ test_application_.set_embed_callback(run_loop.QuitClosure()); |
+ run_loop.Run(); |
+ } |
+ |
+ WindowManagerPtr window_manager_; |
+ TestApplication test_application_; |
+ |
+ private: |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(WindowManagerApplicationTest); |
+}; |
+ |
+TEST_F(WindowManagerApplicationTest, Embed) { |
+ EXPECT_EQ(nullptr, test_application_.root()); |
+ EmbedApplicationWithURL(application_impl()->url()); |
+ EXPECT_NE(nullptr, test_application_.root()); |
+} |
+ |
+struct BoolCallback { |
+ BoolCallback(bool* bool_value, base::RunLoop* run_loop) |
+ : bool_value(bool_value), run_loop(run_loop) {} |
+ |
+ void Run(bool value) const { |
+ *bool_value = value; |
+ run_loop->Quit(); |
+ } |
+ |
+ bool* bool_value; |
+ base::RunLoop* run_loop; |
+}; |
+ |
+TEST_F(WindowManagerApplicationTest, SetCaptureFailsFromNonVM) { |
+ EmbedApplicationWithURL(application_impl()->url()); |
+ bool callback_value = true; |
+ base::RunLoop run_loop; |
+ window_manager_->SetCapture(test_application_.root()->id(), |
+ BoolCallback(&callback_value, &run_loop)); |
+ run_loop.Run(); |
+ // This call only succeeds for WindowManager connections from the ViewManager. |
+ EXPECT_FALSE(callback_value); |
+} |
+ |
+TEST_F(WindowManagerApplicationTest, FocusWindowFailsFromNonVM) { |
+ EmbedApplicationWithURL(application_impl()->url()); |
+ bool callback_value = true; |
+ base::RunLoop run_loop; |
+ window_manager_->FocusWindow(test_application_.root()->id(), |
+ BoolCallback(&callback_value, &run_loop)); |
+ run_loop.Run(); |
+ // This call only succeeds for WindowManager connections from the ViewManager. |
+ EXPECT_FALSE(callback_value); |
+} |
+ |
+TEST_F(WindowManagerApplicationTest, ActivateWindowFailsFromNonVM) { |
+ EmbedApplicationWithURL(application_impl()->url()); |
+ bool callback_value = true; |
+ base::RunLoop run_loop; |
+ window_manager_->ActivateWindow(test_application_.root()->id(), |
+ BoolCallback(&callback_value, &run_loop)); |
+ run_loop.Run(); |
+ // This call only succeeds for WindowManager connections from the ViewManager. |
+ EXPECT_FALSE(callback_value); |
+} |
+ |
+struct FocusedAndActiveViewsCallback { |
+ FocusedAndActiveViewsCallback(uint32* capture_view_id, |
+ uint32* focused_view_id, |
+ uint32* active_view_id, |
+ base::RunLoop* run_loop) |
+ : capture_view_id(capture_view_id), |
+ focused_view_id(focused_view_id), |
+ active_view_id(active_view_id), |
+ run_loop(run_loop) { |
+ } |
+ |
+ void Run(uint32 capture, uint32 focused, uint32 active) const { |
+ *capture_view_id = capture; |
+ *focused_view_id = focused; |
+ *active_view_id = active; |
+ run_loop->Quit(); |
+ } |
+ |
+ uint32* capture_view_id; |
+ uint32* focused_view_id; |
+ uint32* active_view_id; |
+ base::RunLoop* run_loop; |
+}; |
+ |
+TEST_F(WindowManagerApplicationTest, GetFocusedAndActiveViewsFailsWithoutFC) { |
+ EmbedApplicationWithURL(application_impl()->url()); |
+ uint32 capture_view_id = -1; |
+ uint32 focused_view_id = -1; |
+ uint32 active_view_id = -1; |
+ base::RunLoop run_loop; |
+ |
+ WindowManagerObserverPtr observer; |
+ scoped_ptr<TestWindowManagerObserver> window_manager_observer( |
+ new TestWindowManagerObserver(GetProxy(&observer))); |
+ |
+ window_manager_->GetFocusedAndActiveViews( |
+ observer.Pass(), |
+ FocusedAndActiveViewsCallback(&capture_view_id, |
+ &focused_view_id, |
+ &active_view_id, |
+ &run_loop)); |
+ run_loop.Run(); |
+ // This call fails if the WindowManager does not have a FocusController. |
+ EXPECT_EQ(0u, capture_view_id); |
+ EXPECT_EQ(0u, focused_view_id); |
+ EXPECT_EQ(0u, active_view_id); |
+} |
+ |
+// TODO(msw): Write tests exercising other WindowManager functionality. |
+ |
+} // namespace |
+} // namespace mojo |