Index: mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc |
diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc |
index 8aaec2f9181d375a7b5376eb10e3241373e83cf8..c9d634a70ca8d95d5bcefe81be5045fe5d02d452 100644 |
--- a/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc |
+++ b/mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc |
@@ -106,422 +106,28 @@ class RootObserver : public NodeObserver { |
DISALLOW_COPY_AND_ASSIGN(RootObserver); |
}; |
-class ViewManagerTransaction { |
- public: |
- virtual ~ViewManagerTransaction() {} |
- |
- void Commit() { |
- DCHECK(!committed_); |
- DoCommit(); |
- committed_ = true; |
- } |
- |
- bool committed() const { return committed_; } |
- |
- protected: |
- explicit ViewManagerTransaction(ViewManagerClientImpl* client) |
- : committed_(false), |
- client_(client) { |
- } |
- |
- // Overridden to perform transaction-specific commit actions. |
- virtual void DoCommit() = 0; |
- |
- // Overridden to perform transaction-specific cleanup on commit ack from the |
- // service. |
- virtual void DoActionCompleted(bool success) = 0; |
- |
- ViewManagerService* service() { return client_->service_; } |
- |
- // TODO(sky): nuke this and covert all to new one, then rename |
- // ActionCompletedCallbackWithErrorCode to ActionCompletedCallback. |
- base::Callback<void(bool)> ActionCompletedCallback() { |
- return base::Bind(&ViewManagerTransaction::OnActionCompleted, |
- base::Unretained(this)); |
- } |
- |
- base::Callback<void(ErrorCode)> ActionCompletedCallbackWithErrorCode() { |
- return base::Bind(&ViewManagerTransaction::OnActionCompletedWithErrorCode, |
- base::Unretained(this)); |
- } |
- |
- private: |
- // General callback to be used for commits to the service. |
- void OnActionCompleted(bool success) { |
- DoActionCompleted(success); |
- client_->RemoveFromPendingQueue(this); |
- } |
- |
- void OnActionCompletedWithErrorCode(ErrorCode error_code) { |
- DoActionCompleted(error_code == ERROR_CODE_NONE); |
- client_->RemoveFromPendingQueue(this); |
- } |
- |
- bool committed_; |
- ViewManagerClientImpl* client_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ViewManagerTransaction); |
-}; |
- |
-class CreateViewTransaction : public ViewManagerTransaction { |
- public: |
- CreateViewTransaction(Id view_id, ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- view_id_(view_id) {} |
- virtual ~CreateViewTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->CreateView(view_id_, ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): failure. |
- DCHECK(success); |
- } |
- |
- const Id view_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CreateViewTransaction); |
-}; |
- |
-class DestroyViewTransaction : public ViewManagerTransaction { |
- public: |
- DestroyViewTransaction(Id view_id, ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- view_id_(view_id) {} |
- virtual ~DestroyViewTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->DeleteView(view_id_, ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- DCHECK(success); |
- } |
- |
- const Id view_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DestroyViewTransaction); |
-}; |
- |
-class CreateNodeTransaction : public ViewManagerTransaction { |
- public: |
- CreateNodeTransaction(Id node_id, ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- node_id_(node_id) {} |
- virtual ~CreateNodeTransaction() {} |
+bool CreateMapAndDupSharedBuffer(size_t size, |
+ void** memory, |
+ ScopedSharedBufferHandle* handle, |
+ ScopedSharedBufferHandle* duped) { |
+ MojoResult result = CreateSharedBuffer(NULL, size, handle); |
+ if (result != MOJO_RESULT_OK) |
+ return false; |
+ DCHECK(handle->is_valid()); |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->CreateNode(node_id_, ActionCompletedCallbackWithErrorCode()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): Failure means we tried to create with an extant id for this |
- // connection. It also could mean we tried to do something |
- // invalid, or we tried applying a change out of order. Figure |
- // out what to do. |
- DCHECK(success); |
- } |
- |
- const Id node_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CreateNodeTransaction); |
-}; |
- |
-class DestroyNodeTransaction : public ViewManagerTransaction { |
- public: |
- DestroyNodeTransaction(Id node_id, ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- node_id_(node_id) {} |
- virtual ~DestroyNodeTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->DeleteNode(node_id_, ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- DCHECK(success); |
- } |
- |
- const Id node_id_; |
- DISALLOW_COPY_AND_ASSIGN(DestroyNodeTransaction); |
-}; |
- |
-class AddChildTransaction : public ViewManagerTransaction { |
- public: |
- AddChildTransaction(Id child_id, |
- Id parent_id, |
- ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- child_id_(child_id), |
- parent_id_(parent_id) {} |
- virtual ~AddChildTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->AddNode(parent_id_, child_id_, ActionCompletedCallback()); |
- } |
- |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- DCHECK(success); |
- } |
- |
- const Id child_id_; |
- const Id parent_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AddChildTransaction); |
-}; |
- |
-class RemoveChildTransaction : public ViewManagerTransaction { |
- public: |
- RemoveChildTransaction(Id child_id, ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- child_id_(child_id) {} |
- virtual ~RemoveChildTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->RemoveNodeFromParent(child_id_, ActionCompletedCallback()); |
- } |
- |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- DCHECK(success); |
- } |
- |
- const Id child_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(RemoveChildTransaction); |
-}; |
- |
-class ReorderNodeTransaction : public ViewManagerTransaction { |
- public: |
- ReorderNodeTransaction(Id node_id, |
- Id relative_id, |
- OrderDirection direction, |
- ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- node_id_(node_id), |
- relative_id_(relative_id), |
- direction_(direction) {} |
- virtual ~ReorderNodeTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->ReorderNode(node_id_, |
- relative_id_, |
- direction_, |
- ActionCompletedCallback()); |
- } |
- |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- DCHECK(success); |
- } |
+ result = DuplicateBuffer(handle->get(), NULL, duped); |
+ if (result != MOJO_RESULT_OK) |
+ return false; |
+ DCHECK(duped->is_valid()); |
- const Id node_id_; |
- const Id relative_id_; |
- const OrderDirection direction_; |
+ result = MapBuffer( |
+ handle->get(), 0, size, memory, MOJO_MAP_BUFFER_FLAG_NONE); |
+ if (result != MOJO_RESULT_OK) |
+ return false; |
+ DCHECK(*memory); |
- DISALLOW_COPY_AND_ASSIGN(ReorderNodeTransaction); |
-}; |
- |
-class SetActiveViewTransaction : public ViewManagerTransaction { |
- public: |
- SetActiveViewTransaction(Id node_id, |
- Id view_id, |
- ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- node_id_(node_id), |
- view_id_(view_id) {} |
- virtual ~SetActiveViewTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->SetView(node_id_, view_id_, ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- } |
- |
- const Id node_id_; |
- const Id view_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SetActiveViewTransaction); |
-}; |
- |
-class SetBoundsTransaction : public ViewManagerTransaction { |
- public: |
- SetBoundsTransaction(Id node_id, |
- const gfx::Rect& bounds, |
- ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- node_id_(node_id), |
- bounds_(bounds) {} |
- virtual ~SetBoundsTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->SetNodeBounds( |
- node_id_, Rect::From(bounds_), ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- } |
- |
- const Id node_id_; |
- const gfx::Rect bounds_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SetBoundsTransaction); |
-}; |
- |
-class SetViewContentsTransaction : public ViewManagerTransaction { |
- public: |
- SetViewContentsTransaction(Id view_id, |
- const SkBitmap& contents, |
- ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- view_id_(view_id), |
- contents_(contents) {} |
- virtual ~SetViewContentsTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- std::vector<unsigned char> data; |
- gfx::PNGCodec::EncodeBGRASkBitmap(contents_, false, &data); |
- |
- void* memory = NULL; |
- ScopedSharedBufferHandle duped; |
- bool result = CreateMapAndDupSharedBuffer(data.size(), |
- &memory, |
- &shared_state_handle_, |
- &duped); |
- if (!result) |
- return; |
- |
- memcpy(memory, &data[0], data.size()); |
- |
- service()->SetViewContents(view_id_, duped.Pass(), |
- static_cast<uint32_t>(data.size()), |
- ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- } |
- |
- bool CreateMapAndDupSharedBuffer(size_t size, |
- void** memory, |
- ScopedSharedBufferHandle* handle, |
- ScopedSharedBufferHandle* duped) { |
- MojoResult result = CreateSharedBuffer(NULL, size, handle); |
- if (result != MOJO_RESULT_OK) |
- return false; |
- DCHECK(handle->is_valid()); |
- |
- result = DuplicateBuffer(handle->get(), NULL, duped); |
- if (result != MOJO_RESULT_OK) |
- return false; |
- DCHECK(duped->is_valid()); |
- |
- result = MapBuffer( |
- handle->get(), 0, size, memory, MOJO_MAP_BUFFER_FLAG_NONE); |
- if (result != MOJO_RESULT_OK) |
- return false; |
- DCHECK(*memory); |
- |
- return true; |
- } |
- |
- const Id view_id_; |
- const SkBitmap contents_; |
- ScopedSharedBufferHandle shared_state_handle_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SetViewContentsTransaction); |
-}; |
- |
-class EmbedTransaction : public ViewManagerTransaction { |
- public: |
- EmbedTransaction(const String& url, |
- Id node_id, |
- ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- url_(url), |
- node_id_(node_id) {} |
- virtual ~EmbedTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->Embed(url_, node_id_, ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- } |
- |
- const String url_; |
- const Id node_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(EmbedTransaction); |
-}; |
- |
-class SetFocusTransaction : public ViewManagerTransaction { |
- public: |
- SetFocusTransaction(Id node_id, ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- node_id_(node_id) {} |
- virtual ~SetFocusTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->SetFocus(node_id_, ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- } |
- |
- const Id node_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SetFocusTransaction); |
-}; |
- |
-class SetVisibleTransaction : public ViewManagerTransaction { |
- public: |
- SetVisibleTransaction(Id node_id, |
- bool visible, |
- ViewManagerClientImpl* client) |
- : ViewManagerTransaction(client), |
- node_id_(node_id), |
- visible_(visible) {} |
- virtual ~SetVisibleTransaction() {} |
- |
- private: |
- // Overridden from ViewManagerTransaction: |
- virtual void DoCommit() OVERRIDE { |
- service()->SetNodeVisibility(node_id_, visible_, ActionCompletedCallback()); |
- } |
- virtual void DoActionCompleted(bool success) OVERRIDE { |
- // TODO(beng): recovery? |
- } |
- |
- const Id node_id_; |
- const bool visible_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SetVisibleTransaction); |
-}; |
+ return true; |
+} |
ViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate) |
: connected_(false), |
@@ -551,44 +157,36 @@ ViewManagerClientImpl::~ViewManagerClientImpl() { |
Id ViewManagerClientImpl::CreateNode() { |
DCHECK(connected_); |
- const Id node_id(MakeTransportId(connection_id_, ++next_id_)); |
- pending_transactions_.push_back(new CreateNodeTransaction(node_id, this)); |
- Sync(); |
+ const Id node_id = MakeTransportId(connection_id_, ++next_id_); |
+ service_->CreateNode(node_id, ActionCompletedCallbackWithErrorCode()); |
return node_id; |
} |
void ViewManagerClientImpl::DestroyNode(Id node_id) { |
DCHECK(connected_); |
- pending_transactions_.push_back(new DestroyNodeTransaction(node_id, this)); |
- Sync(); |
+ service_->DeleteNode(node_id, ActionCompletedCallback()); |
} |
Id ViewManagerClientImpl::CreateView() { |
DCHECK(connected_); |
- const Id view_id(MakeTransportId(connection_id_, ++next_id_)); |
- pending_transactions_.push_back(new CreateViewTransaction(view_id, this)); |
- Sync(); |
+ const Id view_id = MakeTransportId(connection_id_, ++next_id_); |
+ service_->CreateView(view_id, ActionCompletedCallback()); |
return view_id; |
} |
void ViewManagerClientImpl::DestroyView(Id view_id) { |
DCHECK(connected_); |
- pending_transactions_.push_back(new DestroyViewTransaction(view_id, this)); |
- Sync(); |
+ service_->DeleteView(view_id, ActionCompletedCallback()); |
} |
-void ViewManagerClientImpl::AddChild(Id child_id, |
- Id parent_id) { |
+void ViewManagerClientImpl::AddChild(Id child_id, Id parent_id) { |
DCHECK(connected_); |
- pending_transactions_.push_back( |
- new AddChildTransaction(child_id, parent_id, this)); |
- Sync(); |
+ service_->AddNode(parent_id, child_id, ActionCompletedCallback()); |
} |
void ViewManagerClientImpl::RemoveChild(Id child_id, Id parent_id) { |
DCHECK(connected_); |
- pending_transactions_.push_back(new RemoveChildTransaction(child_id, this)); |
- Sync(); |
+ service_->RemoveNodeFromParent(child_id, ActionCompletedCallback()); |
} |
void ViewManagerClientImpl::Reorder( |
@@ -596,9 +194,8 @@ void ViewManagerClientImpl::Reorder( |
Id relative_node_id, |
OrderDirection direction) { |
DCHECK(connected_); |
- pending_transactions_.push_back( |
- new ReorderNodeTransaction(node_id, relative_node_id, direction, this)); |
- Sync(); |
+ service_->ReorderNode(node_id, relative_node_id, direction, |
+ ActionCompletedCallback()); |
} |
bool ViewManagerClientImpl::OwnsNode(Id id) const { |
@@ -611,44 +208,50 @@ bool ViewManagerClientImpl::OwnsView(Id id) const { |
void ViewManagerClientImpl::SetActiveView(Id node_id, Id view_id) { |
DCHECK(connected_); |
- pending_transactions_.push_back( |
- new SetActiveViewTransaction(node_id, view_id, this)); |
- Sync(); |
+ service_->SetView(node_id, view_id, ActionCompletedCallback()); |
} |
void ViewManagerClientImpl::SetBounds(Id node_id, const gfx::Rect& bounds) { |
DCHECK(connected_); |
- pending_transactions_.push_back( |
- new SetBoundsTransaction(node_id, bounds, this)); |
- Sync(); |
+ service_->SetNodeBounds(node_id, Rect::From(bounds), |
+ ActionCompletedCallback()); |
} |
void ViewManagerClientImpl::SetViewContents(Id view_id, |
const SkBitmap& contents) { |
DCHECK(connected_); |
- pending_transactions_.push_back( |
- new SetViewContentsTransaction(view_id, contents, this)); |
- Sync(); |
+ std::vector<unsigned char> data; |
+ gfx::PNGCodec::EncodeBGRASkBitmap(contents, false, &data); |
+ |
+ void* memory = NULL; |
+ ScopedSharedBufferHandle duped, shared_state_handle; |
+ bool result = CreateMapAndDupSharedBuffer(data.size(), |
+ &memory, |
+ &shared_state_handle, |
+ &duped); |
+ if (!result) |
+ return; |
+ |
+ memcpy(memory, &data[0], data.size()); |
+ |
+ service_->SetViewContents(view_id, duped.Pass(), |
+ static_cast<uint32_t>(data.size()), |
+ ActionCompletedCallback()); |
} |
void ViewManagerClientImpl::SetFocus(Id node_id) { |
DCHECK(connected_); |
- pending_transactions_.push_back(new SetFocusTransaction(node_id, this)); |
- Sync(); |
+ service_->SetFocus(node_id, ActionCompletedCallback()); |
} |
void ViewManagerClientImpl::SetVisible(Id node_id, bool visible) { |
DCHECK(connected_); |
- pending_transactions_.push_back( |
- new SetVisibleTransaction(node_id, visible, this)); |
- Sync(); |
+ service_->SetNodeVisibility(node_id, visible, ActionCompletedCallback()); |
} |
void ViewManagerClientImpl::Embed(const String& url, Id node_id) { |
DCHECK(connected_); |
- pending_transactions_.push_back( |
- new EmbedTransaction(url, node_id, this)); |
- Sync(); |
+ service_->Embed(url, node_id, ActionCompletedCallback()); |
} |
void ViewManagerClientImpl::AddNode(Node* node) { |
@@ -722,8 +325,6 @@ void ViewManagerClientImpl::OnViewManagerConnectionEstablished( |
connected_ = true; |
connection_id_ = connection_id; |
creator_url_ = TypeConverter<String, std::string>::ConvertFrom(creator_url); |
- |
- DCHECK(pending_transactions_.empty()); |
AddRoot(BuildNodeTree(this, nodes)); |
} |
@@ -836,27 +437,6 @@ void ViewManagerClientImpl::DispatchOnViewInputEvent(Id view_id, |
//////////////////////////////////////////////////////////////////////////////// |
// ViewManagerClientImpl, private: |
-void ViewManagerClientImpl::Sync() { |
- // The service connection may not be set up yet. OnConnectionEstablished() |
- // will schedule another sync when it is. |
- if (!connected_) |
- return; |
- |
- Transactions::const_iterator it = pending_transactions_.begin(); |
- for (; it != pending_transactions_.end(); ++it) { |
- if (!(*it)->committed()) |
- (*it)->Commit(); |
- } |
-} |
- |
-void ViewManagerClientImpl::RemoveFromPendingQueue( |
- ViewManagerTransaction* transaction) { |
- DCHECK_EQ(transaction, pending_transactions_.front()); |
- pending_transactions_.erase(pending_transactions_.begin()); |
- if (pending_transactions_.empty() && !changes_acked_callback_.is_null()) |
- changes_acked_callback_.Run(); |
-} |
- |
void ViewManagerClientImpl::AddRoot(Node* root) { |
// A new root must not already exist as a root or be contained by an existing |
// hierarchy visible to this view manager. |
@@ -877,5 +457,25 @@ void ViewManagerClientImpl::RemoveRoot(Node* root) { |
roots_.erase(it); |
} |
+void ViewManagerClientImpl::OnActionCompleted(bool success) { |
+ if (!change_acked_callback_.is_null()) |
+ change_acked_callback_.Run(); |
+} |
+ |
+void ViewManagerClientImpl::OnActionCompletedWithErrorCode(ErrorCode code) { |
+ OnActionCompleted(code == ERROR_CODE_NONE); |
+} |
+ |
+base::Callback<void(bool)> ViewManagerClientImpl::ActionCompletedCallback() { |
+ return base::Bind(&ViewManagerClientImpl::OnActionCompleted, |
+ base::Unretained(this)); |
+} |
+ |
+base::Callback<void(ErrorCode)> |
+ ViewManagerClientImpl::ActionCompletedCallbackWithErrorCode() { |
+ return base::Bind(&ViewManagerClientImpl::OnActionCompletedWithErrorCode, |
+ base::Unretained(this)); |
+} |
+ |
} // namespace view_manager |
} // namespace mojo |