Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: chrome/test/menu_item_view_test.cc

Issue 6931039: Add MenuItemView API to add and remove items at a particular index. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed another spurious OVERRIDE. Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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.
4
5 #include "base/message_loop.h"
6 #include "base/task.h"
7 #include "chrome/browser/automation/ui_controls.h"
Paweł Hajdan Jr. 2011/05/06 08:11:03 Are those chrome includes the only reason why this
8 #include "chrome/test/interactive_ui/view_event_test_base.h"
9 #include "chrome/test/testing_profile.h"
Paweł Hajdan Jr. 2011/05/06 08:11:03 Is this #include used?
10 #include "chrome/test/ui_test_utils.h"
Paweł Hajdan Jr. 2011/05/06 08:11:03 Is this #include used?
11 #include "views/controls/button/menu_button.h"
12 #include "views/controls/menu/menu_controller.h"
13 #include "views/controls/menu/menu_item_view.h"
14 #include "views/controls/menu/submenu_view.h"
15 #include "views/controls/menu/view_menu_delegate.h"
16 #include "views/views_delegate.h"
17 #include "views/window/window.h"
18
19 // This constant is used to delay certain testing steps. It is
20 // normally 0 but can be set higher for local development and
21 // debugging so the behavior can be observed.
22 static const int kStepMilliseconds = 0;
Paweł Hajdan Jr. 2011/05/06 08:11:03 I don't think it's a good idea to check that in (w
23
24 // This is a convenience base class for all tests to provide some
25 // common functionality. It sets up a MenuButton and a MenuItemView
26 // and clicks the MenuButton.
27 //
28 // Subclasses should implement:
29 // BuildMenu() populate the menu
30 // DoTestOnMessageLoop() initiate the test
31 // Step1() called when the menu is posted
32 //
33 // Subclasses can call:
34 // Click() to post a mouse click on a View
35 //
36 // Although it should be possible to post a menu multiple times,
37 // MenuItemView prevents repeated activation of of a menu by
sky 2011/05/06 16:17:00 'of of' -> of
rhashimoto 2011/05/11 00:44:53 Done.
38 // clicks too close in time.
39 class MenuItemViewTestBase : public ViewEventTestBase,
40 public views::ViewMenuDelegate,
41 public views::MenuDelegate {
42 public:
43 MenuItemViewTestBase() : ViewEventTestBase(),
44 button_(NULL),
45 menu_(NULL) {
46 }
47
48 virtual ~MenuItemViewTestBase() {
49 }
50
51 // ViewEventTestBase implementation.
52
53 virtual void SetUp() OVERRIDE {
54 button_ = new views::MenuButton(NULL, L"Menu Test", this, true);
55
56 menu_ = new views::MenuItemView(this);
57 BuildMenu(menu_);
58
59 ViewEventTestBase::SetUp();
60 }
61
62 virtual void TearDown() OVERRIDE {
63 delete menu_;
Paweł Hajdan Jr. 2011/05/06 08:11:03 Why not a scoped_ptr then? Non-scoped memory manag
rhashimoto 2011/05/11 00:44:53 Done.
64 menu_ = NULL;
65 ViewEventTestBase::TearDown();
66 }
67
68 virtual views::View* CreateContentsView() OVERRIDE {
69 return button_;
70 }
71
72 virtual gfx::Size GetPreferredSize() OVERRIDE {
73 return button_->GetPreferredSize();
74 }
75
76 // views::ViewMenuDelegate implementation.
77 virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE {
78 gfx::Point screen_location;
79 views::View::ConvertPointToScreen(source, &screen_location);
80 gfx::Rect bounds(screen_location, source->size());
81 menu_->RunMenuAt(
82 source->GetWindow()->GetNativeWindow(),
83 button_,
84 bounds,
85 views::MenuItemView::TOPLEFT,
86 true);
87 }
88
89 protected:
90 // Generate a mouse click on the specified view and post a new task.
91 virtual void Click(views::View* view,Task* next) {
sky 2011/05/06 16:17:00 'view,task' -> 'view, task'
rhashimoto 2011/05/11 00:44:53 Done.
92 ui_controls::MoveMouseToCenterAndPress(
93 view,
94 ui_controls::LEFT,
95 ui_controls::DOWN | ui_controls::UP,
96 next);
97 }
98
99 virtual void BuildMenu(views::MenuItemView* menu) {
100 }
101
102 views::MenuButton* button_;
103 views::MenuItemView* menu_;
104 };
105
106 // Simple test for clicking a menu item. This template class clicks on an
107 // item and checks that the returned id matches. The index of the item
108 // is the template argument.
109 template<int INDEX>
110 class MenuItemViewTestBasic : public MenuItemViewTestBase {
111 public:
112 MenuItemViewTestBasic() : last_command_(0) {
113 }
114
115 virtual ~MenuItemViewTestBasic() {
116 }
117
118 // views::MenuDelegate implementation
119 virtual void ExecuteCommand(int id) OVERRIDE {
120 last_command_ = id;
121 }
122
123 // MenuItemViewTestBase implementation
124 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
125 menu->AppendMenuItemWithLabel(1, L"item 1");
126 menu->AppendMenuItemWithLabel(2, L"item 2");
127 menu->AppendSeparator();
128 menu->AppendMenuItemWithLabel(3, L"item 3");
129 }
130
131 // ViewEventTestBase implementation
132 virtual void DoTestOnMessageLoop() OVERRIDE {
133 MessageLoopForUI::current()->PostDelayedTask(
134 FROM_HERE,
135 CreateEventTask(this, &MenuItemViewTestBasic::Step0),
136 kStepMilliseconds);
137 }
138
139 // Open the menu.
140 void Step0() {
141 Click(button_, CreateEventTask(this, &MenuItemViewTestBasic::Step1));
142 }
143
144 // Click on item INDEX.
145 void Step1() {
146 ASSERT_TRUE(menu_);
147
148 views::SubmenuView* submenu = menu_->GetSubmenu();
149 ASSERT_TRUE(submenu);
150 ASSERT_TRUE(submenu->IsShowing());
151 ASSERT_EQ(3, submenu->GetMenuItemCount());
152
153 // click an item and pass control to the next step
154 views::MenuItemView* item = submenu->GetMenuItemAt(INDEX);
155 ASSERT_TRUE(item);
156 Click(item, CreateEventTask(this, &MenuItemViewTestBasic::Step2));
157 }
158
159 // Check the clicked item and complete the test.
160 void Step2() {
161 ASSERT_FALSE(menu_->GetSubmenu()->IsShowing());
162 ASSERT_EQ(INDEX + 1,last_command_);
163 Done();
164 }
165
166 private:
167 int last_command_;
168 };
169
170 // Click each item of a 3-item menu (with separator).
171 typedef MenuItemViewTestBasic<0> MenuItemViewTestBasic0;
172 typedef MenuItemViewTestBasic<1> MenuItemViewTestBasic1;
173 typedef MenuItemViewTestBasic<2> MenuItemViewTestBasic2;
174 VIEW_TEST(MenuItemViewTestBasic0, FLAKY_SelectItem0)
175 VIEW_TEST(MenuItemViewTestBasic1, FLAKY_SelectItem1)
176 VIEW_TEST(MenuItemViewTestBasic2, FLAKY_SelectItem2)
177
178 // Test class for inserting a menu item while the menu is open.
179 template<int INSERT_INDEX, int SELECT_INDEX>
180 class MenuItemViewTestInsert : public MenuItemViewTestBase {
181 public:
182 MenuItemViewTestInsert() : last_command_(0),
183 inserted_item_(NULL) {
184 }
185
186 virtual ~MenuItemViewTestInsert() {
187 }
188
189 // views::MenuDelegate implementation
190 virtual void ExecuteCommand(int id) OVERRIDE {
191 last_command_ = id;
192 }
193
194 // MenuItemViewTestBase implementation
195 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
196 menu->AppendMenuItemWithLabel(1, L"item 1");
197 menu->AppendMenuItemWithLabel(2, L"item 2");
198 }
199
200 // ViewEventTestBase implementation
201 virtual void DoTestOnMessageLoop() OVERRIDE {
202 MessageLoopForUI::current()->PostDelayedTask(
203 FROM_HERE,
204 CreateEventTask(this, &MenuItemViewTestInsert::Step0),
205 kStepMilliseconds);
206 }
207
208 // Post the menu.
209 void Step0() {
210 Click(button_, CreateEventTask(this, &MenuItemViewTestInsert::Step1));
211 }
212
213 // Add optional delay for debugging.
214 void Step1() {
215 ASSERT_TRUE(menu_);
216
217 views::SubmenuView* submenu = menu_->GetSubmenu();
218 ASSERT_TRUE(submenu);
219 ASSERT_TRUE(submenu->IsShowing());
220 ASSERT_EQ(2, submenu->GetMenuItemCount());
221
222 MessageLoopForUI::current()->PostDelayedTask(
223 FROM_HERE,
224 CreateEventTask(this, &MenuItemViewTestInsert::Step2),
225 kStepMilliseconds);
226 }
227
228 // Insert item at INSERT_INDEX.
229 void Step2() {
230 inserted_item_ = menu_->AddMenuItemAt(INSERT_INDEX,
231 1000,
232 L"inserted item",
233 SkBitmap(),
234 views::MenuItemView::NORMAL);
235 ASSERT_TRUE(inserted_item_);
236 menu_->ChildrenChanged();
237
238 MessageLoopForUI::current()->PostDelayedTask(
239 FROM_HERE,
240 CreateEventTask(this, &MenuItemViewTestInsert::Step3),
241 kStepMilliseconds);
242 }
243
244 // Click item SELECT_INDEX.
245 void Step3() {
246 ASSERT_TRUE(menu_);
247
248 views::SubmenuView* submenu = menu_->GetSubmenu();
249 ASSERT_TRUE(submenu);
250 ASSERT_TRUE(submenu->IsShowing());
251 ASSERT_EQ(3, submenu->GetMenuItemCount());
252
253 // click an item and pass control to the next step
254 views::MenuItemView* item = submenu->GetMenuItemAt(SELECT_INDEX);
255 ASSERT_TRUE(item);
256 Click(item, CreateEventTask(this, &MenuItemViewTestInsert::Step4));
257 }
258
259 // Check clicked item and complete test.
260 void Step4() {
261 ASSERT_FALSE(menu_->GetSubmenu()->IsShowing());
262
263 if (SELECT_INDEX == INSERT_INDEX)
264 ASSERT_EQ(1000, last_command_);
265 else if (SELECT_INDEX < INSERT_INDEX)
266 ASSERT_EQ(SELECT_INDEX + 1, last_command_);
267 else
268 ASSERT_EQ(SELECT_INDEX, last_command_);
269
270 Done();
271 }
272
273 private:
274 int last_command_;
275 views::MenuItemView* inserted_item_;
276 };
277
278 // MenuItemViewTestInsertXY inserts an item at index X and selects the
279 // item at index Y (after the insertion). The tests here cover
280 // inserting at the beginning, middle, and end, crossbarred with
281 // selecting the first and last item.
282 typedef MenuItemViewTestInsert<0,0> MenuItemViewTestInsert00;
283 typedef MenuItemViewTestInsert<0,2> MenuItemViewTestInsert02;
284 typedef MenuItemViewTestInsert<1,0> MenuItemViewTestInsert10;
285 typedef MenuItemViewTestInsert<1,2> MenuItemViewTestInsert12;
286 typedef MenuItemViewTestInsert<2,0> MenuItemViewTestInsert20;
287 typedef MenuItemViewTestInsert<2,2> MenuItemViewTestInsert22;
288 VIEW_TEST(MenuItemViewTestInsert00, FLAKY_InsertItem00)
289 VIEW_TEST(MenuItemViewTestInsert02, FLAKY_InsertItem02)
290 VIEW_TEST(MenuItemViewTestInsert10, FLAKY_InsertItem10)
291 VIEW_TEST(MenuItemViewTestInsert12, FLAKY_InsertItem12)
292 VIEW_TEST(MenuItemViewTestInsert20, FLAKY_InsertItem20)
293 VIEW_TEST(MenuItemViewTestInsert22, FLAKY_InsertItem22)
294
295 // Test class for inserting a menu item while a submenu is open.
296 template<int INSERT_INDEX>
297 class MenuItemViewTestInsertWithSubmenu : public MenuItemViewTestBase {
298 public:
299 MenuItemViewTestInsertWithSubmenu() : last_command_(0),
300 submenu_(NULL),
301 inserted_item_(NULL) {
302 }
303
304 virtual ~MenuItemViewTestInsertWithSubmenu() {
305 }
306
307 // views::MenuDelegate implementation
308 virtual void ExecuteCommand(int id) OVERRIDE {
309 last_command_ = id;
310 }
311
312 // MenuItemViewTestBase implementation
313 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
314 submenu_ = menu->AppendSubMenu(1, L"My Submenu");
315 submenu_->AppendMenuItemWithLabel(101, L"submenu item 1");
316 submenu_->AppendMenuItemWithLabel(101, L"submenu item 2");
317 menu->AppendMenuItemWithLabel(2, L"item 2");
318 }
319
320 // ViewEventTestBase implementation
321 virtual void DoTestOnMessageLoop() OVERRIDE {
322 MessageLoopForUI::current()->PostDelayedTask(
323 FROM_HERE,
324 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step0),
325 kStepMilliseconds);
326 }
327
328 // Post the menu.
329 void Step0() {
330 Click(button_,
331 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step1));
332 }
333
334 // Add optional delay for debugging.
335 void Step1() {
336 MessageLoopForUI::current()->PostDelayedTask(
337 FROM_HERE,
338 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step2),
339 kStepMilliseconds);
340 }
341
342 // Post submenu.
343 void Step2() {
344 Click(submenu_,
345 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step3));
346 }
347
348 // Add optional delay for debugging.
349 void Step3() {
350 MessageLoopForUI::current()->PostDelayedTask(
351 FROM_HERE,
352 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step4),
353 kStepMilliseconds);
354 }
355
356 // Insert item at INSERT_INDEX.
357 void Step4() {
358 inserted_item_ = menu_->AddMenuItemAt(INSERT_INDEX,
359 1000,
360 L"inserted item",
361 SkBitmap(),
362 views::MenuItemView::NORMAL);
363 ASSERT_TRUE(inserted_item_);
364 menu_->ChildrenChanged();
365
366 MessageLoopForUI::current()->PostDelayedTask(
367 FROM_HERE,
368 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step5),
369 kStepMilliseconds);
370 }
371
372 // Select item to exit menu loop.
373 void Step5() {
374 ASSERT_TRUE(menu_->GetSubmenu()->IsShowing());
375
376 Click(inserted_item_,
377 CreateEventTask(this, &MenuItemViewTestInsertWithSubmenu::Step6));
378 }
379
380 void Step6() {
381 Done();
382 }
383
384 private:
385 int last_command_;
386 views::MenuItemView* submenu_;
387 views::MenuItemView* inserted_item_;
388 };
389
390 // MenuItemViewTestInsertWithSubmenuX posts a menu and its submenu,
391 // then inserts an item in the top-level menu at X.
392 typedef MenuItemViewTestInsertWithSubmenu<0> MenuItemViewTestInsertWithSubmenu0;
393 typedef MenuItemViewTestInsertWithSubmenu<1> MenuItemViewTestInsertWithSubmenu1;
394 VIEW_TEST(MenuItemViewTestInsertWithSubmenu0, FLAKY_InsertItemWithSubmenu0)
395 VIEW_TEST(MenuItemViewTestInsertWithSubmenu1, FLAKY_InsertItemWithSubmenu1)
396
397 // Test class for removing a menu item while the menu is open.
398 template<int REMOVE_INDEX, int SELECT_INDEX>
399 class MenuItemViewTestRemove : public MenuItemViewTestBase {
400 public:
401 MenuItemViewTestRemove() : last_command_(0) {
402 }
403
404 virtual ~MenuItemViewTestRemove() {
405 }
406
407 // views::MenuDelegate implementation
408 virtual void ExecuteCommand(int id) OVERRIDE {
409 last_command_ = id;
410 }
411
412 // MenuItemViewTestBase implementation
413 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
414 menu->AppendMenuItemWithLabel(1, L"item 1");
415 menu->AppendMenuItemWithLabel(2, L"item 2");
416 menu->AppendMenuItemWithLabel(3, L"item 3");
417 }
418
419 // ViewEventTestBase implementation
420 virtual void DoTestOnMessageLoop() OVERRIDE {
421 MessageLoopForUI::current()->PostDelayedTask(
422 FROM_HERE,
423 CreateEventTask(this, &MenuItemViewTestRemove::Step0),
424 kStepMilliseconds);
425 }
426
427 // Post the menu.
428 void Step0() {
429 Click(button_, CreateEventTask(this, &MenuItemViewTestRemove::Step1));
430 }
431
432 // Add optional delay for debugging.
433 void Step1() {
434 ASSERT_TRUE(menu_);
435
436 views::SubmenuView* submenu = menu_->GetSubmenu();
437 ASSERT_TRUE(submenu);
438 ASSERT_TRUE(submenu->IsShowing());
439 ASSERT_EQ(3, submenu->GetMenuItemCount());
440
441 MessageLoopForUI::current()->PostDelayedTask(
442 FROM_HERE,
443 CreateEventTask(this, &MenuItemViewTestRemove::Step2),
444 kStepMilliseconds);
445 }
446
447 // Remove item at REMOVE_INDEX.
448 void Step2() {
449 menu_->RemoveMenuItemAt(REMOVE_INDEX);
450 menu_->ChildrenChanged();
451
452 MessageLoopForUI::current()->PostDelayedTask(
453 FROM_HERE,
454 CreateEventTask(this, &MenuItemViewTestRemove::Step3),
455 kStepMilliseconds);
456 }
457
458 // Click item SELECT_INDEX.
459 void Step3() {
460 ASSERT_TRUE(menu_);
461
462 views::SubmenuView* submenu = menu_->GetSubmenu();
463 ASSERT_TRUE(submenu);
464 ASSERT_TRUE(submenu->IsShowing());
465 ASSERT_EQ(2, submenu->GetMenuItemCount());
466
467 // click an item and pass control to the next step
468 views::MenuItemView* item = submenu->GetMenuItemAt(SELECT_INDEX);
469 ASSERT_TRUE(item);
470 Click(item, CreateEventTask(this, &MenuItemViewTestRemove::Step4));
471 }
472
473 // Check clicked item and complete test.
474 void Step4() {
475 ASSERT_FALSE(menu_->GetSubmenu()->IsShowing());
476
477 if (SELECT_INDEX < REMOVE_INDEX)
478 ASSERT_EQ(SELECT_INDEX + 1, last_command_);
479 else
480 ASSERT_EQ(SELECT_INDEX + 2, last_command_);
481
482 Done();
483 }
484
485 private:
486 int last_command_;
487 };
488
489 typedef MenuItemViewTestRemove<0,0> MenuItemViewTestRemove00;
490 typedef MenuItemViewTestRemove<0,1> MenuItemViewTestRemove01;
491 typedef MenuItemViewTestRemove<1,0> MenuItemViewTestRemove10;
492 typedef MenuItemViewTestRemove<1,1> MenuItemViewTestRemove11;
493 typedef MenuItemViewTestRemove<2,0> MenuItemViewTestRemove20;
494 typedef MenuItemViewTestRemove<2,1> MenuItemViewTestRemove21;
495 VIEW_TEST(MenuItemViewTestRemove00, FLAKY_RemoveItem00)
496 VIEW_TEST(MenuItemViewTestRemove01, FLAKY_RemoveItem01)
497 VIEW_TEST(MenuItemViewTestRemove10, FLAKY_RemoveItem10)
498 VIEW_TEST(MenuItemViewTestRemove11, FLAKY_RemoveItem11)
499 VIEW_TEST(MenuItemViewTestRemove20, FLAKY_RemoveItem20)
500 VIEW_TEST(MenuItemViewTestRemove21, FLAKY_RemoveItem21)
501
502 // Test class for removing a menu item while a submenu is open.
503 template<int REMOVE_INDEX>
504 class MenuItemViewTestRemoveWithSubmenu : public MenuItemViewTestBase {
505 public:
506 MenuItemViewTestRemoveWithSubmenu() : last_command_(0),
507 submenu_(NULL) {
508 }
509
510 virtual ~MenuItemViewTestRemoveWithSubmenu() {
511 }
512
513 // views::MenuDelegate implementation
514 virtual void ExecuteCommand(int id) OVERRIDE {
515 last_command_ = id;
516 }
517
518 // MenuItemViewTestBase implementation
519 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
520 menu->AppendMenuItemWithLabel(1, L"item 1");
521 submenu_ = menu->AppendSubMenu(2, L"My Submenu");
522 submenu_->AppendMenuItemWithLabel(101, L"submenu item 1");
523 submenu_->AppendMenuItemWithLabel(102, L"submenu item 2");
524 }
525
526 // ViewEventTestBase implementation
527 virtual void DoTestOnMessageLoop() OVERRIDE {
528 MessageLoopForUI::current()->PostDelayedTask(
529 FROM_HERE,
530 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step0),
531 kStepMilliseconds);
532 }
533
534 // Post the menu.
535 void Step0() {
536 Click(button_,
537 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step1));
538 }
539
540 // Add optional delay for debugging.
541 void Step1() {
542 MessageLoopForUI::current()->PostDelayedTask(
543 FROM_HERE,
544 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step2),
545 kStepMilliseconds);
546 }
547
548 // Post submenu.
549 void Step2() {
550 Click(submenu_,
551 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step3));
552 }
553
554 // Add optional delay for debugging.
555 void Step3() {
556 MessageLoopForUI::current()->PostDelayedTask(
557 FROM_HERE,
558 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step4),
559 kStepMilliseconds);
560 }
561
562 // Remove item at REMOVE_INDEX.
563 void Step4() {
564 menu_->RemoveMenuItemAt(REMOVE_INDEX);
565 menu_->ChildrenChanged();
566
567 MessageLoopForUI::current()->PostDelayedTask(
568 FROM_HERE,
569 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step5),
570 kStepMilliseconds);
571 }
572
573 // Select item to exit menu loop.
574 void Step5() {
575 ASSERT_TRUE(menu_->GetSubmenu()->IsShowing());
576
577 Click(button_,
578 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step6));
579 }
580
581 void Step6() {
582 Done();
583 }
584
585 private:
586 int last_command_;
587 views::MenuItemView* submenu_;
588 };
589
590 typedef MenuItemViewTestRemoveWithSubmenu<0> MenuItemViewTestRemoveWithSubmenu0;
591 typedef MenuItemViewTestRemoveWithSubmenu<1> MenuItemViewTestRemoveWithSubmenu1;
592 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu0, FLAKY_RemoveItemWithSubmenu0)
593 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu1, FLAKY_RemoveItemWithSubmenu1)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698