| 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 e1229d3a98c321ef39f01e1bc3a404d6bdc35688..4fece9021ddcb1861be2d12ea6b5eef0a54a3e3b 100644
|
| --- a/mojo/services/view_manager/view_manager_service_impl.cc
|
| +++ b/mojo/services/view_manager/view_manager_service_impl.cc
|
| @@ -81,6 +81,23 @@ void ViewManagerServiceImpl::ProcessViewBoundsChanged(
|
| Rect::From(new_bounds));
|
| }
|
|
|
| +void ViewManagerServiceImpl::ProcessWillChangeViewHierarchy(
|
| + const ServerView* view,
|
| + const ServerView* new_parent,
|
| + const ServerView* old_parent,
|
| + bool originated_change) {
|
| + if (originated_change)
|
| + return;
|
| +
|
| + const bool old_drawn = view->IsDrawn(connection_manager_->root());
|
| + const bool new_drawn = view->visible() && new_parent &&
|
| + new_parent->IsDrawn(connection_manager_->root());
|
| + if (old_drawn == new_drawn)
|
| + return;
|
| +
|
| + NotifyDrawnStateChanged(view, new_drawn);
|
| +}
|
| +
|
| void ViewManagerServiceImpl::ProcessViewHierarchyChanged(
|
| const ServerView* view,
|
| const ServerView* new_parent,
|
| @@ -142,6 +159,31 @@ void ViewManagerServiceImpl::ProcessViewDeleted(const ViewId& view,
|
| }
|
| }
|
|
|
| +void ViewManagerServiceImpl::ProcessWillChangeViewVisibility(
|
| + const ServerView* view,
|
| + bool originated_change) {
|
| + if (originated_change)
|
| + return;
|
| +
|
| + if (IsViewKnown(view)) {
|
| + client()->OnViewVisibilityChanged(ViewIdToTransportId(view->id()),
|
| + !view->visible());
|
| + return;
|
| + }
|
| +
|
| + bool view_target_drawn_state;
|
| + if (view->visible()) {
|
| + // View is being hidden, won't be drawn.
|
| + view_target_drawn_state = false;
|
| + } else {
|
| + // View is being shown. View will be drawn if its parent is drawn.
|
| + view_target_drawn_state =
|
| + view->parent() && view->parent()->IsDrawn(connection_manager_->root());
|
| + }
|
| +
|
| + NotifyDrawnStateChanged(view, view_target_drawn_state);
|
| +}
|
| +
|
| void ViewManagerServiceImpl::OnConnectionError() {
|
| if (delete_on_connection_error_)
|
| delete this;
|
| @@ -264,6 +306,8 @@ ViewDataPtr ViewManagerServiceImpl::ViewToViewData(const ServerView* view) {
|
| view_data->parent_id = ViewIdToTransportId(parent ? parent->id() : ViewId());
|
| view_data->view_id = ViewIdToTransportId(view->id());
|
| view_data->bounds = Rect::From(view->bounds());
|
| + view_data->visible = view->visible();
|
| + view_data->drawn = view->IsDrawn(connection_manager_->root());
|
| return view_data.Pass();
|
| }
|
|
|
| @@ -285,6 +329,21 @@ void ViewManagerServiceImpl::GetViewTreeImpl(
|
| GetViewTreeImpl(children[i], views);
|
| }
|
|
|
| +void ViewManagerServiceImpl::NotifyDrawnStateChanged(const ServerView* view,
|
| + bool new_drawn_value) {
|
| + // Even though we don't know about view, it may be an ancestor of one of our
|
| + // roots, in which case the change may effect our roots drawn state.
|
| + for (ViewIdSet::iterator i = roots_.begin(); i != roots_.end(); ++i) {
|
| + const ServerView* root = GetView(ViewIdFromTransportId(*i));
|
| + DCHECK(root);
|
| + if (view->Contains(root) &&
|
| + (new_drawn_value != root->IsDrawn(connection_manager_->root()))) {
|
| + client()->OnViewDrawnStateChanged(ViewIdToTransportId(root->id()),
|
| + new_drawn_value);
|
| + }
|
| + }
|
| +}
|
| +
|
| void ViewManagerServiceImpl::CreateView(
|
| Id transport_view_id,
|
| const Callback<void(ErrorCode)>& callback) {
|
| @@ -414,14 +473,16 @@ void ViewManagerServiceImpl::SetViewVisibility(
|
| bool visible,
|
| const Callback<void(bool)>& callback) {
|
| ServerView* view = GetView(ViewIdFromTransportId(transport_view_id));
|
| - const bool success = view && view->visible() != visible &&
|
| - access_policy_->CanChangeViewVisibility(view);
|
| - if (success) {
|
| - DCHECK(view);
|
| + if (!view || view->visible() == visible ||
|
| + !access_policy_->CanChangeViewVisibility(view)) {
|
| + callback.Run(false);
|
| + return;
|
| + }
|
| + {
|
| + ConnectionManager::ScopedChange change(this, connection_manager_, false);
|
| view->SetVisible(visible);
|
| }
|
| - // TODO(sky): need to notify of visibility changes.
|
| - callback.Run(success);
|
| + callback.Run(true);
|
| }
|
|
|
| void ViewManagerServiceImpl::Embed(
|
|
|