summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/views/bookmark_bar_view_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/views/bookmark_bar_view_test.cc')
-rw-r--r--chrome/browser/ui/views/bookmark_bar_view_test.cc1358
1 files changed, 1358 insertions, 0 deletions
diff --git a/chrome/browser/ui/views/bookmark_bar_view_test.cc b/chrome/browser/ui/views/bookmark_bar_view_test.cc
new file mode 100644
index 0000000..d30d0e4
--- /dev/null
+++ b/chrome/browser/ui/views/bookmark_bar_view_test.cc
@@ -0,0 +1,1358 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "app/keyboard_codes.h"
+#include "base/string_number_conversions.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/automation/ui_controls.h"
+#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "chrome/browser/bookmarks/bookmark_utils.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/tab_contents/page_navigator.h"
+#include "chrome/browser/views/bookmark_bar_view.h"
+#include "chrome/common/notification_service.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/testing_profile.h"
+#include "chrome/test/interactive_ui/view_event_test_base.h"
+#include "chrome/test/ui_test_utils.h"
+#include "grit/generated_resources.h"
+#include "views/controls/button/menu_button.h"
+#include "views/controls/button/text_button.h"
+#include "views/controls/menu/menu_controller.h"
+#include "views/controls/menu/menu_item_view.h"
+#include "views/controls/menu/submenu_view.h"
+#include "views/views_delegate.h"
+#include "views/window/window.h"
+
+#if defined(OS_LINUX)
+// See http://crbug.com/40040 for details.
+#define MAYBE_DND DISABLED_DND
+#define MAYBE_DNDToDifferentMenu DISABLED_DNDToDifferentMenu
+#define MAYBE_DNDBackToOriginatingMenu DISABLED_DNDBackToOriginatingMenu
+
+// See http://crbug.com/40039 for details.
+#define MAYBE_KeyEvents DISABLED_KeyEvents
+
+// Two bugs here. http://crbug.com/47089 for general Linux Views, and
+// http://crbug.com/47452 for ChromiumOS.
+#define MAYBE_CloseWithModalDialog DISABLED_CloseWithModalDialog
+// See http://crbug.com/47089 for details.
+#define MAYBE_CloseMenuAfterClosingContextMenu \
+ DISABLED_CloseMenuAfterClosingContextMenu
+#else
+
+#define MAYBE_DND DND
+#define MAYBE_DNDToDifferentMenu DNDToDifferentMenu
+#define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu
+#define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu
+#define MAYBE_KeyEvents KeyEvents
+#define MAYBE_CloseWithModalDialog CloseWithModalDialog
+#define MAYBE_CloseMenuAfterClosingContextMenu CloseMenuAfterClosingContextMenu
+
+#endif
+
+#if defined(OS_LINUX)
+// See bug http://crbug.com/60444 for details.
+#define MAYBE_ScrollButtonScrolls DISABLED_ScrollButtonScrolls
+#else
+#define MAYBE_ScrollButtonScrolls ScrollButtonScrolls
+#endif
+
+namespace {
+
+class ViewsDelegateImpl : public views::ViewsDelegate {
+ public:
+ ViewsDelegateImpl() {}
+ virtual Clipboard* GetClipboard() const { return NULL; }
+ virtual void SaveWindowPlacement(const std::wstring& window_name,
+ const gfx::Rect& bounds,
+ bool maximized) {}
+ virtual bool GetSavedWindowBounds(const std::wstring& window_name,
+ gfx::Rect* bounds) const {
+ return false;
+ }
+ virtual bool GetSavedMaximizedState(const std::wstring& window_name,
+ bool* maximized) const {
+ return false;
+ }
+
+ virtual void NotifyAccessibilityEvent(
+ views::View* view, AccessibilityTypes::Event event_type) {}
+
+#if defined(OS_WIN)
+ virtual HICON GetDefaultWindowIcon() const { return 0; }
+#endif
+
+ virtual void AddRef() {
+ }
+
+ virtual void ReleaseRef() {
+ MessageLoopForUI::current()->Quit();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ViewsDelegateImpl);
+};
+
+// PageNavigator implementation that records the URL.
+class TestingPageNavigator : public PageNavigator {
+ public:
+ virtual void OpenURL(const GURL& url, const GURL& referrer,
+ WindowOpenDisposition disposition,
+ PageTransition::Type transition) {
+ url_ = url;
+ }
+
+ GURL url_;
+};
+
+} // namespace
+
+// Base class for event generating bookmark view tests. These test are intended
+// to exercise View's menus, but that's easier done with BookmarkBarView rather
+// than View's menu itself.
+//
+// SetUp creates a bookmark model with the following structure.
+// All folders are in upper case, all URLs in lower case.
+// F1
+// f1a
+// F11
+// f11a
+// *
+// a
+// b
+// c
+// d
+// OTHER
+// oa
+// OF
+// ofa
+// ofb
+// OF2
+// of2a
+// of2b
+//
+// * if CreateBigMenu returns return true, 100 menu items are created here with
+// the names f1-f100.
+//
+// Subclasses should be sure and invoke super's implementation of SetUp and
+// TearDown.
+class BookmarkBarViewEventTestBase : public ViewEventTestBase {
+ public:
+ BookmarkBarViewEventTestBase()
+ : ViewEventTestBase(),
+ model_(NULL),
+ bb_view_(NULL),
+ ui_thread_(BrowserThread::UI, MessageLoop::current()),
+ file_thread_(BrowserThread::FILE, MessageLoop::current()) {
+ }
+
+ virtual void SetUp() {
+ BookmarkBarView::testing_ = true;
+
+ profile_.reset(new TestingProfile());
+ profile_->set_has_history_service(true);
+ profile_->CreateBookmarkModel(true);
+ profile_->BlockUntilBookmarkModelLoaded();
+ profile_->GetPrefs()->SetBoolean(prefs::kShowBookmarkBar, true);
+
+ model_ = profile_->GetBookmarkModel();
+ model_->ClearStore();
+
+ bb_view_ = new BookmarkBarView(profile_.get(), NULL);
+ bb_view_->SetPageNavigator(&navigator_);
+
+ AddTestData(CreateBigMenu());
+
+ // Calculate the preferred size so that one button doesn't fit, which
+ // triggers the overflow button to appear.
+ //
+ // BookmarkBarView::Layout does nothing if the parent is NULL and
+ // GetPreferredSize hard codes a width of 1. For that reason we add the
+ // BookmarkBarView to a dumby view as the parent.
+ //
+ // This code looks a bit hacky, but I've written it so that it shouldn't
+ // be dependant upon any of the layout code in BookmarkBarView. Instead
+ // we brute force search for a size that triggers the overflow button.
+ views::View tmp_parent;
+
+ tmp_parent.AddChildView(bb_view_);
+
+ bb_view_pref_ = bb_view_->GetPreferredSize();
+ bb_view_pref_.set_width(1000);
+ views::TextButton* button = bb_view_->GetBookmarkButton(4);
+ while (button->IsVisible()) {
+ bb_view_pref_.set_width(bb_view_pref_.width() - 25);
+ bb_view_->SetBounds(0, 0, bb_view_pref_.width(), bb_view_pref_.height());
+ bb_view_->Layout();
+ }
+
+ tmp_parent.RemoveChildView(bb_view_);
+
+ ViewEventTestBase::SetUp();
+ }
+
+ virtual void TearDown() {
+ ViewEventTestBase::TearDown();
+ BookmarkBarView::testing_ = false;
+ views::ViewsDelegate::views_delegate = NULL;
+ }
+
+ protected:
+ void InstallViewsDelegate() {
+ views::ViewsDelegate::views_delegate = &views_delegate_;
+ }
+
+ virtual views::View* CreateContentsView() {
+ return bb_view_;
+ }
+
+ virtual gfx::Size GetPreferredSize() { return bb_view_pref_; }
+
+ // See comment above class description for what this does.
+ virtual bool CreateBigMenu() { return false; }
+
+ BookmarkModel* model_;
+ BookmarkBarView* bb_view_;
+ TestingPageNavigator navigator_;
+
+ private:
+ void AddTestData(bool big_menu) {
+ std::string test_base = "file:///c:/tmp/";
+
+ const BookmarkNode* f1 = model_->AddGroup(
+ model_->GetBookmarkBarNode(), 0, ASCIIToUTF16("F1"));
+ model_->AddURL(f1, 0, ASCIIToUTF16("f1a"), GURL(test_base + "f1a"));
+ const BookmarkNode* f11 = model_->AddGroup(f1, 1, ASCIIToUTF16("F11"));
+ model_->AddURL(f11, 0, ASCIIToUTF16("f11a"), GURL(test_base + "f11a"));
+ if (big_menu) {
+ for (int i = 1; i <= 100; ++i) {
+ model_->AddURL(f1, i + 1, ASCIIToUTF16("f") + base::IntToString16(i),
+ GURL(test_base + "f" + base::IntToString(i)));
+ }
+ }
+ model_->AddURL(model_->GetBookmarkBarNode(), 1, ASCIIToUTF16("a"),
+ GURL(test_base + "a"));
+ model_->AddURL(model_->GetBookmarkBarNode(), 2, ASCIIToUTF16("b"),
+ GURL(test_base + "b"));
+ model_->AddURL(model_->GetBookmarkBarNode(), 3, ASCIIToUTF16("c"),
+ GURL(test_base + "c"));
+ model_->AddURL(model_->GetBookmarkBarNode(), 4, ASCIIToUTF16("d"),
+ GURL(test_base + "d"));
+ model_->AddURL(model_->other_node(), 0, ASCIIToUTF16("oa"),
+ GURL(test_base + "oa"));
+ const BookmarkNode* of = model_->AddGroup(model_->other_node(), 1,
+ ASCIIToUTF16("OF"));
+ model_->AddURL(of, 0, ASCIIToUTF16("ofa"), GURL(test_base + "ofa"));
+ model_->AddURL(of, 1, ASCIIToUTF16("ofb"), GURL(test_base + "ofb"));
+ const BookmarkNode* of2 = model_->AddGroup(model_->other_node(), 2,
+ ASCIIToUTF16("OF2"));
+ model_->AddURL(of2, 0, ASCIIToUTF16("of2a"), GURL(test_base + "of2a"));
+ model_->AddURL(of2, 1, ASCIIToUTF16("of2b"), GURL(test_base + "of2b"));
+ }
+
+ gfx::Size bb_view_pref_;
+ scoped_ptr<TestingProfile> profile_;
+ BrowserThread ui_thread_;
+ BrowserThread file_thread_;
+ ViewsDelegateImpl views_delegate_;
+};
+
+// Clicks on first menu, makes sure button is depressed. Moves mouse to first
+// child, clicks it and makes sure a navigation occurs.
+class BookmarkBarViewTest1 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest1::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ // Button should be depressed.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ASSERT_TRUE(button->state() == views::CustomButton::BS_PUSHED);
+
+ // Click on the 2nd menu item (A URL).
+ ASSERT_TRUE(menu->GetSubmenu());
+
+ views::MenuItemView* menu_to_select =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ui_controls::MoveMouseToCenterAndPress(menu_to_select, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest1::Step3));
+ }
+
+ void Step3() {
+ // We should have navigated to URL f1a.
+ ASSERT_TRUE(navigator_.url_ ==
+ model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->
+ GetURL());
+
+ // Make sure button is no longer pushed.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ASSERT_TRUE(button->state() == views::CustomButton::BS_NORMAL);
+
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu == NULL || !menu->GetSubmenu()->IsShowing());
+
+ Done();
+ }
+};
+
+// TODO(jcampan): http://crbug.com/26996 temporarily disabled because failing
+// since we move to running the process
+VIEW_TEST(BookmarkBarViewTest1, DISABLED_Basic)
+
+// Brings up menu, clicks on empty space and make sure menu hides.
+class BookmarkBarViewTest2 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest2::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL && menu->GetSubmenu()->IsShowing());
+
+ // Click on 0x0, which should trigger closing menu.
+ // NOTE: this code assume there is a left margin, which is currently
+ // true. If that changes, this code will need to find another empty space
+ // to press the mouse on.
+ gfx::Point mouse_loc;
+ views::View::ConvertPointToScreen(bb_view_, &mouse_loc);
+ ui_controls::SendMouseMove(0, 0);
+ ui_controls::SendMouseEventsNotifyWhenDone(
+ ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest2::Step3));
+ }
+
+ void Step3() {
+ // The menu shouldn't be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu == NULL || !menu->GetSubmenu()->IsShowing());
+
+ // Make sure button is no longer pushed.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ASSERT_TRUE(button->state() == views::CustomButton::BS_NORMAL);
+
+ window_->Activate();
+
+ Done();
+ }
+};
+
+// TODO(jcampan): http://crbug.com/26996 temporarily disabled because failing
+// since we move to running the process
+VIEW_TEST(BookmarkBarViewTest2, DISABLED_HideOnDesktopClick)
+
+// Brings up menu. Moves over child to make sure submenu appears, moves over
+// another child and make sure next menu appears.
+class BookmarkBarViewTest3 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::MenuButton* button = bb_view_->other_bookmarked_button();
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest3::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(1);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Click on second child, which has a submenu.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest3::Step3));
+ }
+
+ void Step3() {
+ // Make sure sub menu is showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(1);
+ ASSERT_TRUE(child_menu->GetSubmenu() != NULL);
+ ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing());
+
+ // Click on third child, which has a submenu too.
+ child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
+ ASSERT_TRUE(child_menu != NULL);
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest3::Step4));
+ }
+
+ void Step4() {
+ // Make sure sub menu we first clicked isn't showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(1);
+ ASSERT_TRUE(child_menu->GetSubmenu() != NULL);
+ ASSERT_FALSE(child_menu->GetSubmenu()->IsShowing());
+
+ // And submenu we last clicked is showing.
+ child_menu = menu->GetSubmenu()->GetMenuItemAt(2);
+ ASSERT_TRUE(child_menu != NULL);
+ ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing());
+
+ // Nothing should have been selected.
+ EXPECT_EQ(GURL(), navigator_.url_);
+
+ // Hide menu.
+ menu->GetMenuController()->CancelAll();
+
+ Done();
+ }
+};
+
+VIEW_TEST(BookmarkBarViewTest3, Submenus)
+
+// Observer that posts task upon the context menu creation.
+// This is necessary for Linux as the context menu has to check
+// the clipboard, which invokes the event loop.
+class ContextMenuNotificationObserver : public NotificationObserver {
+ public:
+ explicit ContextMenuNotificationObserver(Task* task) : task_(task) {
+ registrar_.Add(this,
+ NotificationType::BOOKMARK_CONTEXT_MENU_SHOWN,
+ NotificationService::AllSources());
+ }
+
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ MessageLoop::current()->PostTask(FROM_HERE, task_);
+ }
+
+ private:
+ NotificationRegistrar registrar_;
+ Task* task_;
+
+ DISALLOW_COPY_AND_ASSIGN(ContextMenuNotificationObserver);
+};
+
+// Tests context menus by way of opening a context menu for a bookmark,
+// then right clicking to get context menu and selecting the first menu item
+// (open).
+class BookmarkBarViewTest4 : public BookmarkBarViewEventTestBase {
+ public:
+ BookmarkBarViewTest4()
+ : ALLOW_THIS_IN_INITIALIZER_LIST(
+ observer_(CreateEventTask(this, &BookmarkBarViewTest4::Step3))) {
+ }
+
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->other_bookmarked_button();
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest4::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Right click on the first child to get its context menu.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
+ ui_controls::DOWN | ui_controls::UP, NULL);
+ // Step3 will be invoked by ContextMenuNotificationObserver.
+ }
+
+ void Step3() {
+ // Make sure the context menu is showing.
+ views::MenuItemView* menu = bb_view_->GetContextMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu());
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ // Select the first menu item (open).
+ ui_controls::MoveMouseToCenterAndPress(menu->GetSubmenu()->GetMenuItemAt(0),
+ ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest4::Step4));
+ }
+
+ void Step4() {
+ EXPECT_EQ(navigator_.url_,
+ model_->other_node()->GetChild(0)->GetURL());
+
+ Done();
+ }
+
+ ContextMenuNotificationObserver observer_;
+};
+
+VIEW_TEST(BookmarkBarViewTest4, ContextMenus)
+
+// Tests drag and drop within the same menu.
+class BookmarkBarViewTest5 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ url_dragging_ =
+ model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->GetURL();
+
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest5::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Move mouse to center of menu and press button.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
+ ui_controls::DOWN,
+ CreateEventTask(this, &BookmarkBarViewTest5::Step3));
+ }
+
+ void Step3() {
+ views::MenuItemView* target_menu =
+ bb_view_->GetMenu()->GetSubmenu()->GetMenuItemAt(1);
+ gfx::Point loc(1, target_menu->height() - 1);
+ views::View::ConvertPointToScreen(target_menu, &loc);
+
+ // Start a drag.
+ ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
+ CreateEventTask(this, &BookmarkBarViewTest5::Step4));
+
+ // See comment above this method as to why we do this.
+ ScheduleMouseMoveInBackground(loc.x(), loc.y());
+ }
+
+ void Step4() {
+ // Drop the item so that it's now the second item.
+ views::MenuItemView* target_menu =
+ bb_view_->GetMenu()->GetSubmenu()->GetMenuItemAt(1);
+ gfx::Point loc(1, target_menu->height() - 1);
+ views::View::ConvertPointToScreen(target_menu, &loc);
+ ui_controls::SendMouseMove(loc.x(), loc.y());
+
+ ui_controls::SendMouseEventsNotifyWhenDone(ui_controls::LEFT,
+ ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest5::Step5));
+ }
+
+ void Step5() {
+ GURL url = model_->GetBookmarkBarNode()->GetChild(0)->GetChild(1)->GetURL();
+ EXPECT_EQ(url_dragging_, url);
+ Done();
+ }
+
+ GURL url_dragging_;
+};
+
+VIEW_TEST(BookmarkBarViewTest5, MAYBE_DND)
+
+// Tests holding mouse down on overflow button, dragging such that menu pops up
+// then selecting an item.
+class BookmarkBarViewTest6 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Press the mouse button on the overflow button. Don't release it though.
+ views::TextButton* button = bb_view_->overflow_button();
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN, CreateEventTask(this, &BookmarkBarViewTest6::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Move mouse to center of menu and release mouse.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
+ ui_controls::UP, CreateEventTask(this, &BookmarkBarViewTest6::Step3));
+ }
+
+ void Step3() {
+ ASSERT_TRUE(navigator_.url_ ==
+ model_->GetBookmarkBarNode()->GetChild(4)->GetURL());
+ Done();
+ }
+
+ GURL url_dragging_;
+};
+
+VIEW_TEST(BookmarkBarViewTest6, OpenMenuOnClickAndHold)
+
+// Tests drag and drop to different menu.
+class BookmarkBarViewTest7 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ url_dragging_ =
+ model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->GetURL();
+
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest7::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Move mouse to center of menu and press button.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
+ ui_controls::DOWN,
+ CreateEventTask(this, &BookmarkBarViewTest7::Step3));
+ }
+
+ void Step3() {
+ // Drag over other button.
+ views::TextButton* other_button =
+ bb_view_->other_bookmarked_button();
+ gfx::Point loc(other_button->width() / 2, other_button->height() / 2);
+ views::View::ConvertPointToScreen(other_button, &loc);
+
+ // Start a drag.
+ ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
+ NewRunnableMethod(this, &BookmarkBarViewTest7::Step4));
+
+ // See comment above this method as to why we do this.
+ ScheduleMouseMoveInBackground(loc.x(), loc.y());
+ }
+
+ void Step4() {
+ views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
+ ASSERT_TRUE(drop_menu != NULL);
+ ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* target_menu =
+ drop_menu->GetSubmenu()->GetMenuItemAt(0);
+ gfx::Point loc(1, 1);
+ views::View::ConvertPointToScreen(target_menu, &loc);
+ ui_controls::SendMouseMove(loc.x(), loc.y());
+ ui_controls::SendMouseEventsNotifyWhenDone(
+ ui_controls::LEFT, ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest7::Step5));
+ }
+
+ void Step5() {
+ ASSERT_TRUE(model_->other_node()->GetChild(0)->GetURL() == url_dragging_);
+ Done();
+ }
+
+ GURL url_dragging_;
+};
+
+VIEW_TEST(BookmarkBarViewTest7, MAYBE_DNDToDifferentMenu)
+
+// Drags from one menu to next so that original menu closes, then back to
+// original menu.
+class BookmarkBarViewTest8 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ url_dragging_ =
+ model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->GetURL();
+
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest8::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Move mouse to center of menu and press button.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
+ ui_controls::DOWN,
+ CreateEventTask(this, &BookmarkBarViewTest8::Step3));
+ }
+
+ void Step3() {
+ // Drag over other button.
+ views::TextButton* other_button =
+ bb_view_->other_bookmarked_button();
+ gfx::Point loc(other_button->width() / 2, other_button->height() / 2);
+ views::View::ConvertPointToScreen(other_button, &loc);
+
+ // Start a drag.
+ ui_controls::SendMouseMoveNotifyWhenDone(loc.x() + 10, loc.y(),
+ NewRunnableMethod(this, &BookmarkBarViewTest8::Step4));
+
+ // See comment above this method as to why we do this.
+ ScheduleMouseMoveInBackground(loc.x(), loc.y());
+ }
+
+ void Step4() {
+ views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
+ ASSERT_TRUE(drop_menu != NULL);
+ ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
+
+ // Now drag back over first menu.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ gfx::Point loc(button->width() / 2, button->height() / 2);
+ views::View::ConvertPointToScreen(button, &loc);
+ ui_controls::SendMouseMoveNotifyWhenDone(loc.x(), loc.y(),
+ NewRunnableMethod(this, &BookmarkBarViewTest8::Step5));
+ }
+
+ void Step5() {
+ // Drop on folder F11.
+ views::MenuItemView* drop_menu = bb_view_->GetDropMenu();
+ ASSERT_TRUE(drop_menu != NULL);
+ ASSERT_TRUE(drop_menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* target_menu =
+ drop_menu->GetSubmenu()->GetMenuItemAt(1);
+ ui_controls::MoveMouseToCenterAndPress(
+ target_menu, ui_controls::LEFT, ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest8::Step6));
+ }
+
+ void Step6() {
+ // Make sure drop was processed.
+ GURL final_url = model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->
+ GetChild(1)->GetURL();
+ ASSERT_TRUE(final_url == url_dragging_);
+ Done();
+ }
+
+ GURL url_dragging_;
+};
+
+VIEW_TEST(BookmarkBarViewTest8, MAYBE_DNDBackToOriginatingMenu)
+
+// Moves the mouse over the scroll button and makes sure we get scrolling.
+class BookmarkBarViewTest9 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual bool CreateBigMenu() { return true; }
+
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest9::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ first_menu_ = menu->GetSubmenu()->GetMenuItemAt(0);
+ gfx::Point menu_loc;
+ views::View::ConvertPointToScreen(first_menu_, &menu_loc);
+ start_y_ = menu_loc.y();
+
+ // Move the mouse over the scroll button.
+ views::View* scroll_container = menu->GetSubmenu()->GetParent();
+ ASSERT_TRUE(scroll_container != NULL);
+ scroll_container = scroll_container->GetParent();
+ ASSERT_TRUE(scroll_container != NULL);
+ views::View* scroll_down_button = scroll_container->GetChildViewAt(1);
+ ASSERT_TRUE(scroll_down_button);
+ gfx::Point loc(scroll_down_button->width() / 2,
+ scroll_down_button->height() / 2);
+ views::View::ConvertPointToScreen(scroll_down_button, &loc);
+
+ // On linux, the sending one location isn't enough.
+ ui_controls::SendMouseMove(loc.x() - 1 , loc.y() - 1);
+ ui_controls::SendMouseMoveNotifyWhenDone(
+ loc.x(), loc.y(), CreateEventTask(this, &BookmarkBarViewTest9::Step3));
+ }
+
+ void Step3() {
+ MessageLoop::current()->PostDelayedTask(FROM_HERE,
+ NewRunnableMethod(this, &BookmarkBarViewTest9::Step4), 200);
+ }
+
+ void Step4() {
+ gfx::Point menu_loc;
+ views::View::ConvertPointToScreen(first_menu_, &menu_loc);
+ ASSERT_NE(start_y_, menu_loc.y());
+
+ // Hide menu.
+ bb_view_->GetMenu()->GetMenuController()->CancelAll();
+
+ // On linux, Cancelling menu will call Quit on the message loop,
+ // which can interfere with Done. We need to run Done in the
+ // next execution loop.
+ MessageLoop::current()->PostTask(
+ FROM_HERE,
+ NewRunnableMethod(this, &ViewEventTestBase::Done));
+ }
+
+ int start_y_;
+ views::MenuItemView* first_menu_;
+};
+
+VIEW_TEST(BookmarkBarViewTest9, MAYBE_ScrollButtonScrolls)
+
+// Tests up/down/left/enter key messages.
+class BookmarkBarViewTest10 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest10::Step2));
+ MessageLoop::current()->RunAllPending();
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ // Send a down event, which should select the first item.
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_DOWN, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest10::Step3));
+ }
+
+ void Step3() {
+ // Make sure menu is showing and item is selected.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+ ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
+
+ // Send a key down event, which should select the next item.
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_DOWN, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest10::Step4));
+ }
+
+ void Step4() {
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+ ASSERT_FALSE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
+ ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(1)->IsSelected());
+
+ // Send a right arrow to force the menu to open.
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_RIGHT, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest10::Step5));
+ }
+
+ void Step5() {
+ // Make sure the submenu is showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+ views::MenuItemView* submenu = menu->GetSubmenu()->GetMenuItemAt(1);
+ ASSERT_TRUE(submenu->IsSelected());
+ ASSERT_TRUE(submenu->GetSubmenu());
+ ASSERT_TRUE(submenu->GetSubmenu()->IsShowing());
+
+ // Send a left arrow to close the submenu.
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_LEFT, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest10::Step6));
+ }
+
+ void Step6() {
+ // Make sure the submenu is showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+ views::MenuItemView* submenu = menu->GetSubmenu()->GetMenuItemAt(1);
+ ASSERT_TRUE(submenu->IsSelected());
+ ASSERT_TRUE(!submenu->GetSubmenu() || !submenu->GetSubmenu()->IsShowing());
+
+ // Send a down arrow to wrap back to f1a
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_DOWN, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest10::Step7));
+ }
+
+ void Step7() {
+ // Make sure menu is showing and item is selected.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+ ASSERT_TRUE(menu->GetSubmenu()->GetMenuItemAt(0)->IsSelected());
+
+ // Send enter, which should select the item.
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_RETURN, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest10::Step8));
+ }
+
+ void Step8() {
+ ASSERT_TRUE(
+ model_->GetBookmarkBarNode()->GetChild(0)->GetChild(0)->GetURL() ==
+ navigator_.url_);
+ Done();
+ }
+};
+
+VIEW_TEST(BookmarkBarViewTest10, MAYBE_KeyEvents)
+
+// Make sure the menu closes with the following sequence: show menu, show
+// context menu, close context menu (via escape), then click else where. This
+// effectively verifies we maintain mouse capture after the context menu is
+// hidden.
+class BookmarkBarViewTest11 : public BookmarkBarViewEventTestBase {
+ public:
+ BookmarkBarViewTest11()
+ : ALLOW_THIS_IN_INITIALIZER_LIST(
+ observer_(CreateEventTask(this, &BookmarkBarViewTest11::Step3))) {
+ }
+
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->other_bookmarked_button();
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest11::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Right click on the first child to get its context menu.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
+ ui_controls::DOWN | ui_controls::UP, NULL);
+ // Step3 will be invoked by ContextMenuNotificationObserver.
+ }
+
+ void Step3() {
+ // Send escape so that the context menu hides.
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_ESCAPE, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest11::Step4));
+ }
+
+ void Step4() {
+ // Make sure the context menu is no longer showing.
+ views::MenuItemView* menu = bb_view_->GetContextMenu();
+ ASSERT_TRUE(!menu || !menu->GetSubmenu() ||
+ !menu->GetSubmenu()->IsShowing());
+
+ // But the menu should be showing.
+ menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu && menu->GetSubmenu() && menu->GetSubmenu()->IsShowing());
+
+ // Now click on empty space.
+ gfx::Point mouse_loc;
+ views::View::ConvertPointToScreen(bb_view_, &mouse_loc);
+ ui_controls::SendMouseMove(mouse_loc.x(), mouse_loc.y());
+ ui_controls::SendMouseEventsNotifyWhenDone(
+ ui_controls::LEFT, ui_controls::UP | ui_controls::DOWN,
+ CreateEventTask(this, &BookmarkBarViewTest11::Step5));
+ }
+
+ void Step5() {
+ // Make sure the menu is not showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(!menu || !menu->GetSubmenu() ||
+ !menu->GetSubmenu()->IsShowing());
+ Done();
+ }
+
+ ContextMenuNotificationObserver observer_;
+};
+
+VIEW_TEST(BookmarkBarViewTest11, MAYBE_CloseMenuAfterClosingContextMenu)
+
+// Tests showing a modal dialog from a context menu.
+class BookmarkBarViewTest12 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Open up the other folder.
+ views::TextButton* button = bb_view_->other_bookmarked_button();
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest12::Step2));
+ bookmark_utils::num_urls_before_prompting = 1;
+ }
+
+ ~BookmarkBarViewTest12() {
+ bookmark_utils::num_urls_before_prompting = 15;
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(1);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Right click on the second child (a folder) to get its context menu.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest12::Step3));
+ }
+
+ void Step3() {
+ // Make sure the context menu is showing.
+ views::MenuItemView* menu = bb_view_->GetContextMenu();
+ ASSERT_TRUE(menu && menu->GetSubmenu() && menu->GetSubmenu()->IsShowing());
+
+ // Select the first item in the context menu (open all).
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ASSERT_TRUE(child_menu != NULL);
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP, NULL);
+
+ // Delay until we send tab, otherwise the message box doesn't appear
+ // correctly.
+ MessageLoop::current()->PostDelayedTask(FROM_HERE,
+ CreateEventTask(this, &BookmarkBarViewTest12::Step4), 1000);
+ }
+
+ void Step4() {
+ // Press tab to give focus to the cancel button.
+ ui_controls::SendKeyPress(NULL, app::VKEY_TAB, false, false, false, false);
+
+ // For some reason return isn't processed correctly unless we delay.
+ MessageLoop::current()->PostDelayedTask(FROM_HERE,
+ CreateEventTask(this, &BookmarkBarViewTest12::Step5), 1000);
+ }
+
+ void Step5() {
+ // And press enter so that the cancel button is selected.
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_RETURN, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest12::Step6));
+ }
+
+ void Step6() {
+ // Do a delayed task to give the dialog time to exit.
+ MessageLoop::current()->PostTask(
+ FROM_HERE, CreateEventTask(this, &BookmarkBarViewTest12::Step7));
+ }
+
+ void Step7() {
+ Done();
+ }
+};
+
+VIEW_TEST(BookmarkBarViewTest12, MAYBE_CloseWithModalDialog)
+
+// Tests clicking on the separator of a context menu (this is for coverage of
+// bug 17862).
+class BookmarkBarViewTest13 : public BookmarkBarViewEventTestBase {
+ public:
+ BookmarkBarViewTest13()
+ : ALLOW_THIS_IN_INITIALIZER_LIST(
+ observer_(CreateEventTask(this, &BookmarkBarViewTest13::Step3))) {
+ }
+
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->other_bookmarked_button();
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest13::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(0);
+ ASSERT_TRUE(child_menu != NULL);
+
+ // Right click on the first child to get its context menu.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
+ ui_controls::DOWN | ui_controls::UP, NULL);
+ // Step3 will be invoked by ContextMenuNotificationObserver.
+ }
+
+ void Step3() {
+ // Make sure the context menu is showing.
+ views::MenuItemView* menu = bb_view_->GetContextMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu());
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ // Find the first separator.
+ views::SubmenuView* submenu = menu->GetSubmenu();
+ views::View* separator_view = NULL;
+ for (int i = 0; i < submenu->GetChildViewCount(); ++i) {
+ if (submenu->GetChildViewAt(i)->GetID() !=
+ views::MenuItemView::kMenuItemViewID) {
+ separator_view = submenu->GetChildViewAt(i);
+ break;
+ }
+ }
+ ASSERT_TRUE(separator_view);
+
+ // Click on the separator. Clicking on the separator shouldn't visually
+ // change anything.
+ ui_controls::MoveMouseToCenterAndPress(separator_view,
+ ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest13::Step4));
+ }
+
+ void Step4() {
+ // The context menu should still be showing.
+ views::MenuItemView* menu = bb_view_->GetContextMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu());
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ // Select the first context menu item.
+ ui_controls::MoveMouseToCenterAndPress(menu->GetSubmenu()->GetMenuItemAt(0),
+ ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest13::Step5));
+ }
+
+ void Step5() {
+ Done();
+ }
+
+ ContextMenuNotificationObserver observer_;
+};
+
+VIEW_TEST(BookmarkBarViewTest13, ClickOnContextMenuSeparator)
+
+// Makes sure right cliking on a folder on the bookmark bar doesn't result in
+// both a context menu and showing the menu.
+class BookmarkBarViewTest14 : public BookmarkBarViewEventTestBase {
+ public:
+ BookmarkBarViewTest14()
+ : ALLOW_THIS_IN_INITIALIZER_LIST(
+ observer_(CreateEventTask(this, &BookmarkBarViewTest14::Step2))) {
+ }
+
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // right mouse button.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::RIGHT,
+ ui_controls::DOWN | ui_controls::UP, NULL);
+ // Step2 will be invoked by ContextMenuNotificationObserver.
+ }
+
+ private:
+
+ void Step2() {
+ // Menu should NOT be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu == NULL);
+
+ // Send escape so that the context menu hides.
+ ui_controls::SendKeyPressNotifyWhenDone(
+ NULL, app::VKEY_ESCAPE, false, false, false, false,
+ CreateEventTask(this, &BookmarkBarViewTest14::Step3));
+ }
+
+ void Step3() {
+ Done();
+ }
+
+ ContextMenuNotificationObserver observer_;
+};
+
+VIEW_TEST(BookmarkBarViewTest14, ContextMenus2)
+
+// Makes sure deleting from the context menu keeps the bookmark menu showing.
+class BookmarkBarViewTest15 : public BookmarkBarViewEventTestBase {
+ public:
+ BookmarkBarViewTest15()
+ : deleted_menu_id_(0),
+ ALLOW_THIS_IN_INITIALIZER_LIST(
+ observer_(CreateEventTask(this, &BookmarkBarViewTest15::Step3))) {
+ }
+
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ // Show the other bookmarks.
+ views::TextButton* button = bb_view_->other_bookmarked_button();
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest15::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* child_menu =
+ menu->GetSubmenu()->GetMenuItemAt(1);
+ ASSERT_TRUE(child_menu != NULL);
+
+ deleted_menu_id_ = child_menu->GetCommand();
+
+ // Right click on the second child to get its context menu.
+ ui_controls::MoveMouseToCenterAndPress(child_menu, ui_controls::RIGHT,
+ ui_controls::DOWN | ui_controls::UP, NULL);
+ // Step3 will be invoked by ContextMenuNotificationObserver.
+ }
+
+ void Step3() {
+ // Make sure the context menu is showing.
+ views::MenuItemView* menu = bb_view_->GetContextMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu());
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ views::MenuItemView* delete_menu =
+ menu->GetMenuItemByID(IDS_BOOKMARK_BAR_REMOVE);
+ ASSERT_TRUE(delete_menu);
+
+ // Click on the delete button.
+ ui_controls::MoveMouseToCenterAndPress(delete_menu,
+ ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest15::Step4));
+ }
+
+ void Step4() {
+ // The context menu should not be showing.
+ views::MenuItemView* context_menu = bb_view_->GetContextMenu();
+ ASSERT_TRUE(context_menu == NULL);
+
+ // But the menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ // And the deleted_menu_id_ should have been removed.
+ ASSERT_TRUE(menu->GetMenuItemByID(deleted_menu_id_) == NULL);
+
+ bb_view_->GetMenu()->GetMenuController()->CancelAll();
+
+ Done();
+ }
+
+ int deleted_menu_id_;
+ ContextMenuNotificationObserver observer_;
+};
+
+VIEW_TEST(BookmarkBarViewTest15, MenuStaysVisibleAfterDelete)
+
+// Tests that we don't crash or get stuck if the parent of a menu is closed.
+class BookmarkBarViewTest16 : public BookmarkBarViewEventTestBase {
+ protected:
+ virtual void DoTestOnMessageLoop() {
+ InstallViewsDelegate();
+
+ // Move the mouse to the first folder on the bookmark bar and press the
+ // mouse.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT,
+ ui_controls::DOWN | ui_controls::UP,
+ CreateEventTask(this, &BookmarkBarViewTest16::Step2));
+ }
+
+ private:
+ void Step2() {
+ // Menu should be showing.
+ views::MenuItemView* menu = bb_view_->GetMenu();
+ ASSERT_TRUE(menu != NULL);
+ ASSERT_TRUE(menu->GetSubmenu()->IsShowing());
+
+ // Button should be depressed.
+ views::TextButton* button = bb_view_->GetBookmarkButton(0);
+ ASSERT_TRUE(button->state() == views::CustomButton::BS_PUSHED);
+
+ // Close the window.
+ window_->Close();
+ window_ = NULL;
+ }
+};
+
+VIEW_TEST(BookmarkBarViewTest16, DeleteMenu)