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