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

Unified Diff: mojo/services/view_manager/root_node_manager.h

Issue 307003004: Fixes bug where IViewManagerClient could be messaged unnecessarily (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleanup Created 6 years, 7 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
« no previous file with comments | « no previous file | mojo/services/view_manager/root_node_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/services/view_manager/root_node_manager.h
diff --git a/mojo/services/view_manager/root_node_manager.h b/mojo/services/view_manager/root_node_manager.h
index 204f1586b9226d0e272cf52f8d5f42b75f021c33..1598e0dc35cb35ba8a2a536d2745e2d6fbeefe10 100644
--- a/mojo/services/view_manager/root_node_manager.h
+++ b/mojo/services/view_manager/root_node_manager.h
@@ -48,9 +48,28 @@ class MOJO_VIEW_MANAGER_EXPORT RootNodeManager : public NodeDelegate {
bool is_delete_node);
~ScopedChange();
+ TransportConnectionId connection_id() const { return connection_id_; }
+ ChangeType change_type() const { return change_type_; }
+ bool is_delete_node() const { return is_delete_node_; }
+
+ // Marks the connection with the specified id as having seen a message.
+ void MarkConnectionAsMessaged(TransportConnectionId connection_id) {
+ message_ids_.insert(connection_id);
+ }
+
+ // Returns true if MarkConnectionAsMessaged(connection_id) was invoked.
+ bool DidMessageConnection(TransportConnectionId connection_id) const {
+ return message_ids_.count(connection_id) > 0;
+ }
+
private:
RootNodeManager* root_;
+ const TransportConnectionId connection_id_;
const ChangeType change_type_;
+ const bool is_delete_node_;
+
+ // See description of MarkConnectionAsMessaged/DidMessageConnection.
+ std::set<TransportConnectionId> message_ids_;
DISALLOW_COPY_AND_ASSIGN(ScopedChange);
};
@@ -88,9 +107,17 @@ class MOJO_VIEW_MANAGER_EXPORT RootNodeManager : public NodeDelegate {
Node* root() { return &root_; }
- bool IsProcessingChange() const { return change_source_ != 0; }
+ bool IsProcessingChange() const { return current_change_ != NULL; }
+
+ bool is_processing_delete_node() const {
+ return current_change_ && current_change_->is_delete_node(); }
- bool is_processing_delete_node() const { return is_processing_delete_node_; }
+ // Invoked when a connection messages a client about the change. This is used
+ // to avoid sending ServerChangeIdAdvanced() unnecessarily.
+ void OnConnectionMessagedClient(TransportConnectionId id);
+
+ // Returns true if OnConnectionMessagedClient() was invoked for id.
+ bool DidConnectionMessageClient(TransportConnectionId id) const;
// These functions trivially delegate to all ViewManagerConnections, which in
// term notify their clients.
@@ -115,20 +142,20 @@ class MOJO_VIEW_MANAGER_EXPORT RootNodeManager : public NodeDelegate {
typedef std::map<TransportConnectionId, ViewManagerConnection*> ConnectionMap;
- // Invoked when a particular connection is about to make a change.
- // Subsequently followed by FinishChange() once the change is done.
+ // Invoked when a connection is about to make a change. Subsequently followed
+ // by FinishChange() once the change is done.
//
// Changes should never nest, meaning each PrepareForChange() must be
// balanced with a call to FinishChange() with no PrepareForChange()
// in between.
- void PrepareForChange(ViewManagerConnection* connection, bool is_delete_node);
+ void PrepareForChange(ScopedChange* change);
// Balances a call to PrepareForChange().
- void FinishChange(ChangeType change_type);
+ void FinishChange();
// Returns true if the specified connection originated the current change.
bool IsChangeSource(TransportConnectionId connection_id) const {
- return connection_id == change_source_;
+ return current_change_ && current_change_->connection_id() == connection_id;
}
// Implementation of the two connect variants.
@@ -155,12 +182,6 @@ class MOJO_VIEW_MANAGER_EXPORT RootNodeManager : public NodeDelegate {
// Set of ViewManagerConnections.
ConnectionMap connection_map_;
- // If non-zero we're processing a change from this client.
- TransportConnectionId change_source_;
-
- // True if we're processing a DeleteNode request.
- bool is_processing_delete_node_;
-
RootViewManager root_view_manager_;
// Root node.
@@ -170,6 +191,10 @@ class MOJO_VIEW_MANAGER_EXPORT RootNodeManager : public NodeDelegate {
// explicitly destroyed.
std::set<ViewManagerConnection*> connections_created_by_connect_;
+ // If non-null we're processing a change. The ScopedChange is not owned by us
+ // (it's created on the stack by ViewManagerConnection).
+ ScopedChange* current_change_;
+
DISALLOW_COPY_AND_ASSIGN(RootNodeManager);
};
« no previous file with comments | « no previous file | mojo/services/view_manager/root_node_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698