OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/autofill/browser/autocheckout_manager.h" | 5 #include "components/autofill/browser/autocheckout_manager.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "components/autofill/browser/autocheckout_request_manager.h" |
10 #include "components/autofill/browser/autofill_country.h" | 11 #include "components/autofill/browser/autofill_country.h" |
11 #include "components/autofill/browser/autofill_field.h" | 12 #include "components/autofill/browser/autofill_field.h" |
12 #include "components/autofill/browser/autofill_manager.h" | 13 #include "components/autofill/browser/autofill_manager.h" |
13 #include "components/autofill/browser/autofill_profile.h" | 14 #include "components/autofill/browser/autofill_profile.h" |
14 #include "components/autofill/browser/credit_card.h" | 15 #include "components/autofill/browser/credit_card.h" |
15 #include "components/autofill/browser/field_types.h" | 16 #include "components/autofill/browser/field_types.h" |
16 #include "components/autofill/browser/form_structure.h" | 17 #include "components/autofill/browser/form_structure.h" |
17 #include "components/autofill/common/autocheckout_status.h" | |
18 #include "components/autofill/common/autofill_messages.h" | 18 #include "components/autofill/common/autofill_messages.h" |
19 #include "components/autofill/common/form_data.h" | 19 #include "components/autofill/common/form_data.h" |
20 #include "components/autofill/common/form_field_data.h" | 20 #include "components/autofill/common/form_field_data.h" |
21 #include "components/autofill/common/web_element_descriptor.h" | 21 #include "components/autofill/common/web_element_descriptor.h" |
22 #include "content/public/browser/render_view_host.h" | 22 #include "content/public/browser/render_view_host.h" |
23 #include "content/public/browser/web_contents.h" | 23 #include "content/public/browser/web_contents.h" |
24 #include "content/public/common/ssl_status.h" | 24 #include "content/public/common/ssl_status.h" |
25 #include "googleurl/src/gurl.h" | 25 #include "googleurl/src/gurl.h" |
26 #include "ui/gfx/rect.h" | 26 #include "ui/gfx/rect.h" |
27 | 27 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 formdata.fields.push_back(BuildField("shipping name")); | 61 formdata.fields.push_back(BuildField("shipping name")); |
62 formdata.fields.push_back(BuildField("shipping street-address")); | 62 formdata.fields.push_back(BuildField("shipping street-address")); |
63 formdata.fields.push_back(BuildField("shipping locality")); | 63 formdata.fields.push_back(BuildField("shipping locality")); |
64 formdata.fields.push_back(BuildField("shipping region")); | 64 formdata.fields.push_back(BuildField("shipping region")); |
65 formdata.fields.push_back(BuildField("shipping country")); | 65 formdata.fields.push_back(BuildField("shipping country")); |
66 formdata.fields.push_back(BuildField("shipping postal-code")); | 66 formdata.fields.push_back(BuildField("shipping postal-code")); |
67 formdata.fields.push_back(BuildField("shipping tel")); | 67 formdata.fields.push_back(BuildField("shipping tel")); |
68 return formdata; | 68 return formdata; |
69 } | 69 } |
70 | 70 |
| 71 const char kTransactionIdNotSet[] = "transaction id not set"; |
| 72 |
71 } // namespace | 73 } // namespace |
72 | 74 |
73 namespace autofill { | 75 namespace autofill { |
74 | 76 |
75 AutocheckoutManager::AutocheckoutManager(AutofillManager* autofill_manager) | 77 AutocheckoutManager::AutocheckoutManager(AutofillManager* autofill_manager) |
76 : autofill_manager_(autofill_manager), | 78 : autofill_manager_(autofill_manager), |
77 autocheckout_offered_(false), | 79 autocheckout_offered_(false), |
78 is_autocheckout_bubble_showing_(false), | 80 is_autocheckout_bubble_showing_(false), |
79 in_autocheckout_flow_(false), | 81 in_autocheckout_flow_(false), |
80 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { | 82 google_transaction_id_(kTransactionIdNotSet), |
81 } | 83 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {} |
82 | 84 |
83 AutocheckoutManager::~AutocheckoutManager() { | 85 AutocheckoutManager::~AutocheckoutManager() { |
84 } | 86 } |
85 | 87 |
86 void AutocheckoutManager::FillForms() { | 88 void AutocheckoutManager::FillForms() { |
87 // |page_meta_data_| should have been set by OnLoadedPageMetaData. | 89 // |page_meta_data_| should have been set by OnLoadedPageMetaData. |
88 DCHECK(page_meta_data_); | 90 DCHECK(page_meta_data_); |
89 | 91 |
90 // Fill the forms on the page with data given by user. | 92 // Fill the forms on the page with data given by user. |
91 std::vector<FormData> filled_forms; | 93 std::vector<FormData> filled_forms; |
(...skipping 18 matching lines...) Expand all Loading... |
110 autofill_manager_->GetWebContents()->GetRenderViewHost(); | 112 autofill_manager_->GetWebContents()->GetRenderViewHost(); |
111 if (!host) | 113 if (!host) |
112 return; | 114 return; |
113 | 115 |
114 host->Send(new AutofillMsg_FillFormsAndClick( | 116 host->Send(new AutofillMsg_FillFormsAndClick( |
115 host->GetRoutingID(), | 117 host->GetRoutingID(), |
116 filled_forms, | 118 filled_forms, |
117 *page_meta_data_->proceed_element_descriptor)); | 119 *page_meta_data_->proceed_element_descriptor)); |
118 } | 120 } |
119 | 121 |
| 122 void AutocheckoutManager::OnClickFailed(AutocheckoutStatus status) { |
| 123 SendAutocheckoutStatus(status); |
| 124 autofill_manager_->delegate()->OnAutocheckoutError(); |
| 125 } |
| 126 |
120 void AutocheckoutManager::OnLoadedPageMetaData( | 127 void AutocheckoutManager::OnLoadedPageMetaData( |
121 scoped_ptr<AutocheckoutPageMetaData> page_meta_data) { | 128 scoped_ptr<AutocheckoutPageMetaData> page_meta_data) { |
122 scoped_ptr<AutocheckoutPageMetaData> old_meta_data = | 129 scoped_ptr<AutocheckoutPageMetaData> old_meta_data = |
123 page_meta_data_.Pass(); | 130 page_meta_data_.Pass(); |
124 page_meta_data_ = page_meta_data.Pass(); | 131 page_meta_data_ = page_meta_data.Pass(); |
125 | 132 |
126 // On the first page of an Autocheckout flow, when this function is called the | 133 // On the first page of an Autocheckout flow, when this function is called the |
127 // user won't have opted into the flow yet. | 134 // user won't have opted into the flow yet. |
128 if (!in_autocheckout_flow_) | 135 if (!in_autocheckout_flow_) |
129 return; | 136 return; |
130 | 137 |
| 138 AutocheckoutStatus status = SUCCESS; |
| 139 |
131 // Missing Autofill server results. | 140 // Missing Autofill server results. |
132 if (!page_meta_data_) { | 141 if (!page_meta_data_) { |
133 in_autocheckout_flow_ = false; | 142 in_autocheckout_flow_ = false; |
| 143 status = MISSING_FIELDMAPPING; |
134 } else if (page_meta_data_->IsStartOfAutofillableFlow()) { | 144 } else if (page_meta_data_->IsStartOfAutofillableFlow()) { |
135 // Not possible unless Autocheckout failed to proceed. | 145 // Not possible unless Autocheckout failed to proceed. |
136 in_autocheckout_flow_ = false; | 146 in_autocheckout_flow_ = false; |
| 147 status = CANNOT_PROCEED; |
137 } else if (!page_meta_data_->IsInAutofillableFlow()) { | 148 } else if (!page_meta_data_->IsInAutofillableFlow()) { |
138 // Missing Autocheckout meta data in the Autofill server results. | 149 // Missing Autocheckout meta data in the Autofill server results. |
139 in_autocheckout_flow_ = false; | 150 in_autocheckout_flow_ = false; |
| 151 status = MISSING_FIELDMAPPING; |
140 } else if (page_meta_data_->current_page_number <= | 152 } else if (page_meta_data_->current_page_number <= |
141 old_meta_data->current_page_number) { | 153 old_meta_data->current_page_number) { |
142 // Not possible unless Autocheckout failed to proceed. | 154 // Not possible unless Autocheckout failed to proceed. |
143 in_autocheckout_flow_ = false; | 155 in_autocheckout_flow_ = false; |
| 156 status = CANNOT_PROCEED; |
144 } | 157 } |
145 | 158 |
146 // Encountered an error during the Autocheckout flow. | 159 // Encountered an error during the Autocheckout flow. |
147 if (!in_autocheckout_flow_) { | 160 if (!in_autocheckout_flow_) { |
148 // TODO(ahutter): SendAutocheckoutStatus of the error. | 161 SendAutocheckoutStatus(status); |
149 autofill_manager_->delegate()->OnAutocheckoutError(); | 162 autofill_manager_->delegate()->OnAutocheckoutError(); |
150 return; | 163 return; |
151 } | 164 } |
152 | 165 |
153 // Add 1.0 since page numbers are 0-indexed. | 166 // Add 1.0 since page numbers are 0-indexed. |
154 autofill_manager_->delegate()->UpdateProgressBar( | 167 autofill_manager_->delegate()->UpdateProgressBar( |
155 (1.0 + page_meta_data_->current_page_number) / | 168 (1.0 + page_meta_data_->current_page_number) / |
156 page_meta_data_->total_pages); | 169 page_meta_data_->total_pages); |
157 FillForms(); | 170 FillForms(); |
158 // If the current page is the last page in the flow, close the dialog. | 171 // If the current page is the last page in the flow, close the dialog. |
159 if (page_meta_data_->IsEndOfAutofillableFlow()) { | 172 if (page_meta_data_->IsEndOfAutofillableFlow()) { |
160 // TODO(ahutter): SendAutocheckoutStatus of SUCCESS. | 173 SendAutocheckoutStatus(status); |
161 autofill_manager_->delegate()->HideRequestAutocompleteDialog(); | 174 autofill_manager_->delegate()->HideRequestAutocompleteDialog(); |
162 in_autocheckout_flow_ = false; | 175 in_autocheckout_flow_ = false; |
163 } | 176 } |
164 } | 177 } |
165 | 178 |
166 void AutocheckoutManager::OnFormsSeen() { | 179 void AutocheckoutManager::OnFormsSeen() { |
167 autocheckout_offered_ = false; | 180 autocheckout_offered_ = false; |
168 } | 181 } |
169 | 182 |
170 void AutocheckoutManager::MaybeShowAutocheckoutBubble( | 183 void AutocheckoutManager::MaybeShowAutocheckoutBubble( |
(...skipping 22 matching lines...) Expand all Loading... |
193 void AutocheckoutManager::MaybeShowAutocheckoutDialog( | 206 void AutocheckoutManager::MaybeShowAutocheckoutDialog( |
194 const GURL& frame_url, | 207 const GURL& frame_url, |
195 const SSLStatus& ssl_status, | 208 const SSLStatus& ssl_status, |
196 bool show_dialog) { | 209 bool show_dialog) { |
197 is_autocheckout_bubble_showing_ = false; | 210 is_autocheckout_bubble_showing_ = false; |
198 if (!show_dialog) | 211 if (!show_dialog) |
199 return; | 212 return; |
200 | 213 |
201 FormData form = BuildAutocheckoutFormData(); | 214 FormData form = BuildAutocheckoutFormData(); |
202 form.ssl_status = ssl_status; | 215 form.ssl_status = ssl_status; |
203 base::Callback<void(const FormStructure*)> callback = | 216 base::Callback<void(const FormStructure*, const std::string&)> callback = |
204 base::Bind(&AutocheckoutManager::ReturnAutocheckoutData, | 217 base::Bind(&AutocheckoutManager::ReturnAutocheckoutData, |
205 weak_ptr_factory_.GetWeakPtr()); | 218 weak_ptr_factory_.GetWeakPtr()); |
206 autofill_manager_->ShowRequestAutocompleteDialog( | 219 autofill_manager_->ShowRequestAutocompleteDialog( |
207 form, frame_url, DIALOG_TYPE_AUTOCHECKOUT, callback); | 220 form, frame_url, DIALOG_TYPE_AUTOCHECKOUT, callback); |
208 } | 221 } |
209 | 222 |
210 bool AutocheckoutManager::IsStartOfAutofillableFlow() const { | 223 bool AutocheckoutManager::IsStartOfAutofillableFlow() const { |
211 return page_meta_data_ && page_meta_data_->IsStartOfAutofillableFlow(); | 224 return page_meta_data_ && page_meta_data_->IsStartOfAutofillableFlow(); |
212 } | 225 } |
213 | 226 |
214 bool AutocheckoutManager::IsInAutofillableFlow() const { | 227 bool AutocheckoutManager::IsInAutofillableFlow() const { |
215 return page_meta_data_ && page_meta_data_->IsInAutofillableFlow(); | 228 return page_meta_data_ && page_meta_data_->IsInAutofillableFlow(); |
216 } | 229 } |
217 | 230 |
218 void AutocheckoutManager::ReturnAutocheckoutData(const FormStructure* result) { | 231 void AutocheckoutManager::ReturnAutocheckoutData( |
| 232 const FormStructure* result, |
| 233 const std::string& google_transaction_id) { |
219 if (!result) | 234 if (!result) |
220 return; | 235 return; |
221 | 236 |
| 237 google_transaction_id_ = google_transaction_id; |
222 in_autocheckout_flow_ = true; | 238 in_autocheckout_flow_ = true; |
223 | 239 |
224 profile_.reset(new AutofillProfile()); | 240 profile_.reset(new AutofillProfile()); |
225 credit_card_.reset(new CreditCard()); | 241 credit_card_.reset(new CreditCard()); |
226 | 242 |
227 for (size_t i = 0; i < result->field_count(); ++i) { | 243 for (size_t i = 0; i < result->field_count(); ++i) { |
228 AutofillFieldType type = result->field(i)->type(); | 244 AutofillFieldType type = result->field(i)->type(); |
229 if (type == CREDIT_CARD_VERIFICATION_CODE) { | 245 if (type == CREDIT_CARD_VERIFICATION_CODE) { |
230 cvv_ = result->field(i)->value; | 246 cvv_ = result->field(i)->value; |
231 continue; | 247 continue; |
232 } | 248 } |
233 if (AutofillType(type).group() == AutofillType::CREDIT_CARD) { | 249 if (AutofillType(type).group() == AutofillType::CREDIT_CARD) { |
234 credit_card_->SetRawInfo(result->field(i)->type(), | 250 credit_card_->SetRawInfo(result->field(i)->type(), |
235 result->field(i)->value); | 251 result->field(i)->value); |
236 } else { | 252 } else { |
237 profile_->SetRawInfo(result->field(i)->type(), result->field(i)->value); | 253 profile_->SetRawInfo(result->field(i)->type(), result->field(i)->value); |
238 } | 254 } |
239 } | 255 } |
240 | 256 |
241 // Add 1.0 since page numbers are 0-indexed. | 257 // Add 1.0 since page numbers are 0-indexed. |
242 autofill_manager_->delegate()->UpdateProgressBar( | 258 autofill_manager_->delegate()->UpdateProgressBar( |
243 (1.0 + page_meta_data_->current_page_number) / | 259 (1.0 + page_meta_data_->current_page_number) / |
244 page_meta_data_->total_pages); | 260 page_meta_data_->total_pages); |
245 FillForms(); | 261 FillForms(); |
246 | 262 |
247 // If the current page is the last page in the flow, close the dialog. | 263 // If the current page is the last page in the flow, close the dialog. |
248 if (page_meta_data_->IsEndOfAutofillableFlow()) { | 264 if (page_meta_data_->IsEndOfAutofillableFlow()) { |
249 // TODO(ahutter): SendAutocheckoutStatus of SUCCESS. | 265 SendAutocheckoutStatus(SUCCESS); |
250 autofill_manager_->delegate()->HideRequestAutocompleteDialog(); | 266 autofill_manager_->delegate()->HideRequestAutocompleteDialog(); |
251 in_autocheckout_flow_ = false; | 267 in_autocheckout_flow_ = false; |
252 } | 268 } |
253 } | 269 } |
254 | 270 |
255 void AutocheckoutManager::SetValue(const AutofillField& field, | 271 void AutocheckoutManager::SetValue(const AutofillField& field, |
256 FormFieldData* field_to_fill) { | 272 FormFieldData* field_to_fill) { |
257 AutofillFieldType type = field.type(); | 273 AutofillFieldType type = field.type(); |
258 | 274 |
259 if (type == FIELD_WITH_DEFAULT_VALUE) { | 275 if (type == FIELD_WITH_DEFAULT_VALUE) { |
(...skipping 23 matching lines...) Expand all Loading... |
283 } | 299 } |
284 | 300 |
285 // TODO(ramankk): Handle variants in a better fashion, need to distinguish | 301 // TODO(ramankk): Handle variants in a better fashion, need to distinguish |
286 // between shipping and billing address. | 302 // between shipping and billing address. |
287 if (AutofillType(type).group() == AutofillType::CREDIT_CARD) | 303 if (AutofillType(type).group() == AutofillType::CREDIT_CARD) |
288 credit_card_->FillFormField(field, 0, field_to_fill); | 304 credit_card_->FillFormField(field, 0, field_to_fill); |
289 else | 305 else |
290 profile_->FillFormField(field, 0, field_to_fill); | 306 profile_->FillFormField(field, 0, field_to_fill); |
291 } | 307 } |
292 | 308 |
| 309 void AutocheckoutManager::SendAutocheckoutStatus(AutocheckoutStatus status) { |
| 310 // To ensure stale data isn't being sent. |
| 311 DCHECK_NE(kTransactionIdNotSet, google_transaction_id_); |
| 312 |
| 313 AutocheckoutRequestManager::CreateForBrowserContext( |
| 314 autofill_manager_->GetWebContents()->GetBrowserContext()); |
| 315 AutocheckoutRequestManager* autocheckout_request_manager = |
| 316 AutocheckoutRequestManager::FromBrowserContext( |
| 317 autofill_manager_->GetWebContents()->GetBrowserContext()); |
| 318 // It is assumed that the domain Autocheckout starts on does not change |
| 319 // during the flow. If this proves to be incorrect, the |source_url| from |
| 320 // AutofillDialogControllerImpl will need to be provided in its callback in |
| 321 // addition to the Google transaction id. |
| 322 autocheckout_request_manager->SendAutocheckoutStatus( |
| 323 status, |
| 324 autofill_manager_->GetWebContents()->GetURL(), |
| 325 google_transaction_id_); |
| 326 |
| 327 google_transaction_id_ = kTransactionIdNotSet; |
| 328 } |
| 329 |
293 } // namespace autofill | 330 } // namespace autofill |
OLD | NEW |