| Index: mojo/services/public/cpp/view_manager/lib/view_tree_node.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc b/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc
|
| index 66331a72c39ff33bf4d7c1c0a339fe8383e42678..203d15ef6eed4996644b5c756a8dfa6c6e6389f3 100644
|
| --- a/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc
|
| +++ b/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc
|
| @@ -180,6 +180,12 @@ class ScopedDestructionNotifier {
|
| DISALLOW_COPY_AND_ASSIGN(ScopedDestructionNotifier);
|
| };
|
|
|
| +// Some operations are only permitted in the connection that created the node.
|
| +bool OwnsNode(ViewManager* manager, ViewTreeNode* node) {
|
| + return !manager ||
|
| + ViewManagerPrivate(manager).synchronizer()->OwnsNode(node->id());
|
| +}
|
| +
|
| } // namespace
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -193,7 +199,9 @@ ViewTreeNode* ViewTreeNode::Create(ViewManager* view_manager) {
|
| }
|
|
|
| void ViewTreeNode::Destroy() {
|
| - // TODO(beng): only proceed if |manager_| OwnsNode(this).
|
| + if (!OwnsNode(manager_, this))
|
| + return;
|
| +
|
| if (manager_)
|
| ViewManagerPrivate(manager_).synchronizer()->DestroyViewTreeNode(id_);
|
| while (!children_.empty())
|
| @@ -202,7 +210,9 @@ void ViewTreeNode::Destroy() {
|
| }
|
|
|
| void ViewTreeNode::SetBounds(const gfx::Rect& bounds) {
|
| - // TODO(beng): only proceed if |manager_| OwnsNode(this).
|
| + if (!OwnsNode(manager_, this))
|
| + return;
|
| +
|
| if (manager_)
|
| ViewManagerPrivate(manager_).synchronizer()->SetBounds(id_, bounds);
|
| LocalSetBounds(bounds_, bounds);
|
| @@ -217,6 +227,8 @@ void ViewTreeNode::RemoveObserver(ViewTreeNodeObserver* observer) {
|
| }
|
|
|
| void ViewTreeNode::AddChild(ViewTreeNode* child) {
|
| + // TODO(beng): not necessarily valid to all connections, but possibly to the
|
| + // embeddee in an embedder-embeddee relationship.
|
| if (manager_)
|
| CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_);
|
| LocalAddChild(child);
|
| @@ -225,6 +237,8 @@ void ViewTreeNode::AddChild(ViewTreeNode* child) {
|
| }
|
|
|
| void ViewTreeNode::RemoveChild(ViewTreeNode* child) {
|
| + // TODO(beng): not necessarily valid to all connections, but possibly to the
|
| + // embeddee in an embedder-embeddee relationship.
|
| if (manager_)
|
| CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_);
|
| LocalRemoveChild(child);
|
| @@ -256,6 +270,8 @@ ViewTreeNode* ViewTreeNode::GetChildById(TransportNodeId id) {
|
| }
|
|
|
| void ViewTreeNode::SetActiveView(View* view) {
|
| + // TODO(beng): not necessarily valid to all connections, but possibly to the
|
| + // embeddee in an embedder-embeddee relationship.
|
| if (manager_)
|
| CHECK_EQ(ViewPrivate(view).view_manager(), manager_);
|
| LocalSetActiveView(view);
|
|
|