Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Unified Diff: mojo/services/view_manager/view_manager_service_impl.cc

Issue 699173003: Makes ViewManagerServiceImpl track a single root (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: comment Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 5c8fbfe77bef093b316314dcfcab081169fd8a72..07bf803c0f061311271bc45e4d081b5219bd746c 100644
--- a/mojo/services/view_manager/view_manager_service_impl.cc
+++ b/mojo/services/view_manager/view_manager_service_impl.cc
@@ -31,7 +31,7 @@ ViewManagerServiceImpl::ViewManagerServiceImpl(
creator_url_(creator_url),
service_provider_(service_provider.Pass()) {
CHECK(GetView(root_id));
- roots_.insert(ViewIdToTransportId(root_id));
+ root_.reset(new ViewId(root_id));
if (root_id == RootViewId())
access_policy_.reset(new WindowManagerAccessPolicy(id_, this));
else
@@ -50,17 +50,19 @@ const ServerView* ViewManagerServiceImpl::GetView(const ViewId& id) const {
return connection_manager_->GetView(id);
}
-bool ViewManagerServiceImpl::HasRoot(const ViewId& id) const {
- return roots_.find(ViewIdToTransportId(id)) != roots_.end();
+bool ViewManagerServiceImpl::IsRoot(const ViewId& id) const {
+ return root_.get() && *root_ == id;
}
void ViewManagerServiceImpl::OnWillDestroyViewManagerServiceImpl(
ViewManagerServiceImpl* connection) {
if (creator_id_ == connection->id())
creator_id_ = kInvalidConnectionId;
- ViewId embedded_root_id;
- if (ProvidesRoot(connection, &embedded_root_id))
- client()->OnEmbeddedAppDisconnected(ViewIdToTransportId(embedded_root_id));
+ if (connection->root_ && connection->root_->connection_id == id_ &&
+ view_map_.count(connection->root_->view_id) > 0) {
+ client()->OnEmbeddedAppDisconnected(
+ ViewIdToTransportId(*connection->root_));
+ }
}
void ViewManagerServiceImpl::ProcessViewBoundsChanged(
@@ -160,7 +162,8 @@ void ViewManagerServiceImpl::ProcessViewDeleted(const ViewId& view,
view_map_.erase(view.view_id);
const bool in_known = known_views_.erase(ViewIdToTransportId(view)) > 0;
- roots_.erase(ViewIdToTransportId(view));
+ if (IsRoot(view))
+ root_.reset();
if (originated_change)
return;
@@ -204,19 +207,6 @@ bool ViewManagerServiceImpl::IsViewKnown(const ServerView* view) const {
return known_views_.count(ViewIdToTransportId(view->id())) > 0;
}
-bool ViewManagerServiceImpl::ProvidesRoot(
- const ViewManagerServiceImpl* connection,
- ViewId* root_id) const {
- for (Id transport_id : connection->roots()) {
- const ViewId view_id(ViewIdFromTransportId(transport_id));
- if (id_ == view_id.connection_id && view_map_.count(view_id.view_id) > 0) {
- *root_id = view_id;
- return true;
- }
- }
- return false;
-}
-
bool ViewManagerServiceImpl::CanReorderView(const ServerView* view,
const ServerView* relative_view,
OrderDirection direction) const {
@@ -280,23 +270,21 @@ void ViewManagerServiceImpl::RemoveFromKnown(
RemoveFromKnown(children[i], local_views);
}
-void ViewManagerServiceImpl::RemoveRoot(const ViewId& view_id) {
- const Id transport_view_id(ViewIdToTransportId(view_id));
- CHECK(roots_.count(transport_view_id) > 0);
-
- roots_.erase(transport_view_id);
-
+void ViewManagerServiceImpl::RemoveRoot() {
+ CHECK(root_.get());
+ const ViewId root_id(*root_);
+ root_.reset();
// No need to do anything if we created the view.
- if (view_id.connection_id == id_)
+ if (root_id.connection_id == id_)
return;
- client()->OnViewDeleted(transport_view_id);
+ client()->OnViewDeleted(ViewIdToTransportId(root_id));
connection_manager_->OnConnectionMessagedClient(id_);
// This connection no longer knows about the view. Unparent any views that
// were parented to views in the root.
std::vector<ServerView*> local_views;
- RemoveFromKnown(GetView(view_id), &local_views);
+ RemoveFromKnown(GetView(root_id), &local_views);
for (size_t i = 0; i < local_views.size(); ++i)
local_views[i]->parent()->Remove(local_views[i]);
}
@@ -356,16 +344,17 @@ void ViewManagerServiceImpl::GetViewTreeImpl(
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);
- }
+ // Even though we don't know about view, it may be an ancestor of our root, in
+ // which case the change may effect our roots drawn state.
+ if (!root_.get())
+ return;
+
+ const ServerView* root = GetView(*root_);
+ DCHECK(root);
+ if (view->Contains(root) &&
+ (new_drawn_value != root->IsDrawn(connection_manager_->root()))) {
+ client()->OnViewDrawnStateChanged(ViewIdToTransportId(root->id()),
+ new_drawn_value);
}
}
@@ -555,7 +544,7 @@ void ViewManagerServiceImpl::Embed(
if (existing_owner) {
// Never message the originating connection.
connection_manager_->OnConnectionMessagedClient(id_);
- existing_owner->RemoveRoot(view_id);
+ existing_owner->RemoveRoot();
}
connection_manager_->EmbedAtView(id_, url, transport_view_id, spir.Pass());
callback.Run(true);
@@ -563,8 +552,8 @@ void ViewManagerServiceImpl::Embed(
void ViewManagerServiceImpl::OnConnectionEstablished() {
std::vector<const ServerView*> to_send;
- for (ViewIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i)
- GetUnknownViewsFrom(GetView(ViewIdFromTransportId(*i)), &to_send);
+ if (root_.get())
+ GetUnknownViewsFrom(GetView(*root_), &to_send);
MessagePipe pipe;
connection_manager_->wm_internal()->CreateWindowManagerForViewManagerClient(
@@ -576,9 +565,8 @@ void ViewManagerServiceImpl::OnConnectionEstablished() {
pipe.handle0.Pass());
}
-const base::hash_set<Id>&
-ViewManagerServiceImpl::GetRootsForAccessPolicy() const {
- return roots_;
+bool ViewManagerServiceImpl::IsRootForAccessPolicy(const ViewId& id) const {
+ return IsRoot(id);
}
bool ViewManagerServiceImpl::IsViewKnownForAccessPolicy(
« no previous file with comments | « mojo/services/view_manager/view_manager_service_impl.h ('k') | mojo/services/view_manager/window_manager_access_policy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698