blob: 4ddf4df2a881f31ff662bd57195ca014f79503dd [file] [log] [blame]
// 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 "components/view_manager/server_view_drawn_tracker.h"
#include "components/view_manager/server_view.h"
#include "components/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