Home | History | Annotate | Download | only in browser
      1 // Copyright 2013 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 "components/autofill/content/browser/content_autofill_driver.h"
      6 #include "components/autofill/content/browser/request_autocomplete_manager.h"
      7 #include "components/autofill/content/common/autofill_messages.h"
      8 #include "components/autofill/core/browser/test_autofill_client.h"
      9 #include "content/public/test/mock_render_process_host.h"
     10 #include "content/public/test/test_renderer_host.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 namespace autofill {
     14 
     15 namespace {
     16 
     17 const char kAppLocale[] = "en-US";
     18 const AutofillManager::AutofillDownloadManagerState kDownloadState =
     19     AutofillManager::DISABLE_AUTOFILL_DOWNLOAD_MANAGER;
     20 
     21 class TestAutofillManager : public AutofillManager {
     22  public:
     23   TestAutofillManager(AutofillDriver* driver, AutofillClient* client)
     24       : AutofillManager(driver, client, kAppLocale, kDownloadState),
     25         autofill_enabled_(true) {}
     26   virtual ~TestAutofillManager() {}
     27 
     28   virtual bool IsAutofillEnabled() const OVERRIDE { return autofill_enabled_; }
     29 
     30   void set_autofill_enabled(bool autofill_enabled) {
     31     autofill_enabled_ = autofill_enabled;
     32   }
     33 
     34  private:
     35   bool autofill_enabled_;
     36 
     37   DISALLOW_COPY_AND_ASSIGN(TestAutofillManager);
     38 };
     39 
     40 class CustomTestAutofillClient : public TestAutofillClient {
     41  public:
     42   CustomTestAutofillClient() : should_simulate_success_(true) {}
     43 
     44   virtual ~CustomTestAutofillClient() {}
     45 
     46   virtual void ShowRequestAutocompleteDialog(
     47       const FormData& form,
     48       const GURL& source_url,
     49       const ResultCallback& callback) OVERRIDE {
     50     if (should_simulate_success_) {
     51       FormStructure form_structure(form);
     52       callback.Run(
     53           AutocompleteResultSuccess, base::string16(), &form_structure);
     54     } else {
     55       callback.Run(AutofillClient::AutocompleteResultErrorDisabled,
     56                    base::string16(),
     57                    NULL);
     58     }
     59   }
     60 
     61   void set_should_simulate_success(bool should_simulate_success) {
     62     should_simulate_success_ = should_simulate_success;
     63   }
     64 
     65  private:
     66   // Enable testing the path where a callback is called without a
     67   // valid FormStructure.
     68   bool should_simulate_success_;
     69 
     70   DISALLOW_COPY_AND_ASSIGN(CustomTestAutofillClient);
     71 };
     72 
     73 class TestContentAutofillDriver : public ContentAutofillDriver {
     74  public:
     75   TestContentAutofillDriver(content::WebContents* contents,
     76                             AutofillClient* client)
     77       : ContentAutofillDriver(contents, client, kAppLocale, kDownloadState) {
     78     SetAutofillManager(make_scoped_ptr<AutofillManager>(
     79         new TestAutofillManager(this, client)));
     80   }
     81   virtual ~TestContentAutofillDriver() {}
     82 
     83   TestAutofillManager* mock_autofill_manager() {
     84     return static_cast<TestAutofillManager*>(autofill_manager());
     85   }
     86 
     87   using ContentAutofillDriver::DidNavigateMainFrame;
     88 
     89   DISALLOW_COPY_AND_ASSIGN(TestContentAutofillDriver);
     90 };
     91 
     92 }  // namespace
     93 
     94 class RequestAutocompleteManagerTest :
     95     public content::RenderViewHostTestHarness {
     96  public:
     97   RequestAutocompleteManagerTest() {}
     98 
     99   virtual void SetUp() OVERRIDE {
    100     content::RenderViewHostTestHarness::SetUp();
    101 
    102     driver_.reset(
    103         new TestContentAutofillDriver(web_contents(), &autofill_client_));
    104     request_autocomplete_manager_.reset(
    105         new RequestAutocompleteManager(driver_.get()));
    106   }
    107 
    108   virtual void TearDown() OVERRIDE {
    109     // Reset the driver now to cause all pref observers to be removed and avoid
    110     // crashes that otherwise occur in the destructor.
    111     driver_.reset();
    112     content::RenderViewHostTestHarness::TearDown();
    113   }
    114 
    115   // Searches for an |AutofillMsg_RequestAutocompleteResult| message in the
    116   // queue of sent IPC messages. If none is present, returns false. Otherwise,
    117   // extracts the first |AutofillMsg_RequestAutocompleteResult| message, fills
    118   // the output parameter with the value of the message's parameter, and
    119   // clears the queue of sent messages.
    120   bool GetAutocompleteResultMessage(
    121       blink::WebFormElement::AutocompleteResult* result) {
    122     const uint32 kMsgID = AutofillMsg_RequestAutocompleteResult::ID;
    123     const IPC::Message* message =
    124         process()->sink().GetFirstMessageMatching(kMsgID);
    125     if (!message)
    126       return false;
    127     Tuple3<blink::WebFormElement::AutocompleteResult, base::string16, FormData>
    128         autofill_param;
    129     AutofillMsg_RequestAutocompleteResult::Read(message, &autofill_param);
    130     *result = autofill_param.a;
    131     process()->sink().ClearMessages();
    132     return true;
    133   }
    134 
    135  protected:
    136   CustomTestAutofillClient autofill_client_;
    137   scoped_ptr<TestContentAutofillDriver> driver_;
    138   scoped_ptr<RequestAutocompleteManager> request_autocomplete_manager_;
    139 
    140   DISALLOW_COPY_AND_ASSIGN(RequestAutocompleteManagerTest);
    141 };
    142 
    143 TEST_F(RequestAutocompleteManagerTest, OnRequestAutocompleteSuccess) {
    144   blink::WebFormElement::AutocompleteResult result;
    145   request_autocomplete_manager_->OnRequestAutocomplete(FormData(), GURL());
    146   EXPECT_TRUE(GetAutocompleteResultMessage(&result));
    147   EXPECT_EQ(blink::WebFormElement::AutocompleteResultSuccess, result);
    148 }
    149 
    150 TEST_F(RequestAutocompleteManagerTest, OnRequestAutocompleteCancel) {
    151   blink::WebFormElement::AutocompleteResult result;
    152   autofill_client_.set_should_simulate_success(false);
    153   request_autocomplete_manager_->OnRequestAutocomplete(FormData(), GURL());
    154   EXPECT_TRUE(GetAutocompleteResultMessage(&result));
    155   EXPECT_EQ(blink::WebFormElement::AutocompleteResultErrorDisabled, result);
    156 }
    157 
    158 // Disabling autofill doesn't disable the dialog (it just disables the use of
    159 // autofill in the dialog).
    160 TEST_F(RequestAutocompleteManagerTest,
    161        OnRequestAutocompleteWithAutofillDisabled) {
    162   blink::WebFormElement::AutocompleteResult result;
    163   driver_->mock_autofill_manager()->set_autofill_enabled(false);
    164   request_autocomplete_manager_->OnRequestAutocomplete(FormData(), GURL());
    165   EXPECT_TRUE(GetAutocompleteResultMessage(&result));
    166   EXPECT_EQ(blink::WebFormElement::AutocompleteResultSuccess, result);
    167 }
    168 
    169 }  // namespace autofill
    170