1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_vector.h"
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/application_manager/application_manager.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/application_delegate.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/application_impl.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/cpp/application/service_provider_impl.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/interfaces/application/service_provider.mojom.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/cpp/view_manager/types.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager_delegate.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/interfaces/window_manager/window_manager.mojom.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/shell/shell_test_helper.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kTestServiceURL[] = "mojo:test_url";
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void EmptyResultCallback(bool result) {}
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Callback from Embed(). |result| is the result of the Embed() call and
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// |run_loop| the nested RunLoop.
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ResultCallback(bool* result_cache, base::RunLoop* run_loop, bool result) {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *result_cache = result;
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  run_loop->Quit();
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Responsible for establishing the initial ViewManagerService connection.
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Blocks until result is determined.
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool InitEmbed(ViewManagerInitService* view_manager_init,
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               const std::string& url) {
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool result = false;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop run_loop;
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ServiceProviderPtr sp;
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  BindToProxy(new ServiceProviderImpl, &sp);
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  view_manager_init->Embed(url, sp.Pass(),
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           base::Bind(&ResultCallback, &result, &run_loop));
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  run_loop.Run();
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return result;
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestWindowManagerClient : public WindowManagerClient {
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef base::Callback<void(Id, Id)>
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      TwoNodeCallback;
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit TestWindowManagerClient(base::RunLoop* run_loop)
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : run_loop_(run_loop) {}
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~TestWindowManagerClient() {}
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_focus_changed_callback(const TwoNodeCallback& callback) {
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    focus_changed_callback_ = callback;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_active_window_changed_callback(const TwoNodeCallback& callback) {
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    active_window_changed_callback_ = callback;
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overridden from WindowManagerClient:
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnWindowManagerReady() MOJO_OVERRIDE {
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    run_loop_->Quit();
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnCaptureChanged(
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Id old_capture_node_id,
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Id new_capture_node_id) MOJO_OVERRIDE {
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnFocusChanged(
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Id old_focused_node_id,
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Id new_focused_node_id) MOJO_OVERRIDE {
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!focus_changed_callback_.is_null())
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      focus_changed_callback_.Run(old_focused_node_id, new_focused_node_id);
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnActiveWindowChanged(
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Id old_active_window,
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Id new_active_window) MOJO_OVERRIDE {
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!active_window_changed_callback_.is_null())
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      active_window_changed_callback_.Run(old_active_window, new_active_window);
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop* run_loop_;
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TwoNodeCallback focus_changed_callback_;
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TwoNodeCallback active_window_changed_callback_;
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestWindowManagerClient);
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class TestApplicationLoader : public ApplicationLoader,
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              public ApplicationDelegate,
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              public ViewManagerDelegate {
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  typedef base::Callback<void(View*)> RootAddedCallback;
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  explicit TestApplicationLoader(const RootAddedCallback& root_added_callback)
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : root_added_callback_(root_added_callback) {}
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~TestApplicationLoader() {}
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Overridden from ApplicationLoader:
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void Load(ApplicationManager* application_manager,
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    const GURL& url,
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    scoped_refptr<LoadCallbacks> callbacks) MOJO_OVERRIDE {
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ScopedMessagePipeHandle shell_handle = callbacks->RegisterApplication();
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!shell_handle.is_valid())
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return;
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_ptr<ApplicationImpl> app(
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        new ApplicationImpl(this, shell_handle.Pass()));
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    apps_.push_back(app.release());
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnApplicationError(ApplicationManager* application_manager,
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  const GURL& url) MOJO_OVERRIDE {}
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Overridden from ApplicationDelegate:
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE {
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_manager_client_factory_.reset(
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ViewManagerClientFactory(app->shell(), this));
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool ConfigureIncomingConnection(
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ApplicationConnection* connection) MOJO_OVERRIDE {
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connection->AddService(view_manager_client_factory_.get());
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return true;
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Overridden from ViewManagerDelegate:
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnEmbed(
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ViewManager* view_manager,
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      View* root,
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ServiceProviderImpl* exported_services,
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      scoped_ptr<ServiceProvider> imported_services) MOJO_OVERRIDE {
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    root_added_callback_.Run(root);
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnViewManagerDisconnected(
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ViewManager* view_manager) MOJO_OVERRIDE {
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RootAddedCallback root_added_callback_;
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<ApplicationImpl> apps_;
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_;
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestApplicationLoader);
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WindowManagerApiTest : public testing::Test {
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WindowManagerApiTest() {}
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~WindowManagerApiTest() {}
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef std::pair<Id, Id> TwoIds;
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Id WaitForEmbed() {
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Id id;
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::RunLoop run_loop;
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    root_added_callback_ = base::Bind(&WindowManagerApiTest::OnEmbed,
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                      base::Unretained(this), &id, &run_loop);
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    run_loop.Run();
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return id;
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TwoIds WaitForFocusChange() {
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TwoIds old_and_new;
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::RunLoop run_loop;
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    window_manager_client()->set_focus_changed_callback(
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::Bind(&WindowManagerApiTest::OnFocusChanged,
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   base::Unretained(this), &old_and_new, &run_loop));
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    run_loop.Run();
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return old_and_new;
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TwoIds WaitForActiveWindowChange() {
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TwoIds old_and_new;
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::RunLoop run_loop;
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    window_manager_client()->set_active_window_changed_callback(
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::Bind(&WindowManagerApiTest::OnActiveWindowChanged,
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   base::Unretained(this), &old_and_new, &run_loop));
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    run_loop.Run();
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return old_and_new;
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Id OpenWindow() {
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return OpenWindowWithURL(kTestServiceURL);
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Id OpenWindowWithURL(const std::string& url) {
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    InitEmbed(view_manager_init_.get(), url);
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return WaitForEmbed();
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestWindowManagerClient* window_manager_client() {
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return window_manager_client_.get();
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WindowManagerServicePtr window_manager_;
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overridden from testing::Test:
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() MOJO_OVERRIDE {
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    test_helper_.Init();
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    test_helper_.SetLoaderForURL(
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        scoped_ptr<ApplicationLoader>(new TestApplicationLoader(base::Bind(
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            &WindowManagerApiTest::OnRootAdded, base::Unretained(this)))),
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        GURL(kTestServiceURL));
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_helper_.application_manager()->ConnectToService(
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        GURL("mojo:mojo_view_manager"), &view_manager_init_);
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(InitEmbed(view_manager_init_.get(),
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          "mojo:mojo_core_window_manager"));
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ConnectToWindowManager();
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void TearDown() MOJO_OVERRIDE {}
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ConnectToWindowManager() {
2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_helper_.application_manager()->ConnectToService(
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        GURL("mojo:mojo_core_window_manager"), &window_manager_);
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop connect_loop;
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    window_manager_client_.reset(new TestWindowManagerClient(&connect_loop));
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    window_manager_.set_client(window_manager_client());
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    connect_loop.Run();
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnRootAdded(View* root) {
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!root_added_callback_.is_null())
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      root_added_callback_.Run(root);
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnEmbed(Id* root_id,
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               base::RunLoop* loop,
2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)               View* root) {
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *root_id = root->id();
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    loop->Quit();
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnFocusChanged(TwoIds* old_and_new,
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      base::RunLoop* run_loop,
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      Id old_focused_node_id,
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      Id new_focused_node_id) {
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DCHECK(old_and_new);
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_and_new->first = old_focused_node_id;
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_and_new->second = new_focused_node_id;
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    run_loop->Quit();
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnActiveWindowChanged(TwoIds* old_and_new,
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             base::RunLoop* run_loop,
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             Id old_focused_node_id,
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             Id new_focused_node_id) {
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DCHECK(old_and_new);
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_and_new->first = old_focused_node_id;
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    old_and_new->second = new_focused_node_id;
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    run_loop->Quit();
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  shell::ShellTestHelper test_helper_;
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ViewManagerInitServicePtr view_manager_init_;
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<TestWindowManagerClient> window_manager_client_;
2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  TestApplicationLoader::RootAddedCallback root_added_callback_;
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(WindowManagerApiTest);
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(WindowManagerApiTest, FocusAndActivateWindow) {
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Id first_window = OpenWindow();
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  window_manager_->FocusWindow(first_window,
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               base::Bind(&EmptyResultCallback));
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TwoIds ids = WaitForFocusChange();
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(ids.first == 0);
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ids.second, first_window);
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Id second_window = OpenWindow();
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  window_manager_->ActivateWindow(second_window,
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  base::Bind(&EmptyResultCallback));
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ids = WaitForActiveWindowChange();
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ids.first, first_window);
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(ids.second, second_window);
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace mojo
288