| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/keyboard_codes.h" | 5 #include "base/keyboard_codes.h" |
| 6 #include "base/string_util.h" | 6 #include "base/string_util.h" |
| 7 #include "chrome/browser/automation/ui_controls.h" | 7 #include "chrome/browser/automation/ui_controls.h" |
| 8 #include "chrome/browser/bookmarks/bookmark_model.h" | 8 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 9 #include "chrome/browser/bookmarks/bookmark_utils.h" | 9 #include "chrome/browser/bookmarks/bookmark_utils.h" |
| 10 #include "chrome/browser/pref_service.h" | 10 #include "chrome/browser/pref_service.h" |
| 11 #include "chrome/browser/profile.h" | 11 #include "chrome/browser/profile.h" |
| 12 #include "chrome/browser/tab_contents/page_navigator.h" | 12 #include "chrome/browser/tab_contents/page_navigator.h" |
| 13 #include "chrome/browser/views/bookmark_bar_view.h" | 13 #include "chrome/browser/views/bookmark_bar_view.h" |
| 14 #include "chrome/common/notification_service.h" | 14 #include "chrome/common/notification_service.h" |
| 15 #include "chrome/common/pref_names.h" | 15 #include "chrome/common/pref_names.h" |
| 16 #include "chrome/test/testing_profile.h" | 16 #include "chrome/test/testing_profile.h" |
| 17 #include "chrome/test/interactive_ui/view_event_test_base.h" | 17 #include "chrome/test/interactive_ui/view_event_test_base.h" |
| 18 #include "chrome/test/ui_test_utils.h" | 18 #include "chrome/test/ui_test_utils.h" |
| 19 #include "grit/generated_resources.h" | 19 #include "grit/generated_resources.h" |
| 20 #include "views/controls/button/menu_button.h" | 20 #include "views/controls/button/menu_button.h" |
| 21 #include "views/controls/button/text_button.h" | 21 #include "views/controls/button/text_button.h" |
| 22 #include "views/controls/menu/menu_controller.h" | 22 #include "views/controls/menu/menu_controller.h" |
| 23 #include "views/controls/menu/menu_item_view.h" | 23 #include "views/controls/menu/menu_item_view.h" |
| 24 #include "views/controls/menu/submenu_view.h" | 24 #include "views/controls/menu/submenu_view.h" |
| 25 #include "views/views_delegate.h" |
| 25 #include "views/window/window.h" | 26 #include "views/window/window.h" |
| 26 | 27 |
| 27 #if defined(OS_LINUX) | 28 #if defined(OS_LINUX) |
| 28 // See http://crbug.com/40040 for details. | 29 // See http://crbug.com/40040 for details. |
| 29 #define MAYBE_DND DISABLED_DND | 30 #define MAYBE_DND DISABLED_DND |
| 30 #define MAYBE_DNDToDifferentMenu DISABLED_DNDToDifferentMenu | 31 #define MAYBE_DNDToDifferentMenu DISABLED_DNDToDifferentMenu |
| 31 #define MAYBE_DNDBackToOriginatingMenu DISABLED_DNDBackToOriginatingMenu | 32 #define MAYBE_DNDBackToOriginatingMenu DISABLED_DNDBackToOriginatingMenu |
| 32 | 33 |
| 33 // See http://crbug.com/40039 for details. | 34 // See http://crbug.com/40039 for details. |
| 34 #define MAYBE_KeyEvents DISABLED_KeyEvents | 35 #define MAYBE_KeyEvents DISABLED_KeyEvents |
| 35 | 36 |
| 36 #else | 37 #else |
| 37 | 38 |
| 38 #define MAYBE_DND DND | 39 #define MAYBE_DND DND |
| 39 #define MAYBE_DNDToDifferentMenu DNDToDifferentMenu | 40 #define MAYBE_DNDToDifferentMenu DNDToDifferentMenu |
| 40 #define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu | 41 #define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu |
| 41 #define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu | 42 #define MAYBE_DNDBackToOriginatingMenu DNDBackToOriginatingMenu |
| 42 #define MAYBE_KeyEvents KeyEvents | 43 #define MAYBE_KeyEvents KeyEvents |
| 43 | 44 |
| 44 #endif | 45 #endif |
| 45 | 46 |
| 46 namespace { | 47 namespace { |
| 47 | 48 |
| 49 class ViewsDelegateImpl : public views::ViewsDelegate { |
| 50 public: |
| 51 ViewsDelegateImpl() {} |
| 52 virtual Clipboard* GetClipboard() const { return NULL; } |
| 53 virtual void SaveWindowPlacement(const std::wstring& window_name, |
| 54 const gfx::Rect& bounds, |
| 55 bool maximized) {} |
| 56 virtual bool GetSavedWindowBounds(const std::wstring& window_name, |
| 57 gfx::Rect* bounds) const { |
| 58 return false; |
| 59 } |
| 60 virtual bool GetSavedMaximizedState(const std::wstring& window_name, |
| 61 bool* maximized) const { |
| 62 return false; |
| 63 } |
| 64 |
| 65 #if defined(OS_WIN) |
| 66 virtual HICON GetDefaultWindowIcon() const { return 0; } |
| 67 #endif |
| 68 |
| 69 virtual void AddRef() { |
| 70 } |
| 71 |
| 72 virtual void ReleaseRef() { |
| 73 MessageLoopForUI::current()->Quit(); |
| 74 } |
| 75 |
| 76 private: |
| 77 DISALLOW_COPY_AND_ASSIGN(ViewsDelegateImpl); |
| 78 }; |
| 79 |
| 48 // PageNavigator implementation that records the URL. | 80 // PageNavigator implementation that records the URL. |
| 49 class TestingPageNavigator : public PageNavigator { | 81 class TestingPageNavigator : public PageNavigator { |
| 50 public: | 82 public: |
| 51 virtual void OpenURL(const GURL& url, const GURL& referrer, | 83 virtual void OpenURL(const GURL& url, const GURL& referrer, |
| 52 WindowOpenDisposition disposition, | 84 WindowOpenDisposition disposition, |
| 53 PageTransition::Type transition) { | 85 PageTransition::Type transition) { |
| 54 url_ = url; | 86 url_ = url; |
| 55 } | 87 } |
| 56 | 88 |
| 57 GURL url_; | 89 GURL url_; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 | 173 |
| 142 tmp_parent.RemoveChildView(bb_view_); | 174 tmp_parent.RemoveChildView(bb_view_); |
| 143 | 175 |
| 144 ViewEventTestBase::SetUp(); | 176 ViewEventTestBase::SetUp(); |
| 145 } | 177 } |
| 146 | 178 |
| 147 virtual void TearDown() { | 179 virtual void TearDown() { |
| 148 views::MenuItemView::allow_task_nesting_during_run_ = false; | 180 views::MenuItemView::allow_task_nesting_during_run_ = false; |
| 149 ViewEventTestBase::TearDown(); | 181 ViewEventTestBase::TearDown(); |
| 150 BookmarkBarView::testing_ = false; | 182 BookmarkBarView::testing_ = false; |
| 183 views::ViewsDelegate::views_delegate = NULL; |
| 151 } | 184 } |
| 152 | 185 |
| 153 protected: | 186 protected: |
| 187 void InstallViewsDelegate() { |
| 188 views::ViewsDelegate::views_delegate = &views_delegate_; |
| 189 } |
| 190 |
| 154 virtual views::View* CreateContentsView() { | 191 virtual views::View* CreateContentsView() { |
| 155 return bb_view_; | 192 return bb_view_; |
| 156 } | 193 } |
| 157 | 194 |
| 158 virtual gfx::Size GetPreferredSize() { return bb_view_pref_; } | 195 virtual gfx::Size GetPreferredSize() { return bb_view_pref_; } |
| 159 | 196 |
| 160 // See comment above class description for what this does. | 197 // See comment above class description for what this does. |
| 161 virtual bool CreateBigMenu() { return false; } | 198 virtual bool CreateBigMenu() { return false; } |
| 162 | 199 |
| 163 BookmarkModel* model_; | 200 BookmarkModel* model_; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 193 model_->AddURL(of, 1, L"ofb", GURL(test_base + "ofb")); | 230 model_->AddURL(of, 1, L"ofb", GURL(test_base + "ofb")); |
| 194 const BookmarkNode* of2 = model_->AddGroup(model_->other_node(), 2, L"OF2"); | 231 const BookmarkNode* of2 = model_->AddGroup(model_->other_node(), 2, L"OF2"); |
| 195 model_->AddURL(of2, 0, L"of2a", GURL(test_base + "of2a")); | 232 model_->AddURL(of2, 0, L"of2a", GURL(test_base + "of2a")); |
| 196 model_->AddURL(of2, 1, L"of2b", GURL(test_base + "of2b")); | 233 model_->AddURL(of2, 1, L"of2b", GURL(test_base + "of2b")); |
| 197 } | 234 } |
| 198 | 235 |
| 199 gfx::Size bb_view_pref_; | 236 gfx::Size bb_view_pref_; |
| 200 scoped_ptr<TestingProfile> profile_; | 237 scoped_ptr<TestingProfile> profile_; |
| 201 ChromeThread ui_thread_; | 238 ChromeThread ui_thread_; |
| 202 ChromeThread file_thread_; | 239 ChromeThread file_thread_; |
| 240 ViewsDelegateImpl views_delegate_; |
| 203 }; | 241 }; |
| 204 | 242 |
| 205 // Clicks on first menu, makes sure button is depressed. Moves mouse to first | 243 // Clicks on first menu, makes sure button is depressed. Moves mouse to first |
| 206 // child, clicks it and makes sure a navigation occurs. | 244 // child, clicks it and makes sure a navigation occurs. |
| 207 class BookmarkBarViewTest1 : public BookmarkBarViewEventTestBase { | 245 class BookmarkBarViewTest1 : public BookmarkBarViewEventTestBase { |
| 208 protected: | 246 protected: |
| 209 virtual void DoTestOnMessageLoop() { | 247 virtual void DoTestOnMessageLoop() { |
| 210 // Move the mouse to the first folder on the bookmark bar and press the | 248 // Move the mouse to the first folder on the bookmark bar and press the |
| 211 // mouse. | 249 // mouse. |
| 212 views::TextButton* button = bb_view_->GetBookmarkButton(0); | 250 views::TextButton* button = bb_view_->GetBookmarkButton(0); |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 | 400 |
| 363 // And submenu we last clicked is showing. | 401 // And submenu we last clicked is showing. |
| 364 child_menu = menu->GetSubmenu()->GetMenuItemAt(2); | 402 child_menu = menu->GetSubmenu()->GetMenuItemAt(2); |
| 365 ASSERT_TRUE(child_menu != NULL); | 403 ASSERT_TRUE(child_menu != NULL); |
| 366 ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing()); | 404 ASSERT_TRUE(child_menu->GetSubmenu()->IsShowing()); |
| 367 | 405 |
| 368 // Nothing should have been selected. | 406 // Nothing should have been selected. |
| 369 EXPECT_EQ(GURL(), navigator_.url_); | 407 EXPECT_EQ(GURL(), navigator_.url_); |
| 370 | 408 |
| 371 // Hide menu. | 409 // Hide menu. |
| 372 menu->GetMenuController()->Cancel(true); | 410 menu->GetMenuController()->CancelAll(); |
| 373 | 411 |
| 374 Done(); | 412 Done(); |
| 375 } | 413 } |
| 376 }; | 414 }; |
| 377 | 415 |
| 378 VIEW_TEST(BookmarkBarViewTest3, Submenus) | 416 VIEW_TEST(BookmarkBarViewTest3, Submenus) |
| 379 | 417 |
| 380 // Observer that posts task upon the context menu creation. | 418 // Observer that posts task upon the context menu creation. |
| 381 // This is necessary for Linux as the context menu has to check | 419 // This is necessary for Linux as the context menu has to check |
| 382 // the clipboard, which invokes the event loop. | 420 // the clipboard, which invokes the event loop. |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 777 MessageLoop::current()->PostDelayedTask(FROM_HERE, | 815 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 778 NewRunnableMethod(this, &BookmarkBarViewTest9::Step4), 200); | 816 NewRunnableMethod(this, &BookmarkBarViewTest9::Step4), 200); |
| 779 } | 817 } |
| 780 | 818 |
| 781 void Step4() { | 819 void Step4() { |
| 782 gfx::Point menu_loc; | 820 gfx::Point menu_loc; |
| 783 views::View::ConvertPointToScreen(first_menu_, &menu_loc); | 821 views::View::ConvertPointToScreen(first_menu_, &menu_loc); |
| 784 ASSERT_NE(start_y_, menu_loc.y()); | 822 ASSERT_NE(start_y_, menu_loc.y()); |
| 785 | 823 |
| 786 // Hide menu. | 824 // Hide menu. |
| 787 bb_view_->GetMenu()->GetMenuController()->Cancel(true); | 825 bb_view_->GetMenu()->GetMenuController()->CancelAll(); |
| 788 | 826 |
| 789 // On linux, Cancelling menu will call Quit on the message loop, | 827 // On linux, Cancelling menu will call Quit on the message loop, |
| 790 // which can interfere with Done. We need to run Done in the | 828 // which can interfere with Done. We need to run Done in the |
| 791 // next execution loop. | 829 // next execution loop. |
| 792 MessageLoop::current()->PostTask( | 830 MessageLoop::current()->PostTask( |
| 793 FROM_HERE, | 831 FROM_HERE, |
| 794 NewRunnableMethod(this, &ViewEventTestBase::Done)); | 832 NewRunnableMethod(this, &ViewEventTestBase::Done)); |
| 795 } | 833 } |
| 796 | 834 |
| 797 int start_y_; | 835 int start_y_; |
| (...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 ASSERT_TRUE(context_menu == NULL); | 1286 ASSERT_TRUE(context_menu == NULL); |
| 1249 | 1287 |
| 1250 // But the menu should be showing. | 1288 // But the menu should be showing. |
| 1251 views::MenuItemView* menu = bb_view_->GetMenu(); | 1289 views::MenuItemView* menu = bb_view_->GetMenu(); |
| 1252 ASSERT_TRUE(menu != NULL); | 1290 ASSERT_TRUE(menu != NULL); |
| 1253 ASSERT_TRUE(menu->GetSubmenu()->IsShowing()); | 1291 ASSERT_TRUE(menu->GetSubmenu()->IsShowing()); |
| 1254 | 1292 |
| 1255 // And the deleted_menu_id_ should have been removed. | 1293 // And the deleted_menu_id_ should have been removed. |
| 1256 ASSERT_TRUE(menu->GetMenuItemByID(deleted_menu_id_) == NULL); | 1294 ASSERT_TRUE(menu->GetMenuItemByID(deleted_menu_id_) == NULL); |
| 1257 | 1295 |
| 1258 bb_view_->GetMenu()->GetMenuController()->Cancel(true); | 1296 bb_view_->GetMenu()->GetMenuController()->CancelAll(); |
| 1259 | 1297 |
| 1260 Done(); | 1298 Done(); |
| 1261 } | 1299 } |
| 1262 | 1300 |
| 1263 int deleted_menu_id_; | 1301 int deleted_menu_id_; |
| 1264 ContextMenuNotificationObserver observer_; | 1302 ContextMenuNotificationObserver observer_; |
| 1265 }; | 1303 }; |
| 1266 | 1304 |
| 1267 VIEW_TEST(BookmarkBarViewTest15, MenuStaysVisibleAfterDelete) | 1305 VIEW_TEST(BookmarkBarViewTest15, MenuStaysVisibleAfterDelete) |
| 1306 |
| 1307 // Tests that we don't crash or get stuck if the parent of a menu is closed. |
| 1308 class BookmarkBarViewTest16 : public BookmarkBarViewEventTestBase { |
| 1309 protected: |
| 1310 virtual void DoTestOnMessageLoop() { |
| 1311 InstallViewsDelegate(); |
| 1312 |
| 1313 // Move the mouse to the first folder on the bookmark bar and press the |
| 1314 // mouse. |
| 1315 views::TextButton* button = bb_view_->GetBookmarkButton(0); |
| 1316 ui_controls::MoveMouseToCenterAndPress(button, ui_controls::LEFT, |
| 1317 ui_controls::DOWN | ui_controls::UP, |
| 1318 CreateEventTask(this, &BookmarkBarViewTest16::Step2)); |
| 1319 } |
| 1320 |
| 1321 private: |
| 1322 void Step2() { |
| 1323 // Menu should be showing. |
| 1324 views::MenuItemView* menu = bb_view_->GetMenu(); |
| 1325 ASSERT_TRUE(menu != NULL); |
| 1326 ASSERT_TRUE(menu->GetSubmenu()->IsShowing()); |
| 1327 |
| 1328 // Button should be depressed. |
| 1329 views::TextButton* button = bb_view_->GetBookmarkButton(0); |
| 1330 ASSERT_TRUE(button->state() == views::CustomButton::BS_PUSHED); |
| 1331 |
| 1332 // Close the window. |
| 1333 window_->Close(); |
| 1334 window_ = NULL; |
| 1335 } |
| 1336 }; |
| 1337 |
| 1338 VIEW_TEST(BookmarkBarViewTest16, DeleteMenu) |
| OLD | NEW |