| Index: mojo/services/view_manager/view_manager_service_impl.cc
|
| diff --git a/mojo/services/view_manager/view_manager_service_impl.cc b/mojo/services/view_manager/view_manager_service_impl.cc
|
| index e205feef77ed2098c32d1067b0224c1ca96c63e9..402b3b46338f6d80972f7c065098d3412753ff42 100644
|
| --- a/mojo/services/view_manager/view_manager_service_impl.cc
|
| +++ b/mojo/services/view_manager/view_manager_service_impl.cc
|
| @@ -9,6 +9,7 @@
|
| #include "mojo/converters/geometry/geometry_type_converters.h"
|
| #include "mojo/converters/input_events/input_events_type_converters.h"
|
| #include "mojo/converters/surfaces/surfaces_type_converters.h"
|
| +#include "mojo/services/public/interfaces/window_manager/window_manager_internal.mojom.h"
|
| #include "mojo/services/view_manager/connection_manager.h"
|
| #include "mojo/services/view_manager/default_access_policy.h"
|
| #include "mojo/services/view_manager/server_view.h"
|
| @@ -65,16 +66,6 @@ const ServerView* ViewManagerServiceImpl::GetView(const ViewId& id) const {
|
| return connection_manager_->GetView(id);
|
| }
|
|
|
| -ErrorCode ViewManagerServiceImpl::CreateView(const ViewId& view_id) {
|
| - if (view_id.connection_id != id_)
|
| - return ERROR_CODE_ILLEGAL_ARGUMENT;
|
| - if (view_map_.find(view_id.view_id) != view_map_.end())
|
| - return ERROR_CODE_VALUE_IN_USE;
|
| - view_map_[view_id.view_id] = new ServerView(connection_manager_, view_id);
|
| - known_views_.insert(ViewIdToTransportId(view_id));
|
| - return ERROR_CODE_NONE;
|
| -}
|
| -
|
| bool ViewManagerServiceImpl::IsRoot(const ViewId& id) const {
|
| return root_.get() && *root_ == id;
|
| }
|
| @@ -92,6 +83,73 @@ void ViewManagerServiceImpl::OnWillDestroyViewManagerServiceImpl(
|
| root_.reset();
|
| }
|
|
|
| +ErrorCode ViewManagerServiceImpl::CreateView(const ViewId& view_id) {
|
| + if (view_id.connection_id != id_)
|
| + return ERROR_CODE_ILLEGAL_ARGUMENT;
|
| + if (view_map_.find(view_id.view_id) != view_map_.end())
|
| + return ERROR_CODE_VALUE_IN_USE;
|
| + view_map_[view_id.view_id] = new ServerView(connection_manager_, view_id);
|
| + known_views_.insert(ViewIdToTransportId(view_id));
|
| + return ERROR_CODE_NONE;
|
| +}
|
| +
|
| +bool ViewManagerServiceImpl::AddView(const ViewId& parent_id,
|
| + const ViewId& child_id) {
|
| + ServerView* parent = GetView(parent_id);
|
| + ServerView* child = GetView(child_id);
|
| + if (parent && child && child->parent() != parent &&
|
| + !child->Contains(parent) && access_policy_->CanAddView(parent, child)) {
|
| + ConnectionManager::ScopedChange change(this, connection_manager_, false);
|
| + parent->Add(child);
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +std::vector<const ServerView*> ViewManagerServiceImpl::GetViewTree(
|
| + const ViewId& view_id) const {
|
| + const ServerView* view = GetView(view_id);
|
| + std::vector<const ServerView*> views;
|
| + if (view)
|
| + GetViewTreeImpl(view, &views);
|
| + return views;
|
| +}
|
| +
|
| +bool ViewManagerServiceImpl::SetViewVisibility(const ViewId& view_id,
|
| + bool visible) {
|
| + ServerView* view = GetView(view_id);
|
| + if (!view || view->visible() == visible ||
|
| + !access_policy_->CanChangeViewVisibility(view)) {
|
| + return false;
|
| + }
|
| + ConnectionManager::ScopedChange change(this, connection_manager_, false);
|
| + view->SetVisible(visible);
|
| + return true;
|
| +}
|
| +
|
| +bool ViewManagerServiceImpl::Embed(
|
| + const std::string& url,
|
| + const ViewId& view_id,
|
| + InterfaceRequest<ServiceProvider> service_provider) {
|
| + const ServerView* view = GetView(view_id);
|
| + if (!view || !access_policy_->CanEmbed(view))
|
| + return false;
|
| +
|
| + // Only allow a node to be the root for one connection.
|
| + ViewManagerServiceImpl* existing_owner =
|
| + connection_manager_->GetConnectionWithRoot(view_id);
|
| +
|
| + ConnectionManager::ScopedChange change(this, connection_manager_, true);
|
| + RemoveChildrenAsPartOfEmbed(view_id);
|
| + if (existing_owner) {
|
| + // Never message the originating connection.
|
| + connection_manager_->OnConnectionMessagedClient(id_);
|
| + existing_owner->RemoveRoot();
|
| + }
|
| + connection_manager_->EmbedAtView(id_, url, view_id, service_provider.Pass());
|
| + return true;
|
| +}
|
| +
|
| void ViewManagerServiceImpl::ProcessViewBoundsChanged(
|
| const ServerView* view,
|
| const gfx::Rect& old_bounds,
|
| @@ -188,6 +246,7 @@ void ViewManagerServiceImpl::ProcessViewDeleted(const ViewId& view,
|
| view_map_.erase(view.view_id);
|
|
|
| const bool in_known = known_views_.erase(ViewIdToTransportId(view)) > 0;
|
| +
|
| if (IsRoot(view))
|
| root_.reset();
|
|
|
| @@ -415,16 +474,8 @@ void ViewManagerServiceImpl::AddView(
|
| Id parent_id,
|
| Id child_id,
|
| const Callback<void(bool)>& callback) {
|
| - bool success = false;
|
| - ServerView* parent = GetView(ViewIdFromTransportId(parent_id));
|
| - ServerView* child = GetView(ViewIdFromTransportId(child_id));
|
| - if (parent && child && child->parent() != parent &&
|
| - !child->Contains(parent) && access_policy_->CanAddView(parent, child)) {
|
| - success = true;
|
| - ConnectionManager::ScopedChange change(this, connection_manager_, false);
|
| - parent->Add(child);
|
| - }
|
| - callback.Run(success);
|
| + callback.Run(AddView(ViewIdFromTransportId(parent_id),
|
| + ViewIdFromTransportId(child_id)));
|
| }
|
|
|
| void ViewManagerServiceImpl::RemoveViewFromParent(
|
| @@ -459,12 +510,8 @@ void ViewManagerServiceImpl::ReorderView(Id view_id,
|
| void ViewManagerServiceImpl::GetViewTree(
|
| Id view_id,
|
| const Callback<void(Array<ViewDataPtr>)>& callback) {
|
| - ServerView* view = GetView(ViewIdFromTransportId(view_id));
|
| - std::vector<const ServerView*> views;
|
| - if (view) {
|
| - GetViewTreeImpl(view, &views);
|
| - // TODO(sky): this should map in views that weren't none.
|
| - }
|
| + std::vector<const ServerView*> views(
|
| + GetViewTree(ViewIdFromTransportId(view_id)));
|
| callback.Run(ViewsToViewDatas(views));
|
| }
|
|
|
| @@ -499,17 +546,8 @@ void ViewManagerServiceImpl::SetViewVisibility(
|
| Id transport_view_id,
|
| bool visible,
|
| const Callback<void(bool)>& callback) {
|
| - ServerView* view = GetView(ViewIdFromTransportId(transport_view_id));
|
| - if (!view || view->visible() == visible ||
|
| - !access_policy_->CanChangeViewVisibility(view)) {
|
| - callback.Run(false);
|
| - return;
|
| - }
|
| - {
|
| - ConnectionManager::ScopedChange change(this, connection_manager_, false);
|
| - view->SetVisible(visible);
|
| - }
|
| - callback.Run(true);
|
| + callback.Run(
|
| + SetViewVisibility(ViewIdFromTransportId(transport_view_id), visible));
|
| }
|
|
|
| void ViewManagerServiceImpl::SetViewProperty(
|
| @@ -537,27 +575,9 @@ void ViewManagerServiceImpl::Embed(
|
| Id transport_view_id,
|
| InterfaceRequest<ServiceProvider> service_provider,
|
| const Callback<void(bool)>& callback) {
|
| - const ServerView* view = GetView(ViewIdFromTransportId(transport_view_id));
|
| - if (!view || !access_policy_->CanEmbed(view)) {
|
| - callback.Run(false);
|
| - return;
|
| - }
|
| -
|
| - // Only allow a node to be the root for one connection.
|
| - const ViewId view_id(ViewIdFromTransportId(transport_view_id));
|
| - ViewManagerServiceImpl* existing_owner =
|
| - connection_manager_->GetConnectionWithRoot(view_id);
|
| -
|
| - ConnectionManager::ScopedChange change(this, connection_manager_, true);
|
| - RemoveChildrenAsPartOfEmbed(view_id);
|
| - if (existing_owner) {
|
| - // Never message the originating connection.
|
| - connection_manager_->OnConnectionMessagedClient(id_);
|
| - existing_owner->RemoveRoot();
|
| - }
|
| - connection_manager_->EmbedAtView(id_, url, transport_view_id,
|
| - service_provider.Pass());
|
| - callback.Run(true);
|
| + callback.Run(Embed(url.To<std::string>(),
|
| + ViewIdFromTransportId(transport_view_id),
|
| + service_provider.Pass()));
|
| }
|
|
|
| bool ViewManagerServiceImpl::IsRootForAccessPolicy(const ViewId& id) const {
|
|
|