1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/mus/server_view_drawn_tracker.h"
7 #include "components/mus/server_view.h"
8 #include "components/mus/server_view_drawn_tracker_observer.h"
12 ServerViewDrawnTracker::ServerViewDrawnTracker(
14 ServerViewDrawnTrackerObserver
* observer
)
15 : view_(view
), observer_(observer
), drawn_(view
->IsDrawn()) {
19 ServerViewDrawnTracker::~ServerViewDrawnTracker() {
23 void ServerViewDrawnTracker::SetDrawn(ServerView
* ancestor
, bool drawn
) {
28 observer_
->OnDrawnStateChanged(ancestor
, view_
, drawn
);
31 void ServerViewDrawnTracker::AddObservers() {
35 for (ServerView
* v
= view_
; v
; v
= v
->parent()) {
41 void ServerViewDrawnTracker::RemoveObservers() {
42 for (ServerView
* view
: views_
)
43 view
->RemoveObserver(this);
48 void ServerViewDrawnTracker::OnViewDestroyed(ServerView
* view
) {
49 // As views are removed before being destroyed, resulting in
50 // OnViewHierarchyChanged() and us removing ourself as an observer, the only
51 // view we should ever get notified of destruction on is |view_|.
52 DCHECK_EQ(view
, view_
);
55 SetDrawn(nullptr, false);
58 void ServerViewDrawnTracker::OnViewHierarchyChanged(ServerView
* view
,
59 ServerView
* new_parent
,
60 ServerView
* old_parent
) {
63 const bool is_drawn
= view_
->IsDrawn();
64 SetDrawn(is_drawn
? nullptr : old_parent
, is_drawn
);
67 void ServerViewDrawnTracker::OnViewVisibilityChanged(ServerView
* view
) {
68 const bool is_drawn
= view_
->IsDrawn();
69 SetDrawn(is_drawn
? nullptr : view
->parent(), is_drawn
);