Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Side by Side Diff: mojo/services/window_manager/window_manager_api_unittest.cc

Issue 405523002: Add ability APIs for opening a window with a url embedded, focusing and activating a window. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/services/window_manager/DEPS ('k') | mojo/services/window_manager/window_manager_app.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « mojo/services/window_manager/DEPS ('k') | mojo/services/window_manager/window_manager_app.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698