Home | History | Annotate | Download | only in views
      1 // Copyright (c) 2012 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/strings/string_util.h"
      6 #include "base/strings/utf_string_conversions.h"
      7 #include "chrome/browser/chrome_notification_types.h"
      8 #include "chrome/browser/ui/browser.h"
      9 #include "chrome/browser/ui/browser_commands.h"
     10 #include "chrome/browser/ui/browser_tabstrip.h"
     11 #include "chrome/browser/ui/find_bar/find_bar_controller.h"
     12 #include "chrome/browser/ui/find_bar/find_notification_details.h"
     13 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     14 #include "chrome/browser/ui/view_ids.h"
     15 #include "chrome/browser/ui/views/find_bar_host.h"
     16 #include "chrome/browser/ui/views/frame/browser_view.h"
     17 #include "chrome/test/base/in_process_browser_test.h"
     18 #include "chrome/test/base/interactive_test_utils.h"
     19 #include "chrome/test/base/ui_test_utils.h"
     20 #include "content/public/browser/notification_service.h"
     21 #include "content/public/browser/web_contents.h"
     22 #include "net/test/spawned_test_server/spawned_test_server.h"
     23 #include "ui/base/clipboard/clipboard.h"
     24 #include "ui/base/keycodes/keyboard_codes.h"
     25 #include "ui/views/focus/focus_manager.h"
     26 #include "ui/views/view.h"
     27 #include "ui/views/views_delegate.h"
     28 
     29 using content::WebContents;
     30 
     31 namespace {
     32 
     33 static const char kSimplePage[] = "files/find_in_page/simple.html";
     34 
     35 class FindInPageTest : public InProcessBrowserTest {
     36  public:
     37   FindInPageTest() {
     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   string16 GetFindBarSelectedText() {
     48     FindBarTesting* find_bar =
     49         browser()->GetFindBarController()->find_bar()->GetFindBarTesting();
     50     return find_bar->GetFindSelectedText();
     51   }
     52 
     53  private:
     54   DISALLOW_COPY_AND_ASSIGN(FindInPageTest);
     55 };
     56 
     57 }  // namespace
     58 
     59 // Flaky because the test server fails to start? See: http://crbug.com/96594.
     60 IN_PROC_BROWSER_TEST_F(FindInPageTest, CrashEscHandlers) {
     61   ASSERT_TRUE(test_server()->Start());
     62 
     63   // First we navigate to our test page (tab A).
     64   GURL url = test_server()->GetURL(kSimplePage);
     65   ui_test_utils::NavigateToURL(browser(), url);
     66 
     67   chrome::Find(browser());
     68 
     69   // Open another tab (tab B).
     70   chrome::AddSelectedTabWithURL(browser(), url, content::PAGE_TRANSITION_TYPED);
     71 
     72   chrome::Find(browser());
     73   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
     74                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
     75 
     76   // Select tab A.
     77   browser()->tab_strip_model()->ActivateTabAt(0, true);
     78 
     79   // Close tab B.
     80   browser()->tab_strip_model()->CloseWebContentsAt(1,
     81                                                    TabStripModel::CLOSE_NONE);
     82 
     83   // Click on the location bar so that Find box loses focus.
     84   ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(),
     85                                                      VIEW_ID_OMNIBOX));
     86   // Check the location bar is focused.
     87   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
     88 
     89   // This used to crash until bug 1303709 was fixed.
     90   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
     91       browser(), ui::VKEY_ESCAPE, false, false, false, false));
     92 }
     93 
     94 // Flaky because the test server fails to start? See: http://crbug.com/96594.
     95 IN_PROC_BROWSER_TEST_F(FindInPageTest, FocusRestore) {
     96   ASSERT_TRUE(test_server()->Start());
     97 
     98   GURL url = test_server()->GetURL("title1.html");
     99   ui_test_utils::NavigateToURL(browser(), url);
    100 
    101   // Focus the location bar, open and close the find-in-page, focus should
    102   // return to the location bar.
    103   chrome::FocusLocationBar(browser());
    104   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
    105   // Ensure the creation of the find bar controller.
    106   browser()->GetFindBarController()->Show();
    107   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    108                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    109   browser()->GetFindBarController()->EndFindSession(
    110       FindBarController::kKeepSelectionOnPage,
    111       FindBarController::kKeepResultsInFindBox);
    112   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
    113 
    114   // Focus the location bar, find something on the page, close the find box,
    115   // focus should go to the page.
    116   chrome::FocusLocationBar(browser());
    117   chrome::Find(browser());
    118   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    119                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    120   ui_test_utils::FindInPage(
    121       browser()->tab_strip_model()->GetActiveWebContents(),
    122       ASCIIToUTF16("a"), true, false, NULL, NULL);
    123   browser()->GetFindBarController()->EndFindSession(
    124       FindBarController::kKeepSelectionOnPage,
    125       FindBarController::kKeepResultsInFindBox);
    126   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
    127 
    128   // Focus the location bar, open and close the find box, focus should return to
    129   // the location bar (same as before, just checking that http://crbug.com/23599
    130   // is fixed).
    131   chrome::FocusLocationBar(browser());
    132   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
    133   browser()->GetFindBarController()->Show();
    134   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    135                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    136   browser()->GetFindBarController()->EndFindSession(
    137       FindBarController::kKeepSelectionOnPage,
    138       FindBarController::kKeepResultsInFindBox);
    139   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
    140 }
    141 
    142 // Flaky because the test server fails to start? See: http://crbug.com/96594.
    143 IN_PROC_BROWSER_TEST_F(FindInPageTest, FocusRestoreOnTabSwitch) {
    144   ASSERT_TRUE(test_server()->Start());
    145 
    146   // First we navigate to our test page (tab A).
    147   GURL url = test_server()->GetURL(kSimplePage);
    148   ui_test_utils::NavigateToURL(browser(), url);
    149 
    150   chrome::Find(browser());
    151   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    152                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    153 
    154   FindBarTesting* find_bar =
    155       browser()->GetFindBarController()->find_bar()->GetFindBarTesting();
    156 
    157   // Search for 'a'.
    158   ui_test_utils::FindInPage(
    159       browser()->tab_strip_model()->GetActiveWebContents(),
    160       ASCIIToUTF16("a"), true, false, NULL, NULL);
    161   EXPECT_TRUE(ASCIIToUTF16("a") == find_bar->GetFindSelectedText());
    162 
    163   // Open another tab (tab B).
    164   content::WindowedNotificationObserver observer(
    165       content::NOTIFICATION_LOAD_STOP,
    166       content::NotificationService::AllSources());
    167   chrome::AddSelectedTabWithURL(browser(), url, content::PAGE_TRANSITION_TYPED);
    168   observer.Wait();
    169 
    170   // Make sure Find box is open.
    171   chrome::Find(browser());
    172   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    173                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    174 
    175   // Search for 'b'.
    176   ui_test_utils::FindInPage(
    177       browser()->tab_strip_model()->GetActiveWebContents(),
    178       ASCIIToUTF16("b"), true, false, NULL, NULL);
    179   EXPECT_TRUE(ASCIIToUTF16("b") == find_bar->GetFindSelectedText());
    180 
    181   // Set focus away from the Find bar (to the Location bar).
    182   chrome::FocusLocationBar(browser());
    183   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
    184 
    185   // Select tab A. Find bar should get focus.
    186   browser()->tab_strip_model()->ActivateTabAt(0, true);
    187   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    188                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    189   EXPECT_TRUE(ASCIIToUTF16("a") == find_bar->GetFindSelectedText());
    190 
    191   // Select tab B. Location bar should get focus.
    192   browser()->tab_strip_model()->ActivateTabAt(1, true);
    193   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
    194 }
    195 
    196 // Flaky because the test server fails to start? See: http://crbug.com/96594.
    197 // This tests that whenever you clear values from the Find box and close it that
    198 // it respects that and doesn't show you the last search, as reported in bug:
    199 // http://crbug.com/40121.
    200 IN_PROC_BROWSER_TEST_F(FindInPageTest, PrepopulateRespectBlank) {
    201 #if defined(OS_MACOSX)
    202   // FindInPage on Mac doesn't use prepopulated values. Search there is global.
    203   return;
    204 #endif
    205   ASSERT_TRUE(test_server()->Start());
    206 
    207   // Make sure Chrome is in the foreground, otherwise sending input
    208   // won't do anything and the test will hang.
    209   ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
    210 
    211   // First we navigate to any page.
    212   GURL url = test_server()->GetURL(kSimplePage);
    213   ui_test_utils::NavigateToURL(browser(), url);
    214 
    215   // Show the Find bar.
    216   browser()->GetFindBarController()->Show();
    217 
    218   // Search for "a".
    219   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    220       browser(), ui::VKEY_A, false, false, false, false));
    221 
    222   // We should find "a" here.
    223   EXPECT_EQ(ASCIIToUTF16("a"), GetFindBarText());
    224 
    225   // Delete "a".
    226   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    227       browser(), ui::VKEY_BACK, false, false, false, false));
    228 
    229   // Validate we have cleared the text.
    230   EXPECT_EQ(string16(), GetFindBarText());
    231 
    232   // Close the Find box.
    233   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    234       browser(), ui::VKEY_ESCAPE, false, false, false, false));
    235 
    236   // Show the Find bar.
    237   browser()->GetFindBarController()->Show();
    238 
    239   // After the Find box has been reopened, it should not have been prepopulated
    240   // with "a" again.
    241   EXPECT_EQ(string16(), GetFindBarText());
    242 
    243   // Close the Find box.
    244   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    245       browser(), ui::VKEY_ESCAPE, false, false, false, false));
    246 
    247   // Press F3 to trigger FindNext.
    248   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    249       browser(), ui::VKEY_F3, false, false, false, false));
    250 
    251   // After the Find box has been reopened, it should still have no prepopulate
    252   // value.
    253   EXPECT_EQ(string16(), GetFindBarText());
    254 }
    255 
    256 // Flaky on Win. http://crbug.com/92467
    257 // Flaky on ChromeOS. http://crbug.com/118216
    258 #if defined(OS_WIN) || defined(OS_CHROMEOS)
    259 #define MAYBE_PasteWithoutTextChange DISABLED_PasteWithoutTextChange
    260 #else
    261 #define MAYBE_PasteWithoutTextChange PasteWithoutTextChange
    262 #endif
    263 
    264 IN_PROC_BROWSER_TEST_F(FindInPageTest, MAYBE_PasteWithoutTextChange) {
    265   ASSERT_TRUE(test_server()->Start());
    266 
    267   // Make sure Chrome is in the foreground, otherwise sending input
    268   // won't do anything and the test will hang.
    269   ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
    270 
    271   // First we navigate to any page.
    272   GURL url = test_server()->GetURL(kSimplePage);
    273   ui_test_utils::NavigateToURL(browser(), url);
    274 
    275   // Show the Find bar.
    276   browser()->GetFindBarController()->Show();
    277 
    278   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    279                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    280 
    281   // Search for "a".
    282   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    283       browser(), ui::VKEY_A, false, false, false, false));
    284 
    285   // We should find "a" here.
    286   EXPECT_EQ(ASCIIToUTF16("a"), GetFindBarText());
    287 
    288   // Reload the page to clear the matching result.
    289   chrome::Reload(browser(), CURRENT_TAB);
    290 
    291   // Focus the Find bar again to make sure the text is selected.
    292   browser()->GetFindBarController()->Show();
    293 
    294   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(),
    295                                            VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
    296 
    297   // "a" should be selected.
    298   EXPECT_EQ(ASCIIToUTF16("a"), GetFindBarSelectedText());
    299 
    300   // Press Ctrl-C to copy the content.
    301   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    302       browser(), ui::VKEY_C, true, false, false, false));
    303 
    304   string16 str;
    305   ui::Clipboard::GetForCurrentThread()->
    306       ReadText(ui::Clipboard::BUFFER_STANDARD, &str);
    307 
    308   // Make sure the text is copied successfully.
    309   EXPECT_EQ(ASCIIToUTF16("a"), str);
    310 
    311   // Press Ctrl-V to paste the content back, it should start finding even if the
    312   // content is not changed.
    313   content::Source<WebContents> notification_source(
    314       browser()->tab_strip_model()->GetActiveWebContents());
    315   ui_test_utils::WindowedNotificationObserverWithDetails
    316       <FindNotificationDetails> observer(
    317           chrome::NOTIFICATION_FIND_RESULT_AVAILABLE, notification_source);
    318 
    319   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
    320       browser(), ui::VKEY_V, true, false, false, false));
    321 
    322   ASSERT_NO_FATAL_FAILURE(observer.Wait());
    323   FindNotificationDetails details;
    324   ASSERT_TRUE(observer.GetDetailsFor(notification_source.map_key(), &details));
    325   EXPECT_TRUE(details.number_of_matches() > 0);
    326 }
    327