• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/string_number_conversions.h"
6 #include "base/utf_string_conversions.h"
7 #include "chrome/app/chrome_command_ids.h"
8 #include "chrome/browser/automation/ui_controls.h"
9 #include "chrome/browser/bookmarks/bookmark_model.h"
10 #include "chrome/browser/bookmarks/bookmark_utils.h"
11 #include "chrome/browser/prefs/pref_service.h"
12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
14 #include "chrome/common/pref_names.h"
15 #include "chrome/test/interactive_ui/view_event_test_base.h"
16 #include "chrome/test/testing_profile.h"
17 #include "chrome/test/ui_test_utils.h"
18 #include "content/browser/tab_contents/page_navigator.h"
19 #include "content/common/notification_service.h"
20 #include "grit/generated_resources.h"
21 #include "ui/base/accessibility/accessibility_types.h"
22 #include "ui/base/clipboard/clipboard.h"
23 #include "ui/base/keycodes/keyboard_codes.h"
24 #include "views/controls/button/menu_button.h"
25 #include "views/controls/button/text_button.h"
26 #include "views/controls/menu/menu_controller.h"
27 #include "views/controls/menu/menu_item_view.h"
28 #include "views/controls/menu/submenu_view.h"
29 #include "views/views_delegate.h"
30 #include "views/window/window.h"
31 
32 #if defined(OS_LINUX)
33 // See http://crbug.com/40040 for details.
34 #define MAYBE_DND DISABLED_DND
35 #define MAYBE_DNDToDifferentMenu DISABLED_DNDToDifferentMenu
36 #define MAYBE_DNDBackToOriginatingMenu DISABLED_DNDBackToOriginatingMenu
37 
38 // See http://crbug.com/40039 for details.
39 #define MAYBE_KeyEvents DISABLED_KeyEvents
40 
41 // Two bugs here. http://crbug.com/47089 for general Linux Views, and
42 // http://crbug.com/47452 for ChromiumOS.
43 #define MAYBE_CloseWithModalDialog DISABLED_CloseWithModalDialog
44 // See http://crbug.com/47089 for details.
45 #define MAYBE_CloseMenuAfterClosingContextMenu \
46         DISABLED_CloseMenuAfterClosingContextMenu
47 
48 // See bug http://crbug.com/60444 for details.
49 #define MAYBE_ScrollButtonScrolls DISABLED_ScrollButtonScrolls
50 #else
51 
52 #define MAYBE_DND DND
53 #define MAYBE_DNDToDifferentMenu DNDToDifferentMenu
54 #define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu
55 #define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu
56 #define MAYBE_KeyEvents KeyEvents
57 #define MAYBE_CloseWithModalDialog CloseWithModalDialog
58 #define MAYBE_CloseMenuAfterClosingContextMenu CloseMenuAfterClosingContextMenu
59 #define MAYBE_ScrollButtonScrolls ScrollButtonScrolls
60 
61 #endif
62 
63 namespace {
64 
65 class ViewsDelegateImpl : public views::ViewsDelegate {
66  public:
ViewsDelegateImpl()67   ViewsDelegateImpl() {}
GetClipboard() const68   virtual ui::Clipboard* GetClipboard() const { return NULL; }
SaveWindowPlacement(views::Window * window,const std::wstring & window_name,const gfx::Rect & bounds,bool maximized)69   virtual void SaveWindowPlacement(views::Window* window,
70                                    const std::wstring& window_name,
71                                    const gfx::Rect& bounds,
72                                    bool maximized) {}
GetSavedWindowBounds(views::Window * window,const std::wstring & window_name,gfx::Rect * bounds) const73   virtual bool GetSavedWindowBounds(views::Window* window,
74                                     const std::wstring& window_name,
75                                     gfx::Rect* bounds) const {
76     return false;
77   }
GetSavedMaximizedState(views::Window * window,const std::wstring & window_name,bool * maximized) const78   virtual bool GetSavedMaximizedState(views::Window* window,
79                                       const std::wstring& window_name,
80                                       bool* maximized) const {
81     return false;
82   }
83 
NotifyAccessibilityEvent(views::View * view,ui::AccessibilityTypes::Event event_type)84   virtual void NotifyAccessibilityEvent(
85       views::View* view, ui::AccessibilityTypes::Event event_type) {}
NotifyMenuItemFocused(const std::wstring & menu_name,const std::wstring & menu_item_name,int item_index,int item_count,bool has_submenu)86   virtual void NotifyMenuItemFocused(
87       const std::wstring& menu_name,
88       const std::wstring& menu_item_name,
89       int item_index,
90       int item_count,
91       bool has_submenu) {}
92 
93 #if defined(OS_WIN)
GetDefaultWindowIcon() const94   virtual HICON GetDefaultWindowIcon() const { return 0; }
95 #endif
96 
AddRef()97   virtual void AddRef() {
98   }
99 
ReleaseRef()100   virtual void ReleaseRef() {
101     MessageLoopForUI::current()->Quit();
102   }
103 
104  private:
105   DISALLOW_COPY_AND_ASSIGN(ViewsDelegateImpl);
106 };
107 
108 // PageNavigator implementation that records the URL.
109 class TestingPageNavigator : public PageNavigator {
110  public:
OpenURL(const GURL & url,const GURL & referrer,WindowOpenDisposition disposition,PageTransition::Type transition)111   virtual void OpenURL(const GURL& url, const GURL& referrer,
112                        WindowOpenDisposition disposition,
113                        PageTransition::Type transition) {
114     url_ = url;
115   }
116 
117   GURL url_;
118 };
119 
120 }  // namespace
121 
122 // Base class for event generating bookmark view tests. These test are intended
123 // to exercise View's menus, but that's easier done with BookmarkBarView rather
124 // than View's menu itself.
125 //
126 // SetUp creates a bookmark model with the following structure.
127 // All folders are in upper case, all URLs in lower case.
128 // F1
129 //   f1a
130 //   F11
131 //     f11a
132 //   *
133 // a
134 // b
135 // c
136 // d
137 // OTHER
138 //   oa
139 //   OF
140 //     ofa
141 //     ofb
142 //   OF2
143 //     of2a
144 //     of2b
145 //
146 // * if CreateBigMenu returns return true, 100 menu items are created here with
147 //   the names f1-f100.
148 //
149 // Subclasses should be sure and invoke super's implementation of SetUp and
150 // TearDown.
151 class BookmarkBarViewEventTestBase : public ViewEventTestBase {
152  public:
BookmarkBarViewEventTestBase()153   BookmarkBarViewEventTestBase()
154       : ViewEventTestBase(),
155         model_(NULL),
156         bb_view_(NULL),
157         ui_thread_(BrowserThread::UI, MessageLoop::current()),
158         file_thread_(BrowserThread::FILE, MessageLoop::current()) {
159   }
160 
SetUp()161   virtual void SetUp() {
162     BookmarkBarView::testing_ = true;
163 
164     profile_.reset(new TestingProfile());
165     profile_->CreateBookmarkModel(true);
166     profile_->BlockUntilBookmarkModelLoaded();
167     profile_->GetPrefs()->SetBoolean(prefs::kShowBookmarkBar, true);
168 
169     model_ = profile_->GetBookmarkModel();
170     model_->ClearStore();
171 
172     bb_view_ = new BookmarkBarView(profile_.get(), NULL);
173     bb_view_->SetPageNavigator(&navigator_);
174 
175     AddTestData(CreateBigMenu());
176 
177     // Calculate the preferred size so that one button doesn't fit, which
178     // triggers the overflow button to appear.
179     //
180     // BookmarkBarView::Layout does nothing if the parent is NULL and
181     // GetPreferredSize hard codes a width of 1. For that reason we add the
182     // BookmarkBarView to a dumby view as the parent.
183     //
184     // This code looks a bit hacky, but I've written it so that it shouldn't
185     // be dependant upon any of the layout code in BookmarkBarView. Instead
186     // we brute force search for a size that triggers the overflow button.
187     views::View tmp_parent;
188 
189     tmp_parent.AddChildView(bb_view_);
190 
191     bb_view_pref_ = bb_view_->GetPreferredSize();
192     bb_view_pref_.set_width(1000);
193     views::TextButton* button = bb_view_->GetBookmarkButton(4);
194     while (button->IsVisible()) {
195       bb_view_pref_.set_width(bb_view_pref_.width() - 25);
196       bb_view_->SetBounds(0, 0, bb_view_pref_.width(), bb_view_pref_.height());
197       bb_view_->Layout();
198     }
199 
200     tmp_parent.RemoveChildView(bb_view_);
201 
202     ViewEventTestBase::SetUp();
203   }
204 
TearDown()205   virtual void TearDown() {
206     ViewEventTestBase::TearDown();
207     BookmarkBarView::testing_ = false;
208     views::ViewsDelegate::views_delegate = NULL;
209   }
210 
211  protected:
InstallViewsDelegate()212   void InstallViewsDelegate() {
213     views::ViewsDelegate::views_delegate = &views_delegate_;
214   }
215 
CreateContentsView()216   virtual views::View* CreateContentsView() {
217     return bb_view_;
218   }
219 
GetPreferredSize()220   virtual gfx::Size GetPreferredSize() { return bb_view_pref_; }
221 
222   // See comment above class description for what this does.
CreateBigMenu()223   virtual bool CreateBigMenu() { return false; }
224 
225   BookmarkModel* model_;
226   BookmarkBarView* bb_view_;
227   TestingPageNavigator navigator_;
228 
229  private:
AddTestData(bool big_menu)230   void AddTestData(bool big_menu) {
231     std::string test_base = "file:///c:/tmp/";
232 
233     const BookmarkNode* f1 = model_->AddFolder(
234         model_->GetBookmarkBarNode(), 0, ASCIIToUTF16("F1"));
235     model_->AddURL(f1, 0, ASCIIToUTF16("f1a"), GURL(test_base + "f1a"));
236     const BookmarkNode* f11 = model_->AddFolder(f1, 1, ASCIIToUTF16("F11"));
237     model_->AddURL(f11, 0, ASCIIToUTF16("f11a"), GURL(test_base + "f11a"));
238     if (big_menu) {
239       for (int i = 1; i <= 100; ++i) {
240         model_->AddURL(f1, i + 1, ASCIIToUTF16("f") + base::IntToString16(i),
241                        GURL(test_base + "f" + base::IntToString(i)));
242       }
243     }
244     model_->AddURL(model_->GetBookmarkBarNode(), 1, ASCIIToUTF16("a"),
245                    GURL(test_base + "a"));
246     model_->AddURL(model_->GetBookmarkBarNode(), 2, ASCIIToUTF16("b"),
247                    GURL(test_base + "b"));
248     model_->AddURL(model_->GetBookmarkBarNode(), 3, ASCIIToUTF16("c"),
249                    GURL(test_base + "c"));
250     model_->AddURL(model_->GetBookmarkBarNode(), 4, ASCIIToUTF16("d"),
251                    GURL(test_base + "d"));
252     model_->AddURL(model_->other_node(), 0, ASCIIToUTF16("oa"),
253                    GURL(test_base + "oa"));
254     const BookmarkNode* of = model_->AddFolder(model_->other_node(), 1,
255                                                ASCIIToUTF16("OF"));
256     model_->AddURL(of, 0, ASCIIToUTF16("ofa"), GURL(test_base + "ofa"));
257     model_->AddURL(of, 1, ASCIIToUTF16("ofb"), GURL(test_base + "ofb"));
258     const BookmarkNode* of2 = model_->AddFolder(model_->other_node(), 2,
259                                                 ASCIIToUTF16("OF2"));
260     model_->AddURL(of2, 0, ASCIIToUTF16("of2a"), GURL(test_base + "of2a"));
261     model_->AddURL(of2, 1, ASCIIToUTF16("of2b"), GURL(test_base + "of2b"));
262   }
263 
264   gfx::Size bb_view_pref_;
265   scoped_ptr<TestingProfile> profile_;
266   BrowserThread ui_thread_;
267   BrowserThread file_thread_;
268   ViewsDelegateImpl views_delegate_;
269 };
270 
271 // Clicks on first menu, makes sure button is depressed. Moves mouse to first
272 // child, clicks it and makes sure a navigation occurs.
273 class BookmarkBarViewTest1 : public BookmarkBarViewEventTestBase {
274  protected:
DoTestOnMessageLoop()275   virtual void DoTestOnMessageLoop() {
276     // Move the mouse to the first folder on the bookmark bar and press the
277     // mouse.
278     views::TextButton* button = bb_view_->GetBookmarkButton(0);
279     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
280         ui_controls::DOWN | ui_controls::UP,
281         CreateEventTask(this, &BookmarkBarViewTest1::Step2));
282   }
283 
284  private:
Step2()285   void Step2() {
286     // Menu should be showing.
287     views::MenuItemView* menu = bb_view_->GetMenu();
288     ASSERT_TRUE(menu != NULL);
289     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
290 
291     // Button should be depressed.
292     views::TextButton* button = bb_view_->GetBookmarkButton(0);
293     ASSERT_TRUE(button->state() == views::CustomButton::BS_PUSHED);
294 
295     // Click on the 2nd menu item (A URL).
296     ASSERT_TRUE(menu->GetSubmenu());
297 
298     views::MenuItemView* menu_to_select =
299         menu->GetSubmenu()->GetMenuItemAt(0);
300     ui_controls::MoveMouseToCenterAndPress(menu_to_select, ui_controls::LEFT,
301         ui_controls::DOWN | ui_controls::UP,
302         CreateEventTask(this, &BookmarkBarViewTest1::Step3));
303   }
304 
Step3()305   void Step3() {
306     // We should have navigated to URL f1a.
307     ASSERT_TRUE(navigator_.url_ ==
308                 model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->
309                 GetURL());
310 
311     // Make sure button is no longer pushed.
312     views::TextButton* button = bb_view_->GetBookmarkButton(0);
313     ASSERT_TRUE(button->state() == views::CustomButton::BS_NORMAL);
314 
315     views::MenuItemView* menu = bb_view_->GetMenu();
316     ASSERT_TRUE(menu == NULL || !menu->GetSubmenu()->IsShowing());
317 
318     Done();
319   }
320 };
321 
322 // TODO(jcampan): http://crbug.com/26996 temporarily disabled because failing
323 //                since we move to running the process
324 VIEW_TEST(BookmarkBarViewTest1, DISABLED_Basic)
325 
326 // Brings up menu, clicks on empty space and make sure menu hides.
327 class BookmarkBarViewTest2 : public BookmarkBarViewEventTestBase {
328  protected:
DoTestOnMessageLoop()329   virtual void DoTestOnMessageLoop() {
330     // Move the mouse to the first folder on the bookmark bar and press the
331     // mouse.
332     views::TextButton* button = bb_view_->GetBookmarkButton(0);
333     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
334         ui_controls::DOWN | ui_controls::UP,
335         CreateEventTask(this, &BookmarkBarViewTest2::Step2));
336   }
337 
338  private:
Step2()339   void Step2() {
340     // Menu should be showing.
341     views::MenuItemView* menu = bb_view_->GetMenu();
342     ASSERT_TRUE(menu != NULL && menu->GetSubmenu()->IsShowing());
343 
344     // Click on 0x0, which should trigger closing menu.
345     // NOTE: this code assume there is a left margin, which is currently
346     // true. If that changes, this code will need to find another empty space
347     // to press the mouse on.
348     gfx::Point mouse_loc;
349     views::View::ConvertPointToScreen(bb_view_, &mouse_loc);
350     ui_controls::SendMouseMove(0, 0);
351     ui_controls::SendMouseEventsNotifyWhenDone(
352         ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
353         CreateEventTask(this, &BookmarkBarViewTest2::Step3));
354   }
355 
Step3()356   void Step3() {
357     // The menu shouldn't be showing.
358     views::MenuItemView* menu = bb_view_->GetMenu();
359     ASSERT_TRUE(menu == NULL || !menu->GetSubmenu()->IsShowing());
360 
361     // Make sure button is no longer pushed.
362     views::TextButton* button = bb_view_->GetBookmarkButton(0);
363     ASSERT_TRUE(button->state() == views::CustomButton::BS_NORMAL);
364 
365     window_->Activate();
366 
367     Done();
368   }
369 };
370 
371 // TODO(jcampan): http://crbug.com/26996 temporarily disabled because failing
372 //                since we move to running the process
373 VIEW_TEST(BookmarkBarViewTest2, DISABLED_HideOnDesktopClick)
374 
375 // Brings up menu. Moves over child to make sure submenu appears, moves over
376 // another child and make sure next menu appears.
377 class BookmarkBarViewTest3 : public BookmarkBarViewEventTestBase {
378  protected:
DoTestOnMessageLoop()379   virtual void DoTestOnMessageLoop() {
380     // Move the mouse to the first folder on the bookmark bar and press the
381     // mouse.
382     views::MenuButton* button = bb_view_->other_bookmarked_button();
383     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
384         ui_controls::DOWN | ui_controls::UP,
385         CreateEventTask(this, &BookmarkBarViewTest3::Step2));
386   }
387 
388  private:
Step2()389   void Step2() {
390     // Menu should be showing.
391     views::MenuItemView* menu = bb_view_->GetMenu();
392     ASSERT_TRUE(menu != NULL);
393     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
394 
395     views::MenuItemView* child_menu =
396         menu->GetSubmenu()->GetMenuItemAt(1);
397     ASSERT_TRUE(child_menu != NULL);
398 
399     // Click on second child, which has a submenu.
400     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
401         ui_controls::DOWN | ui_controls::UP,
402         CreateEventTask(this, &BookmarkBarViewTest3::Step3));
403   }
404 
Step3()405   void Step3() {
406     // Make sure sub menu is showing.
407     views::MenuItemView* menu = bb_view_->GetMenu();
408     views::MenuItemView* child_menu =
409         menu->GetSubmenu()->GetMenuItemAt(1);
410     ASSERT_TRUE(child_menu->GetSubmenu() != NULL);
411     ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing());
412 
413     // Click on third child, which has a submenu too.
414     child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
415     ASSERT_TRUE(child_menu != NULL);
416     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
417         ui_controls::DOWN | ui_controls::UP,
418         CreateEventTask(this, &BookmarkBarViewTest3::Step4));
419   }
420 
Step4()421   void Step4() {
422     // Make sure sub menu we first clicked isn't showing.
423     views::MenuItemView* menu = bb_view_->GetMenu();
424     views::MenuItemView* child_menu =
425         menu->GetSubmenu()->GetMenuItemAt(1);
426     ASSERT_TRUE(child_menu->GetSubmenu() != NULL);
427     ASSERT_FALSE(child_menu->GetSubmenu()->IsShowing());
428 
429     // And submenu we last clicked is showing.
430     child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
431     ASSERT_TRUE(child_menu != NULL);
432     ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing());
433 
434     // Nothing should have been selected.
435     EXPECT_EQ(GURL(), navigator_.url_);
436 
437     // Hide menu.
438     menu->GetMenuController()->CancelAll();
439 
440     Done();
441   }
442 };
443 
444 VIEW_TEST(BookmarkBarViewTest3, Submenus)
445 
446 // Observer that posts task upon the context menu creation.
447 // This is necessary for Linux as the context menu has to check
448 // the clipboard, which invokes the event loop.
449 class ContextMenuNotificationObserver : public NotificationObserver {
450  public:
ContextMenuNotificationObserver(Task * task)451   explicit ContextMenuNotificationObserver(Task* task) : task_(task) {
452     registrar_.Add(this,
453                    NotificationType::BOOKMARK_CONTEXT_MENU_SHOWN,
454                    NotificationService::AllSources());
455   }
456 
Observe(NotificationType type,const NotificationSource & source,const NotificationDetails & details)457   virtual void Observe(NotificationType type,
458                        const NotificationSource& source,
459                        const NotificationDetails& details) {
460     MessageLoop::current()->PostTask(FROM_HERE, task_);
461   }
462 
463   // Sets the task that is posted when the context menu is shown.
set_task(Task * task)464   void set_task(Task* task) { task_ = task; }
465 
466  private:
467   NotificationRegistrar registrar_;
468   Task* task_;
469 
470   DISALLOW_COPY_AND_ASSIGN(ContextMenuNotificationObserver);
471 };
472 
473 // Tests context menus by way of opening a context menu for a bookmark,
474 // then right clicking to get context menu and selecting the first menu item
475 // (open).
476 class BookmarkBarViewTest4 : public BookmarkBarViewEventTestBase {
477  public:
BookmarkBarViewTest4()478   BookmarkBarViewTest4()
479       : ALLOW_THIS_IN_INITIALIZER_LIST(
480           observer_(CreateEventTask(this, &BookmarkBarViewTest4::Step3))) {
481   }
482 
483  protected:
DoTestOnMessageLoop()484   virtual void DoTestOnMessageLoop() {
485     // Move the mouse to the first folder on the bookmark bar and press the
486     // mouse.
487     views::TextButton* button = bb_view_->other_bookmarked_button();
488     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
489         ui_controls::DOWN | ui_controls::UP,
490         CreateEventTask(this, &BookmarkBarViewTest4::Step2));
491   }
492 
493  private:
Step2()494   void Step2() {
495     // Menu should be showing.
496     views::MenuItemView* menu = bb_view_->GetMenu();
497     ASSERT_TRUE(menu != NULL);
498     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
499 
500     views::MenuItemView* child_menu =
501         menu->GetSubmenu()->GetMenuItemAt(0);
502     ASSERT_TRUE(child_menu != NULL);
503 
504     // Right click on the first child to get its context menu.
505     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
506         ui_controls::DOWN | ui_controls::UP, NULL);
507     // Step3 will be invoked by ContextMenuNotificationObserver.
508   }
509 
Step3()510   void Step3() {
511     // Make sure the context menu is showing.
512     views::MenuItemView* menu = bb_view_->GetContextMenu();
513     ASSERT_TRUE(menu != NULL);
514     ASSERT_TRUE(menu->GetSubmenu());
515     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
516 
517     // Select the first menu item (open).
518     ui_controls::MoveMouseToCenterAndPress(menu->GetSubmenu()->GetMenuItemAt(0),
519         ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
520         CreateEventTask(this, &BookmarkBarViewTest4::Step4));
521   }
522 
Step4()523   void Step4() {
524     EXPECT_EQ(navigator_.url_,
525               model_->other_node()->GetChild(0)->GetURL());
526 
527     Done();
528   }
529 
530   ContextMenuNotificationObserver observer_;
531 };
532 
533 VIEW_TEST(BookmarkBarViewTest4, ContextMenus)
534 
535 // Tests drag and drop within the same menu.
536 class BookmarkBarViewTest5 : public BookmarkBarViewEventTestBase {
537  protected:
DoTestOnMessageLoop()538   virtual void DoTestOnMessageLoop() {
539     url_dragging_ =
540         model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->GetURL();
541 
542     // Move the mouse to the first folder on the bookmark bar and press the
543     // mouse.
544     views::TextButton* button = bb_view_->GetBookmarkButton(0);
545     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
546         ui_controls::DOWN | ui_controls::UP,
547         CreateEventTask(this, &BookmarkBarViewTest5::Step2));
548   }
549 
550  private:
Step2()551   void Step2() {
552     // Menu should be showing.
553     views::MenuItemView* menu = bb_view_->GetMenu();
554     ASSERT_TRUE(menu != NULL);
555     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
556 
557     views::MenuItemView* child_menu =
558         menu->GetSubmenu()->GetMenuItemAt(0);
559     ASSERT_TRUE(child_menu != NULL);
560 
561     // Move mouse to center of menu and press button.
562     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
563         ui_controls::DOWN,
564         CreateEventTask(this, &BookmarkBarViewTest5::Step3));
565   }
566 
Step3()567   void Step3() {
568     views::MenuItemView* target_menu =
569         bb_view_->GetMenu()->GetSubmenu()->GetMenuItemAt(1);
570     gfx::Point loc(1, target_menu->height() - 1);
571     views::View::ConvertPointToScreen(target_menu, &loc);
572 
573     // Start a drag.
574     ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
575         CreateEventTask(this, &BookmarkBarViewTest5::Step4));
576 
577     // See comment above this method as to why we do this.
578     ScheduleMouseMoveInBackground(loc.x(), loc.y());
579   }
580 
Step4()581   void Step4() {
582     // Drop the item so that it's now the second item.
583     views::MenuItemView* target_menu =
584         bb_view_->GetMenu()->GetSubmenu()->GetMenuItemAt(1);
585     gfx::Point loc(1, target_menu->height() - 1);
586     views::View::ConvertPointToScreen(target_menu, &loc);
587     ui_controls::SendMouseMove(loc.x(), loc.y());
588 
589     ui_controls::SendMouseEventsNotifyWhenDone(ui_controls::LEFT,
590         ui_controls::UP,
591         CreateEventTask(this, &BookmarkBarViewTest5::Step5));
592   }
593 
Step5()594   void Step5() {
595     GURL url = model_->GetBookmarkBarNode()->GetChild(0)->GetChild(1)->GetURL();
596     EXPECT_EQ(url_dragging_, url);
597     Done();
598   }
599 
600   GURL url_dragging_;
601 };
602 
603 VIEW_TEST(BookmarkBarViewTest5, MAYBE_DND)
604 
605 // Tests holding mouse down on overflow button, dragging such that menu pops up
606 // then selecting an item.
607 class BookmarkBarViewTest6 : public BookmarkBarViewEventTestBase {
608  protected:
DoTestOnMessageLoop()609   virtual void DoTestOnMessageLoop() {
610     // Press the mouse button on the overflow button. Don't release it though.
611     views::TextButton* button = bb_view_->overflow_button();
612     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
613         ui_controls::DOWN, CreateEventTask(this, &BookmarkBarViewTest6::Step2));
614   }
615 
616  private:
Step2()617   void Step2() {
618     // Menu should be showing.
619     views::MenuItemView* menu = bb_view_->GetMenu();
620     ASSERT_TRUE(menu != NULL);
621     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
622 
623     views::MenuItemView* child_menu =
624         menu->GetSubmenu()->GetMenuItemAt(0);
625     ASSERT_TRUE(child_menu != NULL);
626 
627     // Move mouse to center of menu and release mouse.
628     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
629         ui_controls::UP, CreateEventTask(this, &BookmarkBarViewTest6::Step3));
630   }
631 
Step3()632   void Step3() {
633     ASSERT_TRUE(navigator_.url_ ==
634                 model_->GetBookmarkBarNode()->GetChild(4)->GetURL());
635     Done();
636   }
637 
638   GURL url_dragging_;
639 };
640 
641 VIEW_TEST(BookmarkBarViewTest6, OpenMenuOnClickAndHold)
642 
643 // Tests drag and drop to different menu.
644 class BookmarkBarViewTest7 : public BookmarkBarViewEventTestBase {
645  protected:
DoTestOnMessageLoop()646   virtual void DoTestOnMessageLoop() {
647     url_dragging_ =
648         model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->GetURL();
649 
650     // Move the mouse to the first folder on the bookmark bar and press the
651     // mouse.
652     views::TextButton* button = bb_view_->GetBookmarkButton(0);
653     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
654         ui_controls::DOWN | ui_controls::UP,
655         CreateEventTask(this, &BookmarkBarViewTest7::Step2));
656   }
657 
658  private:
Step2()659   void Step2() {
660     // Menu should be showing.
661     views::MenuItemView* menu = bb_view_->GetMenu();
662     ASSERT_TRUE(menu != NULL);
663     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
664 
665     views::MenuItemView* child_menu =
666         menu->GetSubmenu()->GetMenuItemAt(0);
667     ASSERT_TRUE(child_menu != NULL);
668 
669     // Move mouse to center of menu and press button.
670     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
671         ui_controls::DOWN,
672         CreateEventTask(this, &BookmarkBarViewTest7::Step3));
673   }
674 
Step3()675   void Step3() {
676     // Drag over other button.
677     views::TextButton* other_button =
678         bb_view_->other_bookmarked_button();
679     gfx::Point loc(other_button->width() / 2, other_button->height() / 2);
680     views::View::ConvertPointToScreen(other_button, &loc);
681 
682     // Start a drag.
683     ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
684         NewRunnableMethod(this, &BookmarkBarViewTest7::Step4));
685 
686     // See comment above this method as to why we do this.
687     ScheduleMouseMoveInBackground(loc.x(), loc.y());
688   }
689 
Step4()690   void Step4() {
691     views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
692     ASSERT_TRUE(drop_menu != NULL);
693     ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
694 
695     views::MenuItemView* target_menu =
696         drop_menu->GetSubmenu()->GetMenuItemAt(0);
697     gfx::Point loc(1, 1);
698     views::View::ConvertPointToScreen(target_menu, &loc);
699     ui_controls::SendMouseMove(loc.x(), loc.y());
700     ui_controls::SendMouseEventsNotifyWhenDone(
701         ui_controls::LEFT, ui_controls::UP,
702         CreateEventTask(this, &BookmarkBarViewTest7::Step5));
703   }
704 
Step5()705   void Step5() {
706     ASSERT_TRUE(model_->other_node()->GetChild(0)->GetURL() == url_dragging_);
707     Done();
708   }
709 
710   GURL url_dragging_;
711 };
712 
713 VIEW_TEST(BookmarkBarViewTest7, MAYBE_DNDToDifferentMenu)
714 
715 // Drags from one menu to next so that original menu closes, then back to
716 // original menu.
717 class BookmarkBarViewTest8 : public BookmarkBarViewEventTestBase {
718  protected:
DoTestOnMessageLoop()719   virtual void DoTestOnMessageLoop() {
720     url_dragging_ =
721         model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->GetURL();
722 
723     // Move the mouse to the first folder on the bookmark bar and press the
724     // mouse.
725     views::TextButton* button = bb_view_->GetBookmarkButton(0);
726     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
727         ui_controls::DOWN | ui_controls::UP,
728         CreateEventTask(this, &BookmarkBarViewTest8::Step2));
729   }
730 
731  private:
Step2()732   void Step2() {
733     // Menu should be showing.
734     views::MenuItemView* menu = bb_view_->GetMenu();
735     ASSERT_TRUE(menu != NULL);
736     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
737 
738     views::MenuItemView* child_menu =
739         menu->GetSubmenu()->GetMenuItemAt(0);
740     ASSERT_TRUE(child_menu != NULL);
741 
742     // Move mouse to center of menu and press button.
743     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
744         ui_controls::DOWN,
745         CreateEventTask(this, &BookmarkBarViewTest8::Step3));
746   }
747 
Step3()748   void Step3() {
749     // Drag over other button.
750     views::TextButton* other_button =
751         bb_view_->other_bookmarked_button();
752     gfx::Point loc(other_button->width() / 2, other_button->height() / 2);
753     views::View::ConvertPointToScreen(other_button, &loc);
754 
755     // Start a drag.
756     ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
757         NewRunnableMethod(this, &BookmarkBarViewTest8::Step4));
758 
759     // See comment above this method as to why we do this.
760     ScheduleMouseMoveInBackground(loc.x(), loc.y());
761   }
762 
Step4()763   void Step4() {
764     views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
765     ASSERT_TRUE(drop_menu != NULL);
766     ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
767 
768     // Now drag back over first menu.
769     views::TextButton* button = bb_view_->GetBookmarkButton(0);
770     gfx::Point loc(button->width() / 2, button->height() / 2);
771     views::View::ConvertPointToScreen(button, &loc);
772     ui_controls::SendMouseMoveNotifyWhenDone(loc.x(), loc.y(),
773         NewRunnableMethod(this, &BookmarkBarViewTest8::Step5));
774   }
775 
Step5()776   void Step5() {
777     // Drop on folder F11.
778     views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
779     ASSERT_TRUE(drop_menu != NULL);
780     ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
781 
782     views::MenuItemView* target_menu =
783         drop_menu->GetSubmenu()->GetMenuItemAt(1);
784     ui_controls::MoveMouseToCenterAndPress(
785         target_menu, ui_controls::LEFT, ui_controls::UP,
786         CreateEventTask(this, &BookmarkBarViewTest8::Step6));
787   }
788 
Step6()789   void Step6() {
790     // Make sure drop was processed.
791     GURL final_url = model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->
792         GetChild(1)->GetURL();
793     ASSERT_TRUE(final_url == url_dragging_);
794     Done();
795   }
796 
797   GURL url_dragging_;
798 };
799 
800 VIEW_TEST(BookmarkBarViewTest8, MAYBE_DNDBackToOriginatingMenu)
801 
802 // Moves the mouse over the scroll button and makes sure we get scrolling.
803 class BookmarkBarViewTest9 : public BookmarkBarViewEventTestBase {
804  protected:
CreateBigMenu()805   virtual bool CreateBigMenu() { return true; }
806 
DoTestOnMessageLoop()807   virtual void DoTestOnMessageLoop() {
808     // Move the mouse to the first folder on the bookmark bar and press the
809     // mouse.
810     views::TextButton* button = bb_view_->GetBookmarkButton(0);
811     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
812         ui_controls::DOWN | ui_controls::UP,
813         CreateEventTask(this, &BookmarkBarViewTest9::Step2));
814   }
815 
816  private:
Step2()817   void Step2() {
818     // Menu should be showing.
819     views::MenuItemView* menu = bb_view_->GetMenu();
820     ASSERT_TRUE(menu != NULL);
821     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
822 
823     first_menu_ = menu->GetSubmenu()->GetMenuItemAt(0);
824     gfx::Point menu_loc;
825     views::View::ConvertPointToScreen(first_menu_, &menu_loc);
826     start_y_ = menu_loc.y();
827 
828     // Move the mouse over the scroll button.
829     views::View* scroll_container = menu->GetSubmenu()->parent();
830     ASSERT_TRUE(scroll_container != NULL);
831     scroll_container = scroll_container->parent();
832     ASSERT_TRUE(scroll_container != NULL);
833     views::View* scroll_down_button = scroll_container->GetChildViewAt(1);
834     ASSERT_TRUE(scroll_down_button);
835     gfx::Point loc(scroll_down_button->width() / 2,
836                    scroll_down_button->height() / 2);
837     views::View::ConvertPointToScreen(scroll_down_button, &loc);
838 
839     // On linux, the sending one location isn't enough.
840     ui_controls::SendMouseMove(loc.x() - 1 , loc.y() - 1);
841     ui_controls::SendMouseMoveNotifyWhenDone(
842         loc.x(), loc.y(), CreateEventTask(this, &BookmarkBarViewTest9::Step3));
843   }
844 
Step3()845   void Step3() {
846     MessageLoop::current()->PostDelayedTask(FROM_HERE,
847         NewRunnableMethod(this, &BookmarkBarViewTest9::Step4), 200);
848   }
849 
Step4()850   void Step4() {
851     gfx::Point menu_loc;
852     views::View::ConvertPointToScreen(first_menu_, &menu_loc);
853     ASSERT_NE(start_y_, menu_loc.y());
854 
855     // Hide menu.
856     bb_view_->GetMenu()->GetMenuController()->CancelAll();
857 
858     // On linux, Cancelling menu will call Quit on the message loop,
859     // which can interfere with Done. We need to run Done in the
860     // next execution loop.
861     MessageLoop::current()->PostTask(
862         FROM_HERE,
863         NewRunnableMethod(this, &ViewEventTestBase::Done));
864   }
865 
866   int start_y_;
867   views::MenuItemView* first_menu_;
868 };
869 
870 VIEW_TEST(BookmarkBarViewTest9, MAYBE_ScrollButtonScrolls)
871 
872 // Tests up/down/left/enter key messages.
873 class BookmarkBarViewTest10 : public BookmarkBarViewEventTestBase {
874  protected:
DoTestOnMessageLoop()875   virtual void DoTestOnMessageLoop() {
876     // Move the mouse to the first folder on the bookmark bar and press the
877     // mouse.
878     views::TextButton* button = bb_view_->GetBookmarkButton(0);
879     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
880         ui_controls::DOWN | ui_controls::UP,
881         CreateEventTask(this, &BookmarkBarViewTest10::Step2));
882     MessageLoop::current()->RunAllPending();
883   }
884 
885  private:
Step2()886   void Step2() {
887     // Menu should be showing.
888     views::MenuItemView* menu = bb_view_->GetMenu();
889     ASSERT_TRUE(menu != NULL);
890     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
891 
892     // Send a down event, which should select the first item.
893     ui_controls::SendKeyPressNotifyWhenDone(
894         NULL, ui::VKEY_DOWN, false, false, false, false,
895         CreateEventTask(this, &BookmarkBarViewTest10::Step3));
896   }
897 
Step3()898   void Step3() {
899     // Make sure menu is showing and item is selected.
900     views::MenuItemView* menu = bb_view_->GetMenu();
901     ASSERT_TRUE(menu != NULL);
902     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
903     ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
904 
905     // Send a key down event, which should select the next item.
906     ui_controls::SendKeyPressNotifyWhenDone(
907         NULL, ui::VKEY_DOWN, false, false, false, false,
908         CreateEventTask(this, &BookmarkBarViewTest10::Step4));
909   }
910 
Step4()911   void Step4() {
912     views::MenuItemView* menu = bb_view_->GetMenu();
913     ASSERT_TRUE(menu != NULL);
914     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
915     ASSERT_FALSE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
916     ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(1)->IsSelected());
917 
918     // Send a right arrow to force the menu to open.
919     ui_controls::SendKeyPressNotifyWhenDone(
920         NULL, ui::VKEY_RIGHT, false, false, false, false,
921         CreateEventTask(this, &BookmarkBarViewTest10::Step5));
922   }
923 
Step5()924   void Step5() {
925     // Make sure the submenu is showing.
926     views::MenuItemView* menu = bb_view_->GetMenu();
927     ASSERT_TRUE(menu != NULL);
928     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
929     views::MenuItemView* submenu = menu->GetSubmenu()->GetMenuItemAt(1);
930     ASSERT_TRUE(submenu->IsSelected());
931     ASSERT_TRUE(submenu->GetSubmenu());
932     ASSERT_TRUE(submenu->GetSubmenu()->IsShowing());
933 
934     // Send a left arrow to close the submenu.
935     ui_controls::SendKeyPressNotifyWhenDone(
936         NULL, ui::VKEY_LEFT, false, false, false, false,
937         CreateEventTask(this, &BookmarkBarViewTest10::Step6));
938   }
939 
Step6()940   void Step6() {
941     // Make sure the submenu is showing.
942     views::MenuItemView* menu = bb_view_->GetMenu();
943     ASSERT_TRUE(menu != NULL);
944     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
945     views::MenuItemView* submenu = menu->GetSubmenu()->GetMenuItemAt(1);
946     ASSERT_TRUE(submenu->IsSelected());
947     ASSERT_TRUE(!submenu->GetSubmenu() || !submenu->GetSubmenu()->IsShowing());
948 
949     // Send a down arrow to wrap back to f1a
950     ui_controls::SendKeyPressNotifyWhenDone(
951         NULL, ui::VKEY_DOWN, false, false, false, false,
952         CreateEventTask(this, &BookmarkBarViewTest10::Step7));
953   }
954 
Step7()955   void Step7() {
956     // Make sure menu is showing and item is selected.
957     views::MenuItemView* menu = bb_view_->GetMenu();
958     ASSERT_TRUE(menu != NULL);
959     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
960     ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
961 
962     // Send enter, which should select the item.
963     ui_controls::SendKeyPressNotifyWhenDone(
964         NULL, ui::VKEY_RETURN, false, false, false, false,
965         CreateEventTask(this, &BookmarkBarViewTest10::Step8));
966   }
967 
Step8()968   void Step8() {
969     ASSERT_TRUE(
970         model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->GetURL() ==
971         navigator_.url_);
972     Done();
973   }
974 };
975 
976 VIEW_TEST(BookmarkBarViewTest10, MAYBE_KeyEvents)
977 
978 // Make sure the menu closes with the following sequence: show menu, show
979 // context menu, close context menu (via escape), then click else where. This
980 // effectively verifies we maintain mouse capture after the context menu is
981 // hidden.
982 class BookmarkBarViewTest11 : public BookmarkBarViewEventTestBase {
983  public:
BookmarkBarViewTest11()984   BookmarkBarViewTest11()
985       : ALLOW_THIS_IN_INITIALIZER_LIST(
986           observer_(CreateEventTask(this, &BookmarkBarViewTest11::Step3))) {
987   }
988 
989  protected:
DoTestOnMessageLoop()990   virtual void DoTestOnMessageLoop() {
991     // Move the mouse to the first folder on the bookmark bar and press the
992     // mouse.
993     views::TextButton* button = bb_view_->other_bookmarked_button();
994     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
995         ui_controls::DOWN | ui_controls::UP,
996         CreateEventTask(this, &BookmarkBarViewTest11::Step2));
997   }
998 
999  private:
Step2()1000   void Step2() {
1001     // Menu should be showing.
1002     views::MenuItemView* menu = bb_view_->GetMenu();
1003     ASSERT_TRUE(menu != NULL);
1004     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1005 
1006     views::MenuItemView* child_menu =
1007         menu->GetSubmenu()->GetMenuItemAt(0);
1008     ASSERT_TRUE(child_menu != NULL);
1009 
1010     // Right click on the first child to get its context menu.
1011     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
1012         ui_controls::DOWN | ui_controls::UP, NULL);
1013     // Step3 will be invoked by ContextMenuNotificationObserver.
1014   }
1015 
Step3()1016   void Step3() {
1017     // Send escape so that the context menu hides.
1018     ui_controls::SendKeyPressNotifyWhenDone(
1019         NULL, ui::VKEY_ESCAPE, false, false, false, false,
1020         CreateEventTask(this, &BookmarkBarViewTest11::Step4));
1021   }
1022 
Step4()1023   void Step4() {
1024     // Make sure the context menu is no longer showing.
1025     views::MenuItemView* menu = bb_view_->GetContextMenu();
1026     ASSERT_TRUE(!menu || !menu->GetSubmenu() ||
1027                 !menu->GetSubmenu()->IsShowing());
1028 
1029     // But the menu should be showing.
1030     menu = bb_view_->GetMenu();
1031     ASSERT_TRUE(menu && menu->GetSubmenu() && menu->GetSubmenu()->IsShowing());
1032 
1033     // Now click on empty space.
1034     gfx::Point mouse_loc;
1035     views::View::ConvertPointToScreen(bb_view_, &mouse_loc);
1036     ui_controls::SendMouseMove(mouse_loc.x(), mouse_loc.y());
1037     ui_controls::SendMouseEventsNotifyWhenDone(
1038         ui_controls::LEFT, ui_controls::UP | ui_controls::DOWN,
1039         CreateEventTask(this, &BookmarkBarViewTest11::Step5));
1040   }
1041 
Step5()1042   void Step5() {
1043     // Make sure the menu is not showing.
1044     views::MenuItemView* menu = bb_view_->GetMenu();
1045     ASSERT_TRUE(!menu || !menu->GetSubmenu() ||
1046                 !menu->GetSubmenu()->IsShowing());
1047     Done();
1048   }
1049 
1050   ContextMenuNotificationObserver observer_;
1051 };
1052 
1053 VIEW_TEST(BookmarkBarViewTest11, MAYBE_CloseMenuAfterClosingContextMenu)
1054 
1055 // Tests showing a modal dialog from a context menu.
1056 class BookmarkBarViewTest12 : public BookmarkBarViewEventTestBase {
1057  protected:
DoTestOnMessageLoop()1058   virtual void DoTestOnMessageLoop() {
1059     // Open up the other folder.
1060     views::TextButton* button = bb_view_->other_bookmarked_button();
1061     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
1062         ui_controls::DOWN | ui_controls::UP,
1063         CreateEventTask(this, &BookmarkBarViewTest12::Step2));
1064     bookmark_utils::num_urls_before_prompting = 1;
1065   }
1066 
~BookmarkBarViewTest12()1067   ~BookmarkBarViewTest12() {
1068     bookmark_utils::num_urls_before_prompting = 15;
1069   }
1070 
1071  private:
Step2()1072   void Step2() {
1073     // Menu should be showing.
1074     views::MenuItemView* menu = bb_view_->GetMenu();
1075     ASSERT_TRUE(menu != NULL);
1076     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1077 
1078     views::MenuItemView* child_menu =
1079         menu->GetSubmenu()->GetMenuItemAt(1);
1080     ASSERT_TRUE(child_menu != NULL);
1081 
1082     // Right click on the second child (a folder) to get its context menu.
1083     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
1084         ui_controls::DOWN | ui_controls::UP,
1085         CreateEventTask(this, &BookmarkBarViewTest12::Step3));
1086   }
1087 
Step3()1088   void Step3() {
1089     // Make sure the context menu is showing.
1090     views::MenuItemView* menu = bb_view_->GetContextMenu();
1091     ASSERT_TRUE(menu && menu->GetSubmenu() && menu->GetSubmenu()->IsShowing());
1092 
1093     // Select the first item in the context menu (open all).
1094     views::MenuItemView* child_menu =
1095         menu->GetSubmenu()->GetMenuItemAt(0);
1096     ASSERT_TRUE(child_menu != NULL);
1097     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
1098         ui_controls::DOWN | ui_controls::UP, NULL);
1099 
1100     // Delay until we send tab, otherwise the message box doesn't appear
1101     // correctly.
1102     MessageLoop::current()->PostDelayedTask(FROM_HERE,
1103         CreateEventTask(this, &BookmarkBarViewTest12::Step4), 1000);
1104   }
1105 
Step4()1106   void Step4() {
1107     // Press tab to give focus to the cancel button.
1108     ui_controls::SendKeyPress(NULL, ui::VKEY_TAB, false, false, false, false);
1109 
1110     // For some reason return isn't processed correctly unless we delay.
1111     MessageLoop::current()->PostDelayedTask(FROM_HERE,
1112         CreateEventTask(this, &BookmarkBarViewTest12::Step5), 1000);
1113   }
1114 
Step5()1115   void Step5() {
1116     // And press enter so that the cancel button is selected.
1117     ui_controls::SendKeyPressNotifyWhenDone(
1118         NULL, ui::VKEY_RETURN, false, false, false, false,
1119         CreateEventTask(this, &BookmarkBarViewTest12::Step6));
1120   }
1121 
Step6()1122   void Step6() {
1123     // Do a delayed task to give the dialog time to exit.
1124     MessageLoop::current()->PostTask(
1125         FROM_HERE, CreateEventTask(this, &BookmarkBarViewTest12::Step7));
1126   }
1127 
Step7()1128   void Step7() {
1129     Done();
1130   }
1131 };
1132 
1133 VIEW_TEST(BookmarkBarViewTest12, MAYBE_CloseWithModalDialog)
1134 
1135 // Tests clicking on the separator of a context menu (this is for coverage of
1136 // bug 17862).
1137 class BookmarkBarViewTest13 : public BookmarkBarViewEventTestBase {
1138  public:
BookmarkBarViewTest13()1139   BookmarkBarViewTest13()
1140       : ALLOW_THIS_IN_INITIALIZER_LIST(
1141           observer_(CreateEventTask(this, &BookmarkBarViewTest13::Step3))) {
1142   }
1143 
1144  protected:
DoTestOnMessageLoop()1145   virtual void DoTestOnMessageLoop() {
1146     // Move the mouse to the first folder on the bookmark bar and press the
1147     // mouse.
1148     views::TextButton* button = bb_view_->other_bookmarked_button();
1149     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
1150         ui_controls::DOWN | ui_controls::UP,
1151         CreateEventTask(this, &BookmarkBarViewTest13::Step2));
1152   }
1153 
1154  private:
Step2()1155   void Step2() {
1156     // Menu should be showing.
1157     views::MenuItemView* menu = bb_view_->GetMenu();
1158     ASSERT_TRUE(menu != NULL);
1159     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1160 
1161     views::MenuItemView* child_menu =
1162         menu->GetSubmenu()->GetMenuItemAt(0);
1163     ASSERT_TRUE(child_menu != NULL);
1164 
1165     // Right click on the first child to get its context menu.
1166     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
1167         ui_controls::DOWN | ui_controls::UP, NULL);
1168     // Step3 will be invoked by ContextMenuNotificationObserver.
1169   }
1170 
Step3()1171   void Step3() {
1172     // Make sure the context menu is showing.
1173     views::MenuItemView* menu = bb_view_->GetContextMenu();
1174     ASSERT_TRUE(menu != NULL);
1175     ASSERT_TRUE(menu->GetSubmenu());
1176     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1177 
1178     // Find the first separator.
1179     views::SubmenuView* submenu = menu->GetSubmenu();
1180     views::View* separator_view = NULL;
1181     for (int i = 0; i < submenu->child_count(); ++i) {
1182       if (submenu->GetChildViewAt(i)->GetID() !=
1183           views::MenuItemView::kMenuItemViewID) {
1184         separator_view = submenu->GetChildViewAt(i);
1185         break;
1186       }
1187     }
1188     ASSERT_TRUE(separator_view);
1189 
1190     // Click on the separator. Clicking on the separator shouldn't visually
1191     // change anything.
1192     ui_controls::MoveMouseToCenterAndPress(separator_view,
1193         ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
1194         CreateEventTask(this, &BookmarkBarViewTest13::Step4));
1195   }
1196 
Step4()1197   void Step4() {
1198     // The context menu should still be showing.
1199     views::MenuItemView* menu = bb_view_->GetContextMenu();
1200     ASSERT_TRUE(menu != NULL);
1201     ASSERT_TRUE(menu->GetSubmenu());
1202     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1203 
1204     // Select the first context menu item.
1205     ui_controls::MoveMouseToCenterAndPress(menu->GetSubmenu()->GetMenuItemAt(0),
1206         ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
1207         CreateEventTask(this, &BookmarkBarViewTest13::Step5));
1208   }
1209 
Step5()1210   void Step5() {
1211     Done();
1212   }
1213 
1214   ContextMenuNotificationObserver observer_;
1215 };
1216 
1217 VIEW_TEST(BookmarkBarViewTest13, ClickOnContextMenuSeparator)
1218 
1219 // Makes sure right clicking on a folder on the bookmark bar doesn't result in
1220 // both a context menu and showing the menu.
1221 class BookmarkBarViewTest14 : public BookmarkBarViewEventTestBase {
1222  public:
BookmarkBarViewTest14()1223   BookmarkBarViewTest14()
1224       : ALLOW_THIS_IN_INITIALIZER_LIST(
1225           observer_(CreateEventTask(this, &BookmarkBarViewTest14::Step2))) {
1226   }
1227 
1228  protected:
DoTestOnMessageLoop()1229   virtual void DoTestOnMessageLoop() {
1230     // Move the mouse to the first folder on the bookmark bar and press the
1231     // right mouse button.
1232     views::TextButton* button = bb_view_->GetBookmarkButton(0);
1233     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::RIGHT,
1234         ui_controls::DOWN | ui_controls::UP, NULL);
1235     // Step2 will be invoked by ContextMenuNotificationObserver.
1236   }
1237 
1238  private:
1239 
Step2()1240   void Step2() {
1241     // Menu should NOT be showing.
1242     views::MenuItemView* menu = bb_view_->GetMenu();
1243     ASSERT_TRUE(menu == NULL);
1244 
1245     // Send escape so that the context menu hides.
1246     ui_controls::SendKeyPressNotifyWhenDone(
1247         NULL, ui::VKEY_ESCAPE, false, false, false, false,
1248         CreateEventTask(this, &BookmarkBarViewTest14::Step3));
1249   }
1250 
Step3()1251   void Step3() {
1252     Done();
1253   }
1254 
1255   ContextMenuNotificationObserver observer_;
1256 };
1257 
1258 VIEW_TEST(BookmarkBarViewTest14, ContextMenus2)
1259 
1260 // Makes sure deleting from the context menu keeps the bookmark menu showing.
1261 class BookmarkBarViewTest15 : public BookmarkBarViewEventTestBase {
1262  public:
BookmarkBarViewTest15()1263   BookmarkBarViewTest15()
1264       : deleted_menu_id_(0),
1265         ALLOW_THIS_IN_INITIALIZER_LIST(
1266             observer_(CreateEventTask(this, &BookmarkBarViewTest15::Step3))) {
1267   }
1268 
1269  protected:
DoTestOnMessageLoop()1270   virtual void DoTestOnMessageLoop() {
1271     // Show the other bookmarks.
1272     views::TextButton* button = bb_view_->other_bookmarked_button();
1273     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
1274         ui_controls::DOWN | ui_controls::UP,
1275         CreateEventTask(this, &BookmarkBarViewTest15::Step2));
1276   }
1277 
1278  private:
Step2()1279   void Step2() {
1280     // Menu should be showing.
1281     views::MenuItemView* menu = bb_view_->GetMenu();
1282     ASSERT_TRUE(menu != NULL);
1283     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1284 
1285     views::MenuItemView* child_menu =
1286         menu->GetSubmenu()->GetMenuItemAt(1);
1287     ASSERT_TRUE(child_menu != NULL);
1288 
1289     deleted_menu_id_ = child_menu->GetCommand();
1290 
1291     // Right click on the second child to get its context menu.
1292     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
1293         ui_controls::DOWN | ui_controls::UP, NULL);
1294     // Step3 will be invoked by ContextMenuNotificationObserver.
1295   }
1296 
Step3()1297   void Step3() {
1298     // Make sure the context menu is showing.
1299     views::MenuItemView* menu = bb_view_->GetContextMenu();
1300     ASSERT_TRUE(menu != NULL);
1301     ASSERT_TRUE(menu->GetSubmenu());
1302     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1303 
1304     views::MenuItemView* delete_menu =
1305         menu->GetMenuItemByID(IDC_BOOKMARK_BAR_REMOVE);
1306     ASSERT_TRUE(delete_menu);
1307 
1308     // Click on the delete button.
1309     ui_controls::MoveMouseToCenterAndPress(delete_menu,
1310         ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
1311         CreateEventTask(this, &BookmarkBarViewTest15::Step4));
1312   }
1313 
Step4()1314   void Step4() {
1315     // The context menu should not be showing.
1316     views::MenuItemView* context_menu = bb_view_->GetContextMenu();
1317     ASSERT_TRUE(context_menu == NULL);
1318 
1319     // But the menu should be showing.
1320     views::MenuItemView* menu = bb_view_->GetMenu();
1321     ASSERT_TRUE(menu != NULL);
1322     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1323 
1324     // And the deleted_menu_id_ should have been removed.
1325     ASSERT_TRUE(menu->GetMenuItemByID(deleted_menu_id_) == NULL);
1326 
1327     bb_view_->GetMenu()->GetMenuController()->CancelAll();
1328 
1329     Done();
1330   }
1331 
1332   int deleted_menu_id_;
1333   ContextMenuNotificationObserver observer_;
1334 };
1335 
1336 VIEW_TEST(BookmarkBarViewTest15, MenuStaysVisibleAfterDelete)
1337 
1338 // Tests that we don't crash or get stuck if the parent of a menu is closed.
1339 class BookmarkBarViewTest16 : public BookmarkBarViewEventTestBase {
1340  protected:
DoTestOnMessageLoop()1341   virtual void DoTestOnMessageLoop() {
1342     InstallViewsDelegate();
1343 
1344     // Move the mouse to the first folder on the bookmark bar and press the
1345     // mouse.
1346     views::TextButton* button = bb_view_->GetBookmarkButton(0);
1347     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
1348         ui_controls::DOWN | ui_controls::UP,
1349         CreateEventTask(this, &BookmarkBarViewTest16::Step2));
1350   }
1351 
1352  private:
Step2()1353   void Step2() {
1354     // Menu should be showing.
1355     views::MenuItemView* menu = bb_view_->GetMenu();
1356     ASSERT_TRUE(menu != NULL);
1357     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1358 
1359     // Button should be depressed.
1360     views::TextButton* button = bb_view_->GetBookmarkButton(0);
1361     ASSERT_TRUE(button->state() == views::CustomButton::BS_PUSHED);
1362 
1363     // Close the window.
1364     window_->CloseWindow();
1365     window_ = NULL;
1366   }
1367 };
1368 
1369 // Disabled, http://crbug.com/64303.
1370 VIEW_TEST(BookmarkBarViewTest16, DISABLED_DeleteMenu)
1371 
1372 // Makes sure right clicking on an item while a context menu is already showing
1373 // doesn't crash and works.
1374 class BookmarkBarViewTest17 : public BookmarkBarViewEventTestBase {
1375  public:
BookmarkBarViewTest17()1376   BookmarkBarViewTest17()
1377       : ALLOW_THIS_IN_INITIALIZER_LIST(
1378           observer_(CreateEventTask(this, &BookmarkBarViewTest17::Step3))) {
1379   }
1380 
1381  protected:
DoTestOnMessageLoop()1382   virtual void DoTestOnMessageLoop() {
1383     // Move the mouse to the other folder on the bookmark bar and press the
1384     // left mouse button.
1385     views::TextButton* button = bb_view_->other_bookmarked_button();
1386     ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
1387         ui_controls::DOWN | ui_controls::UP,
1388         CreateEventTask(this, &BookmarkBarViewTest17::Step2));
1389   }
1390 
1391  private:
Step2()1392   void Step2() {
1393     // Menu should be showing.
1394     views::MenuItemView* menu = bb_view_->GetMenu();
1395     ASSERT_TRUE(menu != NULL);
1396     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1397 
1398     // Right click on the second item to show its context menu.
1399     views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
1400     ASSERT_TRUE(child_menu != NULL);
1401     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
1402         ui_controls::DOWN | ui_controls::UP, NULL);
1403     // Step3 will be invoked by ContextMenuNotificationObserver.
1404   }
1405 
Step3()1406   void Step3() {
1407     // Make sure the context menu is showing.
1408     views::MenuItemView* context_menu = bb_view_->GetContextMenu();
1409     ASSERT_TRUE(context_menu != NULL);
1410     ASSERT_TRUE(context_menu->GetSubmenu());
1411     ASSERT_TRUE(context_menu->GetSubmenu()->IsShowing());
1412 
1413     // Right click on the first menu item to trigger its context menu.
1414     views::MenuItemView* menu = bb_view_->GetMenu();
1415     ASSERT_TRUE(menu != NULL);
1416     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1417     views::MenuItemView* child_menu = menu->GetSubmenu()->GetMenuItemAt(1);
1418     ASSERT_TRUE(child_menu != NULL);
1419 
1420     observer_.set_task(CreateEventTask(this, &BookmarkBarViewTest17::Step4));
1421     ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
1422         ui_controls::DOWN | ui_controls::UP, NULL);
1423     // Step4 will be invoked by ContextMenuNotificationObserver.
1424   }
1425 
Step4()1426   void Step4() {
1427     // The context menu should still be showing.
1428     views::MenuItemView* context_menu = bb_view_->GetContextMenu();
1429     ASSERT_TRUE(context_menu != NULL);
1430 
1431     // And the menu should be showing.
1432     views::MenuItemView* menu = bb_view_->GetMenu();
1433     ASSERT_TRUE(menu != NULL);
1434     ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
1435 
1436     bb_view_->GetMenu()->GetMenuController()->CancelAll();
1437 
1438     Done();
1439   }
1440 
1441   ContextMenuNotificationObserver observer_;
1442 };
1443 
1444 VIEW_TEST(BookmarkBarViewTest17, ContextMenus3)
1445