blob: 5ba883c4865b1c899b6c3278c9ba903de55c5d8a [file] [log] [blame]
// Copyright 2016 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 "ash/wm_window.h"
#include <memory>
#include "ash/test/ash_test.h"
#include "ui/aura/window.h"
#include "ui/aura/window_observer.h"
namespace ash {
using WmWindowTest = AshTest;
namespace {
// Tracks calls to OnWindowVisibilityChanged().
class VisibilityObserver : public aura::WindowObserver {
public:
// Attaches a aura::WindowObserver to |window_to_add_observer_to| and sets
// |last_observed_window_| and |last_observed_visible_value_| to the values
// of the last call to OnWindowVisibilityChanged().
explicit VisibilityObserver(WmWindow* window_to_add_observer_to)
: window_to_add_observer_to_(window_to_add_observer_to) {
window_to_add_observer_to_->aura_window()->AddObserver(this);
}
~VisibilityObserver() override {
window_to_add_observer_to_->aura_window()->RemoveObserver(this);
}
// The values last supplied to OnWindowVisibilityChanged().
WmWindow* last_observed_window() { return last_observed_window_; }
bool last_observed_visible_value() const {
return last_observed_visible_value_;
}
// aura::WindowObserver:
void OnWindowVisibilityChanged(aura::Window* window, bool visible) override {
last_observed_window_ = WmWindow::Get(window);
last_observed_visible_value_ = visible;
}
private:
WmWindow* window_to_add_observer_to_;
WmWindow* last_observed_window_ = nullptr;
bool last_observed_visible_value_ = false;
DISALLOW_COPY_AND_ASSIGN(VisibilityObserver);
};
} // namespace
// Verifies OnWindowVisibilityChanged() is called on a aura::WindowObserver
// attached
// to the parent when the child window's visibility changes.
TEST_F(WmWindowTest, OnWindowVisibilityChangedCalledOnAncestor) {
std::unique_ptr<WindowOwner> window_owner = CreateTestWindow();
WmWindow* window = window_owner->window();
std::unique_ptr<WindowOwner> child_owner =
CreateChildWindow(window_owner->window());
WmWindow* child_window = child_owner->window();
VisibilityObserver observer(window);
child_window->Hide();
EXPECT_EQ(child_window, observer.last_observed_window());
EXPECT_FALSE(observer.last_observed_visible_value());
}
// Verifies OnWindowVisibilityChanged() is called on a aura::WindowObserver
// attached
// to a child when the parent window's visibility changes.
TEST_F(WmWindowTest, OnWindowVisibilityChangedCalledOnChild) {
std::unique_ptr<WindowOwner> parent_window_owner = CreateTestWindow();
WmWindow* parent_window = parent_window_owner->window();
std::unique_ptr<WindowOwner> child_owner = CreateChildWindow(parent_window);
WmWindow* child_window = child_owner->window();
VisibilityObserver observer(child_window);
parent_window->Hide();
EXPECT_EQ(parent_window, observer.last_observed_window());
EXPECT_FALSE(observer.last_observed_visible_value());
}
} // namespace ash