// Copyright 2013 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 "ui/views/test/views_test_base.h" #include "ui/views/widget/root_view_test_helper.h" namespace views { namespace test { typedef ViewsTestBase RootViewTest; class DeleteOnKeyEventView : public View { public: explicit DeleteOnKeyEventView(bool* set_on_key) : set_on_key_(set_on_key) {} virtual ~DeleteOnKeyEventView() {} virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE { *set_on_key_ = true; delete this; return true; } private: // Set to true in OnKeyPressed(). bool* set_on_key_; DISALLOW_COPY_AND_ASSIGN(DeleteOnKeyEventView); }; // Verifies deleting a View in OnKeyPressed() doesn't crash. TEST_F(RootViewTest, DeleteViewDuringKeyEventDispatch) { Widget widget; Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP); init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; widget.Init(init_params); bool got_key_event = false; View* content = new View; widget.SetContentsView(content); View* child = new DeleteOnKeyEventView(&got_key_event); content->AddChildView(child); ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_ESCAPE, 0, false); RootViewTestHelper test_helper( static_cast<internal::RootView*>(widget.GetRootView())); test_helper.DispatchKeyEventStartAt(child, &key_event); EXPECT_TRUE(got_key_event); } } // namespace test } // namespace views