• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ToWebkitAutocompleteResult(AutofillClient::RequestAutocompleteResult result)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 
RequestAutocompleteManager(ContentAutofillDriver * autofill_driver)40 RequestAutocompleteManager::RequestAutocompleteManager(
41     ContentAutofillDriver* autofill_driver)
42     : autofill_driver_(autofill_driver), weak_ptr_factory_(this) {
43   DCHECK(autofill_driver_);
44 }
45 
~RequestAutocompleteManager()46 RequestAutocompleteManager::~RequestAutocompleteManager() {}
47 
OnRequestAutocomplete(const FormData & form,const GURL & frame_url)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 
OnCancelRequestAutocomplete()60 void RequestAutocompleteManager::OnCancelRequestAutocomplete() {
61   autofill_driver_->autofill_manager()->client()
62       ->HideRequestAutocompleteDialog();
63 }
64 
ReturnAutocompleteResult(AutofillClient::RequestAutocompleteResult result,const base::string16 & debug_message,const FormStructure * form_structure)65 void RequestAutocompleteManager::ReturnAutocompleteResult(
66     AutofillClient::RequestAutocompleteResult result,
67     const base::string16& debug_message,
68     const FormStructure* form_structure) {
69   // autofill_driver_->web_contents() will be NULL when the interactive
70   // autocomplete is closed due to a tab or browser window closing.
71   if (!autofill_driver_->web_contents())
72     return;
73 
74   content::RenderViewHost* host =
75       autofill_driver_->web_contents()->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 
ShowRequestAutocompleteDialog(const FormData & form,const GURL & source_url,const AutofillClient::ResultCallback & callback)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