| 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
|
|
|