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 |