| Index: ui/views/view_unittest.cc
|
| diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
|
| index e9af12ad5a964d0a67207326d15e99dbd2163f12..2141dbf5ffa09cb12429633095011826ad091e77 100644
|
| --- a/ui/views/view_unittest.cc
|
| +++ b/ui/views/view_unittest.cc
|
| @@ -41,6 +41,7 @@
|
| #include "ui/views/controls/textfield/textfield.h"
|
| #include "ui/views/focus/view_storage.h"
|
| #include "ui/views/test/views_test_base.h"
|
| +#include "ui/views/view_observer.h"
|
| #include "ui/views/widget/native_widget.h"
|
| #include "ui/views/widget/root_view.h"
|
| #include "ui/views/window/dialog_client_view.h"
|
| @@ -4577,4 +4578,149 @@ TEST_F(ViewTest, CrashOnAddFromFromOnNativeThemeChanged) {
|
| EXPECT_TRUE(v->on_native_theme_changed_called());
|
| }
|
|
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// Observer tests.
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +class ViewObserverTest : public ViewTest, public ViewObserver {
|
| + public:
|
| + ViewObserverTest()
|
| + : view_visibility_changed_(nullptr),
|
| + view_enabled_changed_(nullptr),
|
| + view_bounds_changed_(nullptr),
|
| + view_reordered_(nullptr) {}
|
| +
|
| + ~ViewObserverTest() override {}
|
| +
|
| + // ViewObserver:
|
| + void OnViewParentChanged(View* target, View* old_parent) override {
|
| + ViewParentChangedDetails details;
|
| + details.target = target;
|
| + details.old_parent = old_parent;
|
| + details.new_parent = target->parent();
|
| + views_parent_changed_details_.push_back(details);
|
| + }
|
| +
|
| + void OnViewVisibilityChanged(View* view) override {
|
| + view_visibility_changed_ = view;
|
| + }
|
| +
|
| + void OnViewEnabledChanged(View* view) override {
|
| + view_enabled_changed_ = view;
|
| + }
|
| +
|
| + void OnViewBoundsChanged(View* view) override { view_bounds_changed_ = view; }
|
| +
|
| + void OnChildViewReordered(View* view) override { view_reordered_ = view; }
|
| +
|
| + bool DidChangeParent(View* target, View* old_parent, View* new_parent) {
|
| + for (auto& details : views_parent_changed_details_) {
|
| + if (details.target == target && details.old_parent == old_parent &&
|
| + details.new_parent == new_parent)
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + void reset() {
|
| + views_parent_changed_details_.clear();
|
| + view_visibility_changed_ = nullptr;
|
| + view_enabled_changed_ = nullptr;
|
| + view_bounds_changed_ = nullptr;
|
| + view_reordered_ = nullptr;
|
| + }
|
| +
|
| + std::unique_ptr<View> NewView() {
|
| + auto view = base::MakeUnique<View>();
|
| + view->AddObserver(this);
|
| + return view;
|
| + }
|
| +
|
| + int views_parent_changed_times() const {
|
| + return static_cast<int>(views_parent_changed_details_.size());
|
| + }
|
| + const View* view_visibility_changed() const {
|
| + return view_visibility_changed_;
|
| + }
|
| + const View* view_enabled_changed() const { return view_enabled_changed_; }
|
| + const View* view_bounds_changed() const { return view_bounds_changed_; }
|
| + const View* view_reordered() const { return view_reordered_; }
|
| +
|
| + private:
|
| + struct ViewParentChangedDetails {
|
| + View* target;
|
| + View* old_parent;
|
| + View* new_parent;
|
| + };
|
| + std::vector<ViewParentChangedDetails> views_parent_changed_details_;
|
| + View* view_visibility_changed_;
|
| + View* view_enabled_changed_;
|
| + View* view_bounds_changed_;
|
| + View* view_reordered_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ViewObserverTest);
|
| +};
|
| +
|
| +TEST_F(ViewObserverTest, ViewParentChanged) {
|
| + std::unique_ptr<View> parent1 = NewView();
|
| + std::unique_ptr<View> parent2 = NewView();
|
| + std::unique_ptr<View> child_view = NewView();
|
| +
|
| + parent1->AddChildView(child_view.get());
|
| + EXPECT_EQ(1, views_parent_changed_times());
|
| + EXPECT_TRUE(DidChangeParent(child_view.get(), nullptr, parent1.get()));
|
| + reset();
|
| +
|
| + // Removed from parent1, added to parent2
|
| + parent2->AddChildView(child_view.get());
|
| + EXPECT_EQ(2, views_parent_changed_times());
|
| + EXPECT_TRUE(DidChangeParent(child_view.get(), parent1.get(), nullptr));
|
| + EXPECT_TRUE(DidChangeParent(child_view.get(), nullptr, parent2.get()));
|
| +
|
| + reset();
|
| +
|
| + parent2->RemoveChildView(child_view.get());
|
| + EXPECT_EQ(1, views_parent_changed_times());
|
| + EXPECT_TRUE(DidChangeParent(child_view.get(), parent2.get(), nullptr));
|
| +}
|
| +
|
| +TEST_F(ViewObserverTest, ViewVisibilityChanged) {
|
| + std::unique_ptr<View> view = NewView();
|
| + view->SetVisible(false);
|
| + EXPECT_EQ(view.get(), view_visibility_changed());
|
| + EXPECT_EQ(false, view->visible());
|
| +}
|
| +
|
| +TEST_F(ViewObserverTest, ViewEnabledChanged) {
|
| + std::unique_ptr<View> view = NewView();
|
| + view->SetEnabled(false);
|
| + EXPECT_EQ(view.get(), view_enabled_changed());
|
| + EXPECT_EQ(false, view->enabled());
|
| +}
|
| +
|
| +TEST_F(ViewObserverTest, ViewBoundsChanged) {
|
| + std::unique_ptr<View> view = NewView();
|
| + gfx::Rect bounds(2, 2, 2, 2);
|
| + view->SetBoundsRect(bounds);
|
| + EXPECT_EQ(view.get(), view_bounds_changed());
|
| + EXPECT_EQ(bounds, view->bounds());
|
| +
|
| + reset();
|
| +
|
| + gfx::Rect new_bounds(1, 1, 1, 1);
|
| + view->SetBoundsRect(new_bounds);
|
| + EXPECT_EQ(view.get(), view_bounds_changed());
|
| + EXPECT_EQ(new_bounds, view->bounds());
|
| +}
|
| +
|
| +TEST_F(ViewObserverTest, ChildViewReordered) {
|
| + std::unique_ptr<View> view = NewView();
|
| + std::unique_ptr<View> child_view = NewView();
|
| + std::unique_ptr<View> child_view2 = NewView();
|
| + view->AddChildView(child_view.get());
|
| + view->AddChildView(child_view2.get());
|
| + view->ReorderChildView(child_view2.get(), 0);
|
| + EXPECT_EQ(child_view2.get(), view_reordered());
|
| +}
|
| +
|
| } // namespace views
|
|
|