Cast: Stop logging kVideoFrameSentToEncoder and rename a couple events.
[chromium-blink-merge.git] / chrome / browser / ui / views / menu_model_adapter_test.cc
blob7f861ded35b619bf3be2a1907936b70324c31241
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/callback.h"
6 #include "base/strings/utf_string_conversions.h"
7 #include "chrome/test/base/interactive_test_utils.h"
8 #include "chrome/test/base/ui_test_utils.h"
9 #include "chrome/test/base/view_event_test_base.h"
10 #include "ui/base/models/menu_model.h"
11 #include "ui/base/test/ui_controls.h"
12 #include "ui/views/controls/button/menu_button.h"
13 #include "ui/views/controls/button/menu_button_listener.h"
14 #include "ui/views/controls/menu/menu_controller.h"
15 #include "ui/views/controls/menu/menu_item_view.h"
16 #include "ui/views/controls/menu/menu_model_adapter.h"
17 #include "ui/views/controls/menu/menu_runner.h"
18 #include "ui/views/controls/menu/submenu_view.h"
19 #include "ui/views/test/test_views_delegate.h"
20 #include "ui/views/widget/root_view.h"
21 #include "ui/views/widget/widget.h"
23 namespace {
25 const int kTopMenuBaseId = 100;
26 const int kSubMenuBaseId = 200;
28 // Implement most of the ui::MenuModel pure virtual methods for subclasses
30 // Exceptions:
31 // virtual int GetItemCount() const = 0;
32 // virtual ItemType GetTypeAt(int index) const = 0;
33 // virtual int GetCommandIdAt(int index) const = 0;
34 // virtual base::string16 GetLabelAt(int index) const = 0;
35 class CommonMenuModel : public ui::MenuModel {
36 public:
37 CommonMenuModel() {
40 virtual ~CommonMenuModel() {
43 protected:
44 // ui::MenuModel implementation.
45 virtual bool HasIcons() const OVERRIDE {
46 return false;
49 virtual bool IsItemDynamicAt(int index) const OVERRIDE {
50 return false;
53 virtual bool GetAcceleratorAt(int index,
54 ui::Accelerator* accelerator) const OVERRIDE {
55 return false;
58 virtual ui::MenuSeparatorType GetSeparatorTypeAt(int index) const OVERRIDE {
59 return ui::NORMAL_SEPARATOR;
62 virtual bool IsItemCheckedAt(int index) const OVERRIDE {
63 return false;
66 virtual int GetGroupIdAt(int index) const OVERRIDE {
67 return 0;
70 virtual bool GetIconAt(int index, gfx::Image* icon) OVERRIDE {
71 return false;
74 virtual ui::ButtonMenuItemModel* GetButtonMenuItemAt(
75 int index) const OVERRIDE {
76 return NULL;
79 virtual bool IsEnabledAt(int index) const OVERRIDE {
80 return true;
83 virtual ui::MenuModel* GetSubmenuModelAt(int index) const OVERRIDE {
84 return NULL;
87 virtual void HighlightChangedTo(int index) OVERRIDE {
90 virtual void ActivatedAt(int index) OVERRIDE {
93 virtual void SetMenuModelDelegate(ui::MenuModelDelegate* delegate) OVERRIDE {
96 virtual ui::MenuModelDelegate* GetMenuModelDelegate() const OVERRIDE {
97 return NULL;
100 private:
101 DISALLOW_COPY_AND_ASSIGN(CommonMenuModel);
104 class SubMenuModel : public CommonMenuModel {
105 public:
106 SubMenuModel()
107 : showing_(false) {
110 virtual ~SubMenuModel() {
113 bool showing() const {
114 return showing_;
117 private:
118 // ui::MenuModel implementation.
119 virtual int GetItemCount() const OVERRIDE {
120 return 1;
123 virtual ItemType GetTypeAt(int index) const OVERRIDE {
124 return TYPE_COMMAND;
127 virtual int GetCommandIdAt(int index) const OVERRIDE {
128 return index + kSubMenuBaseId;
131 virtual base::string16 GetLabelAt(int index) const OVERRIDE {
132 return base::ASCIIToUTF16("Item");
135 virtual void MenuWillShow() OVERRIDE {
136 showing_ = true;
139 // Called when the menu has been closed.
140 virtual void MenuClosed() OVERRIDE {
141 showing_ = false;
144 bool showing_;
146 DISALLOW_COPY_AND_ASSIGN(SubMenuModel);
149 class TopMenuModel : public CommonMenuModel {
150 public:
151 TopMenuModel() {
154 virtual ~TopMenuModel() {
157 bool IsSubmenuShowing() {
158 return sub_menu_model_.showing();
161 private:
162 // ui::MenuModel implementation.
163 virtual int GetItemCount() const OVERRIDE {
164 return 1;
167 virtual ItemType GetTypeAt(int index) const OVERRIDE {
168 return TYPE_SUBMENU;
171 virtual int GetCommandIdAt(int index) const OVERRIDE {
172 return index + kTopMenuBaseId;
175 virtual base::string16 GetLabelAt(int index) const OVERRIDE {
176 return base::ASCIIToUTF16("submenu");
179 virtual MenuModel* GetSubmenuModelAt(int index) const OVERRIDE {
180 return &sub_menu_model_;
183 mutable SubMenuModel sub_menu_model_;
185 DISALLOW_COPY_AND_ASSIGN(TopMenuModel);
188 } // namespace
190 class MenuModelAdapterTest : public ViewEventTestBase,
191 public views::MenuButtonListener {
192 public:
193 MenuModelAdapterTest()
194 : ViewEventTestBase(),
195 button_(NULL),
196 menu_model_adapter_(&top_menu_model_),
197 menu_(NULL) {
198 old_views_delegate_ = views::ViewsDelegate::views_delegate;
199 views::ViewsDelegate::views_delegate = &views_delegate_;
202 virtual ~MenuModelAdapterTest() {
203 views::ViewsDelegate::views_delegate = old_views_delegate_;
206 // ViewEventTestBase implementation.
208 virtual void SetUp() OVERRIDE {
209 button_ = new views::MenuButton(
210 NULL, base::ASCIIToUTF16("Menu Adapter Test"), this, true);
212 menu_ = menu_model_adapter_.CreateMenu();
213 menu_runner_.reset(new views::MenuRunner(menu_));
215 ViewEventTestBase::SetUp();
218 virtual void TearDown() OVERRIDE {
219 menu_runner_.reset(NULL);
220 menu_ = NULL;
221 ViewEventTestBase::TearDown();
224 virtual views::View* CreateContentsView() OVERRIDE {
225 return button_;
228 virtual gfx::Size GetPreferredSize() OVERRIDE {
229 return button_->GetPreferredSize();
232 // views::MenuButtonListener implementation.
233 virtual void OnMenuButtonClicked(views::View* source,
234 const gfx::Point& point) OVERRIDE {
235 gfx::Point screen_location;
236 views::View::ConvertPointToScreen(source, &screen_location);
237 gfx::Rect bounds(screen_location, source->size());
238 ignore_result(menu_runner_->RunMenuAt(source->GetWidget(),
239 button_,
240 bounds,
241 views::MENU_ANCHOR_TOPLEFT,
242 ui::MENU_SOURCE_NONE,
243 views::MenuRunner::HAS_MNEMONICS));
246 // ViewEventTestBase implementation
247 virtual void DoTestOnMessageLoop() OVERRIDE {
248 Click(button_, CreateEventTask(this, &MenuModelAdapterTest::Step1));
251 // Open the submenu.
252 void Step1() {
253 views::SubmenuView* topmenu = menu_->GetSubmenu();
254 ASSERT_TRUE(topmenu);
255 ASSERT_TRUE(topmenu->IsShowing());
256 ASSERT_FALSE(top_menu_model_.IsSubmenuShowing());
258 // Click the first item to open the submenu.
259 views::MenuItemView* item = topmenu->GetMenuItemAt(0);
260 ASSERT_TRUE(item);
261 Click(item, CreateEventTask(this, &MenuModelAdapterTest::Step2));
264 // Rebuild the menu which should close the submenu.
265 void Step2() {
266 views::SubmenuView* topmenu = menu_->GetSubmenu();
267 ASSERT_TRUE(topmenu);
268 ASSERT_TRUE(topmenu->IsShowing());
269 ASSERT_TRUE(top_menu_model_.IsSubmenuShowing());
271 menu_model_adapter_.BuildMenu(menu_);
273 base::MessageLoopForUI::current()->PostTask(
274 FROM_HERE, CreateEventTask(this, &MenuModelAdapterTest::Step3));
277 // Verify that the submenu MenuModel received the close callback
278 // and close the menu.
279 void Step3() {
280 views::SubmenuView* topmenu = menu_->GetSubmenu();
281 ASSERT_TRUE(topmenu);
282 ASSERT_TRUE(topmenu->IsShowing());
283 ASSERT_FALSE(top_menu_model_.IsSubmenuShowing());
285 // Click the button to exit the menu.
286 Click(button_, CreateEventTask(this, &MenuModelAdapterTest::Step4));
289 // All done.
290 void Step4() {
291 views::SubmenuView* topmenu = menu_->GetSubmenu();
292 ASSERT_TRUE(topmenu);
293 ASSERT_FALSE(topmenu->IsShowing());
294 ASSERT_FALSE(top_menu_model_.IsSubmenuShowing());
296 Done();
299 private:
300 // Generate a mouse click on the specified view and post a new task.
301 virtual void Click(views::View* view, const base::Closure& next) {
302 ui_test_utils::MoveMouseToCenterAndPress(
303 view,
304 ui_controls::LEFT,
305 ui_controls::DOWN | ui_controls::UP,
306 next);
309 views::ViewsDelegate* old_views_delegate_;
310 views::TestViewsDelegate views_delegate_;
312 views::MenuButton* button_;
313 TopMenuModel top_menu_model_;
314 views::MenuModelAdapter menu_model_adapter_;
315 views::MenuItemView* menu_;
316 scoped_ptr<views::MenuRunner> menu_runner_;
319 VIEW_TEST(MenuModelAdapterTest, RebuildMenu)