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 "mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.h" | 5 #include "mojo/services/view_manager/public/cpp/lib/view_manager_client_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "mojo/public/cpp/application/application_impl.h" | 10 #include "mojo/public/cpp/application/application_impl.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 // destroyed. | 73 // destroyed. |
74 class RootObserver : public ViewObserver { | 74 class RootObserver : public ViewObserver { |
75 public: | 75 public: |
76 explicit RootObserver(View* root) : root_(root) {} | 76 explicit RootObserver(View* root) : root_(root) {} |
77 ~RootObserver() override {} | 77 ~RootObserver() override {} |
78 | 78 |
79 private: | 79 private: |
80 // Overridden from ViewObserver: | 80 // Overridden from ViewObserver: |
81 void OnViewDestroyed(View* view) override { | 81 void OnViewDestroyed(View* view) override { |
82 DCHECK_EQ(view, root_); | 82 DCHECK_EQ(view, root_); |
83 static_cast<ViewManagerClientImpl*>( | 83 static_cast<ViewManagerClientImpl*>(root_->view_manager()) |
84 ViewPrivate(root_).view_manager())->RootDestroyed(root_); | 84 ->RootDestroyed(root_); |
85 view->RemoveObserver(this); | 85 view->RemoveObserver(this); |
86 delete this; | 86 delete this; |
87 } | 87 } |
88 | 88 |
89 View* root_; | 89 View* root_; |
90 | 90 |
91 DISALLOW_COPY_AND_ASSIGN(RootObserver); | 91 DISALLOW_COPY_AND_ASSIGN(RootObserver); |
92 }; | 92 }; |
93 | 93 |
94 ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate, | 94 ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate, |
95 Shell* shell, | 95 Shell* shell, |
96 ScopedMessagePipeHandle handle, | 96 ScopedMessagePipeHandle handle, |
97 bool delete_on_error) | 97 bool delete_on_error) |
98 : connected_(false), | 98 : connected_(false), |
99 connection_id_(0), | 99 connection_id_(0), |
100 next_id_(1), | 100 next_id_(1), |
101 delegate_(delegate), | 101 delegate_(delegate), |
102 root_(nullptr), | 102 root_(nullptr), |
| 103 capture_view_(nullptr), |
103 focused_view_(nullptr), | 104 focused_view_(nullptr), |
| 105 activated_view_(nullptr), |
104 binding_(this, handle.Pass()), | 106 binding_(this, handle.Pass()), |
105 service_(binding_.client()), | 107 service_(binding_.client()), |
106 delete_on_error_(delete_on_error) { | 108 delete_on_error_(delete_on_error) { |
107 } | 109 } |
108 | 110 |
109 ViewManagerClientImpl::~ViewManagerClientImpl() { | 111 ViewManagerClientImpl::~ViewManagerClientImpl() { |
110 std::vector<View*> non_owned; | 112 std::vector<View*> non_owned; |
111 while (!views_.empty()) { | 113 while (!views_.empty()) { |
112 IdToViewMap::iterator it = views_.begin(); | 114 IdToViewMap::iterator it = views_.begin(); |
113 if (OwnsView(it->second->id())) { | 115 if (OwnsView(it->second->id())) { |
114 it->second->Destroy(); | 116 it->second->Destroy(); |
115 } else { | 117 } else { |
116 non_owned.push_back(it->second); | 118 non_owned.push_back(it->second); |
117 views_.erase(it); | 119 views_.erase(it); |
118 } | 120 } |
119 } | 121 } |
120 // Delete the non-owned views last. In the typical case these are roots. The | 122 // Delete the non-owned views last. In the typical case these are roots. The |
121 // exception is the window manager, which may know aboutother random views | 123 // exception is the window manager, which may know aboutother random views |
122 // that it doesn't own. | 124 // that it doesn't own. |
123 // NOTE: we manually delete as we're a friend. | 125 // NOTE: we manually delete as we're a friend. |
124 for (size_t i = 0; i < non_owned.size(); ++i) | 126 for (size_t i = 0; i < non_owned.size(); ++i) |
125 delete non_owned[i]; | 127 delete non_owned[i]; |
126 | 128 |
127 delegate_->OnViewManagerDisconnected(this); | 129 delegate_->OnViewManagerDisconnected(this); |
128 } | 130 } |
129 | 131 |
130 Id ViewManagerClientImpl::CreateView() { | |
131 DCHECK(connected_); | |
132 const Id view_id = MakeTransportId(connection_id_, ++next_id_); | |
133 service_->CreateView(view_id, ActionCompletedCallbackWithErrorCode()); | |
134 return view_id; | |
135 } | |
136 | |
137 void ViewManagerClientImpl::DestroyView(Id view_id) { | 132 void ViewManagerClientImpl::DestroyView(Id view_id) { |
138 DCHECK(connected_); | 133 DCHECK(connected_); |
139 service_->DeleteView(view_id, ActionCompletedCallback()); | 134 service_->DeleteView(view_id, ActionCompletedCallback()); |
140 } | 135 } |
141 | 136 |
142 void ViewManagerClientImpl::AddChild(Id child_id, Id parent_id) { | 137 void ViewManagerClientImpl::AddChild(Id child_id, Id parent_id) { |
143 DCHECK(connected_); | 138 DCHECK(connected_); |
144 service_->AddView(parent_id, child_id, ActionCompletedCallback()); | 139 service_->AddView(parent_id, child_id, ActionCompletedCallback()); |
145 } | 140 } |
146 | 141 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 | 216 |
222 void ViewManagerClientImpl::RemoveView(Id view_id) { | 217 void ViewManagerClientImpl::RemoveView(Id view_id) { |
223 IdToViewMap::iterator it = views_.find(view_id); | 218 IdToViewMap::iterator it = views_.find(view_id); |
224 if (it != views_.end()) | 219 if (it != views_.end()) |
225 views_.erase(it); | 220 views_.erase(it); |
226 } | 221 } |
227 | 222 |
228 //////////////////////////////////////////////////////////////////////////////// | 223 //////////////////////////////////////////////////////////////////////////////// |
229 // ViewManagerClientImpl, ViewManager implementation: | 224 // ViewManagerClientImpl, ViewManager implementation: |
230 | 225 |
| 226 Id ViewManagerClientImpl::CreateViewOnServer() { |
| 227 DCHECK(connected_); |
| 228 const Id view_id = MakeTransportId(connection_id_, ++next_id_); |
| 229 service_->CreateView(view_id, ActionCompletedCallbackWithErrorCode()); |
| 230 return view_id; |
| 231 } |
| 232 |
231 const std::string& ViewManagerClientImpl::GetEmbedderURL() const { | 233 const std::string& ViewManagerClientImpl::GetEmbedderURL() const { |
232 return creator_url_; | 234 return creator_url_; |
233 } | 235 } |
234 | 236 |
235 View* ViewManagerClientImpl::GetRoot() { | 237 View* ViewManagerClientImpl::GetRoot() { |
236 return root_; | 238 return root_; |
237 } | 239 } |
238 | 240 |
239 View* ViewManagerClientImpl::GetViewById(Id id) { | 241 View* ViewManagerClientImpl::GetViewById(Id id) { |
240 IdToViewMap::const_iterator it = views_.find(id); | 242 IdToViewMap::const_iterator it = views_.find(id); |
241 return it != views_.end() ? it->second : NULL; | 243 return it != views_.end() ? it->second : NULL; |
242 } | 244 } |
243 | 245 |
244 View* ViewManagerClientImpl::GetFocusedView() { | 246 View* ViewManagerClientImpl::GetFocusedView() { |
245 return focused_view_; | 247 return focused_view_; |
246 } | 248 } |
247 | 249 |
| 250 View* ViewManagerClientImpl::CreateView() { |
| 251 View* view = new View(this, CreateViewOnServer()); |
| 252 AddView(view); |
| 253 return view; |
| 254 } |
| 255 |
248 //////////////////////////////////////////////////////////////////////////////// | 256 //////////////////////////////////////////////////////////////////////////////// |
249 // ViewManagerClientImpl, ViewManagerClient implementation: | 257 // ViewManagerClientImpl, ViewManagerClient implementation: |
250 | 258 |
251 void ViewManagerClientImpl::OnEmbed( | 259 void ViewManagerClientImpl::OnEmbed( |
252 ConnectionSpecificId connection_id, | 260 ConnectionSpecificId connection_id, |
253 const String& creator_url, | 261 const String& creator_url, |
254 ViewDataPtr root_data, | 262 ViewDataPtr root_data, |
255 InterfaceRequest<ServiceProvider> parent_services, | 263 InterfaceRequest<ServiceProvider> parent_services, |
256 ScopedMessagePipeHandle window_manager_pipe) { | 264 ScopedMessagePipeHandle window_manager_pipe) { |
257 DCHECK(!connected_); | 265 DCHECK(!connected_); |
(...skipping 14 matching lines...) Expand all Loading... |
272 BindToRequest(exported_services, &parent_services); | 280 BindToRequest(exported_services, &parent_services); |
273 remote.reset(exported_services->CreateRemoteServiceProvider()); | 281 remote.reset(exported_services->CreateRemoteServiceProvider()); |
274 } | 282 } |
275 window_manager_.Bind(window_manager_pipe.Pass()); | 283 window_manager_.Bind(window_manager_pipe.Pass()); |
276 window_manager_.set_client(this); | 284 window_manager_.set_client(this); |
277 // base::Unretained() is safe here as |window_manager_| is bound to our | 285 // base::Unretained() is safe here as |window_manager_| is bound to our |
278 // lifetime. | 286 // lifetime. |
279 window_manager_->GetFocusedAndActiveViews( | 287 window_manager_->GetFocusedAndActiveViews( |
280 base::Bind(&ViewManagerClientImpl::OnGotFocusedAndActiveViews, | 288 base::Bind(&ViewManagerClientImpl::OnGotFocusedAndActiveViews, |
281 base::Unretained(this))); | 289 base::Unretained(this))); |
282 delegate_->OnEmbed(this, root_, exported_services, remote.Pass()); | 290 delegate_->OnEmbed(root_, exported_services, remote.Pass()); |
283 } | 291 } |
284 | 292 |
285 void ViewManagerClientImpl::OnEmbeddedAppDisconnected(Id view_id) { | 293 void ViewManagerClientImpl::OnEmbeddedAppDisconnected(Id view_id) { |
286 View* view = GetViewById(view_id); | 294 View* view = GetViewById(view_id); |
287 if (view) { | 295 if (view) { |
288 FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(view).observers(), | 296 FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(view).observers(), |
289 OnViewEmbeddedAppDisconnected(view)); | 297 OnViewEmbeddedAppDisconnected(view)); |
290 } | 298 } |
291 } | 299 } |
292 | 300 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 *ViewPrivate(view).observers(), | 381 *ViewPrivate(view).observers(), |
374 OnViewInputEvent(view, event)); | 382 OnViewInputEvent(view, event)); |
375 } | 383 } |
376 ack_callback.Run(); | 384 ack_callback.Run(); |
377 } | 385 } |
378 | 386 |
379 //////////////////////////////////////////////////////////////////////////////// | 387 //////////////////////////////////////////////////////////////////////////////// |
380 // ViewManagerClientImpl, WindowManagerClient implementation: | 388 // ViewManagerClientImpl, WindowManagerClient implementation: |
381 | 389 |
382 void ViewManagerClientImpl::OnCaptureChanged(Id old_capture_view_id, | 390 void ViewManagerClientImpl::OnCaptureChanged(Id old_capture_view_id, |
383 Id new_capture_view_id) {} | 391 Id new_capture_view_id) { |
| 392 View* gained_capture = GetViewById(new_capture_view_id); |
| 393 View* lost_capture = GetViewById(old_capture_view_id); |
| 394 if (lost_capture) { |
| 395 FOR_EACH_OBSERVER(ViewObserver, |
| 396 *ViewPrivate(lost_capture).observers(), |
| 397 OnViewFocusChanged(gained_capture, lost_capture)); |
| 398 } |
| 399 capture_view_ = gained_capture; |
| 400 if (gained_capture) { |
| 401 FOR_EACH_OBSERVER(ViewObserver, |
| 402 *ViewPrivate(gained_capture).observers(), |
| 403 OnViewFocusChanged(gained_capture, lost_capture)); |
| 404 } |
| 405 } |
384 | 406 |
385 void ViewManagerClientImpl::OnFocusChanged(Id old_focused_view_id, | 407 void ViewManagerClientImpl::OnFocusChanged(Id old_focused_view_id, |
386 Id new_focused_view_id) { | 408 Id new_focused_view_id) { |
387 View* focused = GetViewById(new_focused_view_id); | 409 View* focused = GetViewById(new_focused_view_id); |
388 View* blurred = GetViewById(old_focused_view_id); | 410 View* blurred = GetViewById(old_focused_view_id); |
389 if (blurred) { | 411 if (blurred) { |
390 FOR_EACH_OBSERVER(ViewObserver, | 412 FOR_EACH_OBSERVER(ViewObserver, |
391 *ViewPrivate(blurred).observers(), | 413 *ViewPrivate(blurred).observers(), |
392 OnViewFocusChanged(focused, blurred)); | 414 OnViewFocusChanged(focused, blurred)); |
393 } | 415 } |
394 focused_view_ = focused; | 416 focused_view_ = focused; |
395 if (focused) { | 417 if (focused) { |
396 FOR_EACH_OBSERVER(ViewObserver, | 418 FOR_EACH_OBSERVER(ViewObserver, |
397 *ViewPrivate(focused).observers(), | 419 *ViewPrivate(focused).observers(), |
398 OnViewFocusChanged(focused, blurred)); | 420 OnViewFocusChanged(focused, blurred)); |
399 } | 421 } |
400 } | 422 } |
401 | 423 |
402 void ViewManagerClientImpl::OnActiveWindowChanged(Id old_focused_window, | 424 void ViewManagerClientImpl::OnActiveWindowChanged(Id old_active_view_id, |
403 Id new_focused_window) {} | 425 Id new_active_view_id) { |
| 426 View* activated = GetViewById(new_active_view_id); |
| 427 View* deactivated = GetViewById(old_active_view_id); |
| 428 if (deactivated) { |
| 429 FOR_EACH_OBSERVER(ViewObserver, |
| 430 *ViewPrivate(deactivated).observers(), |
| 431 OnViewActivationChanged(activated, deactivated)); |
| 432 } |
| 433 activated_view_ = activated; |
| 434 if (activated) { |
| 435 FOR_EACH_OBSERVER(ViewObserver, |
| 436 *ViewPrivate(activated).observers(), |
| 437 OnViewActivationChanged(activated, deactivated)); |
| 438 } |
| 439 } |
404 | 440 |
405 //////////////////////////////////////////////////////////////////////////////// | 441 //////////////////////////////////////////////////////////////////////////////// |
406 // OnConnectionError, private: | 442 // OnConnectionError, private: |
407 void ViewManagerClientImpl::OnConnectionError() { | 443 void ViewManagerClientImpl::OnConnectionError() { |
408 if (delete_on_error_) | 444 if (delete_on_error_) |
409 delete this; | 445 delete this; |
410 } | 446 } |
411 | 447 |
412 //////////////////////////////////////////////////////////////////////////////// | 448 //////////////////////////////////////////////////////////////////////////////// |
413 // ViewManagerClientImpl, private: | 449 // ViewManagerClientImpl, private: |
(...skipping 20 matching lines...) Expand all Loading... |
434 base::Callback<void(ErrorCode)> | 470 base::Callback<void(ErrorCode)> |
435 ViewManagerClientImpl::ActionCompletedCallbackWithErrorCode() { | 471 ViewManagerClientImpl::ActionCompletedCallbackWithErrorCode() { |
436 return base::Bind(&ViewManagerClientImpl::OnActionCompletedWithErrorCode, | 472 return base::Bind(&ViewManagerClientImpl::OnActionCompletedWithErrorCode, |
437 base::Unretained(this)); | 473 base::Unretained(this)); |
438 } | 474 } |
439 | 475 |
440 void ViewManagerClientImpl::OnGotFocusedAndActiveViews(uint32 focused_view_id, | 476 void ViewManagerClientImpl::OnGotFocusedAndActiveViews(uint32 focused_view_id, |
441 uint32 active_view_id) { | 477 uint32 active_view_id) { |
442 if (GetViewById(focused_view_id) != focused_view_) | 478 if (GetViewById(focused_view_id) != focused_view_) |
443 OnFocusChanged(focused_view_ ? focused_view_->id() : 0, focused_view_id); | 479 OnFocusChanged(focused_view_ ? focused_view_->id() : 0, focused_view_id); |
| 480 if (GetViewById(active_view_id) != activated_view_) { |
| 481 OnActiveWindowChanged(activated_view_ ? activated_view_->id() : 0, |
| 482 active_view_id); |
| 483 } |
444 } | 484 } |
445 | 485 |
446 } // namespace mojo | 486 } // namespace mojo |
OLD | NEW |