OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h" | 5 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "mojo/public/cpp/shell/connect.h" | 9 #include "mojo/public/cpp/shell/connect.h" |
10 #include "mojo/public/interfaces/shell/shell.mojom.h" | 10 #include "mojo/public/interfaces/shell/shell.mojom.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 private_view.set_id(view_id); | 44 private_view.set_id(view_id); |
45 private_view.set_node(node); | 45 private_view.set_node(node); |
46 // TODO(beng): this broadcasts notifications locally... do we want this? I | 46 // TODO(beng): this broadcasts notifications locally... do we want this? I |
47 // don't think so. same story for LocalAddChild above! | 47 // don't think so. same story for LocalAddChild above! |
48 private_node.LocalSetActiveView(view); | 48 private_node.LocalSetActiveView(view); |
49 private_manager.AddView(view->id(), view); | 49 private_manager.AddView(view->id(), view); |
50 } | 50 } |
51 return node; | 51 return node; |
52 } | 52 } |
53 | 53 |
| 54 ViewTreeNode* BuildNodeTree(ViewManager* manager, |
| 55 const Array<INode>& nodes) { |
| 56 std::vector<ViewTreeNode*> parents; |
| 57 ViewTreeNode* root = NULL; |
| 58 ViewTreeNode* last_node = NULL; |
| 59 for (size_t i = 0; i < nodes.size(); ++i) { |
| 60 if (last_node && nodes[i].parent_id() == last_node->id()) { |
| 61 parents.push_back(last_node); |
| 62 } else if (!parents.empty()) { |
| 63 while (parents.back()->id() != nodes[i].parent_id()) |
| 64 parents.pop_back(); |
| 65 } |
| 66 ViewTreeNode* node = AddNodeToViewManager( |
| 67 manager, |
| 68 !parents.empty() ? parents.back() : NULL, |
| 69 nodes[i].node_id(), |
| 70 nodes[i].view_id()); |
| 71 if (!last_node) |
| 72 root = node; |
| 73 last_node = node; |
| 74 } |
| 75 return root; |
| 76 } |
| 77 |
54 class ViewManagerTransaction { | 78 class ViewManagerTransaction { |
55 public: | 79 public: |
56 virtual ~ViewManagerTransaction() {} | 80 virtual ~ViewManagerTransaction() {} |
57 | 81 |
58 void Commit() { | 82 void Commit() { |
59 DCHECK(!committed_); | 83 DCHECK(!committed_); |
60 DoCommit(); | 84 DoCommit(); |
61 committed_ = true; | 85 committed_ = true; |
62 } | 86 } |
63 | 87 |
64 bool committed() const { return committed_; } | 88 bool committed() const { return committed_; } |
65 | 89 |
66 // General callback to be used for commits to the service. | |
67 void OnActionCompleted(bool success) { | |
68 DCHECK(success); | |
69 DoActionCompleted(success); | |
70 synchronizer_->RemoveFromPendingQueue(this); | |
71 } | |
72 | |
73 protected: | 90 protected: |
74 enum TransactionType { | 91 enum TransactionType { |
75 // View creation and destruction. | 92 // View creation and destruction. |
76 TYPE_CREATE_VIEW, | 93 TYPE_CREATE_VIEW, |
77 TYPE_DESTROY_VIEW, | 94 TYPE_DESTROY_VIEW, |
78 // Node creation and destruction. | 95 // Node creation and destruction. |
79 TYPE_CREATE_VIEW_TREE_NODE, | 96 TYPE_CREATE_VIEW_TREE_NODE, |
80 TYPE_DESTROY_VIEW_TREE_NODE, | 97 TYPE_DESTROY_VIEW_TREE_NODE, |
81 // Modifications to the hierarchy (addition of or removal of nodes from a | 98 // Modifications to the hierarchy (addition of or removal of nodes from a |
82 // parent.) | 99 // parent.) |
(...skipping 15 matching lines...) Expand all Loading... |
98 // Overridden to perform transaction-specific cleanup on commit ack from the | 115 // Overridden to perform transaction-specific cleanup on commit ack from the |
99 // service. | 116 // service. |
100 virtual void DoActionCompleted(bool success) = 0; | 117 virtual void DoActionCompleted(bool success) = 0; |
101 | 118 |
102 IViewManager* service() { return synchronizer_->service_.get(); } | 119 IViewManager* service() { return synchronizer_->service_.get(); } |
103 | 120 |
104 TransportChangeId GetAndAdvanceNextServerChangeId() { | 121 TransportChangeId GetAndAdvanceNextServerChangeId() { |
105 return synchronizer_->next_server_change_id_++; | 122 return synchronizer_->next_server_change_id_++; |
106 } | 123 } |
107 | 124 |
| 125 base::Callback<void(bool)> ActionCompletedCallback() { |
| 126 return base::Bind(&ViewManagerTransaction::OnActionCompleted, |
| 127 base::Unretained(this)); |
| 128 } |
| 129 |
108 private: | 130 private: |
| 131 // General callback to be used for commits to the service. |
| 132 void OnActionCompleted(bool success) { |
| 133 DCHECK(success); |
| 134 DoActionCompleted(success); |
| 135 synchronizer_->RemoveFromPendingQueue(this); |
| 136 } |
| 137 |
109 const TransactionType transaction_type_; | 138 const TransactionType transaction_type_; |
110 bool committed_; | 139 bool committed_; |
111 ViewManagerSynchronizer* synchronizer_; | 140 ViewManagerSynchronizer* synchronizer_; |
112 | 141 |
113 DISALLOW_COPY_AND_ASSIGN(ViewManagerTransaction); | 142 DISALLOW_COPY_AND_ASSIGN(ViewManagerTransaction); |
114 }; | 143 }; |
115 | 144 |
116 class CreateViewTransaction : public ViewManagerTransaction { | 145 class CreateViewTransaction : public ViewManagerTransaction { |
117 public: | 146 public: |
118 CreateViewTransaction(TransportViewId view_id, | 147 CreateViewTransaction(TransportViewId view_id, |
119 ViewManagerSynchronizer* synchronizer) | 148 ViewManagerSynchronizer* synchronizer) |
120 : ViewManagerTransaction(TYPE_CREATE_VIEW, synchronizer), | 149 : ViewManagerTransaction(TYPE_CREATE_VIEW, synchronizer), |
121 view_id_(view_id) {} | 150 view_id_(view_id) {} |
122 virtual ~CreateViewTransaction() {} | 151 virtual ~CreateViewTransaction() {} |
123 | 152 |
124 private: | 153 private: |
125 // Overridden from ViewManagerTransaction: | 154 // Overridden from ViewManagerTransaction: |
126 virtual void DoCommit() OVERRIDE { | 155 virtual void DoCommit() OVERRIDE { |
127 service()->CreateView( | 156 service()->CreateView(view_id_, ActionCompletedCallback()); |
128 view_id_, | |
129 base::Bind(&ViewManagerTransaction::OnActionCompleted, | |
130 base::Unretained(this))); | |
131 } | 157 } |
132 virtual void DoActionCompleted(bool success) OVERRIDE { | 158 virtual void DoActionCompleted(bool success) OVERRIDE { |
133 // TODO(beng): failure. | 159 // TODO(beng): failure. |
134 } | 160 } |
135 | 161 |
136 const TransportViewId view_id_; | 162 const TransportViewId view_id_; |
137 | 163 |
138 DISALLOW_COPY_AND_ASSIGN(CreateViewTransaction); | 164 DISALLOW_COPY_AND_ASSIGN(CreateViewTransaction); |
139 }; | 165 }; |
140 | 166 |
141 class DestroyViewTransaction : public ViewManagerTransaction { | 167 class DestroyViewTransaction : public ViewManagerTransaction { |
142 public: | 168 public: |
143 DestroyViewTransaction(TransportViewId view_id, | 169 DestroyViewTransaction(TransportViewId view_id, |
144 ViewManagerSynchronizer* synchronizer) | 170 ViewManagerSynchronizer* synchronizer) |
145 : ViewManagerTransaction(TYPE_DESTROY_VIEW, synchronizer), | 171 : ViewManagerTransaction(TYPE_DESTROY_VIEW, synchronizer), |
146 view_id_(view_id) {} | 172 view_id_(view_id) {} |
147 virtual ~DestroyViewTransaction() {} | 173 virtual ~DestroyViewTransaction() {} |
148 | 174 |
149 private: | 175 private: |
150 // Overridden from ViewManagerTransaction: | 176 // Overridden from ViewManagerTransaction: |
151 virtual void DoCommit() OVERRIDE { | 177 virtual void DoCommit() OVERRIDE { |
152 service()->DeleteView( | 178 service()->DeleteView(view_id_, ActionCompletedCallback()); |
153 view_id_, | |
154 base::Bind(&ViewManagerTransaction::OnActionCompleted, | |
155 base::Unretained(this))); | |
156 } | 179 } |
157 virtual void DoActionCompleted(bool success) OVERRIDE { | 180 virtual void DoActionCompleted(bool success) OVERRIDE { |
158 // TODO(beng): recovery? | 181 // TODO(beng): recovery? |
159 } | 182 } |
160 | 183 |
161 const TransportViewId view_id_; | 184 const TransportViewId view_id_; |
162 | 185 |
163 DISALLOW_COPY_AND_ASSIGN(DestroyViewTransaction); | 186 DISALLOW_COPY_AND_ASSIGN(DestroyViewTransaction); |
164 }; | 187 }; |
165 | 188 |
166 class CreateViewTreeNodeTransaction : public ViewManagerTransaction { | 189 class CreateViewTreeNodeTransaction : public ViewManagerTransaction { |
167 public: | 190 public: |
168 CreateViewTreeNodeTransaction(TransportNodeId node_id, | 191 CreateViewTreeNodeTransaction(TransportNodeId node_id, |
169 ViewManagerSynchronizer* synchronizer) | 192 ViewManagerSynchronizer* synchronizer) |
170 : ViewManagerTransaction(TYPE_CREATE_VIEW_TREE_NODE, synchronizer), | 193 : ViewManagerTransaction(TYPE_CREATE_VIEW_TREE_NODE, synchronizer), |
171 node_id_(node_id) {} | 194 node_id_(node_id) {} |
172 virtual ~CreateViewTreeNodeTransaction() {} | 195 virtual ~CreateViewTreeNodeTransaction() {} |
173 | 196 |
174 private: | 197 private: |
175 // Overridden from ViewManagerTransaction: | 198 // Overridden from ViewManagerTransaction: |
176 virtual void DoCommit() OVERRIDE { | 199 virtual void DoCommit() OVERRIDE { |
177 service()->CreateNode( | 200 service()->CreateNode(node_id_, ActionCompletedCallback()); |
178 node_id_, | |
179 base::Bind(&ViewManagerTransaction::OnActionCompleted, | |
180 base::Unretained(this))); | |
181 } | 201 } |
182 virtual void DoActionCompleted(bool success) OVERRIDE { | 202 virtual void DoActionCompleted(bool success) OVERRIDE { |
183 // TODO(beng): Failure means we tried to create with an extant id for this | 203 // TODO(beng): Failure means we tried to create with an extant id for this |
184 // connection. It also could mean we tried to do something | 204 // connection. It also could mean we tried to do something |
185 // invalid, or we tried applying a change out of order. Figure | 205 // invalid, or we tried applying a change out of order. Figure |
186 // out what to do. | 206 // out what to do. |
187 } | 207 } |
188 | 208 |
189 const TransportNodeId node_id_; | 209 const TransportNodeId node_id_; |
190 | 210 |
191 DISALLOW_COPY_AND_ASSIGN(CreateViewTreeNodeTransaction); | 211 DISALLOW_COPY_AND_ASSIGN(CreateViewTreeNodeTransaction); |
192 }; | 212 }; |
193 | 213 |
194 class DestroyViewTreeNodeTransaction : public ViewManagerTransaction { | 214 class DestroyViewTreeNodeTransaction : public ViewManagerTransaction { |
195 public: | 215 public: |
196 DestroyViewTreeNodeTransaction(TransportNodeId node_id, | 216 DestroyViewTreeNodeTransaction(TransportNodeId node_id, |
197 ViewManagerSynchronizer* synchronizer) | 217 ViewManagerSynchronizer* synchronizer) |
198 : ViewManagerTransaction(TYPE_DESTROY_VIEW_TREE_NODE, synchronizer), | 218 : ViewManagerTransaction(TYPE_DESTROY_VIEW_TREE_NODE, synchronizer), |
199 node_id_(node_id) {} | 219 node_id_(node_id) {} |
200 virtual ~DestroyViewTreeNodeTransaction() {} | 220 virtual ~DestroyViewTreeNodeTransaction() {} |
201 | 221 |
202 private: | 222 private: |
203 // Overridden from ViewManagerTransaction: | 223 // Overridden from ViewManagerTransaction: |
204 virtual void DoCommit() OVERRIDE { | 224 virtual void DoCommit() OVERRIDE { |
205 service()->DeleteNode( | 225 service()->DeleteNode(node_id_, ActionCompletedCallback()); |
206 node_id_, | |
207 base::Bind(&ViewManagerTransaction::OnActionCompleted, | |
208 base::Unretained(this))); | |
209 } | 226 } |
210 virtual void DoActionCompleted(bool success) OVERRIDE { | 227 virtual void DoActionCompleted(bool success) OVERRIDE { |
211 // TODO(beng): recovery? | 228 // TODO(beng): recovery? |
212 } | 229 } |
213 | 230 |
214 const TransportNodeId node_id_; | 231 const TransportNodeId node_id_; |
215 DISALLOW_COPY_AND_ASSIGN(DestroyViewTreeNodeTransaction); | 232 DISALLOW_COPY_AND_ASSIGN(DestroyViewTreeNodeTransaction); |
216 }; | 233 }; |
217 | 234 |
218 class HierarchyTransaction : public ViewManagerTransaction { | 235 class HierarchyTransaction : public ViewManagerTransaction { |
(...skipping 14 matching lines...) Expand all Loading... |
233 | 250 |
234 private: | 251 private: |
235 // Overridden from ViewManagerTransaction: | 252 // Overridden from ViewManagerTransaction: |
236 virtual void DoCommit() OVERRIDE { | 253 virtual void DoCommit() OVERRIDE { |
237 switch (hierarchy_change_type_) { | 254 switch (hierarchy_change_type_) { |
238 case TYPE_ADD: | 255 case TYPE_ADD: |
239 service()->AddNode( | 256 service()->AddNode( |
240 parent_id_, | 257 parent_id_, |
241 child_id_, | 258 child_id_, |
242 GetAndAdvanceNextServerChangeId(), | 259 GetAndAdvanceNextServerChangeId(), |
243 base::Bind(&ViewManagerTransaction::OnActionCompleted, | 260 ActionCompletedCallback()); |
244 base::Unretained(this))); | |
245 break; | 261 break; |
246 case TYPE_REMOVE: | 262 case TYPE_REMOVE: |
247 service()->RemoveNodeFromParent( | 263 service()->RemoveNodeFromParent( |
248 child_id_, | 264 child_id_, |
249 GetAndAdvanceNextServerChangeId(), | 265 GetAndAdvanceNextServerChangeId(), |
250 base::Bind(&ViewManagerTransaction::OnActionCompleted, | 266 ActionCompletedCallback()); |
251 base::Unretained(this))); | |
252 break; | 267 break; |
253 } | 268 } |
254 } | 269 } |
255 | 270 |
256 virtual void DoActionCompleted(bool success) OVERRIDE { | 271 virtual void DoActionCompleted(bool success) OVERRIDE { |
257 // TODO(beng): Failure means either one of the nodes specified didn't exist, | 272 // TODO(beng): Failure means either one of the nodes specified didn't exist, |
258 // or we passed the same node id for both params. Roll back? | 273 // or we passed the same node id for both params. Roll back? |
259 } | 274 } |
260 | 275 |
261 const HierarchyChangeType hierarchy_change_type_; | 276 const HierarchyChangeType hierarchy_change_type_; |
262 const TransportNodeId child_id_; | 277 const TransportNodeId child_id_; |
263 const TransportNodeId parent_id_; | 278 const TransportNodeId parent_id_; |
264 | 279 |
265 DISALLOW_COPY_AND_ASSIGN(HierarchyTransaction); | 280 DISALLOW_COPY_AND_ASSIGN(HierarchyTransaction); |
266 }; | 281 }; |
267 | 282 |
268 class SetActiveViewTransaction : public ViewManagerTransaction { | 283 class SetActiveViewTransaction : public ViewManagerTransaction { |
269 public: | 284 public: |
270 SetActiveViewTransaction(TransportNodeId node_id, | 285 SetActiveViewTransaction(TransportNodeId node_id, |
271 TransportViewId view_id, | 286 TransportViewId view_id, |
272 ViewManagerSynchronizer* synchronizer) | 287 ViewManagerSynchronizer* synchronizer) |
273 : ViewManagerTransaction(TYPE_SET_ACTIVE_VIEW, synchronizer), | 288 : ViewManagerTransaction(TYPE_SET_ACTIVE_VIEW, synchronizer), |
274 node_id_(node_id), | 289 node_id_(node_id), |
275 view_id_(view_id) {} | 290 view_id_(view_id) {} |
276 virtual ~SetActiveViewTransaction() {} | 291 virtual ~SetActiveViewTransaction() {} |
277 | 292 |
278 private: | 293 private: |
279 // Overridden from ViewManagerTransaction: | 294 // Overridden from ViewManagerTransaction: |
280 virtual void DoCommit() OVERRIDE { | 295 virtual void DoCommit() OVERRIDE { |
281 service()->SetView( | 296 service()->SetView(node_id_, view_id_, ActionCompletedCallback()); |
282 node_id_, | |
283 view_id_, | |
284 base::Bind(&ViewManagerTransaction::OnActionCompleted, | |
285 base::Unretained(this))); | |
286 } | 297 } |
287 virtual void DoActionCompleted(bool success) OVERRIDE { | 298 virtual void DoActionCompleted(bool success) OVERRIDE { |
288 // TODO(beng): recovery? | 299 // TODO(beng): recovery? |
289 } | 300 } |
290 | 301 |
291 const TransportNodeId node_id_; | 302 const TransportNodeId node_id_; |
292 const TransportViewId view_id_; | 303 const TransportViewId view_id_; |
293 | 304 |
294 DISALLOW_COPY_AND_ASSIGN(SetActiveViewTransaction); | 305 DISALLOW_COPY_AND_ASSIGN(SetActiveViewTransaction); |
295 }; | 306 }; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 new SetActiveViewTransaction(node_id, view_id, this)); | 398 new SetActiveViewTransaction(node_id, view_id, this)); |
388 Sync(); | 399 Sync(); |
389 } | 400 } |
390 | 401 |
391 //////////////////////////////////////////////////////////////////////////////// | 402 //////////////////////////////////////////////////////////////////////////////// |
392 // ViewManagerSynchronizer, IViewManagerClient implementation: | 403 // ViewManagerSynchronizer, IViewManagerClient implementation: |
393 | 404 |
394 void ViewManagerSynchronizer::OnConnectionEstablished( | 405 void ViewManagerSynchronizer::OnConnectionEstablished( |
395 TransportConnectionId connection_id, | 406 TransportConnectionId connection_id, |
396 TransportChangeId next_server_change_id, | 407 TransportChangeId next_server_change_id, |
397 const mojo::Array<INode>& nodes) { | 408 const Array<INode>& nodes) { |
398 connected_ = true; | 409 connected_ = true; |
399 connection_id_ = connection_id; | 410 connection_id_ = connection_id; |
400 next_server_change_id_ = next_server_change_id; | 411 next_server_change_id_ = next_server_change_id; |
401 | 412 |
402 ViewManagerPrivate private_manager(view_manager_); | 413 ViewManagerPrivate(view_manager_).set_root( |
403 std::vector<ViewTreeNode*> parents; | 414 BuildNodeTree(view_manager_, nodes)); |
404 ViewTreeNode* root = NULL; | |
405 ViewTreeNode* last_node = NULL; | |
406 for (size_t i = 0; i < nodes.size(); ++i) { | |
407 if (last_node && nodes[i].parent_id() == last_node->id()) { | |
408 parents.push_back(last_node); | |
409 } else if (!parents.empty()) { | |
410 while (parents.back()->id() != nodes[i].parent_id()) | |
411 parents.pop_back(); | |
412 } | |
413 ViewTreeNode* node = | |
414 AddNodeToViewManager(view_manager_, | |
415 !parents.empty() ? parents.back() : NULL, | |
416 nodes[i].node_id(), | |
417 nodes[i].view_id()); | |
418 if (!last_node) | |
419 root = node; | |
420 last_node = node; | |
421 } | |
422 private_manager.set_root(root); | |
423 if (init_loop_) | 415 if (init_loop_) |
424 init_loop_->Quit(); | 416 init_loop_->Quit(); |
425 | 417 |
426 Sync(); | 418 Sync(); |
427 } | 419 } |
428 | 420 |
429 void ViewManagerSynchronizer::OnServerChangeIdAdvanced( | 421 void ViewManagerSynchronizer::OnServerChangeIdAdvanced( |
430 uint32_t next_server_change_id) { | 422 uint32_t next_server_change_id) { |
431 next_server_change_id_ = next_server_change_id; | 423 next_server_change_id_ = next_server_change_id; |
432 } | 424 } |
433 | 425 |
434 void ViewManagerSynchronizer::OnNodeHierarchyChanged( | 426 void ViewManagerSynchronizer::OnNodeHierarchyChanged( |
435 uint32_t node_id, | 427 uint32_t node_id, |
436 uint32_t new_parent_id, | 428 uint32_t new_parent_id, |
437 uint32_t old_parent_id, | 429 uint32_t old_parent_id, |
438 TransportChangeId server_change_id, | 430 TransportChangeId server_change_id, |
439 const mojo::Array<INode>& nodes) { | 431 const Array<INode>& nodes) { |
440 // TODO: deal with |nodes|. | 432 // TODO: deal with |nodes|. |
441 next_server_change_id_ = server_change_id + 1; | 433 next_server_change_id_ = server_change_id + 1; |
442 | 434 |
443 ViewTreeNode* new_parent = | 435 BuildNodeTree(view_manager_, nodes); |
444 view_manager_->tree()->GetChildById(new_parent_id); | |
445 ViewTreeNode* old_parent = | |
446 view_manager_->tree()->GetChildById(old_parent_id); | |
447 ViewTreeNode* node = NULL; | |
448 if (old_parent) { | |
449 // Existing node, mapped in this connection's tree. | |
450 // TODO(beng): verify this is actually true. | |
451 node = view_manager_->GetNodeById(node_id); | |
452 DCHECK_EQ(node->parent(), old_parent); | |
453 } else { | |
454 // New node, originating from another connection. | |
455 node = ViewTreeNodePrivate::LocalCreate(); | |
456 ViewTreeNodePrivate private_node(node); | |
457 private_node.set_view_manager(view_manager_); | |
458 private_node.set_id(node_id); | |
459 ViewManagerPrivate(view_manager_).AddNode(node->id(), node); | |
460 | 436 |
461 // TODO(beng): view changes. | 437 ViewTreeNode* new_parent = view_manager_->GetNodeById(new_parent_id); |
462 } | 438 ViewTreeNode* old_parent = view_manager_->GetNodeById(old_parent_id); |
| 439 ViewTreeNode* node = view_manager_->GetNodeById(node_id); |
463 if (new_parent) | 440 if (new_parent) |
464 ViewTreeNodePrivate(new_parent).LocalAddChild(node); | 441 ViewTreeNodePrivate(new_parent).LocalAddChild(node); |
465 else | 442 else |
466 ViewTreeNodePrivate(old_parent).LocalRemoveChild(node); | 443 ViewTreeNodePrivate(old_parent).LocalRemoveChild(node); |
467 } | 444 } |
468 | 445 |
469 void ViewManagerSynchronizer::OnNodeDeleted(uint32_t node_id, | 446 void ViewManagerSynchronizer::OnNodeDeleted(uint32_t node_id, |
470 uint32_t server_change_id) { | 447 uint32_t server_change_id) { |
471 next_server_change_id_ = server_change_id + 1; | 448 next_server_change_id_ = server_change_id + 1; |
472 | 449 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 for (; it != pending_transactions_.end(); ++it) { | 490 for (; it != pending_transactions_.end(); ++it) { |
514 if (!(*it)->committed()) | 491 if (!(*it)->committed()) |
515 (*it)->Commit(); | 492 (*it)->Commit(); |
516 } | 493 } |
517 } | 494 } |
518 | 495 |
519 void ViewManagerSynchronizer::RemoveFromPendingQueue( | 496 void ViewManagerSynchronizer::RemoveFromPendingQueue( |
520 ViewManagerTransaction* transaction) { | 497 ViewManagerTransaction* transaction) { |
521 DCHECK_EQ(transaction, pending_transactions_.front()); | 498 DCHECK_EQ(transaction, pending_transactions_.front()); |
522 pending_transactions_.erase(pending_transactions_.begin()); | 499 pending_transactions_.erase(pending_transactions_.begin()); |
| 500 if (pending_transactions_.empty() && !changes_acked_callback_.is_null()) |
| 501 changes_acked_callback_.Run(); |
523 } | 502 } |
524 | 503 |
525 } // namespace view_manager | 504 } // namespace view_manager |
526 } // namespace mojo | 505 } // namespace mojo |
OLD | NEW |