| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "services/ui/view_manager/view_registry.h" | 5 #include "services/ui/view_manager/view_registry.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 void ViewRegistry::ConnectToViewService( | 271 void ViewRegistry::ConnectToViewService( |
| 272 ViewState* view_state, | 272 ViewState* view_state, |
| 273 const mojo::String& service_name, | 273 const mojo::String& service_name, |
| 274 mojo::ScopedMessagePipeHandle client_handle) { | 274 mojo::ScopedMessagePipeHandle client_handle) { |
| 275 DCHECK(IsViewStateRegisteredDebug(view_state)); | 275 DCHECK(IsViewStateRegisteredDebug(view_state)); |
| 276 | 276 |
| 277 associate_table_.ConnectToViewService(view_state->view_token()->Clone(), | 277 associate_table_.ConnectToViewService(view_state->view_token()->Clone(), |
| 278 service_name, client_handle.Pass()); | 278 service_name, client_handle.Pass()); |
| 279 } | 279 } |
| 280 | 280 |
| 281 void ViewRegistry::SetRenderer(ViewTreeState* tree_state, |
| 282 mojo::gfx::composition::RendererPtr renderer) { |
| 283 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| 284 DVLOG(1) << "SetRenderer"; |
| 285 |
| 286 if (renderer) { |
| 287 renderer.set_connection_error_handler( |
| 288 base::Bind(&ViewRegistry::OnRendererDied, base::Unretained(this), |
| 289 base::Unretained(tree_state))); |
| 290 } |
| 291 |
| 292 tree_state->set_renderer(renderer.Pass()); |
| 293 UpdateViewTreeRootScene(tree_state); |
| 294 } |
| 295 |
| 281 void ViewRegistry::RequestLayout(ViewTreeState* tree_state) { | 296 void ViewRegistry::RequestLayout(ViewTreeState* tree_state) { |
| 282 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); | 297 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| 283 DVLOG(1) << "RequestLayout: tree=" << tree_state; | 298 DVLOG(1) << "RequestLayout: tree=" << tree_state; |
| 284 | 299 |
| 285 InvalidateLayoutForRoot(tree_state); | 300 InvalidateLayoutForRoot(tree_state); |
| 286 } | 301 } |
| 287 | 302 |
| 288 void ViewRegistry::SetRoot( | 303 void ViewRegistry::SetRoot( |
| 289 ViewTreeState* tree_state, | 304 ViewTreeState* tree_state, |
| 290 uint32_t root_key, | 305 uint32_t root_key, |
| 291 mojo::InterfaceHandle<mojo::ui::ViewOwner> root_view_owner) { | 306 mojo::InterfaceHandle<mojo::ui::ViewOwner> root_view_owner) { |
| 292 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); | 307 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| 293 DCHECK(root_view_owner); | 308 DCHECK(root_view_owner); |
| 294 DVLOG(1) << "SetRoot: tree=" << tree_state << ", root_key=" << root_key; | 309 DVLOG(1) << "SetRoot: tree=" << tree_state << ", root_key=" << root_key; |
| 295 | 310 |
| 296 // Ensure there isn't already a root. | 311 // Ensure there isn't already a root. |
| 297 if (tree_state->root()) { | 312 if (tree_state->root()) { |
| 298 LOG(ERROR) | 313 LOG(ERROR) |
| 299 << "View tree attempted to set the root while one is already set: tree=" | 314 << "View tree attempted to set the root while one is already set: tree=" |
| 300 << tree_state << ", root_key=" << root_key; | 315 << tree_state << ", root_key=" << root_key; |
| 301 UnregisterViewTree(tree_state); | 316 UnregisterViewTree(tree_state); |
| 302 return; | 317 return; |
| 303 } | 318 } |
| 304 | 319 |
| 305 // Set the root to a stub, pending resolution of the view owner. | 320 // Set the root to a stub, pending resolution of the view owner. |
| 306 tree_state->LinkRoot(root_key, std::unique_ptr<ViewStub>(new ViewStub( | 321 tree_state->LinkRoot(root_key, std::unique_ptr<ViewStub>(new ViewStub( |
| 307 this, root_view_owner.Pass()))); | 322 this, root_view_owner.Pass()))); |
| 323 UpdateViewTreeRootScene(tree_state); |
| 308 | 324 |
| 309 // Schedule layout of the tree on behalf of its newly added root. | 325 // Schedule layout of the tree on behalf of its newly added root. |
| 310 // We don't need to schedule layout of the root until the tree provides | 326 // We don't need to schedule layout of the root until the tree provides |
| 311 // new layout parameters. | 327 // new layout parameters. |
| 312 InvalidateLayoutForRoot(tree_state); | 328 InvalidateLayoutForRoot(tree_state); |
| 313 } | 329 } |
| 314 | 330 |
| 315 void ViewRegistry::ResetRoot(ViewTreeState* tree_state, | 331 void ViewRegistry::ResetRoot(ViewTreeState* tree_state, |
| 316 mojo::InterfaceRequest<mojo::ui::ViewOwner> | 332 mojo::InterfaceRequest<mojo::ui::ViewOwner> |
| 317 transferred_view_owner_request) { | 333 transferred_view_owner_request) { |
| 318 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); | 334 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| 319 DVLOG(1) << "ResetRoot: tree=" << tree_state; | 335 DVLOG(1) << "ResetRoot: tree=" << tree_state; |
| 320 | 336 |
| 321 // Ensure there is a root. | 337 // Ensure there is a root. |
| 322 if (!tree_state->root()) { | 338 if (!tree_state->root()) { |
| 323 LOG(ERROR) | 339 LOG(ERROR) |
| 324 << "View tree attempted to reset the root but there is none: tree=" | 340 << "View tree attempted to reset the root but there is none: tree=" |
| 325 << tree_state; | 341 << tree_state; |
| 326 UnregisterViewTree(tree_state); | 342 UnregisterViewTree(tree_state); |
| 327 return; | 343 return; |
| 328 } | 344 } |
| 329 | 345 |
| 330 // Unlink the root from its tree. | 346 // Unlink the root from its tree. |
| 331 TransferOrUnregisterViewStub(tree_state->UnlinkRoot(), | 347 TransferOrUnregisterViewStub(tree_state->UnlinkRoot(), |
| 332 transferred_view_owner_request.Pass()); | 348 transferred_view_owner_request.Pass()); |
| 349 UpdateViewTreeRootScene(tree_state); |
| 333 | 350 |
| 334 // Note: We don't need to schedule layout for the root since it will retain | 351 // Note: We don't need to schedule layout for the root since it will retain |
| 335 // its old layout parameters. And there's no need to tell the tree | 352 // its old layout parameters. And there's no need to tell the tree |
| 336 // either since it won't have any work to do. So we're done. | 353 // either since it won't have any work to do. So we're done. |
| 337 } | 354 } |
| 338 | 355 |
| 339 void ViewRegistry::LayoutRoot(ViewTreeState* tree_state, | 356 void ViewRegistry::LayoutRoot(ViewTreeState* tree_state, |
| 340 mojo::ui::ViewLayoutParamsPtr root_layout_params, | 357 mojo::ui::ViewLayoutParamsPtr root_layout_params, |
| 341 const ViewLayoutCallback& callback) { | 358 const ViewLayoutCallback& callback) { |
| 342 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); | 359 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 | 678 |
| 662 if (recurse && view_state->view_stub()) { | 679 if (recurse && view_state->view_stub()) { |
| 663 if (view_state->view_stub()->parent()) { | 680 if (view_state->view_stub()->parent()) { |
| 664 InvalidateLayoutForChild(view_state->view_stub()->parent(), | 681 InvalidateLayoutForChild(view_state->view_stub()->parent(), |
| 665 view_state->view_stub()->key()); | 682 view_state->view_stub()->key()); |
| 666 } else if (view_state->view_stub()->tree()) { | 683 } else if (view_state->view_stub()->tree()) { |
| 667 InvalidateLayoutForRoot(view_state->view_stub()->tree()); | 684 InvalidateLayoutForRoot(view_state->view_stub()->tree()); |
| 668 } | 685 } |
| 669 } | 686 } |
| 670 | 687 |
| 688 if (view_state->view_stub()->is_root_of_tree() && size_changed) |
| 689 UpdateViewTreeRootScene(view_state->view_stub()->tree()); |
| 690 |
| 671 IssueNextViewLayoutRequest(view_state); | 691 IssueNextViewLayoutRequest(view_state); |
| 672 } | 692 } |
| 673 | 693 |
| 674 void ViewRegistry::OnViewTreeLayoutResult( | 694 void ViewRegistry::OnViewTreeLayoutResult( |
| 675 base::WeakPtr<ViewTreeState> tree_state_weak) { | 695 base::WeakPtr<ViewTreeState> tree_state_weak) { |
| 676 ViewTreeState* tree_state = tree_state_weak.get(); | 696 ViewTreeState* tree_state = tree_state_weak.get(); |
| 677 if (tree_state) { | 697 if (tree_state) { |
| 678 DCHECK(tree_state->layout_request_issued()); | 698 DCHECK(tree_state->layout_request_issued()); |
| 679 | 699 |
| 680 DVLOG(1) << "OnViewTreeLayoutResult"; | 700 DVLOG(1) << "OnViewTreeLayoutResult"; |
| 681 | 701 |
| 682 tree_state->set_layout_request_issued(false); | 702 tree_state->set_layout_request_issued(false); |
| 683 IssueNextViewTreeLayoutRequest(tree_state); | 703 IssueNextViewTreeLayoutRequest(tree_state); |
| 684 } | 704 } |
| 685 } | 705 } |
| 686 | 706 |
| 707 void ViewRegistry::UpdateViewTreeRootScene(ViewTreeState* tree_state) { |
| 708 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| 709 DVLOG(1) << "UpdateViewTreeRootScene: tree_state=" << tree_state; |
| 710 |
| 711 if (!tree_state->renderer()) |
| 712 return; |
| 713 |
| 714 if (tree_state->root()) { |
| 715 ViewState* root_state = tree_state->root()->state(); |
| 716 if (root_state && root_state->scene_token() && |
| 717 root_state->layout_result()) { |
| 718 // TODO(jeffbrown): Take the scene version from the layout parameters |
| 719 // once we've figured out that part of the layout protocol. |
| 720 mojo::Rect viewport; |
| 721 viewport.width = root_state->layout_result()->size->width; |
| 722 viewport.height = root_state->layout_result()->size->height; |
| 723 tree_state->renderer()->SetRootScene( |
| 724 tree_state->root()->state()->scene_token()->Clone(), |
| 725 mojo::gfx::composition::kSceneVersionNone, viewport.Clone()); |
| 726 return; |
| 727 } |
| 728 } |
| 729 |
| 730 tree_state->renderer()->ResetRootScene(); |
| 731 } |
| 732 |
| 733 void ViewRegistry::OnRendererDied(ViewTreeState* tree_state) { |
| 734 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| 735 DVLOG(1) << "UpdateViewTreeRootScene: tree_state=" << tree_state; |
| 736 |
| 737 tree_state->set_renderer(nullptr); |
| 738 SendRendererDied(tree_state); |
| 739 } |
| 740 |
| 687 void ViewRegistry::SendChildUnavailable(ViewState* parent_state, | 741 void ViewRegistry::SendChildUnavailable(ViewState* parent_state, |
| 688 uint32_t child_key) { | 742 uint32_t child_key) { |
| 689 DCHECK(IsViewStateRegisteredDebug(parent_state)); | 743 DCHECK(IsViewStateRegisteredDebug(parent_state)); |
| 690 | 744 |
| 691 // TODO: Detect ANRs | 745 // TODO: Detect ANRs |
| 692 DVLOG(1) << "SendChildUnavailable: parent_state=" << parent_state | 746 DVLOG(1) << "SendChildUnavailable: parent_state=" << parent_state |
| 693 << ", child_key=" << child_key; | 747 << ", child_key=" << child_key; |
| 694 parent_state->view_listener()->OnChildUnavailable( | 748 parent_state->view_listener()->OnChildUnavailable( |
| 695 child_key, base::Bind(&base::DoNothing)); | 749 child_key, base::Bind(&base::DoNothing)); |
| 696 } | 750 } |
| 697 | 751 |
| 698 void ViewRegistry::SendRootUnavailable(ViewTreeState* tree_state, | 752 void ViewRegistry::SendRootUnavailable(ViewTreeState* tree_state, |
| 699 uint32_t root_key) { | 753 uint32_t root_key) { |
| 700 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); | 754 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| 701 | 755 |
| 702 // TODO: Detect ANRs | 756 // TODO: Detect ANRs |
| 703 DVLOG(1) << "SendRootUnavailable: tree_state=" << tree_state | 757 DVLOG(1) << "SendRootUnavailable: tree_state=" << tree_state |
| 704 << ", root_key=" << root_key; | 758 << ", root_key=" << root_key; |
| 705 tree_state->view_tree_listener()->OnRootUnavailable( | 759 tree_state->view_tree_listener()->OnRootUnavailable( |
| 706 root_key, base::Bind(&base::DoNothing)); | 760 root_key, base::Bind(&base::DoNothing)); |
| 707 } | 761 } |
| 708 | 762 |
| 763 void ViewRegistry::SendRendererDied(ViewTreeState* tree_state) { |
| 764 DCHECK(IsViewTreeStateRegisteredDebug(tree_state)); |
| 765 |
| 766 // TODO: Detect ANRs |
| 767 DVLOG(1) << "SendRendererDied: tree_state=" << tree_state; |
| 768 tree_state->view_tree_listener()->OnRendererDied( |
| 769 base::Bind(&base::DoNothing)); |
| 770 } |
| 771 |
| 709 } // namespace view_manager | 772 } // namespace view_manager |
| OLD | NEW |