Index: mojo/services/view_manager/server_view_drawn_tracker.cc |
diff --git a/mojo/services/view_manager/server_view_drawn_tracker.cc b/mojo/services/view_manager/server_view_drawn_tracker.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8b79346ccb4e09b8834e644e42fa26e38958eb3c |
--- /dev/null |
+++ b/mojo/services/view_manager/server_view_drawn_tracker.cc |
@@ -0,0 +1,76 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/services/view_manager/server_view_drawn_tracker.h" |
+ |
+#include "mojo/services/view_manager/server_view.h" |
+#include "mojo/services/view_manager/server_view_drawn_tracker_observer.h" |
+ |
+namespace view_manager { |
+ |
+ServerViewDrawnTracker::ServerViewDrawnTracker( |
+ ServerView* root, |
+ ServerView* view, |
+ ServerViewDrawnTrackerObserver* observer) |
+ : root_(root), |
+ view_(view), |
+ observer_(observer), |
+ drawn_(view->IsDrawn(root)) { |
+ AddObservers(); |
+} |
+ |
+ServerViewDrawnTracker::~ServerViewDrawnTracker() { |
+ RemoveObservers(); |
+} |
+ |
+void ServerViewDrawnTracker::SetDrawn(ServerView* ancestor, bool drawn) { |
+ if (drawn == drawn_) |
+ return; |
+ |
+ drawn_ = drawn; |
+ observer_->OnDrawnStateChanged(ancestor, view_, drawn); |
+} |
+ |
+void ServerViewDrawnTracker::AddObservers() { |
+ if (!view_) |
+ return; |
+ |
+ for (ServerView* v = view_; v; v = v->parent()) { |
+ v->AddObserver(this); |
+ views_.insert(v); |
+ } |
+} |
+ |
+void ServerViewDrawnTracker::RemoveObservers() { |
+ for (ServerView* view : views_) |
+ view->RemoveObserver(this); |
+ |
+ views_.clear(); |
+} |
+ |
+void ServerViewDrawnTracker::OnViewDestroyed(ServerView* view) { |
+ // As views are removed before being destroyed, resulting in |
+ // OnViewHierarchyChanged() and us removing ourself as an observer, the only |
+ // view we should ever get notified of destruction on is |view_|. |
+ DCHECK_EQ(view, view_); |
+ RemoveObservers(); |
+ view_ = nullptr; |
+ SetDrawn(nullptr, false); |
+} |
+ |
+void ServerViewDrawnTracker::OnViewHierarchyChanged(ServerView* view, |
+ ServerView* new_parent, |
+ ServerView* old_parent) { |
+ RemoveObservers(); |
+ AddObservers(); |
+ const bool is_drawn = view_->IsDrawn(root_); |
+ SetDrawn(is_drawn ? nullptr : old_parent, is_drawn); |
+} |
+ |
+void ServerViewDrawnTracker::OnViewVisibilityChanged(ServerView* view) { |
+ const bool is_drawn = view_->IsDrawn(root_); |
+ SetDrawn(is_drawn ? nullptr : view->parent(), is_drawn); |
+} |
+ |
+} // namespace view_manager |