Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Unified Diff: ui/views/accessibility/native_view_accessibility_unittest.cc

Issue 1287463002: Call RemoveObserver from OnWidgetDestroying (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added test Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/accessibility/native_view_accessibility.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/accessibility/native_view_accessibility_unittest.cc
diff --git a/ui/views/accessibility/native_view_accessibility_unittest.cc b/ui/views/accessibility/native_view_accessibility_unittest.cc
index 7fff8436f997f54abd28a84c2a045ee28122824e..705f3efc77f963f796c9e9b103ba1b3a864e6ee2 100644
--- a/ui/views/accessibility/native_view_accessibility_unittest.cc
+++ b/ui/views/accessibility/native_view_accessibility_unittest.cc
@@ -73,5 +73,41 @@ TEST_F(NativeViewAccessibilityTest, LabelIsChildOfButton) {
label_accessibility_->GetParent());
}
+// Subclass of NativeViewAccessibility that destroys itself when its
+// parent widget is destroyed, for the purposes of making sure this
+// doesn't lead to a crash.
+class TestNativeViewAccessibility : public NativeViewAccessibility {
+ public:
+ explicit TestNativeViewAccessibility(View* view)
+ : NativeViewAccessibility(view) {}
+
+ void OnWidgetDestroying(Widget* widget) override {
+ bool is_destroying_parent_widget = (parent_widget_ == widget);
+ NativeViewAccessibility::OnWidgetDestroying(widget);
+ if (is_destroying_parent_widget)
+ delete this;
+ }
+};
+
+TEST_F(NativeViewAccessibilityTest, CrashOnWidgetDestroyed) {
+ scoped_ptr<Widget> parent_widget(new Widget);
+ Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.bounds = gfx::Rect(50, 50, 650, 650);
+ parent_widget->Init(params);
+
+ scoped_ptr<Widget> child_widget(new Widget);
+ child_widget->Init(params);
+
+ // Make sure that deleting the parent widget can't cause a crash
+ // due to NativeViewAccessibility not unregistering itself as a
+ // WidgetObserver. Note that TestNativeViewAccessibility is a subclass
+ // defined above that destroys itself when its parent widget is destroyed.
+ TestNativeViewAccessibility* child_accessible =
+ new TestNativeViewAccessibility(child_widget->GetRootView());
+ child_accessible->SetParentWidget(parent_widget.get());
+ parent_widget.reset();
+}
+
} // namespace test
} // namespace views
« no previous file with comments | « ui/views/accessibility/native_view_accessibility.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698