| 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/public/cpp/view_manager/lib/view_manager_client_impl.h" | 5 #include "mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" |
| 8 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 9 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| 10 #include "mojo/public/cpp/application/application_connection.h" | 11 #include "mojo/public/cpp/application/application_connection.h" |
| 11 #include "mojo/public/cpp/application/connect.h" | 12 #include "mojo/public/cpp/application/connect.h" |
| 12 #include "mojo/public/cpp/application/service_provider_impl.h" | 13 #include "mojo/public/cpp/application/service_provider_impl.h" |
| 13 #include "mojo/public/interfaces/application/service_provider.mojom.h" | 14 #include "mojo/public/interfaces/application/service_provider.mojom.h" |
| 14 #include "mojo/services/public/cpp/view_manager/lib/view_private.h" | 15 #include "mojo/services/public/cpp/view_manager/lib/view_private.h" |
| 15 #include "mojo/services/public/cpp/view_manager/util.h" | 16 #include "mojo/services/public/cpp/view_manager/util.h" |
| 16 #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" | 17 #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" |
| 17 #include "mojo/services/public/cpp/view_manager/view_observer.h" | 18 #include "mojo/services/public/cpp/view_manager/view_observer.h" |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 | 110 |
| 110 result = MapBuffer( | 111 result = MapBuffer( |
| 111 handle->get(), 0, size, memory, MOJO_MAP_BUFFER_FLAG_NONE); | 112 handle->get(), 0, size, memory, MOJO_MAP_BUFFER_FLAG_NONE); |
| 112 if (result != MOJO_RESULT_OK) | 113 if (result != MOJO_RESULT_OK) |
| 113 return false; | 114 return false; |
| 114 DCHECK(*memory); | 115 DCHECK(*memory); |
| 115 | 116 |
| 116 return true; | 117 return true; |
| 117 } | 118 } |
| 118 | 119 |
| 119 ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate) | 120 ViewManagerClientImpl::ViewManagerClientImpl( |
| 121 ViewManagerDelegate* delegate, |
| 122 ApplicationConnection* app_connection) |
| 120 : connected_(false), | 123 : connected_(false), |
| 121 connection_id_(0), | 124 connection_id_(0), |
| 122 next_id_(1), | 125 next_id_(1), |
| 123 delegate_(delegate), | 126 delegate_(delegate), |
| 124 window_manager_delegate_(NULL) { | 127 window_manager_delegate_(NULL) { |
| 128 // TODO(beng): Come up with a better way of establishing a configuration for |
| 129 // what the active window manager is. |
| 130 std::string window_manager_url = "mojo:mojo_window_manager"; |
| 131 if (base::CommandLine::ForCurrentProcess()->HasSwitch("window-manager")) { |
| 132 window_manager_url = |
| 133 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 134 "window-manager"); |
| 135 } |
| 136 app_connection->ConnectToService(window_manager_url, &window_manager_); |
| 137 window_manager_.set_client(this); |
| 125 } | 138 } |
| 126 | 139 |
| 127 ViewManagerClientImpl::~ViewManagerClientImpl() { | 140 ViewManagerClientImpl::~ViewManagerClientImpl() { |
| 128 std::vector<View*> non_owned; | 141 std::vector<View*> non_owned; |
| 129 while (!views_.empty()) { | 142 while (!views_.empty()) { |
| 130 IdToViewMap::iterator it = views_.begin(); | 143 IdToViewMap::iterator it = views_.begin(); |
| 131 if (OwnsView(it->second->id())) { | 144 if (OwnsView(it->second->id())) { |
| 132 it->second->Destroy(); | 145 it->second->Destroy(); |
| 133 } else { | 146 } else { |
| 134 non_owned.push_back(it->second); | 147 non_owned.push_back(it->second); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 return; | 214 return; |
| 202 | 215 |
| 203 memcpy(memory, &data[0], data.size()); | 216 memcpy(memory, &data[0], data.size()); |
| 204 | 217 |
| 205 service_->SetViewContents(view_id, duped.Pass(), | 218 service_->SetViewContents(view_id, duped.Pass(), |
| 206 static_cast<uint32_t>(data.size()), | 219 static_cast<uint32_t>(data.size()), |
| 207 ActionCompletedCallback()); | 220 ActionCompletedCallback()); |
| 208 } | 221 } |
| 209 | 222 |
| 210 void ViewManagerClientImpl::SetFocus(Id view_id) { | 223 void ViewManagerClientImpl::SetFocus(Id view_id) { |
| 211 DCHECK(connected_); | 224 window_manager_->FocusWindow(view_id, ActionCompletedCallback()); |
| 212 service_->SetFocus(view_id, ActionCompletedCallback()); | |
| 213 } | 225 } |
| 214 | 226 |
| 215 void ViewManagerClientImpl::SetVisible(Id view_id, bool visible) { | 227 void ViewManagerClientImpl::SetVisible(Id view_id, bool visible) { |
| 216 DCHECK(connected_); | 228 DCHECK(connected_); |
| 217 service_->SetViewVisibility(view_id, visible, ActionCompletedCallback()); | 229 service_->SetViewVisibility(view_id, visible, ActionCompletedCallback()); |
| 218 } | 230 } |
| 219 | 231 |
| 220 void ViewManagerClientImpl::Embed(const String& url, Id view_id) { | 232 void ViewManagerClientImpl::Embed(const String& url, Id view_id) { |
| 221 ServiceProviderPtr sp; | 233 ServiceProviderPtr sp; |
| 222 BindToProxy(new ServiceProviderImpl, &sp); | 234 BindToProxy(new ServiceProviderImpl, &sp); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 242 if (it != views_.end()) | 254 if (it != views_.end()) |
| 243 views_.erase(it); | 255 views_.erase(it); |
| 244 } | 256 } |
| 245 | 257 |
| 246 //////////////////////////////////////////////////////////////////////////////// | 258 //////////////////////////////////////////////////////////////////////////////// |
| 247 // ViewManagerClientImpl, ViewManager implementation: | 259 // ViewManagerClientImpl, ViewManager implementation: |
| 248 | 260 |
| 249 void ViewManagerClientImpl::SetWindowManagerDelegate( | 261 void ViewManagerClientImpl::SetWindowManagerDelegate( |
| 250 WindowManagerDelegate* window_manager_delegate) { | 262 WindowManagerDelegate* window_manager_delegate) { |
| 251 CHECK(NULL != GetViewById(1)); | 263 CHECK(NULL != GetViewById(1)); |
| 264 CHECK(!window_manager_delegate_); |
| 252 window_manager_delegate_ = window_manager_delegate; | 265 window_manager_delegate_ = window_manager_delegate; |
| 253 } | 266 } |
| 254 | 267 |
| 255 void ViewManagerClientImpl::DispatchEvent(View* target, EventPtr event) { | 268 void ViewManagerClientImpl::DispatchEvent(View* target, EventPtr event) { |
| 256 CHECK(window_manager_delegate_); | 269 CHECK(window_manager_delegate_); |
| 257 service_->DispatchOnViewInputEvent(target->id(), event.Pass()); | 270 service_->DispatchOnViewInputEvent(target->id(), event.Pass()); |
| 258 } | 271 } |
| 259 | 272 |
| 260 const std::string& ViewManagerClientImpl::GetEmbedderURL() const { | 273 const std::string& ViewManagerClientImpl::GetEmbedderURL() const { |
| 261 return creator_url_; | 274 return creator_url_; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 const Callback<void()>& ack_callback) { | 370 const Callback<void()>& ack_callback) { |
| 358 View* view = GetViewById(view_id); | 371 View* view = GetViewById(view_id); |
| 359 if (view) { | 372 if (view) { |
| 360 FOR_EACH_OBSERVER(ViewObserver, | 373 FOR_EACH_OBSERVER(ViewObserver, |
| 361 *ViewPrivate(view).observers(), | 374 *ViewPrivate(view).observers(), |
| 362 OnViewInputEvent(view, event)); | 375 OnViewInputEvent(view, event)); |
| 363 } | 376 } |
| 364 ack_callback.Run(); | 377 ack_callback.Run(); |
| 365 } | 378 } |
| 366 | 379 |
| 367 void ViewManagerClientImpl::OnFocusChanged(Id gained_focus_id, | 380 void ViewManagerClientImpl::Embed( |
| 368 Id lost_focus_id) { | 381 const String& url, |
| 369 View* focused = GetViewById(gained_focus_id); | 382 InterfaceRequest<ServiceProvider> service_provider) { |
| 370 View* blurred = GetViewById(lost_focus_id); | 383 window_manager_delegate_->Embed(url, service_provider.Pass()); |
| 384 } |
| 385 |
| 386 void ViewManagerClientImpl::DispatchOnViewInputEvent(EventPtr event) { |
| 387 if (window_manager_delegate_) |
| 388 window_manager_delegate_->DispatchEvent(event.Pass()); |
| 389 } |
| 390 |
| 391 //////////////////////////////////////////////////////////////////////////////// |
| 392 // ViewManagerClientImpl, WindowManagerClient implementation: |
| 393 |
| 394 void ViewManagerClientImpl::OnWindowManagerReady() {} |
| 395 |
| 396 void ViewManagerClientImpl::OnCaptureChanged(Id old_capture_view_id, |
| 397 Id new_capture_view_id) {} |
| 398 |
| 399 void ViewManagerClientImpl::OnFocusChanged(Id old_focused_view_id, |
| 400 Id new_focused_view_id) { |
| 401 View* focused = GetViewById(new_focused_view_id); |
| 402 View* blurred = GetViewById(old_focused_view_id); |
| 371 if (blurred) { | 403 if (blurred) { |
| 372 FOR_EACH_OBSERVER(ViewObserver, | 404 FOR_EACH_OBSERVER(ViewObserver, |
| 373 *ViewPrivate(blurred).observers(), | 405 *ViewPrivate(blurred).observers(), |
| 374 OnViewFocusChanged(focused, blurred)); | 406 OnViewFocusChanged(focused, blurred)); |
| 375 } | 407 } |
| 376 if (focused) { | 408 if (focused) { |
| 377 FOR_EACH_OBSERVER(ViewObserver, | 409 FOR_EACH_OBSERVER(ViewObserver, |
| 378 *ViewPrivate(focused).observers(), | 410 *ViewPrivate(focused).observers(), |
| 379 OnViewFocusChanged(focused, blurred)); | 411 OnViewFocusChanged(focused, blurred)); |
| 380 } | 412 } |
| 381 } | 413 } |
| 382 | 414 |
| 383 void ViewManagerClientImpl::Embed( | 415 void ViewManagerClientImpl::OnActiveWindowChanged(Id old_focused_window, |
| 384 const String& url, | 416 Id new_focused_window) {} |
| 385 InterfaceRequest<ServiceProvider> service_provider) { | |
| 386 window_manager_delegate_->Embed(url, service_provider.Pass()); | |
| 387 } | |
| 388 | |
| 389 void ViewManagerClientImpl::DispatchOnViewInputEvent(Id view_id, | |
| 390 EventPtr event) { | |
| 391 if (window_manager_delegate_) | |
| 392 window_manager_delegate_->DispatchEvent(GetViewById(view_id), event.Pass()); | |
| 393 } | |
| 394 | 417 |
| 395 //////////////////////////////////////////////////////////////////////////////// | 418 //////////////////////////////////////////////////////////////////////////////// |
| 396 // ViewManagerClientImpl, private: | 419 // ViewManagerClientImpl, private: |
| 397 | 420 |
| 398 void ViewManagerClientImpl::RemoveRoot(View* root) { | 421 void ViewManagerClientImpl::RemoveRoot(View* root) { |
| 399 std::vector<View*>::iterator it = | 422 std::vector<View*>::iterator it = |
| 400 std::find(roots_.begin(), roots_.end(), root); | 423 std::find(roots_.begin(), roots_.end(), root); |
| 401 if (it != roots_.end()) | 424 if (it != roots_.end()) |
| 402 roots_.erase(it); | 425 roots_.erase(it); |
| 403 } | 426 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 416 base::Unretained(this)); | 439 base::Unretained(this)); |
| 417 } | 440 } |
| 418 | 441 |
| 419 base::Callback<void(ErrorCode)> | 442 base::Callback<void(ErrorCode)> |
| 420 ViewManagerClientImpl::ActionCompletedCallbackWithErrorCode() { | 443 ViewManagerClientImpl::ActionCompletedCallbackWithErrorCode() { |
| 421 return base::Bind(&ViewManagerClientImpl::OnActionCompletedWithErrorCode, | 444 return base::Bind(&ViewManagerClientImpl::OnActionCompletedWithErrorCode, |
| 422 base::Unretained(this)); | 445 base::Unretained(this)); |
| 423 } | 446 } |
| 424 | 447 |
| 425 } // namespace mojo | 448 } // namespace mojo |
| OLD | NEW |