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