• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
MockAutofillClient()31   MockAutofillClient() {}
~MockAutofillClient()32   virtual ~MockAutofillClient() {}
33 
GetPrefs()34   virtual PrefService* GetPrefs() { return &prefs_; }
35 
GetPrefRegistry()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:
TestContentAutofillDriver(content::WebContents * web_contents,AutofillClient * client)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) {}
~TestContentAutofillDriver()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:
ContentAutofillDriverBrowserTest()79   ContentAutofillDriverBrowserTest() {}
~ContentAutofillDriverBrowserTest()80   virtual ~ContentAutofillDriverBrowserTest() {}
81 
SetUpOnMainThread()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.
WebContentsDestroyed()95   virtual void WebContentsDestroyed() OVERRIDE {
96     autofill_driver_.reset();
97   }
98 
WasHidden()99   virtual void WasHidden() OVERRIDE {
100     if (!web_contents_hidden_callback_.is_null())
101       web_contents_hidden_callback_.Run();
102   }
103 
NavigationEntryCommitted(const content::LoadCommittedDetails & load_details)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 
IN_PROC_BROWSER_TEST_F(ContentAutofillDriverBrowserTest,SwitchTabAndHideAutofillPopup)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 
IN_PROC_BROWSER_TEST_F(ContentAutofillDriverBrowserTest,TestPageNavigationHidingAutofillPopup)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