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

Side by Side Diff: mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc

Issue 303163005: Embedding demo in View manager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 6 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 | Annotate | Revision Log
OLDNEW
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/public/cpp/view_manager/lib/view_manager_synchronizer.h" 5 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/run_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "mojo/public/cpp/application/connect.h" 9 #include "mojo/public/cpp/application/connect.h"
10 #include "mojo/public/interfaces/service_provider/service_provider.mojom.h" 10 #include "mojo/public/interfaces/service_provider/service_provider.mojom.h"
11 #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h" 11 #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
12 #include "mojo/services/public/cpp/view_manager/lib/view_private.h" 12 #include "mojo/services/public/cpp/view_manager/lib/view_private.h"
13 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h" 13 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h"
14 #include "mojo/services/public/cpp/view_manager/util.h" 14 #include "mojo/services/public/cpp/view_manager/util.h"
15 #include "third_party/skia/include/core/SkBitmap.h" 15 #include "third_party/skia/include/core/SkBitmap.h"
16 #include "ui/gfx/codec/png_codec.h" 16 #include "ui/gfx/codec/png_codec.h"
17 17
18 namespace mojo { 18 namespace mojo {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 TYPE_CREATE_VIEW_TREE_NODE, 101 TYPE_CREATE_VIEW_TREE_NODE,
102 TYPE_DESTROY_VIEW_TREE_NODE, 102 TYPE_DESTROY_VIEW_TREE_NODE,
103 // Modifications to the hierarchy (addition of or removal of nodes from a 103 // Modifications to the hierarchy (addition of or removal of nodes from a
104 // parent.) 104 // parent.)
105 TYPE_HIERARCHY, 105 TYPE_HIERARCHY,
106 // View replacement. 106 // View replacement.
107 TYPE_SET_ACTIVE_VIEW, 107 TYPE_SET_ACTIVE_VIEW,
108 // Node bounds. 108 // Node bounds.
109 TYPE_SET_BOUNDS, 109 TYPE_SET_BOUNDS,
110 // View contents 110 // View contents
111 TYPE_SET_VIEW_CONTENTS 111 TYPE_SET_VIEW_CONTENTS,
112 // Embed.
113 TYPE_EMBED
112 }; 114 };
113 115
114 ViewManagerTransaction(TransactionType transaction_type, 116 ViewManagerTransaction(TransactionType transaction_type,
115 ViewManagerSynchronizer* synchronizer) 117 ViewManagerSynchronizer* synchronizer)
116 : transaction_type_(transaction_type), 118 : transaction_type_(transaction_type),
117 committed_(false), 119 committed_(false),
118 synchronizer_(synchronizer) { 120 synchronizer_(synchronizer) {
119 } 121 }
120 122
121 // Overridden to perform transaction-specific commit actions. 123 // Overridden to perform transaction-specific commit actions.
122 virtual void DoCommit() = 0; 124 virtual void DoCommit() = 0;
123 125
124 // Overridden to perform transaction-specific cleanup on commit ack from the 126 // Overridden to perform transaction-specific cleanup on commit ack from the
125 // service. 127 // service.
126 virtual void DoActionCompleted(bool success) = 0; 128 virtual void DoActionCompleted(bool success) = 0;
127 129
128 IViewManager* service() { return synchronizer_->service_.get(); } 130 IViewManager* service() { return synchronizer_->service_; }
129 131
130 TransportChangeId GetAndAdvanceNextServerChangeId() { 132 TransportChangeId GetAndAdvanceNextServerChangeId() {
131 return synchronizer_->next_server_change_id_++; 133 return synchronizer_->next_server_change_id_++;
132 } 134 }
133 135
134 base::Callback<void(bool)> ActionCompletedCallback() { 136 base::Callback<void(bool)> ActionCompletedCallback() {
135 return base::Bind(&ViewManagerTransaction::OnActionCompleted, 137 return base::Bind(&ViewManagerTransaction::OnActionCompleted,
136 base::Unretained(this)); 138 base::Unretained(this));
137 } 139 }
138 140
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 return true; 400 return true;
399 } 401 }
400 402
401 const TransportViewId view_id_; 403 const TransportViewId view_id_;
402 const SkBitmap contents_; 404 const SkBitmap contents_;
403 ScopedSharedBufferHandle shared_state_handle_; 405 ScopedSharedBufferHandle shared_state_handle_;
404 406
405 DISALLOW_COPY_AND_ASSIGN(SetViewContentsTransaction); 407 DISALLOW_COPY_AND_ASSIGN(SetViewContentsTransaction);
406 }; 408 };
407 409
410 class EmbedTransaction : public ViewManagerTransaction {
411 public:
412 EmbedTransaction(const String& url,
413 TransportNodeId node_id,
414 ViewManagerSynchronizer* synchronizer)
415 : ViewManagerTransaction(TYPE_EMBED, synchronizer),
416 url_(url),
417 node_id_(node_id) {}
418 virtual ~EmbedTransaction() {}
419
420 private:
421 // Overridden from ViewManagerTransaction:
422 virtual void DoCommit() OVERRIDE {
423 std::vector<TransportNodeId> ids;
424 ids.push_back(node_id_);
425 service()->Connect(url_, Array<TransportNodeId>::From(ids),
426 ActionCompletedCallback());
427 }
428 virtual void DoActionCompleted(bool success) OVERRIDE {
429 // TODO(beng): recovery?
430 }
431
432 const String url_;
433 const TransportNodeId node_id_;
434
435 DISALLOW_COPY_AND_ASSIGN(EmbedTransaction);
436 };
437
408 ViewManagerSynchronizer::ViewManagerSynchronizer(ViewManager* view_manager) 438 ViewManagerSynchronizer::ViewManagerSynchronizer(ViewManager* view_manager)
409 : view_manager_(view_manager), 439 : view_manager_(view_manager),
410 connected_(false), 440 connected_(false),
411 connection_id_(0), 441 connection_id_(0),
412 next_id_(1), 442 next_id_(1),
413 next_server_change_id_(0), 443 next_server_change_id_(0),
414 sync_factory_(this), 444 sync_factory_(this) {
415 init_loop_(NULL) { 445 ViewManagerPrivate(view_manager).set_synchronizer(this);
416 ConnectToService(
417 ViewManagerPrivate(view_manager_).service_provider(),
418 "mojo:mojo_view_manager",
419 &service_);
420 service_.set_client(this);
421
422 // Start a runloop. This loop is quit when the server tells us about the
423 // connection (OnConnectionEstablished()).
424 base::RunLoop loop;
425 init_loop_ = &loop;
426 init_loop_->Run();
427 init_loop_ = NULL;
428 } 446 }
429 447
430 ViewManagerSynchronizer::~ViewManagerSynchronizer() { 448 ViewManagerSynchronizer::~ViewManagerSynchronizer() {
431 Sync(); 449 Sync();
432 } 450 }
433 451
434 TransportNodeId ViewManagerSynchronizer::CreateViewTreeNode() { 452 TransportNodeId ViewManagerSynchronizer::CreateViewTreeNode() {
435 DCHECK(connected_); 453 DCHECK(connected_);
436 const TransportNodeId node_id( 454 const TransportNodeId node_id(
437 MakeTransportId(connection_id_, ++next_id_)); 455 MakeTransportId(connection_id_, ++next_id_));
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 } 528 }
511 529
512 void ViewManagerSynchronizer::SetViewContents(TransportViewId view_id, 530 void ViewManagerSynchronizer::SetViewContents(TransportViewId view_id,
513 const SkBitmap& contents) { 531 const SkBitmap& contents) {
514 DCHECK(connected_); 532 DCHECK(connected_);
515 pending_transactions_.push_back( 533 pending_transactions_.push_back(
516 new SetViewContentsTransaction(view_id, contents, this)); 534 new SetViewContentsTransaction(view_id, contents, this));
517 Sync(); 535 Sync();
518 } 536 }
519 537
538 void ViewManagerSynchronizer::Embed(const String& url,
539 TransportNodeId node_id) {
540 DCHECK(connected_);
541 pending_transactions_.push_back(new EmbedTransaction(url, node_id, this));
542 Sync();
543 }
544
545 ////////////////////////////////////////////////////////////////////////////////
546 // ViewManagerSynchronizer, InterfaceImpl overrides:
547
548 void ViewManagerSynchronizer::OnConnectionEstablished() {
549 service_ = client();
550 }
551
520 //////////////////////////////////////////////////////////////////////////////// 552 ////////////////////////////////////////////////////////////////////////////////
521 // ViewManagerSynchronizer, IViewManagerClient implementation: 553 // ViewManagerSynchronizer, IViewManagerClient implementation:
522 554
523 void ViewManagerSynchronizer::OnViewManagerConnectionEstablished( 555 void ViewManagerSynchronizer::OnViewManagerConnectionEstablished(
524 TransportConnectionId connection_id, 556 TransportConnectionId connection_id,
525 TransportChangeId next_server_change_id, 557 TransportChangeId next_server_change_id,
526 mojo::Array<INodePtr> nodes) { 558 mojo::Array<INodePtr> nodes) {
527 connected_ = true; 559 connected_ = true;
528 connection_id_ = connection_id; 560 connection_id_ = connection_id;
529 next_server_change_id_ = next_server_change_id; 561 next_server_change_id_ = next_server_change_id;
530 562
531 ViewManagerPrivate(view_manager_).set_root( 563 ViewManagerPrivate(view_manager()).set_root(
532 BuildNodeTree(view_manager_, nodes)); 564 BuildNodeTree(view_manager(), nodes));
533 if (init_loop_)
534 init_loop_->Quit();
535 565
536 Sync(); 566 Sync();
567
568 base::MessageLoop::current()->Quit();
537 } 569 }
538 570
539 void ViewManagerSynchronizer::OnServerChangeIdAdvanced( 571 void ViewManagerSynchronizer::OnServerChangeIdAdvanced(
540 uint32_t next_server_change_id) { 572 uint32_t next_server_change_id) {
541 next_server_change_id_ = next_server_change_id; 573 next_server_change_id_ = next_server_change_id;
542 } 574 }
543 575
544 void ViewManagerSynchronizer::OnNodeBoundsChanged(uint32 node_id, 576 void ViewManagerSynchronizer::OnNodeBoundsChanged(uint32 node_id,
545 RectPtr old_bounds, 577 RectPtr old_bounds,
546 RectPtr new_bounds) { 578 RectPtr new_bounds) {
547 ViewTreeNode* node = view_manager_->GetNodeById(node_id); 579 ViewTreeNode* node = view_manager()->GetNodeById(node_id);
548 ViewTreeNodePrivate(node).LocalSetBounds(old_bounds.To<gfx::Rect>(), 580 ViewTreeNodePrivate(node).LocalSetBounds(old_bounds.To<gfx::Rect>(),
549 new_bounds.To<gfx::Rect>()); 581 new_bounds.To<gfx::Rect>());
550 } 582 }
551 583
552 void ViewManagerSynchronizer::OnNodeHierarchyChanged( 584 void ViewManagerSynchronizer::OnNodeHierarchyChanged(
553 uint32_t node_id, 585 uint32_t node_id,
554 uint32_t new_parent_id, 586 uint32_t new_parent_id,
555 uint32_t old_parent_id, 587 uint32_t old_parent_id,
556 TransportChangeId server_change_id, 588 TransportChangeId server_change_id,
557 mojo::Array<INodePtr> nodes) { 589 mojo::Array<INodePtr> nodes) {
558 // TODO: deal with |nodes|. 590 // TODO: deal with |nodes|.
559 next_server_change_id_ = server_change_id + 1; 591 next_server_change_id_ = server_change_id + 1;
560 592
561 BuildNodeTree(view_manager_, nodes); 593 BuildNodeTree(view_manager(), nodes);
562 594
563 ViewTreeNode* new_parent = view_manager_->GetNodeById(new_parent_id); 595 ViewTreeNode* new_parent = view_manager()->GetNodeById(new_parent_id);
564 ViewTreeNode* old_parent = view_manager_->GetNodeById(old_parent_id); 596 ViewTreeNode* old_parent = view_manager()->GetNodeById(old_parent_id);
565 ViewTreeNode* node = view_manager_->GetNodeById(node_id); 597 ViewTreeNode* node = view_manager()->GetNodeById(node_id);
566 if (new_parent) 598 if (new_parent)
567 ViewTreeNodePrivate(new_parent).LocalAddChild(node); 599 ViewTreeNodePrivate(new_parent).LocalAddChild(node);
568 else 600 else
569 ViewTreeNodePrivate(old_parent).LocalRemoveChild(node); 601 ViewTreeNodePrivate(old_parent).LocalRemoveChild(node);
570 } 602 }
571 603
572 void ViewManagerSynchronizer::OnNodeDeleted(uint32_t node_id, 604 void ViewManagerSynchronizer::OnNodeDeleted(uint32_t node_id,
573 uint32_t server_change_id) { 605 uint32_t server_change_id) {
574 next_server_change_id_ = server_change_id + 1; 606 next_server_change_id_ = server_change_id + 1;
575 607
576 ViewTreeNode* node = view_manager_->GetNodeById(node_id); 608 ViewTreeNode* node = view_manager()->GetNodeById(node_id);
577 if (node) 609 if (node)
578 ViewTreeNodePrivate(node).LocalDestroy(); 610 ViewTreeNodePrivate(node).LocalDestroy();
579 } 611 }
580 612
581 void ViewManagerSynchronizer::OnNodeViewReplaced(uint32_t node_id, 613 void ViewManagerSynchronizer::OnNodeViewReplaced(uint32_t node_id,
582 uint32_t new_view_id, 614 uint32_t new_view_id,
583 uint32_t old_view_id) { 615 uint32_t old_view_id) {
584 ViewTreeNode* node = view_manager_->GetNodeById(node_id); 616 ViewTreeNode* node = view_manager()->GetNodeById(node_id);
585 View* new_view = view_manager_->GetViewById(new_view_id); 617 View* new_view = view_manager()->GetViewById(new_view_id);
586 if (!new_view && new_view_id != 0) { 618 if (!new_view && new_view_id != 0) {
587 // This client wasn't aware of this View until now. 619 // This client wasn't aware of this View until now.
588 new_view = ViewPrivate::LocalCreate(); 620 new_view = ViewPrivate::LocalCreate();
589 ViewPrivate private_view(new_view); 621 ViewPrivate private_view(new_view);
590 private_view.set_view_manager(view_manager_); 622 private_view.set_view_manager(view_manager());
591 private_view.set_id(new_view_id); 623 private_view.set_id(new_view_id);
592 private_view.set_node(node); 624 private_view.set_node(node);
593 ViewManagerPrivate(view_manager_).AddView(new_view->id(), new_view); 625 ViewManagerPrivate(view_manager()).AddView(new_view->id(), new_view);
594 } 626 }
595 View* old_view = view_manager_->GetViewById(old_view_id); 627 View* old_view = view_manager()->GetViewById(old_view_id);
596 DCHECK_EQ(old_view, node->active_view()); 628 DCHECK_EQ(old_view, node->active_view());
597 ViewTreeNodePrivate(node).LocalSetActiveView(new_view); 629 ViewTreeNodePrivate(node).LocalSetActiveView(new_view);
598 } 630 }
599 631
600 void ViewManagerSynchronizer::OnViewDeleted(uint32_t view_id) { 632 void ViewManagerSynchronizer::OnViewDeleted(uint32_t view_id) {
601 View* view = view_manager_->GetViewById(view_id); 633 View* view = view_manager()->GetViewById(view_id);
602 if (view) 634 if (view)
603 ViewPrivate(view).LocalDestroy(); 635 ViewPrivate(view).LocalDestroy();
604 } 636 }
605 637
606 //////////////////////////////////////////////////////////////////////////////// 638 ////////////////////////////////////////////////////////////////////////////////
607 // ViewManagerSynchronizer, private: 639 // ViewManagerSynchronizer, private:
608 640
609 void ViewManagerSynchronizer::Sync() { 641 void ViewManagerSynchronizer::Sync() {
610 // The service connection may not be set up yet. OnConnectionEstablished() 642 // The service connection may not be set up yet. OnConnectionEstablished()
611 // will schedule another sync when it is. 643 // will schedule another sync when it is.
(...skipping 10 matching lines...) Expand all
622 void ViewManagerSynchronizer::RemoveFromPendingQueue( 654 void ViewManagerSynchronizer::RemoveFromPendingQueue(
623 ViewManagerTransaction* transaction) { 655 ViewManagerTransaction* transaction) {
624 DCHECK_EQ(transaction, pending_transactions_.front()); 656 DCHECK_EQ(transaction, pending_transactions_.front());
625 pending_transactions_.erase(pending_transactions_.begin()); 657 pending_transactions_.erase(pending_transactions_.begin());
626 if (pending_transactions_.empty() && !changes_acked_callback_.is_null()) 658 if (pending_transactions_.empty() && !changes_acked_callback_.is_null())
627 changes_acked_callback_.Run(); 659 changes_acked_callback_.Run();
628 } 660 }
629 661
630 } // namespace view_manager 662 } // namespace view_manager
631 } // namespace mojo 663 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698