OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/memory/scoped_vector.h" |
| 7 #include "mojo/public/cpp/application/application_delegate.h" |
| 8 #include "mojo/public/cpp/application/application_impl.h" |
6 #include "mojo/service_manager/service_manager.h" | 9 #include "mojo/service_manager/service_manager.h" |
| 10 #include "mojo/services/public/cpp/view_manager/node.h" |
7 #include "mojo/services/public/cpp/view_manager/types.h" | 11 #include "mojo/services/public/cpp/view_manager/types.h" |
| 12 #include "mojo/services/public/cpp/view_manager/view_manager.h" |
| 13 #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" |
8 #include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h" | 14 #include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h" |
9 #include "mojo/services/public/interfaces/window_manager/window_manager.mojom.h" | 15 #include "mojo/services/public/interfaces/window_manager/window_manager.mojom.h" |
10 #include "mojo/shell/shell_test_helper.h" | 16 #include "mojo/shell/shell_test_helper.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
12 | 18 |
13 namespace mojo { | 19 namespace mojo { |
14 namespace { | 20 namespace { |
15 | 21 |
| 22 const char kTestServiceURL[] = "mojo:test_url"; |
| 23 |
| 24 void EmptyResultCallback(bool result) {} |
| 25 |
16 // Callback from EmbedRoot(). |result| is the result of the | 26 // Callback from EmbedRoot(). |result| is the result of the |
17 // Embed() call and |run_loop| the nested RunLoop. | 27 // Embed() call and |run_loop| the nested RunLoop. |
18 void ResultCallback(bool* result_cache, base::RunLoop* run_loop, bool result) { | 28 void ResultCallback(bool* result_cache, base::RunLoop* run_loop, bool result) { |
19 *result_cache = result; | 29 *result_cache = result; |
20 run_loop->Quit(); | 30 run_loop->Quit(); |
21 } | 31 } |
22 | 32 |
23 // Responsible for establishing the initial ViewManagerService connection. | 33 // Responsible for establishing the initial ViewManagerService connection. |
24 // Blocks until result is determined. | 34 // Blocks until result is determined. |
25 bool EmbedRoot(view_manager::ViewManagerInitService* view_manager_init, | 35 bool EmbedRoot(view_manager::ViewManagerInitService* view_manager_init, |
(...skipping 15 matching lines...) Expand all Loading... |
41 | 51 |
42 view_manager::Id OpenWindow(WindowManagerService* window_manager) { | 52 view_manager::Id OpenWindow(WindowManagerService* window_manager) { |
43 base::RunLoop run_loop; | 53 base::RunLoop run_loop; |
44 view_manager::Id id; | 54 view_manager::Id id; |
45 window_manager->OpenWindow( | 55 window_manager->OpenWindow( |
46 base::Bind(&OpenWindowCallback, &id, &run_loop)); | 56 base::Bind(&OpenWindowCallback, &id, &run_loop)); |
47 run_loop.Run(); | 57 run_loop.Run(); |
48 return id; | 58 return id; |
49 } | 59 } |
50 | 60 |
| 61 view_manager::Id OpenWindowWithURL(WindowManagerService* window_manager, |
| 62 const std::string& url) { |
| 63 base::RunLoop run_loop; |
| 64 view_manager::Id id; |
| 65 window_manager->OpenWindowWithURL( |
| 66 url, |
| 67 base::Bind(&OpenWindowCallback, &id, &run_loop)); |
| 68 run_loop.Run(); |
| 69 return id; |
| 70 } |
| 71 |
51 class TestWindowManagerClient : public WindowManagerClient { | 72 class TestWindowManagerClient : public WindowManagerClient { |
52 public: | 73 public: |
| 74 typedef base::Callback<void(view_manager::Id, view_manager::Id)> |
| 75 TwoNodeCallback; |
| 76 |
53 explicit TestWindowManagerClient(base::RunLoop* run_loop) | 77 explicit TestWindowManagerClient(base::RunLoop* run_loop) |
54 : run_loop_(run_loop) {} | 78 : run_loop_(run_loop) {} |
55 virtual ~TestWindowManagerClient() {} | 79 virtual ~TestWindowManagerClient() {} |
56 | 80 |
| 81 void set_focus_changed_callback(const TwoNodeCallback& callback) { |
| 82 focus_changed_callback_ = callback; |
| 83 } |
| 84 void set_active_window_changed_callback(const TwoNodeCallback& callback) { |
| 85 active_window_changed_callback_ = callback; |
| 86 } |
| 87 |
57 private: | 88 private: |
58 // Overridden from WindowManagerClient: | 89 // Overridden from WindowManagerClient: |
59 virtual void OnWindowManagerReady() MOJO_OVERRIDE { | 90 virtual void OnWindowManagerReady() MOJO_OVERRIDE { |
60 run_loop_->Quit(); | 91 run_loop_->Quit(); |
61 } | 92 } |
62 virtual void OnCaptureChanged( | 93 virtual void OnCaptureChanged( |
63 view_manager::Id old_capture_node_id, | 94 view_manager::Id old_capture_node_id, |
64 view_manager::Id new_capture_node_id) MOJO_OVERRIDE {} | 95 view_manager::Id new_capture_node_id) MOJO_OVERRIDE { |
| 96 } |
| 97 virtual void OnFocusChanged( |
| 98 view_manager::Id old_focused_node_id, |
| 99 view_manager::Id new_focused_node_id) MOJO_OVERRIDE { |
| 100 if (!focus_changed_callback_.is_null()) |
| 101 focus_changed_callback_.Run(old_focused_node_id, new_focused_node_id); |
| 102 } |
| 103 virtual void OnActiveWindowChanged( |
| 104 view_manager::Id old_active_window, |
| 105 view_manager::Id new_active_window) MOJO_OVERRIDE { |
| 106 if (!active_window_changed_callback_.is_null()) |
| 107 active_window_changed_callback_.Run(old_active_window, new_active_window); |
| 108 } |
65 | 109 |
66 base::RunLoop* run_loop_; | 110 base::RunLoop* run_loop_; |
| 111 TwoNodeCallback focus_changed_callback_; |
| 112 TwoNodeCallback active_window_changed_callback_; |
67 | 113 |
68 DISALLOW_COPY_AND_ASSIGN(TestWindowManagerClient); | 114 DISALLOW_COPY_AND_ASSIGN(TestWindowManagerClient); |
69 }; | 115 }; |
70 | 116 |
| 117 class TestServiceLoader : public ServiceLoader, |
| 118 public ApplicationDelegate, |
| 119 public view_manager::ViewManagerDelegate { |
| 120 public: |
| 121 typedef base::Callback<void(view_manager::Node*)> RootAddedCallback; |
| 122 |
| 123 explicit TestServiceLoader(const RootAddedCallback& root_added_callback) |
| 124 : root_added_callback_(root_added_callback) {} |
| 125 virtual ~TestServiceLoader() {} |
| 126 |
| 127 private: |
| 128 // Overridden from ServiceLoader: |
| 129 virtual void LoadService(ServiceManager* service_manager, |
| 130 const GURL& url, |
| 131 ScopedMessagePipeHandle shell_handle) MOJO_OVERRIDE { |
| 132 scoped_ptr<ApplicationImpl> app( |
| 133 new ApplicationImpl(this, shell_handle.Pass())); |
| 134 apps_.push_back(app.release()); |
| 135 } |
| 136 virtual void OnServiceError(ServiceManager* service_manager, |
| 137 const GURL& url) MOJO_OVERRIDE { |
| 138 } |
| 139 |
| 140 // Overridden from ApplicationDelegate: |
| 141 virtual bool ConfigureIncomingConnection( |
| 142 ApplicationConnection* connection) MOJO_OVERRIDE { |
| 143 view_manager::ViewManager::ConfigureIncomingConnection(connection, this); |
| 144 return true; |
| 145 } |
| 146 |
| 147 // Overridden from ViewManagerDelegate: |
| 148 virtual void OnRootAdded(view_manager::ViewManager* view_manager, |
| 149 view_manager::Node* root) MOJO_OVERRIDE { |
| 150 root_added_callback_.Run(root); |
| 151 } |
| 152 virtual void OnViewManagerDisconnected( |
| 153 view_manager::ViewManager* view_manager) MOJO_OVERRIDE { |
| 154 } |
| 155 |
| 156 RootAddedCallback root_added_callback_; |
| 157 |
| 158 ScopedVector<ApplicationImpl> apps_; |
| 159 |
| 160 DISALLOW_COPY_AND_ASSIGN(TestServiceLoader); |
| 161 }; |
| 162 |
71 } // namespace | 163 } // namespace |
72 | 164 |
73 class WindowManagerApiTest : public testing::Test { | 165 class WindowManagerApiTest : public testing::Test { |
74 public: | 166 public: |
75 WindowManagerApiTest() {} | 167 WindowManagerApiTest() {} |
76 virtual ~WindowManagerApiTest() {} | 168 virtual ~WindowManagerApiTest() {} |
77 | 169 |
78 protected: | 170 protected: |
| 171 typedef std::pair<view_manager::Id, view_manager::Id> TwoIds; |
| 172 |
| 173 view_manager::Id WaitForEmbed() { |
| 174 view_manager::Id id; |
| 175 base::RunLoop run_loop; |
| 176 root_added_callback_ = base::Bind(&WindowManagerApiTest::OnEmbed, |
| 177 base::Unretained(this), &id, &run_loop); |
| 178 run_loop.Run(); |
| 179 return id; |
| 180 } |
| 181 |
| 182 TwoIds WaitForFocusChange() { |
| 183 TwoIds old_and_new; |
| 184 base::RunLoop run_loop; |
| 185 window_manager_client()->set_focus_changed_callback( |
| 186 base::Bind(&WindowManagerApiTest::OnFocusChanged, |
| 187 base::Unretained(this), &old_and_new, &run_loop)); |
| 188 run_loop.Run(); |
| 189 return old_and_new; |
| 190 } |
| 191 |
| 192 TwoIds WaitForActiveWindowChange() { |
| 193 TwoIds old_and_new; |
| 194 base::RunLoop run_loop; |
| 195 window_manager_client()->set_active_window_changed_callback( |
| 196 base::Bind(&WindowManagerApiTest::OnActiveWindowChanged, |
| 197 base::Unretained(this), &old_and_new, &run_loop)); |
| 198 run_loop.Run(); |
| 199 return old_and_new; |
| 200 } |
| 201 |
| 202 TestWindowManagerClient* window_manager_client() { |
| 203 return window_manager_client_.get(); |
| 204 } |
| 205 |
79 WindowManagerServicePtr window_manager_; | 206 WindowManagerServicePtr window_manager_; |
80 | 207 |
81 private: | 208 private: |
82 // Overridden from testing::Test: | 209 // Overridden from testing::Test: |
83 virtual void SetUp() MOJO_OVERRIDE { | 210 virtual void SetUp() MOJO_OVERRIDE { |
84 test_helper_.Init(); | 211 test_helper_.Init(); |
| 212 test_helper_.SetLoaderForURL( |
| 213 scoped_ptr<ServiceLoader>(new TestServiceLoader( |
| 214 base::Bind(&WindowManagerApiTest::OnRootAdded, |
| 215 base::Unretained(this)))), |
| 216 GURL(kTestServiceURL)); |
85 test_helper_.service_manager()->ConnectToService( | 217 test_helper_.service_manager()->ConnectToService( |
86 GURL("mojo:mojo_view_manager"), | 218 GURL("mojo:mojo_view_manager"), |
87 &view_manager_init_); | 219 &view_manager_init_); |
88 ASSERT_TRUE(EmbedRoot(view_manager_init_.get(), | 220 ASSERT_TRUE(EmbedRoot(view_manager_init_.get(), |
89 "mojo:mojo_core_window_manager")); | 221 "mojo:mojo_core_window_manager")); |
90 ConnectToWindowManager(); | 222 ConnectToWindowManager(); |
91 } | 223 } |
92 virtual void TearDown() MOJO_OVERRIDE {} | 224 virtual void TearDown() MOJO_OVERRIDE {} |
93 | 225 |
94 void ConnectToWindowManager() { | 226 void ConnectToWindowManager() { |
95 test_helper_.service_manager()->ConnectToService( | 227 test_helper_.service_manager()->ConnectToService( |
96 GURL("mojo:mojo_core_window_manager"), | 228 GURL("mojo:mojo_core_window_manager"), |
97 &window_manager_); | 229 &window_manager_); |
98 base::RunLoop connect_loop; | 230 base::RunLoop connect_loop; |
99 window_manager_client_ = new TestWindowManagerClient(&connect_loop); | 231 window_manager_client_.reset(new TestWindowManagerClient(&connect_loop)); |
100 window_manager_.set_client(window_manager_client_); | 232 window_manager_.set_client(window_manager_client()); |
101 connect_loop.Run(); | 233 connect_loop.Run(); |
102 } | 234 } |
103 | 235 |
| 236 void OnRootAdded(view_manager::Node* root) { |
| 237 if (!root_added_callback_.is_null()) |
| 238 root_added_callback_.Run(root); |
| 239 } |
| 240 |
| 241 void OnEmbed(view_manager::Id* root_id, |
| 242 base::RunLoop* loop, |
| 243 view_manager::Node* root) { |
| 244 *root_id = root->id(); |
| 245 loop->Quit(); |
| 246 } |
| 247 |
| 248 void OnFocusChanged(TwoIds* old_and_new, |
| 249 base::RunLoop* run_loop, |
| 250 view_manager::Id old_focused_node_id, |
| 251 view_manager::Id new_focused_node_id) { |
| 252 DCHECK(old_and_new); |
| 253 old_and_new->first = old_focused_node_id; |
| 254 old_and_new->second = new_focused_node_id; |
| 255 run_loop->Quit(); |
| 256 } |
| 257 |
| 258 void OnActiveWindowChanged(TwoIds* old_and_new, |
| 259 base::RunLoop* run_loop, |
| 260 view_manager::Id old_focused_node_id, |
| 261 view_manager::Id new_focused_node_id) { |
| 262 DCHECK(old_and_new); |
| 263 old_and_new->first = old_focused_node_id; |
| 264 old_and_new->second = new_focused_node_id; |
| 265 run_loop->Quit(); |
| 266 } |
| 267 |
104 base::MessageLoop loop_; | 268 base::MessageLoop loop_; |
105 shell::ShellTestHelper test_helper_; | 269 shell::ShellTestHelper test_helper_; |
106 view_manager::ViewManagerInitServicePtr view_manager_init_; | 270 view_manager::ViewManagerInitServicePtr view_manager_init_; |
107 TestWindowManagerClient* window_manager_client_; | 271 scoped_ptr<TestWindowManagerClient> window_manager_client_; |
| 272 TestServiceLoader::RootAddedCallback root_added_callback_; |
108 | 273 |
109 DISALLOW_COPY_AND_ASSIGN(WindowManagerApiTest); | 274 DISALLOW_COPY_AND_ASSIGN(WindowManagerApiTest); |
110 }; | 275 }; |
111 | 276 |
112 TEST_F(WindowManagerApiTest, OpenWindow) { | 277 TEST_F(WindowManagerApiTest, OpenWindow) { |
113 OpenWindow(window_manager_.get()); | 278 OpenWindow(window_manager_.get()); |
| 279 view_manager::Id created_node = |
| 280 OpenWindowWithURL(window_manager_.get(), kTestServiceURL); |
| 281 view_manager::Id embed_node = WaitForEmbed(); |
| 282 EXPECT_EQ(created_node, embed_node); |
| 283 } |
| 284 |
| 285 TEST_F(WindowManagerApiTest, FocusAndActivateWindow) { |
| 286 view_manager::Id first_window = OpenWindow(window_manager_.get()); |
| 287 window_manager_->FocusWindow(first_window, |
| 288 base::Bind(&EmptyResultCallback)); |
| 289 TwoIds ids = WaitForFocusChange(); |
| 290 EXPECT_TRUE(ids.first == 0); |
| 291 EXPECT_EQ(ids.second, first_window); |
| 292 |
| 293 view_manager::Id second_window = OpenWindow(window_manager_.get()); |
| 294 window_manager_->ActivateWindow(second_window, |
| 295 base::Bind(&EmptyResultCallback)); |
| 296 ids = WaitForActiveWindowChange(); |
| 297 EXPECT_EQ(ids.first, first_window); |
| 298 EXPECT_EQ(ids.second, second_window); |
114 } | 299 } |
115 | 300 |
116 } // namespace mojo | 301 } // namespace mojo |
OLD | NEW |