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

Unified Diff: mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.cc

Issue 415143004: Get rid of ViewManagerTransactions & pending queue. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698