Home | History | Annotate | Download | only in views
      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/process_util.h"
      6 #include "base/string_util.h"
      7 #include "base/utf_string_conversions.h"
      8 #include "chrome/browser/tabs/tab_strip_model.h"
      9 #include "chrome/browser/ui/browser.h"
     10 #include "chrome/browser/ui/find_bar/find_bar_controller.h"
     11 #include "chrome/browser/ui/view_ids.h"
     12 #include "chrome/browser/ui/views/find_bar_host.h"
     13 #include "chrome/browser/ui/views/frame/browser_view.h"
     14 #include "chrome/test/in_process_browser_test.h"
     15 #include "chrome/test/ui_test_utils.h"
     16 #include "content/browser/tab_contents/tab_contents.h"
     17 #include "net/test/test_server.h"
     18 #include "ui/base/keycodes/keyboard_codes.h"
     19 #include "views/focus/focus_manager.h"
     20 #include "views/view.h"
     21 
     22 namespace {
     23 
     24 // The delay waited after sending an OS simulated event.
     25 static const int kActionDelayMs = 500;
     26 static const char kSimplePage[] = "files/find_in_page/simple.html";
     27 
     28 void Checkpoint(const char* message, const base::TimeTicks& start_time) {
     29   LOG(INFO) << message << " : "
     30     << (base::TimeTicks::Now() - start_time).InMilliseconds()
     31     << " ms" << std::flush;
     32 }
     33 
     34 class FindInPageTest : public InProcessBrowserTest {
     35  public:
     36   FindInPageTest() {
     37     set_show_window(true);
     38     FindBarHost::disable_animations_during_testing_ = true;
     39   }
     40 
     41   string16 GetFindBarText() {
     42     FindBarTesting* find_bar =
     43         browser()->GetFindBarController()->find_bar()->GetFindBarTesting();
     44     return find_bar->GetFindText();
     45   }
     46 };
     47 
     48 }  // namespace
     49 
     50 IN_PROC_BROWSER_TEST_F(FindInPageTest, CrashEscHandlers) {
     51   ASSERT_TRUE(test_server()->Start());
     52 
     53   // First we navigate to our test page (tab A).
     54   GURL url = test_server()->GetURL(kSimplePage);
     55   ui_test_utils::NavigateToURL(browser(), url);
     56 
     57   browser()->Find();
     58 
     59   // Open another tab (tab B).
     60   browser()->AddSelectedTabWithURL(url, PageTransition::TYPED);
     61 
     62   browser()->Find();
     63   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
     64                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
     65 
     66   // Select tab A.
     67   browser()->ActivateTabAt(0, true);
     68 
     69   // Close tab B.
     70   browser()->CloseTabContents(browser()->GetTabContentsAt(1));
     71 
     72   // Click on the location bar so that Find box loses focus.
     73   ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(),
     74                                                      VIEW_ID_LOCATION_BAR));
     75 #if defined(TOOLKIT_VIEWS) || defined(OS_WIN)
     76   // Check the location bar is focused.
     77   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR));
     78 #endif
     79 
     80   // This used to crash until bug 1303709 was fixed.
     81   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
     82       browser(), ui::VKEY_ESCAPE, false, false, false, false));
     83 }
     84 
     85 IN_PROC_BROWSER_TEST_F(FindInPageTest, FocusRestore) {
     86   ASSERT_TRUE(test_server()->Start());
     87 
     88   GURL url = test_server()->GetURL("title1.html");
     89   ui_test_utils::NavigateToURL(browser(), url);
     90 
     91   // Focus the location bar, open and close the find-in-page, focus should
     92   // return to the location bar.
     93   browser()->FocusLocationBar();
     94   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR));
     95   // Ensure the creation of the find bar controller.
     96   browser()->GetFindBarController()->Show();
     97   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
     98                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
     99   browser()->GetFindBarController()->EndFindSession(
    100       FindBarController::kKeepSelection);
    101   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR));
    102 
    103   // Focus the location bar, find something on the page, close the find box,
    104   // focus should go to the page.
    105   browser()->FocusLocationBar();
    106   browser()->Find();
    107   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    108                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    109   ui_test_utils::FindInPage(browser()->GetSelectedTabContentsWrapper(),
    110                             ASCIIToUTF16("a"), true, false, NULL);
    111   browser()->GetFindBarController()->EndFindSession(
    112       FindBarController::kKeepSelection);
    113   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    114                                            VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
    115 
    116   // Focus the location bar, open and close the find box, focus should return to
    117   // the location bar (same as before, just checking that http://crbug.com/23599
    118   // is fixed).
    119   browser()->FocusLocationBar();
    120   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR));
    121   browser()->GetFindBarController()->Show();
    122   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    123                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    124   browser()->GetFindBarController()->EndFindSession(
    125       FindBarController::kKeepSelection);
    126   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR));
    127 }
    128 
    129 IN_PROC_BROWSER_TEST_F(FindInPageTest, FocusRestoreOnTabSwitch) {
    130   ASSERT_TRUE(test_server()->Start());
    131 
    132   // First we navigate to our test page (tab A).
    133   GURL url = test_server()->GetURL(kSimplePage);
    134   ui_test_utils::NavigateToURL(browser(), url);
    135 
    136   browser()->Find();
    137   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    138                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    139 
    140   FindBarTesting* find_bar =
    141       browser()->GetFindBarController()->find_bar()->GetFindBarTesting();
    142 
    143   // Search for 'a'.
    144   ui_test_utils::FindInPage(browser()->GetSelectedTabContentsWrapper(),
    145                             ASCIIToUTF16("a"), true, false, NULL);
    146   EXPECT_TRUE(ASCIIToUTF16("a") == find_bar->GetFindSelectedText());
    147 
    148   // Open another tab (tab B).
    149   browser()->AddSelectedTabWithURL(url, PageTransition::TYPED);
    150   ASSERT_TRUE(ui_test_utils::WaitForNavigationInCurrentTab(browser()));
    151 
    152   // Make sure Find box is open.
    153   browser()->Find();
    154   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    155                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    156 
    157   // Search for 'b'.
    158   ui_test_utils::FindInPage(browser()->GetSelectedTabContentsWrapper(),
    159                             ASCIIToUTF16("b"), true, false, NULL);
    160   EXPECT_TRUE(ASCIIToUTF16("b") == find_bar->GetFindSelectedText());
    161 
    162   // Set focus away from the Find bar (to the Location bar).
    163   browser()->FocusLocationBar();
    164   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR));
    165 
    166   // Select tab A. Find bar should get focus.
    167   browser()->ActivateTabAt(0, true);
    168   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    169                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    170   EXPECT_TRUE(ASCIIToUTF16("a") == find_bar->GetFindSelectedText());
    171 
    172   // Select tab B. Location bar should get focus.
    173   browser()->ActivateTabAt(1, true);
    174   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR));
    175 }
    176 
    177 // This tests that whenever you clear values from the Find box and close it that
    178 // it respects that and doesn't show you the last search, as reported in bug:
    179 // http://crbug.com/40121.
    180 IN_PROC_BROWSER_TEST_F(FindInPageTest, PrepopulateRespectBlank) {
    181 #if defined(OS_MACOSX)
    182   // FindInPage on Mac doesn't use prepopulated values. Search there is global.
    183   return;
    184 #endif
    185   base::TimeTicks start_time = base::TimeTicks::Now();
    186   Checkpoint("Test starting", start_time);
    187 
    188   ASSERT_TRUE(test_server()->Start());
    189 
    190   // Make sure Chrome is in the foreground, otherwise sending input
    191   // won't do anything and the test will hang.
    192   ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
    193 
    194   Checkpoint("Navigate", start_time);
    195 
    196   // First we navigate to any page.
    197   GURL url = test_server()->GetURL(kSimplePage);
    198   ui_test_utils::NavigateToURL(browser(), url);
    199 
    200   Checkpoint("Show Find bar", start_time);
    201 
    202   // Show the Find bar.
    203   browser()->GetFindBarController()->Show();
    204 
    205   Checkpoint("Search for 'a'", start_time);
    206 
    207   // Search for "a".
    208   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    209       browser(), ui::VKEY_A, false, false, false, false));
    210 
    211   // We should find "a" here.
    212   EXPECT_EQ(ASCIIToUTF16("a"), GetFindBarText());
    213 
    214   Checkpoint("Delete 'a'", start_time);
    215 
    216   // Delete "a".
    217   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    218       browser(), ui::VKEY_BACK, false, false, false, false));
    219 
    220   // Validate we have cleared the text.
    221   EXPECT_EQ(string16(), GetFindBarText());
    222 
    223   Checkpoint("Close find bar", start_time);
    224 
    225   // Close the Find box.
    226   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    227       browser(), ui::VKEY_ESCAPE, false, false, false, false));
    228 
    229   Checkpoint("Show Find bar", start_time);
    230 
    231   // Show the Find bar.
    232   browser()->GetFindBarController()->Show();
    233 
    234   Checkpoint("Validate text", start_time);
    235 
    236   // After the Find box has been reopened, it should not have been prepopulated
    237   // with "a" again.
    238   EXPECT_EQ(string16(), GetFindBarText());
    239 
    240   Checkpoint("Close Find bar", start_time);
    241 
    242   // Close the Find box.
    243   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    244       browser(), ui::VKEY_ESCAPE, false, false, false, false));
    245 
    246   Checkpoint("FindNext", start_time);
    247 
    248   // Press F3 to trigger FindNext.
    249   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    250       browser(), ui::VKEY_F3, false, false, false, false));
    251 
    252   Checkpoint("Validate", start_time);
    253 
    254   // After the Find box has been reopened, it should still have no prepopulate
    255   // value.
    256   EXPECT_EQ(string16(), GetFindBarText());
    257 
    258   Checkpoint("Test done", start_time);
    259 }
    260