OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/services/view_manager/view_manager_service_impl.h" | 5 #include "mojo/services/view_manager/view_manager_service_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "mojo/converters/geometry/geometry_type_converters.h" | 9 #include "mojo/converters/geometry/geometry_type_converters.h" |
10 #include "mojo/converters/input_events/input_events_type_converters.h" | 10 #include "mojo/converters/input_events/input_events_type_converters.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 const std::string& url, | 24 const std::string& url, |
25 const ViewId& root_id, | 25 const ViewId& root_id, |
26 InterfaceRequest<ServiceProvider> service_provider) | 26 InterfaceRequest<ServiceProvider> service_provider) |
27 : connection_manager_(connection_manager), | 27 : connection_manager_(connection_manager), |
28 id_(connection_manager_->GetAndAdvanceNextConnectionId()), | 28 id_(connection_manager_->GetAndAdvanceNextConnectionId()), |
29 url_(url), | 29 url_(url), |
30 creator_id_(creator_id), | 30 creator_id_(creator_id), |
31 creator_url_(creator_url), | 31 creator_url_(creator_url), |
32 service_provider_(service_provider.Pass()) { | 32 service_provider_(service_provider.Pass()) { |
33 CHECK(GetView(root_id)); | 33 CHECK(GetView(root_id)); |
34 roots_.insert(ViewIdToTransportId(root_id)); | 34 root_.reset(new ViewId(root_id)); |
35 if (root_id == RootViewId()) | 35 if (root_id == RootViewId()) |
36 access_policy_.reset(new WindowManagerAccessPolicy(id_, this)); | 36 access_policy_.reset(new WindowManagerAccessPolicy(id_, this)); |
37 else | 37 else |
38 access_policy_.reset(new DefaultAccessPolicy(id_, this)); | 38 access_policy_.reset(new DefaultAccessPolicy(id_, this)); |
39 } | 39 } |
40 | 40 |
41 ViewManagerServiceImpl::~ViewManagerServiceImpl() { | 41 ViewManagerServiceImpl::~ViewManagerServiceImpl() { |
42 DestroyViews(); | 42 DestroyViews(); |
43 } | 43 } |
44 | 44 |
45 const ServerView* ViewManagerServiceImpl::GetView(const ViewId& id) const { | 45 const ServerView* ViewManagerServiceImpl::GetView(const ViewId& id) const { |
46 if (id_ == id.connection_id) { | 46 if (id_ == id.connection_id) { |
47 ViewMap::const_iterator i = view_map_.find(id.view_id); | 47 ViewMap::const_iterator i = view_map_.find(id.view_id); |
48 return i == view_map_.end() ? NULL : i->second; | 48 return i == view_map_.end() ? NULL : i->second; |
49 } | 49 } |
50 return connection_manager_->GetView(id); | 50 return connection_manager_->GetView(id); |
51 } | 51 } |
52 | 52 |
53 bool ViewManagerServiceImpl::HasRoot(const ViewId& id) const { | 53 bool ViewManagerServiceImpl::IsRoot(const ViewId& id) const { |
54 return roots_.find(ViewIdToTransportId(id)) != roots_.end(); | 54 return root_.get() && *root_ == id; |
55 } | 55 } |
56 | 56 |
57 void ViewManagerServiceImpl::OnWillDestroyViewManagerServiceImpl( | 57 void ViewManagerServiceImpl::OnWillDestroyViewManagerServiceImpl( |
58 ViewManagerServiceImpl* connection) { | 58 ViewManagerServiceImpl* connection) { |
59 if (creator_id_ == connection->id()) | 59 if (creator_id_ == connection->id()) |
60 creator_id_ = kInvalidConnectionId; | 60 creator_id_ = kInvalidConnectionId; |
61 ViewId embedded_root_id; | 61 if (connection->root_ && connection->root_->connection_id == id_ && |
62 if (ProvidesRoot(connection, &embedded_root_id)) | 62 view_map_.count(connection->root_->view_id) > 0) { |
63 client()->OnEmbeddedAppDisconnected(ViewIdToTransportId(embedded_root_id)); | 63 client()->OnEmbeddedAppDisconnected( |
| 64 ViewIdToTransportId(*connection->root_)); |
| 65 } |
64 } | 66 } |
65 | 67 |
66 void ViewManagerServiceImpl::ProcessViewBoundsChanged( | 68 void ViewManagerServiceImpl::ProcessViewBoundsChanged( |
67 const ServerView* view, | 69 const ServerView* view, |
68 const gfx::Rect& old_bounds, | 70 const gfx::Rect& old_bounds, |
69 const gfx::Rect& new_bounds, | 71 const gfx::Rect& new_bounds, |
70 bool originated_change) { | 72 bool originated_change) { |
71 if (originated_change || !IsViewKnown(view)) | 73 if (originated_change || !IsViewKnown(view)) |
72 return; | 74 return; |
73 client()->OnViewBoundsChanged(ViewIdToTransportId(view->id()), | 75 client()->OnViewBoundsChanged(ViewIdToTransportId(view->id()), |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 client()->OnViewReordered(ViewIdToTransportId(view->id()), | 155 client()->OnViewReordered(ViewIdToTransportId(view->id()), |
154 ViewIdToTransportId(relative_view->id()), | 156 ViewIdToTransportId(relative_view->id()), |
155 direction); | 157 direction); |
156 } | 158 } |
157 | 159 |
158 void ViewManagerServiceImpl::ProcessViewDeleted(const ViewId& view, | 160 void ViewManagerServiceImpl::ProcessViewDeleted(const ViewId& view, |
159 bool originated_change) { | 161 bool originated_change) { |
160 view_map_.erase(view.view_id); | 162 view_map_.erase(view.view_id); |
161 | 163 |
162 const bool in_known = known_views_.erase(ViewIdToTransportId(view)) > 0; | 164 const bool in_known = known_views_.erase(ViewIdToTransportId(view)) > 0; |
163 roots_.erase(ViewIdToTransportId(view)); | 165 if (IsRoot(view)) |
| 166 root_.reset(); |
164 | 167 |
165 if (originated_change) | 168 if (originated_change) |
166 return; | 169 return; |
167 | 170 |
168 if (in_known) { | 171 if (in_known) { |
169 client()->OnViewDeleted(ViewIdToTransportId(view)); | 172 client()->OnViewDeleted(ViewIdToTransportId(view)); |
170 connection_manager_->OnConnectionMessagedClient(id_); | 173 connection_manager_->OnConnectionMessagedClient(id_); |
171 } | 174 } |
172 } | 175 } |
173 | 176 |
(...skipping 23 matching lines...) Expand all Loading... |
197 } | 200 } |
198 | 201 |
199 void ViewManagerServiceImpl::OnConnectionError() { | 202 void ViewManagerServiceImpl::OnConnectionError() { |
200 connection_manager_->OnConnectionError(this); | 203 connection_manager_->OnConnectionError(this); |
201 } | 204 } |
202 | 205 |
203 bool ViewManagerServiceImpl::IsViewKnown(const ServerView* view) const { | 206 bool ViewManagerServiceImpl::IsViewKnown(const ServerView* view) const { |
204 return known_views_.count(ViewIdToTransportId(view->id())) > 0; | 207 return known_views_.count(ViewIdToTransportId(view->id())) > 0; |
205 } | 208 } |
206 | 209 |
207 bool ViewManagerServiceImpl::ProvidesRoot( | |
208 const ViewManagerServiceImpl* connection, | |
209 ViewId* root_id) const { | |
210 for (Id transport_id : connection->roots()) { | |
211 const ViewId view_id(ViewIdFromTransportId(transport_id)); | |
212 if (id_ == view_id.connection_id && view_map_.count(view_id.view_id) > 0) { | |
213 *root_id = view_id; | |
214 return true; | |
215 } | |
216 } | |
217 return false; | |
218 } | |
219 | |
220 bool ViewManagerServiceImpl::CanReorderView(const ServerView* view, | 210 bool ViewManagerServiceImpl::CanReorderView(const ServerView* view, |
221 const ServerView* relative_view, | 211 const ServerView* relative_view, |
222 OrderDirection direction) const { | 212 OrderDirection direction) const { |
223 if (!view || !relative_view) | 213 if (!view || !relative_view) |
224 return false; | 214 return false; |
225 | 215 |
226 if (!view->parent() || view->parent() != relative_view->parent()) | 216 if (!view->parent() || view->parent() != relative_view->parent()) |
227 return false; | 217 return false; |
228 | 218 |
229 if (!access_policy_->CanReorderView(view, relative_view, direction)) | 219 if (!access_policy_->CanReorderView(view, relative_view, direction)) |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 if (local_views) | 263 if (local_views) |
274 local_views->push_back(GetView(view->id())); | 264 local_views->push_back(GetView(view->id())); |
275 return; | 265 return; |
276 } | 266 } |
277 known_views_.erase(ViewIdToTransportId(view->id())); | 267 known_views_.erase(ViewIdToTransportId(view->id())); |
278 std::vector<const ServerView*> children = view->GetChildren(); | 268 std::vector<const ServerView*> children = view->GetChildren(); |
279 for (size_t i = 0; i < children.size(); ++i) | 269 for (size_t i = 0; i < children.size(); ++i) |
280 RemoveFromKnown(children[i], local_views); | 270 RemoveFromKnown(children[i], local_views); |
281 } | 271 } |
282 | 272 |
283 void ViewManagerServiceImpl::RemoveRoot(const ViewId& view_id) { | 273 void ViewManagerServiceImpl::RemoveRoot() { |
284 const Id transport_view_id(ViewIdToTransportId(view_id)); | 274 CHECK(root_.get()); |
285 CHECK(roots_.count(transport_view_id) > 0); | 275 const ViewId root_id(*root_); |
286 | 276 root_.reset(); |
287 roots_.erase(transport_view_id); | |
288 | |
289 // No need to do anything if we created the view. | 277 // No need to do anything if we created the view. |
290 if (view_id.connection_id == id_) | 278 if (root_id.connection_id == id_) |
291 return; | 279 return; |
292 | 280 |
293 client()->OnViewDeleted(transport_view_id); | 281 client()->OnViewDeleted(ViewIdToTransportId(root_id)); |
294 connection_manager_->OnConnectionMessagedClient(id_); | 282 connection_manager_->OnConnectionMessagedClient(id_); |
295 | 283 |
296 // This connection no longer knows about the view. Unparent any views that | 284 // This connection no longer knows about the view. Unparent any views that |
297 // were parented to views in the root. | 285 // were parented to views in the root. |
298 std::vector<ServerView*> local_views; | 286 std::vector<ServerView*> local_views; |
299 RemoveFromKnown(GetView(view_id), &local_views); | 287 RemoveFromKnown(GetView(root_id), &local_views); |
300 for (size_t i = 0; i < local_views.size(); ++i) | 288 for (size_t i = 0; i < local_views.size(); ++i) |
301 local_views[i]->parent()->Remove(local_views[i]); | 289 local_views[i]->parent()->Remove(local_views[i]); |
302 } | 290 } |
303 | 291 |
304 void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( | 292 void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( |
305 const ViewId& view_id) { | 293 const ViewId& view_id) { |
306 ServerView* view = GetView(view_id); | 294 ServerView* view = GetView(view_id); |
307 CHECK(view); | 295 CHECK(view); |
308 CHECK(view->id().connection_id == view_id.connection_id); | 296 CHECK(view->id().connection_id == view_id.connection_id); |
309 std::vector<ServerView*> children = view->GetChildren(); | 297 std::vector<ServerView*> children = view->GetChildren(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 if (!access_policy_->CanDescendIntoViewForViewTree(view)) | 337 if (!access_policy_->CanDescendIntoViewForViewTree(view)) |
350 return; | 338 return; |
351 | 339 |
352 std::vector<const ServerView*> children(view->GetChildren()); | 340 std::vector<const ServerView*> children(view->GetChildren()); |
353 for (size_t i = 0 ; i < children.size(); ++i) | 341 for (size_t i = 0 ; i < children.size(); ++i) |
354 GetViewTreeImpl(children[i], views); | 342 GetViewTreeImpl(children[i], views); |
355 } | 343 } |
356 | 344 |
357 void ViewManagerServiceImpl::NotifyDrawnStateChanged(const ServerView* view, | 345 void ViewManagerServiceImpl::NotifyDrawnStateChanged(const ServerView* view, |
358 bool new_drawn_value) { | 346 bool new_drawn_value) { |
359 // Even though we don't know about view, it may be an ancestor of one of our | 347 // Even though we don't know about view, it may be an ancestor of our root, in |
360 // roots, in which case the change may effect our roots drawn state. | 348 // which case the change may effect our roots drawn state. |
361 for (ViewIdSet::iterator i = roots_.begin(); i != roots_.end(); ++i) { | 349 if (!root_.get()) |
362 const ServerView* root = GetView(ViewIdFromTransportId(*i)); | 350 return; |
363 DCHECK(root); | 351 |
364 if (view->Contains(root) && | 352 const ServerView* root = GetView(*root_); |
365 (new_drawn_value != root->IsDrawn(connection_manager_->root()))) { | 353 DCHECK(root); |
366 client()->OnViewDrawnStateChanged(ViewIdToTransportId(root->id()), | 354 if (view->Contains(root) && |
367 new_drawn_value); | 355 (new_drawn_value != root->IsDrawn(connection_manager_->root()))) { |
368 } | 356 client()->OnViewDrawnStateChanged(ViewIdToTransportId(root->id()), |
| 357 new_drawn_value); |
369 } | 358 } |
370 } | 359 } |
371 | 360 |
372 void ViewManagerServiceImpl::DestroyViews() { | 361 void ViewManagerServiceImpl::DestroyViews() { |
373 if (!view_map_.empty()) { | 362 if (!view_map_.empty()) { |
374 ConnectionManager::ScopedChange change(this, connection_manager_, true); | 363 ConnectionManager::ScopedChange change(this, connection_manager_, true); |
375 // If we get here from the destructor we're not going to get | 364 // If we get here from the destructor we're not going to get |
376 // ProcessViewDeleted(). Copy the map and delete from the copy so that we | 365 // ProcessViewDeleted(). Copy the map and delete from the copy so that we |
377 // don't have to worry about whether |view_map_| changes or not. | 366 // don't have to worry about whether |view_map_| changes or not. |
378 ViewMap view_map_copy; | 367 ViewMap view_map_copy; |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 // Only allow a node to be the root for one connection. | 537 // Only allow a node to be the root for one connection. |
549 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); | 538 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); |
550 ViewManagerServiceImpl* existing_owner = | 539 ViewManagerServiceImpl* existing_owner = |
551 connection_manager_->GetConnectionWithRoot(view_id); | 540 connection_manager_->GetConnectionWithRoot(view_id); |
552 | 541 |
553 ConnectionManager::ScopedChange change(this, connection_manager_, true); | 542 ConnectionManager::ScopedChange change(this, connection_manager_, true); |
554 RemoveChildrenAsPartOfEmbed(view_id); | 543 RemoveChildrenAsPartOfEmbed(view_id); |
555 if (existing_owner) { | 544 if (existing_owner) { |
556 // Never message the originating connection. | 545 // Never message the originating connection. |
557 connection_manager_->OnConnectionMessagedClient(id_); | 546 connection_manager_->OnConnectionMessagedClient(id_); |
558 existing_owner->RemoveRoot(view_id); | 547 existing_owner->RemoveRoot(); |
559 } | 548 } |
560 connection_manager_->EmbedAtView(id_, url, transport_view_id, spir.Pass()); | 549 connection_manager_->EmbedAtView(id_, url, transport_view_id, spir.Pass()); |
561 callback.Run(true); | 550 callback.Run(true); |
562 } | 551 } |
563 | 552 |
564 void ViewManagerServiceImpl::OnConnectionEstablished() { | 553 void ViewManagerServiceImpl::OnConnectionEstablished() { |
565 std::vector<const ServerView*> to_send; | 554 std::vector<const ServerView*> to_send; |
566 for (ViewIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i) | 555 if (root_.get()) |
567 GetUnknownViewsFrom(GetView(ViewIdFromTransportId(*i)), &to_send); | 556 GetUnknownViewsFrom(GetView(*root_), &to_send); |
568 | 557 |
569 MessagePipe pipe; | 558 MessagePipe pipe; |
570 connection_manager_->wm_internal()->CreateWindowManagerForViewManagerClient( | 559 connection_manager_->wm_internal()->CreateWindowManagerForViewManagerClient( |
571 id_, pipe.handle1.Pass()); | 560 id_, pipe.handle1.Pass()); |
572 client()->OnEmbed(id_, | 561 client()->OnEmbed(id_, |
573 creator_url_, | 562 creator_url_, |
574 ViewToViewData(to_send.front()), | 563 ViewToViewData(to_send.front()), |
575 service_provider_.Pass(), | 564 service_provider_.Pass(), |
576 pipe.handle0.Pass()); | 565 pipe.handle0.Pass()); |
577 } | 566 } |
578 | 567 |
579 const base::hash_set<Id>& | 568 bool ViewManagerServiceImpl::IsRootForAccessPolicy(const ViewId& id) const { |
580 ViewManagerServiceImpl::GetRootsForAccessPolicy() const { | 569 return IsRoot(id); |
581 return roots_; | |
582 } | 570 } |
583 | 571 |
584 bool ViewManagerServiceImpl::IsViewKnownForAccessPolicy( | 572 bool ViewManagerServiceImpl::IsViewKnownForAccessPolicy( |
585 const ServerView* view) const { | 573 const ServerView* view) const { |
586 return IsViewKnown(view); | 574 return IsViewKnown(view); |
587 } | 575 } |
588 | 576 |
589 bool ViewManagerServiceImpl::IsViewRootOfAnotherConnectionForAccessPolicy( | 577 bool ViewManagerServiceImpl::IsViewRootOfAnotherConnectionForAccessPolicy( |
590 const ServerView* view) const { | 578 const ServerView* view) const { |
591 ViewManagerServiceImpl* connection = | 579 ViewManagerServiceImpl* connection = |
592 connection_manager_->GetConnectionWithRoot(view->id()); | 580 connection_manager_->GetConnectionWithRoot(view->id()); |
593 return connection && connection != this; | 581 return connection && connection != this; |
594 } | 582 } |
595 | 583 |
596 } // namespace service | 584 } // namespace service |
597 } // namespace mojo | 585 } // namespace mojo |
OLD | NEW |