Index: mojo/services/view_manager/cpp/lib/view_manager_client_impl.cc |
diff --git a/mojo/services/view_manager/cpp/lib/view_manager_client_impl.cc b/mojo/services/view_manager/cpp/lib/view_manager_client_impl.cc |
deleted file mode 100644 |
index 6852f660dcd1bb6cbff39c935f7905061b4053d1..0000000000000000000000000000000000000000 |
--- a/mojo/services/view_manager/cpp/lib/view_manager_client_impl.cc |
+++ /dev/null |
@@ -1,494 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "view_manager/cpp/lib/view_manager_client_impl.h" |
- |
-#include "mojo/public/cpp/application/application_impl.h" |
-#include "mojo/public/cpp/application/connect.h" |
-#include "mojo/public/cpp/application/service_provider_impl.h" |
-#include "mojo/public/interfaces/application/service_provider.mojom.h" |
-#include "mojo/public/interfaces/application/shell.mojom.h" |
-#include "view_manager/cpp/lib/view_private.h" |
-#include "view_manager/cpp/util.h" |
-#include "view_manager/cpp/view_manager_delegate.h" |
-#include "view_manager/cpp/view_observer.h" |
- |
-namespace mojo { |
- |
-Id MakeTransportId(ConnectionSpecificId connection_id, |
- ConnectionSpecificId local_id) { |
- return (connection_id << 16) | local_id; |
-} |
- |
-// Helper called to construct a local view object from transport data. |
-View* AddViewToViewManager(ViewManagerClientImpl* client, |
- View* parent, |
- const ViewDataPtr& view_data) { |
- // We don't use the ctor that takes a ViewManager here, since it will call |
- // back to the service and attempt to create a new view. |
- View* view = ViewPrivate::LocalCreate(); |
- ViewPrivate private_view(view); |
- private_view.set_view_manager(client); |
- private_view.set_id(view_data->view_id); |
- private_view.set_visible(view_data->visible); |
- private_view.set_drawn(view_data->drawn); |
- private_view.LocalSetViewportMetrics(ViewportMetrics(), |
- *view_data->viewport_metrics); |
- private_view.set_properties( |
- view_data->properties.To<std::map<std::string, std::vector<uint8_t>>>()); |
- client->AddView(view); |
- private_view.LocalSetBounds(Rect(), *view_data->bounds); |
- if (parent) |
- ViewPrivate(parent).LocalAddChild(view); |
- return view; |
-} |
- |
-View* BuildViewTree(ViewManagerClientImpl* client, |
- const Array<ViewDataPtr>& views, |
- View* initial_parent) { |
- std::vector<View*> parents; |
- View* root = NULL; |
- View* last_view = NULL; |
- if (initial_parent) |
- parents.push_back(initial_parent); |
- for (size_t i = 0; i < views.size(); ++i) { |
- if (last_view && views[i]->parent_id == last_view->id()) { |
- parents.push_back(last_view); |
- } else if (!parents.empty()) { |
- while (parents.back()->id() != views[i]->parent_id) |
- parents.pop_back(); |
- } |
- View* view = AddViewToViewManager( |
- client, !parents.empty() ? parents.back() : NULL, views[i]); |
- if (!last_view) |
- root = view; |
- last_view = view; |
- } |
- return root; |
-} |
- |
-// Responsible for removing a root from the ViewManager when that view is |
-// destroyed. |
-class RootObserver : public ViewObserver { |
- public: |
- explicit RootObserver(View* root) : root_(root) {} |
- ~RootObserver() override {} |
- |
- private: |
- // Overridden from ViewObserver: |
- void OnViewDestroyed(View* view) override { |
- DCHECK_EQ(view, root_); |
- static_cast<ViewManagerClientImpl*>(root_->view_manager()) |
- ->RootDestroyed(root_); |
- view->RemoveObserver(this); |
- delete this; |
- } |
- |
- View* root_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(RootObserver); |
-}; |
- |
-ViewManagerClientImpl::ViewManagerClientImpl( |
- ViewManagerDelegate* delegate, |
- Shell* shell, |
- InterfaceRequest<ViewManagerClient> request, |
- bool delete_on_error) |
- : connection_id_(0), |
- next_id_(1), |
- delegate_(delegate), |
- root_(nullptr), |
- capture_view_(nullptr), |
- focused_view_(nullptr), |
- activated_view_(nullptr), |
- wm_observer_binding_(this), |
- binding_(this, request.Pass()) { |
- if (delete_on_error) |
- binding_.set_connection_error_handler([this]() { delete this; }); |
-} |
- |
-ViewManagerClientImpl::~ViewManagerClientImpl() { |
- std::vector<View*> non_owned; |
- while (!views_.empty()) { |
- IdToViewMap::iterator it = views_.begin(); |
- if (OwnsView(it->second->id())) { |
- it->second->Destroy(); |
- } else { |
- non_owned.push_back(it->second); |
- views_.erase(it); |
- } |
- } |
- // Delete the non-owned views last. In the typical case these are roots. The |
- // exception is the window manager, which may know aboutother random views |
- // that it doesn't own. |
- // NOTE: we manually delete as we're a friend. |
- for (size_t i = 0; i < non_owned.size(); ++i) |
- delete non_owned[i]; |
- |
- delegate_->OnViewManagerDisconnected(this); |
-} |
- |
-void ViewManagerClientImpl::DestroyView(Id view_id) { |
- DCHECK(service_); |
- service_->DeleteView(view_id, ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::AddChild(Id child_id, Id parent_id) { |
- DCHECK(service_); |
- service_->AddView(parent_id, child_id, ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::RemoveChild(Id child_id, Id parent_id) { |
- DCHECK(service_); |
- service_->RemoveViewFromParent(child_id, ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::Reorder(Id view_id, |
- Id relative_view_id, |
- OrderDirection direction) { |
- DCHECK(service_); |
- service_->ReorderView(view_id, relative_view_id, direction, |
- ActionCompletedCallback()); |
-} |
- |
-bool ViewManagerClientImpl::OwnsView(Id id) const { |
- return HiWord(id) == connection_id_; |
-} |
- |
-void ViewManagerClientImpl::SetBounds(Id view_id, const Rect& bounds) { |
- DCHECK(service_); |
- service_->SetViewBounds(view_id, bounds.Clone(), ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::SetSurfaceId(Id view_id, SurfaceIdPtr surface_id) { |
- DCHECK(service_); |
- if (surface_id.is_null()) |
- return; |
- service_->SetViewSurfaceId(view_id, surface_id.Pass(), |
- ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::SetFocus(Id view_id) { |
- // In order for us to get here we had to have exposed a view, which implies we |
- // got a connection. |
- DCHECK(service_); |
- service_->PerformAction(view_id, "focus", ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::SetVisible(Id view_id, bool visible) { |
- DCHECK(service_); |
- service_->SetViewVisibility(view_id, visible, ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::SetProperty(Id view_id, |
- const std::string& name, |
- const std::vector<uint8_t>& data) { |
- DCHECK(service_); |
- service_->SetViewProperty(view_id, String(name), Array<uint8_t>::From(data), |
- ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::Embed(const String& url, Id view_id) { |
- Embed(url, view_id, nullptr, nullptr); |
-} |
- |
-void ViewManagerClientImpl::Embed(const String& url, |
- Id view_id, |
- InterfaceRequest<ServiceProvider> services, |
- ServiceProviderPtr exposed_services) { |
- DCHECK(service_); |
- service_->EmbedUrl(url, view_id, services.Pass(), exposed_services.Pass(), |
- ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::Embed(Id view_id, ViewManagerClientPtr client) { |
- DCHECK(service_); |
- service_->Embed(view_id, client.Pass(), ActionCompletedCallback()); |
-} |
- |
-void ViewManagerClientImpl::AddView(View* view) { |
- DCHECK(views_.find(view->id()) == views_.end()); |
- views_[view->id()] = view; |
-} |
- |
-void ViewManagerClientImpl::RemoveView(Id view_id) { |
- if (focused_view_ && focused_view_->id() == view_id) |
- OnFocusChanged(0); |
- if (capture_view_ && capture_view_->id() == view_id) |
- OnCaptureChanged(0); |
- if (activated_view_ && activated_view_->id() == view_id) |
- OnActiveWindowChanged(0); |
- |
- IdToViewMap::iterator it = views_.find(view_id); |
- if (it != views_.end()) |
- views_.erase(it); |
-} |
- |
-void ViewManagerClientImpl::SetViewManagerService( |
- ViewManagerServicePtr service) { |
- DCHECK(!service_); |
- DCHECK(service); |
- service_ = service.Pass(); |
-} |
-//////////////////////////////////////////////////////////////////////////////// |
-// ViewManagerClientImpl, ViewManager implementation: |
- |
-Id ViewManagerClientImpl::CreateViewOnServer() { |
- DCHECK(service_); |
- const Id view_id = MakeTransportId(connection_id_, ++next_id_); |
- service_->CreateView(view_id, [this](ErrorCode code) { |
- OnActionCompleted(code == ErrorCode::NONE); |
- }); |
- return view_id; |
-} |
- |
-const std::string& ViewManagerClientImpl::GetEmbedderURL() const { |
- return creator_url_; |
-} |
- |
-View* ViewManagerClientImpl::GetRoot() { |
- return root_; |
-} |
- |
-View* ViewManagerClientImpl::GetViewById(Id id) { |
- IdToViewMap::const_iterator it = views_.find(id); |
- return it != views_.end() ? it->second : NULL; |
-} |
- |
-View* ViewManagerClientImpl::GetFocusedView() { |
- return focused_view_; |
-} |
- |
-View* ViewManagerClientImpl::CreateView() { |
- View* view = new View(this, CreateViewOnServer()); |
- AddView(view); |
- return view; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ViewManagerClientImpl, ViewManagerClient implementation: |
- |
-void ViewManagerClientImpl::OnEmbed( |
- ConnectionSpecificId connection_id, |
- const String& creator_url, |
- ViewDataPtr root_data, |
- ViewManagerServicePtr view_manager_service, |
- InterfaceRequest<ServiceProvider> services, |
- ServiceProviderPtr exposed_services, |
- ScopedMessagePipeHandle window_manager_pipe) { |
- if (view_manager_service) { |
- DCHECK(!service_); |
- service_ = view_manager_service.Pass(); |
- } |
- connection_id_ = connection_id; |
- creator_url_ = String::From(creator_url); |
- |
- DCHECK(!root_); |
- root_ = AddViewToViewManager(this, nullptr, root_data); |
- root_->AddObserver(new RootObserver(root_)); |
- |
- window_manager_.Bind( |
- InterfacePtrInfo<WindowManager>(window_manager_pipe.Pass(), 0u)); |
- WindowManagerObserverPtr observer; |
- wm_observer_binding_.Bind(GetProxy(&observer)); |
- // binding to |this| is safe here as |window_manager_| is bound to our |
- // lifetime. |
- window_manager_->GetFocusedAndActiveViews( |
- observer.Pass(), |
- [this](uint32_t capture_view_id, uint32_t focused_view_id, |
- uint32_t active_view_id) { |
- if (GetViewById(capture_view_id) != capture_view_) |
- OnCaptureChanged(capture_view_id); |
- if (GetViewById(focused_view_id) != focused_view_) |
- OnFocusChanged(focused_view_id); |
- if (GetViewById(active_view_id) != activated_view_) |
- OnActiveWindowChanged(active_view_id); |
- }); |
- |
- delegate_->OnEmbed(root_, services.Pass(), exposed_services.Pass()); |
-} |
- |
-void ViewManagerClientImpl::OnEmbeddedAppDisconnected(Id view_id) { |
- View* view = GetViewById(view_id); |
- if (view) { |
- FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(view).observers(), |
- OnViewEmbeddedAppDisconnected(view)); |
- } |
-} |
- |
-void ViewManagerClientImpl::OnViewBoundsChanged(Id view_id, |
- RectPtr old_bounds, |
- RectPtr new_bounds) { |
- View* view = GetViewById(view_id); |
- ViewPrivate(view).LocalSetBounds(*old_bounds, *new_bounds); |
-} |
- |
-namespace { |
- |
-void SetViewportMetricsOnDecendants(View* root, |
- const ViewportMetrics& old_metrics, |
- const ViewportMetrics& new_metrics) { |
- ViewPrivate(root).LocalSetViewportMetrics(old_metrics, new_metrics); |
- const View::Children& children = root->children(); |
- for (size_t i = 0; i < children.size(); ++i) |
- SetViewportMetricsOnDecendants(children[i], old_metrics, new_metrics); |
-} |
-} |
- |
-void ViewManagerClientImpl::OnViewViewportMetricsChanged( |
- ViewportMetricsPtr old_metrics, |
- ViewportMetricsPtr new_metrics) { |
- View* view = GetRoot(); |
- if (view) |
- SetViewportMetricsOnDecendants(view, *old_metrics, *new_metrics); |
-} |
- |
-void ViewManagerClientImpl::OnViewHierarchyChanged( |
- Id view_id, |
- Id new_parent_id, |
- Id old_parent_id, |
- mojo::Array<ViewDataPtr> views) { |
- View* initial_parent = views.size() ? GetViewById(views[0]->parent_id) : NULL; |
- |
- BuildViewTree(this, views, initial_parent); |
- |
- View* new_parent = GetViewById(new_parent_id); |
- View* old_parent = GetViewById(old_parent_id); |
- View* view = GetViewById(view_id); |
- if (new_parent) |
- ViewPrivate(new_parent).LocalAddChild(view); |
- else |
- ViewPrivate(old_parent).LocalRemoveChild(view); |
-} |
- |
-void ViewManagerClientImpl::OnViewReordered(Id view_id, |
- Id relative_view_id, |
- OrderDirection direction) { |
- View* view = GetViewById(view_id); |
- View* relative_view = GetViewById(relative_view_id); |
- if (view && relative_view) |
- ViewPrivate(view).LocalReorder(relative_view, direction); |
-} |
- |
-void ViewManagerClientImpl::OnViewDeleted(Id view_id) { |
- View* view = GetViewById(view_id); |
- if (view) |
- ViewPrivate(view).LocalDestroy(); |
-} |
- |
-void ViewManagerClientImpl::OnViewVisibilityChanged(Id view_id, bool visible) { |
- // TODO(sky): there is a race condition here. If this client and another |
- // client change the visibility at the same time the wrong value may be set. |
- // Deal with this some how. |
- View* view = GetViewById(view_id); |
- if (view) |
- ViewPrivate(view).LocalSetVisible(visible); |
-} |
- |
-void ViewManagerClientImpl::OnViewDrawnStateChanged(Id view_id, bool drawn) { |
- View* view = GetViewById(view_id); |
- if (view) |
- ViewPrivate(view).LocalSetDrawn(drawn); |
-} |
- |
-void ViewManagerClientImpl::OnViewSharedPropertyChanged( |
- Id view_id, |
- const String& name, |
- Array<uint8_t> new_data) { |
- View* view = GetViewById(view_id); |
- if (view) { |
- std::vector<uint8_t> data; |
- std::vector<uint8_t>* data_ptr = NULL; |
- if (!new_data.is_null()) { |
- data = new_data.To<std::vector<uint8_t>>(); |
- data_ptr = &data; |
- } |
- |
- view->SetSharedProperty(name, data_ptr); |
- } |
-} |
- |
-void ViewManagerClientImpl::OnViewInputEvent( |
- Id view_id, |
- EventPtr event, |
- const Callback<void()>& ack_callback) { |
- View* view = GetViewById(view_id); |
- if (view) { |
- FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(view).observers(), |
- OnViewInputEvent(view, event)); |
- } |
- ack_callback.Run(); |
-} |
- |
-void ViewManagerClientImpl::OnPerformAction( |
- Id view_id, |
- const String& name, |
- const Callback<void(bool)>& callback) { |
- View* view = GetViewById(view_id); |
- callback.Run(delegate_->OnPerformAction(view, name)); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ViewManagerClientImpl, WindowManagerObserver implementation: |
- |
-void ViewManagerClientImpl::OnCaptureChanged(Id capture_view_id) { |
- View* gained_capture = GetViewById(capture_view_id); |
- View* lost_capture = capture_view_; |
- if (lost_capture) { |
- FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(lost_capture).observers(), |
- OnViewFocusChanged(gained_capture, lost_capture)); |
- } |
- capture_view_ = gained_capture; |
- if (gained_capture) { |
- FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(gained_capture).observers(), |
- OnViewFocusChanged(gained_capture, lost_capture)); |
- } |
-} |
- |
-void ViewManagerClientImpl::OnFocusChanged(Id focused_view_id) { |
- View* focused = GetViewById(focused_view_id); |
- View* blurred = focused_view_; |
- if (blurred) { |
- FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(blurred).observers(), |
- OnViewFocusChanged(focused, blurred)); |
- } |
- focused_view_ = focused; |
- if (focused) { |
- FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(focused).observers(), |
- OnViewFocusChanged(focused, blurred)); |
- } |
-} |
- |
-void ViewManagerClientImpl::OnActiveWindowChanged(Id active_view_id) { |
- View* activated = GetViewById(active_view_id); |
- View* deactivated = activated_view_; |
- if (deactivated) { |
- FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(deactivated).observers(), |
- OnViewActivationChanged(activated, deactivated)); |
- } |
- activated_view_ = activated; |
- if (activated) { |
- FOR_EACH_OBSERVER(ViewObserver, *ViewPrivate(activated).observers(), |
- OnViewActivationChanged(activated, deactivated)); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ViewManagerClientImpl, private: |
- |
-void ViewManagerClientImpl::RootDestroyed(View* root) { |
- DCHECK_EQ(root, root_); |
- root_ = nullptr; |
-} |
- |
-void ViewManagerClientImpl::OnActionCompleted(bool success) { |
- if (!change_acked_callback_.is_null()) |
- change_acked_callback_.Run(); |
-} |
- |
-Callback<void(bool)> ViewManagerClientImpl::ActionCompletedCallback() { |
- return [this](bool success) { OnActionCompleted(success); }; |
-} |
- |
-} // namespace mojo |