| 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
|
|
|