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(); |
} |