Index: ui/views/widget/widget_unittest.cc |
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc |
index 41bbe8198d7b40b9136deaf3ae068bb795c3be87..ac5d2d12b8dee7284b92a0db89cf84c3e9b89521 100644 |
--- a/ui/views/widget/widget_unittest.cc |
+++ b/ui/views/widget/widget_unittest.cc |
@@ -29,6 +29,7 @@ |
#include "ui/views/widget/native_widget_delegate.h" |
#include "ui/views/widget/root_view.h" |
#include "ui/views/widget/widget_deletion_observer.h" |
+#include "ui/views/widget/widget_removals_observer.h" |
#include "ui/views/window/dialog_delegate.h" |
#include "ui/views/window/native_frame_view.h" |
@@ -3401,5 +3402,46 @@ TEST_F(WidgetTest, OnDeviceScaleFactorChanged) { |
EXPECT_EQ(scale_factor, view->last_scale_factor()); |
} |
+namespace { |
+ |
+class TestWidgetRemovalsObserver : public WidgetRemovalsObserver { |
+ public: |
+ TestWidgetRemovalsObserver() {} |
+ ~TestWidgetRemovalsObserver() override {} |
+ |
+ void OnWillRemoveView(Widget* widget, View* view) override { |
+ removed_views_.insert(view); |
+ } |
+ |
+ bool DidRemoveView(View* view) { |
+ return removed_views_.find(view) != removed_views_.end(); |
+ } |
+ |
+ private: |
+ std::set<View*> removed_views_; |
+}; |
+ |
+} |
+ |
+// Test that WidgetRemovalsObserver::OnWillRemoveView is called on every |
+// deleted view. |
+TEST_F(WidgetTest, WidgetRemovalsObserver) { |
+ WidgetAutoclosePtr widget(CreateTopLevelPlatformWidget()); |
+ TestWidgetRemovalsObserver removals_observer; |
+ widget->AddRemovalsObserver(&removals_observer); |
+ |
+ View* parent = new View(); |
+ widget->client_view()->AddChildView(parent); |
+ |
+ View* child = new View(); |
+ parent->AddChildView(child); |
+ |
+ widget->client_view()->RemoveChildView(parent); |
+ EXPECT_TRUE(removals_observer.DidRemoveView(parent)); |
+ EXPECT_TRUE(removals_observer.DidRemoveView(child)); |
+ |
+ widget->RemoveRemovalsObserver(&removals_observer); |
+} |
+ |
} // namespace test |
} // namespace views |