| 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/view.h" | 5 #include "mojo/services/public/cpp/view_manager/view.h" |
| 6 | 6 |
| 7 #include <set> |
| 8 |
| 7 #include "mojo/public/cpp/application/service_provider_impl.h" | 9 #include "mojo/public/cpp/application/service_provider_impl.h" |
| 8 #include "mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h" | 10 #include "mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h" |
| 9 #include "mojo/services/public/cpp/view_manager/lib/view_private.h" | 11 #include "mojo/services/public/cpp/view_manager/lib/view_private.h" |
| 10 #include "mojo/services/public/cpp/view_manager/view_observer.h" | 12 #include "mojo/services/public/cpp/view_manager/view_observer.h" |
| 13 #include "mojo/services/public/cpp/view_manager/view_tracker.h" |
| 11 | 14 |
| 12 namespace mojo { | 15 namespace mojo { |
| 13 | 16 |
| 14 namespace { | 17 namespace { |
| 15 | 18 |
| 16 void NotifyViewTreeChangeAtReceiver( | 19 void NotifyViewTreeChangeAtReceiver( |
| 17 View* receiver, | 20 View* receiver, |
| 18 const ViewObserver::TreeChangeParams& params, | 21 const ViewObserver::TreeChangeParams& params, |
| 19 bool change_applied) { | 22 bool change_applied) { |
| 20 ViewObserver::TreeChangeParams local_params = params; | 23 ViewObserver::TreeChangeParams local_params = params; |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 } | 221 } |
| 219 | 222 |
| 220 void View::SetVisible(bool value) { | 223 void View::SetVisible(bool value) { |
| 221 if (visible_ == value) | 224 if (visible_ == value) |
| 222 return; | 225 return; |
| 223 | 226 |
| 224 if (manager_) | 227 if (manager_) |
| 225 static_cast<ViewManagerClientImpl*>(manager_)->SetVisible(id_, value); | 228 static_cast<ViewManagerClientImpl*>(manager_)->SetVisible(id_, value); |
| 226 FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewVisibilityChanging(this)); | 229 FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewVisibilityChanging(this)); |
| 227 visible_ = value; | 230 visible_ = value; |
| 228 FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewVisibilityChanged(this)); | 231 NotifyViewVisibilityChanged(this); |
| 229 } | 232 } |
| 230 | 233 |
| 231 void View::SetSharedProperty(const std::string& name, | 234 void View::SetSharedProperty(const std::string& name, |
| 232 const std::vector<uint8_t>* value) { | 235 const std::vector<uint8_t>* value) { |
| 233 std::vector<uint8_t> old_value; | 236 std::vector<uint8_t> old_value; |
| 234 std::vector<uint8_t>* old_value_ptr = nullptr; | 237 std::vector<uint8_t>* old_value_ptr = nullptr; |
| 235 auto it = properties_.find(name); | 238 auto it = properties_.find(name); |
| 236 if (it != properties_.end()) { | 239 if (it != properties_.end()) { |
| 237 old_value = it->second; | 240 old_value = it->second; |
| 238 old_value_ptr = &old_value; | 241 old_value_ptr = &old_value; |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 // notification is the value of IsDrawn() is really changing. | 499 // notification is the value of IsDrawn() is really changing. |
| 497 if (IsDrawn() == value) { | 500 if (IsDrawn() == value) { |
| 498 drawn_ = value; | 501 drawn_ = value; |
| 499 return; | 502 return; |
| 500 } | 503 } |
| 501 FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewDrawnChanging(this)); | 504 FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewDrawnChanging(this)); |
| 502 drawn_ = value; | 505 drawn_ = value; |
| 503 FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewDrawnChanged(this)); | 506 FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewDrawnChanged(this)); |
| 504 } | 507 } |
| 505 | 508 |
| 509 void View::NotifyViewVisibilityChanged(View* target) { |
| 510 if (!NotifyViewVisibilityChangedDown(target)) { |
| 511 return; // |this| has been deleted. |
| 512 } |
| 513 NotifyViewVisibilityChangedUp(target); |
| 514 } |
| 515 |
| 516 bool View::NotifyViewVisibilityChangedAtReceiver(View* target) { |
| 517 // |this| may be deleted during a call to OnViewVisibilityChanged() on one |
| 518 // of the observers. We create an local observer for that. In that case we |
| 519 // exit without further access to any members. |
| 520 ViewTracker tracker; |
| 521 tracker.Add(this); |
| 522 FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewVisibilityChanged(target)); |
| 523 return tracker.Contains(this); |
| 524 } |
| 525 |
| 526 bool View::NotifyViewVisibilityChangedDown(View* target) { |
| 527 if (!NotifyViewVisibilityChangedAtReceiver(target)) |
| 528 return false; // |this| was deleted. |
| 529 std::set<const View*> child_already_processed; |
| 530 bool child_destroyed = false; |
| 531 do { |
| 532 child_destroyed = false; |
| 533 for (View::Children::const_iterator it = children_.begin(); |
| 534 it != children_.end(); ++it) { |
| 535 if (!child_already_processed.insert(*it).second) |
| 536 continue; |
| 537 if (!(*it)->NotifyViewVisibilityChangedDown(target)) { |
| 538 // |*it| was deleted, |it| is invalid and |children_| has changed. We |
| 539 // exit the current for-loop and enter a new one. |
| 540 child_destroyed = true; |
| 541 break; |
| 542 } |
| 543 } |
| 544 } while (child_destroyed); |
| 545 return true; |
| 546 } |
| 547 |
| 548 void View::NotifyViewVisibilityChangedUp(View* target) { |
| 549 // Start with the parent as we already notified |this| |
| 550 // in NotifyViewVisibilityChangedDown. |
| 551 for (View* view = parent(); view; view = view->parent()) { |
| 552 bool ret = view->NotifyViewVisibilityChangedAtReceiver(target); |
| 553 DCHECK(ret); |
| 554 } |
| 555 } |
| 556 |
| 506 } // namespace mojo | 557 } // namespace mojo |
| OLD | NEW |