Home | History | Annotate | Download | only in autofill
      1 // Copyright 2014 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/memory/scoped_ptr.h"
      6 #include "chrome/browser/browser_process.h"
      7 #include "chrome/browser/ui/browser.h"
      8 #include "chrome/browser/ui/browser_tabstrip.h"
      9 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     10 #include "chrome/common/url_constants.h"
     11 #include "chrome/test/base/in_process_browser_test.h"
     12 #include "chrome/test/base/testing_pref_service_syncable.h"
     13 #include "components/autofill/content/browser/content_autofill_driver.h"
     14 #include "components/autofill/core/browser/autofill_manager.h"
     15 #include "components/autofill/core/browser/test_autofill_client.h"
     16 #include "content/public/browser/navigation_controller.h"
     17 #include "content/public/browser/page_navigator.h"
     18 #include "content/public/browser/web_contents.h"
     19 #include "content/public/browser/web_contents_observer.h"
     20 #include "content/public/common/url_constants.h"
     21 #include "content/public/test/test_utils.h"
     22 #include "testing/gmock/include/gmock/gmock.h"
     23 #include "testing/gtest/include/gtest/gtest.h"
     24 #include "ui/gfx/rect.h"
     25 
     26 namespace autofill {
     27 namespace {
     28 
     29 class MockAutofillClient : public TestAutofillClient {
     30  public:
     31   MockAutofillClient() {}
     32   virtual ~MockAutofillClient() {}
     33 
     34   virtual PrefService* GetPrefs() { return &prefs_; }
     35 
     36   user_prefs::PrefRegistrySyncable* GetPrefRegistry() {
     37     return prefs_.registry();
     38   }
     39 
     40   MOCK_METHOD7(ShowAutofillPopup,
     41                void(const gfx::RectF& element_bounds,
     42                     base::i18n::TextDirection text_direction,
     43                     const std::vector<base::string16>& values,
     44                     const std::vector<base::string16>& labels,
     45                     const std::vector<base::string16>& icons,
     46                     const std::vector<int>& identifiers,
     47                     base::WeakPtr<AutofillPopupDelegate> delegate));
     48 
     49   MOCK_METHOD0(HideAutofillPopup, void());
     50 
     51  private:
     52   TestingPrefServiceSyncable prefs_;
     53 
     54   DISALLOW_COPY_AND_ASSIGN(MockAutofillClient);
     55 };
     56 
     57 // Subclass ContentAutofillDriver so we can create an ContentAutofillDriver
     58 // instance.
     59 class TestContentAutofillDriver : public ContentAutofillDriver {
     60  public:
     61   TestContentAutofillDriver(content::WebContents* web_contents,
     62                             AutofillClient* client)
     63       : ContentAutofillDriver(
     64             web_contents,
     65             client,
     66             g_browser_process->GetApplicationLocale(),
     67             AutofillManager::ENABLE_AUTOFILL_DOWNLOAD_MANAGER) {}
     68   virtual ~TestContentAutofillDriver() {}
     69 
     70  private:
     71   DISALLOW_COPY_AND_ASSIGN(TestContentAutofillDriver);
     72 };
     73 
     74 }  // namespace
     75 
     76 class ContentAutofillDriverBrowserTest : public InProcessBrowserTest,
     77                                          public content::WebContentsObserver {
     78  public:
     79   ContentAutofillDriverBrowserTest() {}
     80   virtual ~ContentAutofillDriverBrowserTest() {}
     81 
     82   virtual void SetUpOnMainThread() OVERRIDE {
     83     content::WebContents* web_contents =
     84         browser()->tab_strip_model()->GetActiveWebContents();
     85     ASSERT_TRUE(web_contents != NULL);
     86     Observe(web_contents);
     87     AutofillManager::RegisterProfilePrefs(autofill_client_.GetPrefRegistry());
     88 
     89     autofill_driver_.reset(
     90         new TestContentAutofillDriver(web_contents, &autofill_client_));
     91   }
     92 
     93   // Normally the WebContents will automatically delete the driver, but here
     94   // the driver is owned by this test, so we have to manually destroy.
     95   virtual void WebContentsDestroyed() OVERRIDE {
     96     autofill_driver_.reset();
     97   }
     98 
     99   virtual void WasHidden() OVERRIDE {
    100     if (!web_contents_hidden_callback_.is_null())
    101       web_contents_hidden_callback_.Run();
    102   }
    103 
    104   virtual void NavigationEntryCommitted(
    105       const content::LoadCommittedDetails& load_details) OVERRIDE {
    106     if (!nav_entry_committed_callback_.is_null())
    107       nav_entry_committed_callback_.Run();
    108   }
    109 
    110  protected:
    111   content::WebContents* web_contents_;
    112 
    113   base::Closure web_contents_hidden_callback_;
    114   base::Closure nav_entry_committed_callback_;
    115 
    116   testing::NiceMock<MockAutofillClient> autofill_client_;
    117   scoped_ptr<TestContentAutofillDriver> autofill_driver_;
    118 };
    119 
    120 IN_PROC_BROWSER_TEST_F(ContentAutofillDriverBrowserTest,
    121                        SwitchTabAndHideAutofillPopup) {
    122   // Notification is different on platforms. On linux this will be called twice,
    123   // while on windows only once.
    124   EXPECT_CALL(autofill_client_, HideAutofillPopup()).Times(testing::AtLeast(1));
    125 
    126   scoped_refptr<content::MessageLoopRunner> runner =
    127       new content::MessageLoopRunner;
    128   web_contents_hidden_callback_ = runner->QuitClosure();
    129   chrome::AddSelectedTabWithURL(browser(),
    130                                 GURL(url::kAboutBlankURL),
    131                                 ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
    132   runner->Run();
    133   web_contents_hidden_callback_.Reset();
    134 }
    135 
    136 IN_PROC_BROWSER_TEST_F(ContentAutofillDriverBrowserTest,
    137                        TestPageNavigationHidingAutofillPopup) {
    138   // Notification is different on platforms. On linux this will be called twice,
    139   // while on windows only once.
    140   EXPECT_CALL(autofill_client_, HideAutofillPopup()).Times(testing::AtLeast(1));
    141 
    142   scoped_refptr<content::MessageLoopRunner> runner =
    143       new content::MessageLoopRunner;
    144   nav_entry_committed_callback_ = runner->QuitClosure();
    145   browser()->OpenURL(content::OpenURLParams(GURL(chrome::kChromeUIBookmarksURL),
    146                                             content::Referrer(),
    147                                             CURRENT_TAB,
    148                                             ui::PAGE_TRANSITION_TYPED,
    149                                             false));
    150   browser()->OpenURL(content::OpenURLParams(GURL(chrome::kChromeUIAboutURL),
    151                                             content::Referrer(),
    152                                             CURRENT_TAB,
    153                                             ui::PAGE_TRANSITION_TYPED,
    154                                             false));
    155   runner->Run();
    156   nav_entry_committed_callback_.Reset();
    157 }
    158 
    159 }  // namespace autofill
    160