OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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/core/browser/autofill_manager.h" | 5 #include "components/autofill/core/browser/autofill_manager.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <limits> | 9 #include <limits> |
10 #include <map> | 10 #include <map> |
(...skipping 17 matching lines...) Expand all Loading... | |
28 #include "components/autofill/core/browser/autofill_manager_delegate.h" | 28 #include "components/autofill/core/browser/autofill_manager_delegate.h" |
29 #include "components/autofill/core/browser/autofill_manager_test_delegate.h" | 29 #include "components/autofill/core/browser/autofill_manager_test_delegate.h" |
30 #include "components/autofill/core/browser/autofill_metrics.h" | 30 #include "components/autofill/core/browser/autofill_metrics.h" |
31 #include "components/autofill/core/browser/autofill_profile.h" | 31 #include "components/autofill/core/browser/autofill_profile.h" |
32 #include "components/autofill/core/browser/autofill_type.h" | 32 #include "components/autofill/core/browser/autofill_type.h" |
33 #include "components/autofill/core/browser/credit_card.h" | 33 #include "components/autofill/core/browser/credit_card.h" |
34 #include "components/autofill/core/browser/form_structure.h" | 34 #include "components/autofill/core/browser/form_structure.h" |
35 #include "components/autofill/core/browser/personal_data_manager.h" | 35 #include "components/autofill/core/browser/personal_data_manager.h" |
36 #include "components/autofill/core/browser/phone_number.h" | 36 #include "components/autofill/core/browser/phone_number.h" |
37 #include "components/autofill/core/browser/phone_number_i18n.h" | 37 #include "components/autofill/core/browser/phone_number_i18n.h" |
38 #include "components/autofill/core/common/autofill_data_sanitizer.h" | |
38 #include "components/autofill/core/common/autofill_pref_names.h" | 39 #include "components/autofill/core/common/autofill_pref_names.h" |
39 #include "components/autofill/core/common/autofill_switches.h" | 40 #include "components/autofill/core/common/autofill_switches.h" |
40 #include "components/autofill/core/common/form_data.h" | 41 #include "components/autofill/core/common/form_data.h" |
41 #include "components/autofill/core/common/form_data_predictions.h" | 42 #include "components/autofill/core/common/form_data_predictions.h" |
42 #include "components/autofill/core/common/form_field_data.h" | 43 #include "components/autofill/core/common/form_field_data.h" |
43 #include "components/autofill/core/common/password_form_fill_data.h" | 44 #include "components/autofill/core/common/password_form_fill_data.h" |
44 #include "components/user_prefs/pref_registry_syncable.h" | 45 #include "components/user_prefs/pref_registry_syncable.h" |
45 #include "grit/component_strings.h" | 46 #include "grit/component_strings.h" |
46 #include "third_party/WebKit/public/web/WebAutofillClient.h" | 47 #include "third_party/WebKit/public/web/WebAutofillClient.h" |
47 #include "ui/base/l10n/l10n_util.h" | 48 #include "ui/base/l10n/l10n_util.h" |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
223 } | 224 } |
224 | 225 |
225 void AutofillManager::SetExternalDelegate(AutofillExternalDelegate* delegate) { | 226 void AutofillManager::SetExternalDelegate(AutofillExternalDelegate* delegate) { |
226 // TODO(jrg): consider passing delegate into the ctor. That won't | 227 // TODO(jrg): consider passing delegate into the ctor. That won't |
227 // work if the delegate has a pointer to the AutofillManager, but | 228 // work if the delegate has a pointer to the AutofillManager, but |
228 // future directions may not need such a pointer. | 229 // future directions may not need such a pointer. |
229 external_delegate_ = delegate; | 230 external_delegate_ = delegate; |
230 autocomplete_history_manager_->SetExternalDelegate(delegate); | 231 autocomplete_history_manager_->SetExternalDelegate(delegate); |
231 } | 232 } |
232 | 233 |
234 void AutofillManager::ShowAutofillSettings() { | |
235 manager_delegate_->ShowAutofillSettings(); | |
236 } | |
237 | |
233 bool AutofillManager::OnFormSubmitted(const FormData& form, | 238 bool AutofillManager::OnFormSubmitted(const FormData& form, |
234 const TimeTicks& timestamp) { | 239 const TimeTicks& timestamp) { |
240 // Bail if the arguments appear to be corrupt. | |
241 if (!IsSanitizedFormData(form)) | |
242 return false; | |
243 | |
235 // Let Autocomplete know as well. | 244 // Let Autocomplete know as well. |
236 autocomplete_history_manager_->OnFormSubmitted(form); | 245 autocomplete_history_manager_->OnFormSubmitted(form); |
237 | 246 |
238 // Grab a copy of the form data. | 247 // Grab a copy of the form data. |
239 scoped_ptr<FormStructure> submitted_form(new FormStructure(form)); | 248 scoped_ptr<FormStructure> submitted_form(new FormStructure(form)); |
240 | 249 |
241 if (!ShouldUploadForm(*submitted_form)) | 250 if (!ShouldUploadForm(*submitted_form)) |
242 return false; | 251 return false; |
243 | 252 |
244 // Don't save data that was submitted through JavaScript. | 253 // Don't save data that was submitted through JavaScript. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
294 initial_interaction_timestamp_, | 303 initial_interaction_timestamp_, |
295 timestamp)); | 304 timestamp)); |
296 } | 305 } |
297 | 306 |
298 return true; | 307 return true; |
299 } | 308 } |
300 | 309 |
301 void AutofillManager::OnFormsSeen(const std::vector<FormData>& forms, | 310 void AutofillManager::OnFormsSeen(const std::vector<FormData>& forms, |
302 const TimeTicks& timestamp, | 311 const TimeTicks& timestamp, |
303 autofill::FormsSeenState state) { | 312 autofill::FormsSeenState state) { |
313 // Bail if the arguments appear to be corrupt. | |
314 if (!IsSanitizedFormDataVector(forms)) | |
315 return; | |
316 | |
304 bool is_post_document_load = state == autofill::DYNAMIC_FORMS_SEEN; | 317 bool is_post_document_load = state == autofill::DYNAMIC_FORMS_SEEN; |
305 // If new forms were added dynamically, treat as a new page. | 318 // If new forms were added dynamically, treat as a new page. |
306 if (is_post_document_load) | 319 if (is_post_document_load) |
307 Reset(); | 320 Reset(); |
308 | 321 |
309 if (!driver_->RendererIsAvailable()) | 322 if (!driver_->RendererIsAvailable()) |
310 return; | 323 return; |
311 | 324 |
312 bool enabled = IsAutofillEnabled(); | 325 bool enabled = IsAutofillEnabled(); |
313 if (!has_logged_autofill_enabled_) { | 326 if (!has_logged_autofill_enabled_) { |
314 metric_logger_->LogIsAutofillEnabledAtPageLoad(enabled); | 327 metric_logger_->LogIsAutofillEnabledAtPageLoad(enabled); |
315 has_logged_autofill_enabled_ = true; | 328 has_logged_autofill_enabled_ = true; |
316 } | 329 } |
317 | 330 |
318 if (!enabled) | 331 if (!enabled) |
319 return; | 332 return; |
320 | 333 |
321 forms_loaded_timestamp_ = timestamp; | 334 forms_loaded_timestamp_ = timestamp; |
322 ParseForms(forms); | 335 ParseForms(forms); |
323 } | 336 } |
324 | 337 |
325 void AutofillManager::OnTextFieldDidChange(const FormData& form, | 338 void AutofillManager::OnTextFieldDidChange(const FormData& form, |
326 const FormFieldData& field, | 339 const FormFieldData& field, |
327 const TimeTicks& timestamp) { | 340 const TimeTicks& timestamp) { |
341 // Bail if the arguments appear to be corrupt. | |
palmer
2013/12/20 19:53:36
Nit: I'd drop the instances of this comment. The f
Ilya Sherman
2013/12/20 23:54:52
Done.
| |
342 if (!IsSanitizedFormData(form) || !IsSanitizedFormFieldData(field)) | |
343 return; | |
344 | |
328 FormStructure* form_structure = NULL; | 345 FormStructure* form_structure = NULL; |
329 AutofillField* autofill_field = NULL; | 346 AutofillField* autofill_field = NULL; |
330 if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field)) | 347 if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field)) |
331 return; | 348 return; |
332 | 349 |
333 if (!user_did_type_) { | 350 if (!user_did_type_) { |
334 user_did_type_ = true; | 351 user_did_type_ = true; |
335 metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE); | 352 metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_TYPE); |
336 } | 353 } |
337 | 354 |
(...skipping 10 matching lines...) Expand all Loading... | |
348 } | 365 } |
349 | 366 |
350 UpdateInitialInteractionTimestamp(timestamp); | 367 UpdateInitialInteractionTimestamp(timestamp); |
351 } | 368 } |
352 | 369 |
353 void AutofillManager::OnQueryFormFieldAutofill(int query_id, | 370 void AutofillManager::OnQueryFormFieldAutofill(int query_id, |
354 const FormData& form, | 371 const FormData& form, |
355 const FormFieldData& field, | 372 const FormFieldData& field, |
356 const gfx::RectF& bounding_box, | 373 const gfx::RectF& bounding_box, |
357 bool display_warning) { | 374 bool display_warning) { |
375 // Bail if the arguments appear to be corrupt. | |
376 if (!IsSanitizedFormData(form) || !IsSanitizedFormFieldData(field)) | |
377 return; | |
378 | |
358 std::vector<base::string16> values; | 379 std::vector<base::string16> values; |
359 std::vector<base::string16> labels; | 380 std::vector<base::string16> labels; |
360 std::vector<base::string16> icons; | 381 std::vector<base::string16> icons; |
361 std::vector<int> unique_ids; | 382 std::vector<int> unique_ids; |
362 | 383 |
363 external_delegate_->OnQuery(query_id, | 384 external_delegate_->OnQuery(query_id, |
364 form, | 385 form, |
365 field, | 386 field, |
366 bounding_box, | 387 bounding_box, |
367 display_warning); | 388 display_warning); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
435 // hand off what we generated and they will send the results back to the | 456 // hand off what we generated and they will send the results back to the |
436 // renderer. | 457 // renderer. |
437 autocomplete_history_manager_->OnGetAutocompleteSuggestions( | 458 autocomplete_history_manager_->OnGetAutocompleteSuggestions( |
438 query_id, field.name, field.value, values, labels, icons, unique_ids); | 459 query_id, field.name, field.value, values, labels, icons, unique_ids); |
439 } | 460 } |
440 | 461 |
441 void AutofillManager::OnFillAutofillFormData(int query_id, | 462 void AutofillManager::OnFillAutofillFormData(int query_id, |
442 const FormData& form, | 463 const FormData& form, |
443 const FormFieldData& field, | 464 const FormFieldData& field, |
444 int unique_id) { | 465 int unique_id) { |
466 // Bail if the arguments appear to be corrupt. | |
467 if (!IsSanitizedFormData(form) || !IsSanitizedFormFieldData(field)) | |
468 return; | |
469 | |
445 const AutofillDataModel* data_model = NULL; | 470 const AutofillDataModel* data_model = NULL; |
446 size_t variant = 0; | 471 size_t variant = 0; |
447 FormStructure* form_structure = NULL; | 472 FormStructure* form_structure = NULL; |
448 AutofillField* autofill_field = NULL; | 473 AutofillField* autofill_field = NULL; |
449 // NOTE: RefreshDataModels may invalidate |data_model| because it causes the | 474 // NOTE: RefreshDataModels may invalidate |data_model| because it causes the |
450 // PersonalDataManager to reload Mac address book entries. Thus it must come | 475 // PersonalDataManager to reload Mac address book entries. Thus it must come |
451 // before GetProfileOrCreditCard. | 476 // before GetProfileOrCreditCard. |
452 if (!RefreshDataModels() || | 477 if (!RefreshDataModels() || |
453 !driver_->RendererIsAvailable() || | 478 !driver_->RendererIsAvailable() || |
454 !GetProfileOrCreditCard(unique_id, &data_model, &variant) || | 479 !GetProfileOrCreditCard(unique_id, &data_model, &variant) || |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
515 | 540 |
516 autofilled_form_signatures_.push_front(form_structure->FormSignature()); | 541 autofilled_form_signatures_.push_front(form_structure->FormSignature()); |
517 // Only remember the last few forms that we've seen, both to avoid false | 542 // Only remember the last few forms that we've seen, both to avoid false |
518 // positives and to avoid wasting memory. | 543 // positives and to avoid wasting memory. |
519 if (autofilled_form_signatures_.size() > kMaxRecentFormSignaturesToRemember) | 544 if (autofilled_form_signatures_.size() > kMaxRecentFormSignaturesToRemember) |
520 autofilled_form_signatures_.pop_back(); | 545 autofilled_form_signatures_.pop_back(); |
521 | 546 |
522 driver_->SendFormDataToRenderer(query_id, result); | 547 driver_->SendFormDataToRenderer(query_id, result); |
523 } | 548 } |
524 | 549 |
525 void AutofillManager::OnShowAutofillDialog() { | |
526 manager_delegate_->ShowAutofillSettings(); | |
527 } | |
528 | |
529 void AutofillManager::OnDidPreviewAutofillFormData() { | 550 void AutofillManager::OnDidPreviewAutofillFormData() { |
530 if (test_delegate_) | 551 if (test_delegate_) |
531 test_delegate_->DidPreviewFormData(); | 552 test_delegate_->DidPreviewFormData(); |
532 } | 553 } |
533 | 554 |
534 void AutofillManager::OnDidFillAutofillFormData(const TimeTicks& timestamp) { | 555 void AutofillManager::OnDidFillAutofillFormData(const TimeTicks& timestamp) { |
535 if (test_delegate_) | 556 if (test_delegate_) |
536 test_delegate_->DidFillFormData(); | 557 test_delegate_->DidFillFormData(); |
537 | 558 |
538 metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL); | 559 metric_logger_->LogUserHappinessMetric(AutofillMetrics::USER_DID_AUTOFILL); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
592 const std::vector<FormStructure*>& AutofillManager::GetFormStructures() { | 613 const std::vector<FormStructure*>& AutofillManager::GetFormStructures() { |
593 return form_structures_.get(); | 614 return form_structures_.get(); |
594 } | 615 } |
595 | 616 |
596 void AutofillManager::SetTestDelegate( | 617 void AutofillManager::SetTestDelegate( |
597 autofill::AutofillManagerTestDelegate* delegate) { | 618 autofill::AutofillManagerTestDelegate* delegate) { |
598 test_delegate_ = delegate; | 619 test_delegate_ = delegate; |
599 } | 620 } |
600 | 621 |
601 void AutofillManager::OnAddPasswordFormMapping( | 622 void AutofillManager::OnAddPasswordFormMapping( |
602 const FormFieldData& form, | 623 const FormFieldData& username_field, |
603 const PasswordFormFillData& fill_data) { | 624 const PasswordFormFillData& fill_data) { |
604 external_delegate_->AddPasswordFormMapping(form, fill_data); | 625 // Bail if the arguments appear to be corrupt. |
626 if (!IsSanitizedFormFieldData(username_field) || | |
627 !IsSanitizedPasswordFormFillData(fill_data)) | |
628 return; | |
629 | |
630 external_delegate_->AddPasswordFormMapping(username_field, fill_data); | |
605 } | 631 } |
606 | 632 |
607 void AutofillManager::OnShowPasswordSuggestions( | 633 void AutofillManager::OnShowPasswordSuggestions( |
608 const FormFieldData& field, | 634 const FormFieldData& field, |
609 const gfx::RectF& bounds, | 635 const gfx::RectF& bounds, |
610 const std::vector<base::string16>& suggestions, | 636 const std::vector<base::string16>& suggestions, |
611 const std::vector<base::string16>& realms) { | 637 const std::vector<base::string16>& realms) { |
638 // Bail if the arguments appear to be corrupt. | |
639 if (!IsSanitizedString16Vector(suggestions) || | |
640 !IsSanitizedString16Vector(realms) || | |
641 suggestions.size() != realms.size()) | |
642 return; | |
643 | |
612 external_delegate_->OnShowPasswordSuggestions(suggestions, | 644 external_delegate_->OnShowPasswordSuggestions(suggestions, |
613 realms, | 645 realms, |
614 field, | 646 field, |
615 bounds); | 647 bounds); |
616 } | 648 } |
617 | 649 |
618 void AutofillManager::OnSetDataList(const std::vector<base::string16>& values, | 650 void AutofillManager::OnSetDataList(const std::vector<base::string16>& values, |
619 const std::vector<base::string16>& labels) { | 651 const std::vector<base::string16>& labels) { |
620 if (values.size() != labels.size()) | 652 // Bail if the arguments appear to be corrupt. |
653 if (!IsSanitizedString16Vector(values) || | |
654 !IsSanitizedString16Vector(labels) || | |
655 values.size() != labels.size()) | |
621 return; | 656 return; |
622 | 657 |
623 external_delegate_->SetCurrentDataListValues(values, labels); | 658 external_delegate_->SetCurrentDataListValues(values, labels); |
624 } | 659 } |
625 | 660 |
626 void AutofillManager::OnLoadedServerPredictions( | 661 void AutofillManager::OnLoadedServerPredictions( |
627 const std::string& response_xml) { | 662 const std::string& response_xml) { |
628 // Parse and store the server predictions. | 663 // Parse and store the server predictions. |
629 FormStructure::ParseQueryResponse(response_xml, | 664 FormStructure::ParseQueryResponse(response_xml, |
630 form_structures_.get(), | 665 form_structures_.get(), |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1100 return false; | 1135 return false; |
1101 | 1136 |
1102 // Disregard forms that we wouldn't ever autofill in the first place. | 1137 // Disregard forms that we wouldn't ever autofill in the first place. |
1103 if (!form.ShouldBeParsed(true)) | 1138 if (!form.ShouldBeParsed(true)) |
1104 return false; | 1139 return false; |
1105 | 1140 |
1106 return true; | 1141 return true; |
1107 } | 1142 } |
1108 | 1143 |
1109 } // namespace autofill | 1144 } // namespace autofill |
OLD | NEW |