15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/toolbar_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_utils.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_command_controller.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToolbarViewTest : public InProcessBrowserTest { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ToolbarViewTest() {} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunToolbarCycleFocusTest(Browser* browser); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ToolbarViewTest); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToolbarViewTest::RunToolbarCycleFocusTest(Browser* browser) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow window = browser->window()->GetNativeWindow(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::FocusManager* focus_manager = widget->GetFocusManager(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandUpdater* updater = browser->command_controller()->command_updater(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send focus to the toolbar as if the user pressed Alt+Shift+T. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updater->ExecuteCommand(IDC_FOCUS_TOOLBAR); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* first_view = focus_manager->GetFocusedView(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> ids; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Press Tab to cycle through all of the controls in the toolbar until 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we end up back where we started. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found_reload = false; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found_location_bar = false; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found_app_menu = false; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::View* view = NULL; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (view != first_view) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager->AdvanceFocus(false); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view = focus_manager->GetFocusedView(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ids.push_back(view->id()); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view->id() == VIEW_ID_RELOAD_BUTTON) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found_reload = true; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view->id() == VIEW_ID_APP_MENU) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found_app_menu = true; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view->id() == VIEW_ID_OMNIBOX) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found_location_bar = true; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ids.size() > 100) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTEST_FAIL() << "Tabbed 100 times, still haven't cycled back!"; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we found a few key items. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(found_reload); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(found_app_menu); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(found_location_bar); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now press Shift-Tab to cycle backwards. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> reverse_ids; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view = NULL; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (view != first_view) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager->AdvanceFocus(true); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view = focus_manager->GetFocusedView(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reverse_ids.push_back(view->id()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reverse_ids.size() > 100) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTEST_FAIL() << "Tabbed 100 times, still haven't cycled back!"; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assert that the views were focused in exactly the reverse order. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The sequences should be the same length, and the last element will 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be the same, and the others are reverse. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ids.size(), reverse_ids.size()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count = ids.size(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < count - 1; i++) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids[i], reverse_ids[count - 2 - i]); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test is flaky on Win (http://crbug.com/152938) and crashes on CrOS under 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AddressSanitizer (http://crbug.com/154657). 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ToolbarViewTest, DISABLED_ToolbarCycleFocus) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunToolbarCycleFocusTest(browser()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/152938 Flaky on win. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ToolbarCycleFocusWithBookmarkBar \ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_ToolbarCycleFocusWithBookmarkBar 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ToolbarCycleFocusWithBookmarkBar ToolbarCycleFocusWithBookmarkBar 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ToolbarViewTest, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_ToolbarCycleFocusWithBookmarkBar) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandUpdater* updater = browser()->command_controller()->command_updater(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updater->ExecuteCommand(IDC_SHOW_BOOKMARK_BAR); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model = 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelFactory::GetForProfile(browser()->profile()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_utils::AddIfNotBookmarked( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model, GURL("http://foo.com"), ASCIIToUTF16("Foo")); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want to specifically test the case where the bookmark bar is 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // already showing when a window opens, so create a second browser 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window with the same profile. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* second_browser = CreateBrowser(browser()->profile()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunToolbarCycleFocusTest(second_browser); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 122