1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file. 4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ui/views/widget/root_view_test_helper.h" 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace views { 9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace test { 10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)typedef ViewsTestBase RootViewTest; 12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class DeleteOnKeyEventView : public View { 14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public: 15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) explicit DeleteOnKeyEventView(bool* set_on_key) : set_on_key_(set_on_key) {} 16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual ~DeleteOnKeyEventView() {} 17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE { 19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) *set_on_key_ = true; 20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delete this; 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private: 25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Set to true in OnKeyPressed(). 26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool* set_on_key_; 27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DeleteOnKeyEventView); 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Verifies deleting a View in OnKeyPressed() doesn't crash. 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(RootViewTest, DeleteViewDuringKeyEventDispatch) { 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget widget; 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Widget::InitParams init_params = 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) CreateParams(Widget::InitParams::TYPE_POPUP); 36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) widget.Init(init_params); 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool got_key_event = false; 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) View* content = new View; 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) widget.SetContentsView(content); 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) View* child = new DeleteOnKeyEventView(&got_key_event); 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) content->AddChildView(child); 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_ESCAPE, 0, false); 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RootViewTestHelper test_helper( 49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static_cast<internal::RootView*>(widget.GetRootView())); 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) test_helper.DispatchKeyEventStartAt(child, &key_event); 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(got_key_event); 52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace test 55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace views 56