| Index: mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| index 2ae13781cbd808b6bc33e4f972ffd1f1cf6b4ca9..7d1d489ef51e0db3a7ee2b08152a66f68717cf57 100644
|
| --- a/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| +++ b/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
|
| @@ -5,7 +5,7 @@
|
| #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h"
|
|
|
| #include "base/bind.h"
|
| -#include "base/run_loop.h"
|
| +#include "base/message_loop/message_loop.h"
|
| #include "mojo/public/cpp/application/connect.h"
|
| #include "mojo/public/interfaces/service_provider/service_provider.mojom.h"
|
| #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
|
| @@ -108,7 +108,9 @@ class ViewManagerTransaction {
|
| // Node bounds.
|
| TYPE_SET_BOUNDS,
|
| // View contents
|
| - TYPE_SET_VIEW_CONTENTS
|
| + TYPE_SET_VIEW_CONTENTS,
|
| + // Embed.
|
| + TYPE_EMBED
|
| };
|
|
|
| ViewManagerTransaction(TransactionType transaction_type,
|
| @@ -125,7 +127,7 @@ class ViewManagerTransaction {
|
| // service.
|
| virtual void DoActionCompleted(bool success) = 0;
|
|
|
| - IViewManager* service() { return synchronizer_->service_.get(); }
|
| + IViewManager* service() { return synchronizer_->service_; }
|
|
|
| TransportChangeId GetAndAdvanceNextServerChangeId() {
|
| return synchronizer_->next_server_change_id_++;
|
| @@ -405,26 +407,42 @@ class SetViewContentsTransaction : public ViewManagerTransaction {
|
| DISALLOW_COPY_AND_ASSIGN(SetViewContentsTransaction);
|
| };
|
|
|
| +class EmbedTransaction : public ViewManagerTransaction {
|
| + public:
|
| + EmbedTransaction(const String& url,
|
| + TransportNodeId node_id,
|
| + ViewManagerSynchronizer* synchronizer)
|
| + : ViewManagerTransaction(TYPE_EMBED, synchronizer),
|
| + url_(url),
|
| + node_id_(node_id) {}
|
| + virtual ~EmbedTransaction() {}
|
| +
|
| + private:
|
| + // Overridden from ViewManagerTransaction:
|
| + virtual void DoCommit() OVERRIDE {
|
| + std::vector<TransportNodeId> ids;
|
| + ids.push_back(node_id_);
|
| + service()->Connect(url_, Array<TransportNodeId>::From(ids),
|
| + ActionCompletedCallback());
|
| + }
|
| + virtual void DoActionCompleted(bool success) OVERRIDE {
|
| + // TODO(beng): recovery?
|
| + }
|
| +
|
| + const String url_;
|
| + const TransportNodeId node_id_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(EmbedTransaction);
|
| +};
|
| +
|
| ViewManagerSynchronizer::ViewManagerSynchronizer(ViewManager* view_manager)
|
| : view_manager_(view_manager),
|
| connected_(false),
|
| connection_id_(0),
|
| next_id_(1),
|
| next_server_change_id_(0),
|
| - sync_factory_(this),
|
| - init_loop_(NULL) {
|
| - ConnectToService(
|
| - ViewManagerPrivate(view_manager_).service_provider(),
|
| - "mojo:mojo_view_manager",
|
| - &service_);
|
| - service_.set_client(this);
|
| -
|
| - // Start a runloop. This loop is quit when the server tells us about the
|
| - // connection (OnConnectionEstablished()).
|
| - base::RunLoop loop;
|
| - init_loop_ = &loop;
|
| - init_loop_->Run();
|
| - init_loop_ = NULL;
|
| + sync_factory_(this) {
|
| + ViewManagerPrivate(view_manager).set_synchronizer(this);
|
| }
|
|
|
| ViewManagerSynchronizer::~ViewManagerSynchronizer() {
|
| @@ -517,6 +535,20 @@ void ViewManagerSynchronizer::SetViewContents(TransportViewId view_id,
|
| Sync();
|
| }
|
|
|
| +void ViewManagerSynchronizer::Embed(const String& url,
|
| + TransportNodeId node_id) {
|
| + DCHECK(connected_);
|
| + pending_transactions_.push_back(new EmbedTransaction(url, node_id, this));
|
| + Sync();
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// ViewManagerSynchronizer, InterfaceImpl overrides:
|
| +
|
| +void ViewManagerSynchronizer::OnConnectionEstablished() {
|
| + service_ = client();
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // ViewManagerSynchronizer, IViewManagerClient implementation:
|
|
|
| @@ -528,12 +560,12 @@ void ViewManagerSynchronizer::OnViewManagerConnectionEstablished(
|
| connection_id_ = connection_id;
|
| next_server_change_id_ = next_server_change_id;
|
|
|
| - ViewManagerPrivate(view_manager_).set_root(
|
| - BuildNodeTree(view_manager_, nodes));
|
| - if (init_loop_)
|
| - init_loop_->Quit();
|
| + ViewManagerPrivate(view_manager()).set_root(
|
| + BuildNodeTree(view_manager(), nodes));
|
|
|
| Sync();
|
| +
|
| + base::MessageLoop::current()->Quit();
|
| }
|
|
|
| void ViewManagerSynchronizer::OnServerChangeIdAdvanced(
|
| @@ -544,7 +576,7 @@ void ViewManagerSynchronizer::OnServerChangeIdAdvanced(
|
| void ViewManagerSynchronizer::OnNodeBoundsChanged(uint32 node_id,
|
| RectPtr old_bounds,
|
| RectPtr new_bounds) {
|
| - ViewTreeNode* node = view_manager_->GetNodeById(node_id);
|
| + ViewTreeNode* node = view_manager()->GetNodeById(node_id);
|
| ViewTreeNodePrivate(node).LocalSetBounds(old_bounds.To<gfx::Rect>(),
|
| new_bounds.To<gfx::Rect>());
|
| }
|
| @@ -558,11 +590,11 @@ void ViewManagerSynchronizer::OnNodeHierarchyChanged(
|
| // TODO: deal with |nodes|.
|
| next_server_change_id_ = server_change_id + 1;
|
|
|
| - BuildNodeTree(view_manager_, nodes);
|
| + BuildNodeTree(view_manager(), nodes);
|
|
|
| - ViewTreeNode* new_parent = view_manager_->GetNodeById(new_parent_id);
|
| - ViewTreeNode* old_parent = view_manager_->GetNodeById(old_parent_id);
|
| - ViewTreeNode* node = view_manager_->GetNodeById(node_id);
|
| + ViewTreeNode* new_parent = view_manager()->GetNodeById(new_parent_id);
|
| + ViewTreeNode* old_parent = view_manager()->GetNodeById(old_parent_id);
|
| + ViewTreeNode* node = view_manager()->GetNodeById(node_id);
|
| if (new_parent)
|
| ViewTreeNodePrivate(new_parent).LocalAddChild(node);
|
| else
|
| @@ -573,7 +605,7 @@ void ViewManagerSynchronizer::OnNodeDeleted(uint32_t node_id,
|
| uint32_t server_change_id) {
|
| next_server_change_id_ = server_change_id + 1;
|
|
|
| - ViewTreeNode* node = view_manager_->GetNodeById(node_id);
|
| + ViewTreeNode* node = view_manager()->GetNodeById(node_id);
|
| if (node)
|
| ViewTreeNodePrivate(node).LocalDestroy();
|
| }
|
| @@ -581,24 +613,24 @@ void ViewManagerSynchronizer::OnNodeDeleted(uint32_t node_id,
|
| void ViewManagerSynchronizer::OnNodeViewReplaced(uint32_t node_id,
|
| uint32_t new_view_id,
|
| uint32_t old_view_id) {
|
| - ViewTreeNode* node = view_manager_->GetNodeById(node_id);
|
| - View* new_view = view_manager_->GetViewById(new_view_id);
|
| + ViewTreeNode* node = view_manager()->GetNodeById(node_id);
|
| + View* new_view = view_manager()->GetViewById(new_view_id);
|
| if (!new_view && new_view_id != 0) {
|
| // This client wasn't aware of this View until now.
|
| new_view = ViewPrivate::LocalCreate();
|
| ViewPrivate private_view(new_view);
|
| - private_view.set_view_manager(view_manager_);
|
| + private_view.set_view_manager(view_manager());
|
| private_view.set_id(new_view_id);
|
| private_view.set_node(node);
|
| - ViewManagerPrivate(view_manager_).AddView(new_view->id(), new_view);
|
| + ViewManagerPrivate(view_manager()).AddView(new_view->id(), new_view);
|
| }
|
| - View* old_view = view_manager_->GetViewById(old_view_id);
|
| + View* old_view = view_manager()->GetViewById(old_view_id);
|
| DCHECK_EQ(old_view, node->active_view());
|
| ViewTreeNodePrivate(node).LocalSetActiveView(new_view);
|
| }
|
|
|
| void ViewManagerSynchronizer::OnViewDeleted(uint32_t view_id) {
|
| - View* view = view_manager_->GetViewById(view_id);
|
| + View* view = view_manager()->GetViewById(view_id);
|
| if (view)
|
| ViewPrivate(view).LocalDestroy();
|
| }
|
|
|