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/request_autocomplete_manager.h"
      6 
      7 #include "components/autofill/content/browser/content_autofill_driver.h"
      8 #include "components/autofill/content/common/autofill_messages.h"
      9 #include "components/autofill/core/browser/form_structure.h"
     10 #include "components/autofill/core/common/autofill_data_validation.h"
     11 #include "components/autofill/core/common/form_data.h"
     12 #include "content/public/browser/render_view_host.h"
     13 #include "content/public/browser/web_contents.h"
     14 #include "third_party/WebKit/public/web/WebFormElement.h"
     15 #include "url/gurl.h"
     16 
     17 namespace autofill {
     18 
     19 namespace {
     20 
     21 blink::WebFormElement::AutocompleteResult ToWebkitAutocompleteResult(
     22     AutofillClient::RequestAutocompleteResult result) {
     23   switch(result) {
     24     case AutofillClient::AutocompleteResultSuccess:
     25       return blink::WebFormElement::AutocompleteResultSuccess;
     26     case AutofillClient::AutocompleteResultErrorDisabled:
     27       return blink::WebFormElement::AutocompleteResultErrorDisabled;
     28     case AutofillClient::AutocompleteResultErrorCancel:
     29       return blink::WebFormElement::AutocompleteResultErrorCancel;
     30     case AutofillClient::AutocompleteResultErrorInvalid:
     31       return blink::WebFormElement::AutocompleteResultErrorInvalid;
     32   }
     33 
     34   NOTREACHED();
     35   return blink::WebFormElement::AutocompleteResultErrorDisabled;
     36 }
     37 
     38 }  // namespace
     39 
     40 RequestAutocompleteManager::RequestAutocompleteManager(
     41     ContentAutofillDriver* autofill_driver)
     42     : autofill_driver_(autofill_driver), weak_ptr_factory_(this) {
     43   DCHECK(autofill_driver_);
     44 }
     45 
     46 RequestAutocompleteManager::~RequestAutocompleteManager() {}
     47 
     48 void RequestAutocompleteManager::OnRequestAutocomplete(
     49     const FormData& form,
     50     const GURL& frame_url) {
     51   if (!IsValidFormData(form))
     52     return;
     53 
     54   AutofillClient::ResultCallback callback =
     55       base::Bind(&RequestAutocompleteManager::ReturnAutocompleteResult,
     56                  weak_ptr_factory_.GetWeakPtr());
     57   ShowRequestAutocompleteDialog(form, frame_url, callback);
     58 }
     59 
     60 void RequestAutocompleteManager::OnCancelRequestAutocomplete() {
     61   autofill_driver_->autofill_manager()->client()
     62       ->HideRequestAutocompleteDialog();
     63 }
     64 
     65 void RequestAutocompleteManager::ReturnAutocompleteResult(
     66     AutofillClient::RequestAutocompleteResult result,
     67     const base::string16& debug_message,
     68     const FormStructure* form_structure) {
     69   // autofill_driver_->GetWebContents() will be NULL when the interactive
     70   // autocomplete is closed due to a tab or browser window closing.
     71   if (!autofill_driver_->GetWebContents())
     72     return;
     73 
     74   content::RenderViewHost* host =
     75       autofill_driver_->GetWebContents()->GetRenderViewHost();
     76   if (!host)
     77     return;
     78 
     79   FormData form_data;
     80   if (form_structure) {
     81     form_data = form_structure->ToFormData();
     82     for (size_t i = 0; i < form_data.fields.size(); ++i) {
     83       if(!form_data.fields[i].value.empty())
     84         form_data.fields[i].is_autofilled = true;
     85     }
     86   }
     87 
     88   host->Send(new AutofillMsg_RequestAutocompleteResult(
     89       host->GetRoutingID(),
     90       ToWebkitAutocompleteResult(result),
     91       debug_message,
     92       form_data));
     93 }
     94 
     95 void RequestAutocompleteManager::ShowRequestAutocompleteDialog(
     96     const FormData& form,
     97     const GURL& source_url,
     98     const AutofillClient::ResultCallback& callback) {
     99   AutofillClient* client = autofill_driver_->autofill_manager()->client();
    100   client->ShowRequestAutocompleteDialog(form, source_url, callback);
    101 }
    102 
    103 }  // namespace autofill
    104