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

Side by Side Diff: services/ui/view_manager/view_registry.cc

Issue 1775143004: Mozart: Directly associate the renderer with the view tree. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-1
Patch Set: Created 4 years, 9 months 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 unified diff | Download patch
« no previous file with comments | « services/ui/view_manager/view_registry.h ('k') | services/ui/view_manager/view_stub.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « services/ui/view_manager/view_registry.h ('k') | services/ui/view_manager/view_stub.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698