Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/autofill/autofill_manager.h" | 5 #include "chrome/browser/autofill/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> |
| 11 #include <set> | 11 #include <set> |
| 12 #include <utility> | 12 #include <utility> |
| 13 | 13 |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/command_line.h" | 15 #include "base/command_line.h" |
| 16 #include "base/guid.h" | 16 #include "base/guid.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/string16.h" | 18 #include "base/string16.h" |
| 19 #include "base/string_util.h" | 19 #include "base/string_util.h" |
| 20 #include "base/supports_user_data.h" | |
| 20 #include "base/threading/sequenced_worker_pool.h" | 21 #include "base/threading/sequenced_worker_pool.h" |
| 21 #include "base/utf_string_conversions.h" | 22 #include "base/utf_string_conversions.h" |
| 22 #include "chrome/browser/api/infobars/infobar_service.h" | 23 #include "chrome/browser/api/infobars/infobar_service.h" |
| 23 #include "chrome/browser/api/prefs/pref_service_base.h" | 24 #include "chrome/browser/api/prefs/pref_service_base.h" |
| 24 #include "chrome/browser/api/sync/profile_sync_service_base.h" | 25 #include "chrome/browser/api/sync/profile_sync_service_base.h" |
| 25 #include "chrome/browser/autofill/autocomplete_history_manager.h" | 26 #include "chrome/browser/autofill/autocomplete_history_manager.h" |
| 26 #include "chrome/browser/autofill/autofill_cc_infobar_delegate.h" | 27 #include "chrome/browser/autofill/autofill_cc_infobar_delegate.h" |
| 27 #include "chrome/browser/autofill/autofill_external_delegate.h" | 28 #include "chrome/browser/autofill/autofill_external_delegate.h" |
| 28 #include "chrome/browser/autofill/autofill_field.h" | 29 #include "chrome/browser/autofill/autofill_field.h" |
| 29 #include "chrome/browser/autofill/autofill_manager_delegate.h" | 30 #include "chrome/browser/autofill/autofill_manager_delegate.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 using base::TimeTicks; | 65 using base::TimeTicks; |
| 65 using content::BrowserThread; | 66 using content::BrowserThread; |
| 66 using content::RenderViewHost; | 67 using content::RenderViewHost; |
| 67 using switches::kEnableAutofillFeedback; | 68 using switches::kEnableAutofillFeedback; |
| 68 using webkit::forms::FormData; | 69 using webkit::forms::FormData; |
| 69 using webkit::forms::FormDataPredictions; | 70 using webkit::forms::FormDataPredictions; |
| 70 using webkit::forms::FormField; | 71 using webkit::forms::FormField; |
| 71 | 72 |
| 72 namespace { | 73 namespace { |
| 73 | 74 |
| 75 const char* kAutofillManagerWebContentsUserDataKey = "web_contents_autofill"; | |
| 76 | |
| 74 // We only send a fraction of the forms to upload server. | 77 // We only send a fraction of the forms to upload server. |
| 75 // The rate for positive/negative matches potentially could be different. | 78 // The rate for positive/negative matches potentially could be different. |
| 76 const double kAutofillPositiveUploadRateDefaultValue = 0.20; | 79 const double kAutofillPositiveUploadRateDefaultValue = 0.20; |
| 77 const double kAutofillNegativeUploadRateDefaultValue = 0.20; | 80 const double kAutofillNegativeUploadRateDefaultValue = 0.20; |
| 78 | 81 |
| 79 const size_t kMaxRecentFormSignaturesToRemember = 3; | 82 const size_t kMaxRecentFormSignaturesToRemember = 3; |
| 80 | 83 |
| 81 // Set a conservative upper bound on the number of forms we are willing to | 84 // Set a conservative upper bound on the number of forms we are willing to |
| 82 // cache, simply to prevent unbounded memory consumption. | 85 // cache, simply to prevent unbounded memory consumption. |
| 83 const size_t kMaxFormCacheSize = 100; | 86 const size_t kMaxFormCacheSize = 100; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 | 168 |
| 166 if (matching_types.empty()) | 169 if (matching_types.empty()) |
| 167 matching_types.insert(UNKNOWN_TYPE); | 170 matching_types.insert(UNKNOWN_TYPE); |
| 168 | 171 |
| 169 field->set_possible_types(matching_types); | 172 field->set_possible_types(matching_types); |
| 170 } | 173 } |
| 171 } | 174 } |
| 172 | 175 |
| 173 } // namespace | 176 } // namespace |
| 174 | 177 |
| 175 AutofillManager::AutofillManager(autofill::AutofillManagerDelegate* delegate, | 178 // static |
| 176 TabContents* tab_contents) | 179 void AutofillManager::CreateForWebContentsAndDelegate( |
| 177 : content::WebContentsObserver(tab_contents->web_contents()), | 180 content::WebContents* contents, |
| 181 autofill::AutofillManagerDelegate* delegate) { | |
| 182 if (FromWebContents(contents)) | |
| 183 return; | |
| 184 | |
| 185 contents->SetUserData(kAutofillManagerWebContentsUserDataKey, | |
| 186 new base::UserDataAdapter<AutofillManager>( | |
| 187 new AutofillManager(contents, delegate))); | |
| 188 } | |
| 189 | |
| 190 // static | |
| 191 AutofillManager* AutofillManager::FromWebContents( | |
| 192 content::WebContents* contents) { | |
| 193 return base::UserDataAdapter<AutofillManager>::Get( | |
| 194 contents, kAutofillManagerWebContentsUserDataKey); | |
| 195 } | |
| 196 | |
| 197 AutofillManager::AutofillManager(content::WebContents* web_contents, | |
| 198 autofill::AutofillManagerDelegate* delegate) | |
| 199 : content::WebContentsObserver(web_contents), | |
| 178 manager_delegate_(delegate), | 200 manager_delegate_(delegate), |
| 179 tab_contents_(tab_contents), | |
| 180 personal_data_(NULL), | 201 personal_data_(NULL), |
| 181 download_manager_(delegate->GetBrowserContext(), this), | 202 download_manager_(delegate->GetBrowserContext(), this), |
| 182 disable_download_manager_requests_(false), | 203 disable_download_manager_requests_(false), |
| 183 metric_logger_(new AutofillMetrics), | 204 metric_logger_(new AutofillMetrics), |
| 184 has_logged_autofill_enabled_(false), | 205 has_logged_autofill_enabled_(false), |
| 185 has_logged_address_suggestions_count_(false), | 206 has_logged_address_suggestions_count_(false), |
| 186 did_show_suggestions_(false), | 207 did_show_suggestions_(false), |
| 187 user_did_type_(false), | 208 user_did_type_(false), |
| 188 user_did_autofill_(false), | 209 user_did_autofill_(false), |
| 189 user_did_edit_autofilled_field_(false), | 210 user_did_edit_autofilled_field_(false), |
| 190 password_generation_enabled_(false), | 211 password_generation_enabled_(false), |
| 191 external_delegate_(NULL) { | 212 external_delegate_(NULL) { |
| 192 // |personal_data_| is NULL when using test-enabled WebContents. | 213 // |personal_data_| is NULL when using test-enabled WebContents. |
| 193 personal_data_ = PersonalDataManagerFactory::GetForProfile( | 214 personal_data_ = PersonalDataManagerFactory::GetForProfile( |
| 194 delegate->GetOriginalProfile()); | 215 delegate->GetOriginalProfile()); |
| 195 RegisterWithSyncService(); | 216 RegisterWithSyncService(); |
| 196 registrar_.Init(manager_delegate_->GetPrefs()); | 217 registrar_.Init(manager_delegate_->GetPrefs()); |
| 197 registrar_.Add(prefs::kPasswordGenerationEnabled, this); | 218 registrar_.Add(prefs::kPasswordGenerationEnabled, this); |
| 219 TabContents* tab_contents = TabContents::FromWebContents(web_contents); | |
| 198 notification_registrar_.Add(this, | 220 notification_registrar_.Add(this, |
| 199 chrome::NOTIFICATION_TAB_CONTENTS_DESTROYED, | 221 chrome::NOTIFICATION_TAB_CONTENTS_DESTROYED, |
| 200 content::Source<TabContents>(tab_contents)); | 222 content::Source<TabContents>(tab_contents)); |
| 201 } | 223 } |
| 202 | 224 |
| 203 AutofillManager::~AutofillManager() { | 225 AutofillManager::~AutofillManager() { |
| 204 } | 226 } |
| 205 | 227 |
| 206 // static | 228 // static |
| 207 void AutofillManager::RegisterUserPrefs(PrefServiceBase* prefs) { | 229 void AutofillManager::RegisterUserPrefs(PrefServiceBase* prefs) { |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 OnSetDataList) | 369 OnSetDataList) |
| 348 IPC_MESSAGE_UNHANDLED(handled = false) | 370 IPC_MESSAGE_UNHANDLED(handled = false) |
| 349 IPC_END_MESSAGE_MAP() | 371 IPC_END_MESSAGE_MAP() |
| 350 | 372 |
| 351 return handled; | 373 return handled; |
| 352 } | 374 } |
| 353 | 375 |
| 354 bool AutofillManager::OnFormSubmitted(const FormData& form, | 376 bool AutofillManager::OnFormSubmitted(const FormData& form, |
| 355 const TimeTicks& timestamp) { | 377 const TimeTicks& timestamp) { |
| 356 // Let AutoComplete know as well. | 378 // Let AutoComplete know as well. |
| 357 AutocompleteHistoryManager::FromWebContents(tab_contents_->web_contents())-> | 379 AutocompleteHistoryManager::FromWebContents(web_contents())-> |
| 358 OnFormSubmitted(form); | 380 OnFormSubmitted(form); |
| 359 | 381 |
| 360 if (!IsAutofillEnabled()) | 382 if (!IsAutofillEnabled()) |
| 361 return false; | 383 return false; |
| 362 | 384 |
| 363 if (web_contents()->GetBrowserContext()->IsOffTheRecord()) | 385 if (web_contents()->GetBrowserContext()->IsOffTheRecord()) |
| 364 return false; | 386 return false; |
| 365 | 387 |
| 366 // Don't save data that was submitted through JavaScript. | 388 // Don't save data that was submitted through JavaScript. |
| 367 if (!form.user_submitted) | 389 if (!form.user_submitted) |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 550 metric_logger_->LogAddressSuggestionsCount(values.size()); | 572 metric_logger_->LogAddressSuggestionsCount(values.size()); |
| 551 has_logged_address_suggestions_count_ = true; | 573 has_logged_address_suggestions_count_ = true; |
| 552 } | 574 } |
| 553 } | 575 } |
| 554 } | 576 } |
| 555 } | 577 } |
| 556 | 578 |
| 557 // Add the results from AutoComplete. They come back asynchronously, so we | 579 // Add the results from AutoComplete. They come back asynchronously, so we |
| 558 // hand off what we generated and they will send the results back to the | 580 // hand off what we generated and they will send the results back to the |
| 559 // renderer. | 581 // renderer. |
| 560 AutocompleteHistoryManager::FromWebContents(tab_contents_->web_contents())-> | 582 AutocompleteHistoryManager::FromWebContents(web_contents())-> |
| 561 OnGetAutocompleteSuggestions( | 583 OnGetAutocompleteSuggestions( |
| 562 query_id, field.name, field.value, values, labels, icons, unique_ids); | 584 query_id, field.name, field.value, values, labels, icons, unique_ids); |
| 563 } | 585 } |
| 564 | 586 |
| 565 void AutofillManager::OnFillAutofillFormData(int query_id, | 587 void AutofillManager::OnFillAutofillFormData(int query_id, |
| 566 const FormData& form, | 588 const FormData& form, |
| 567 const FormField& field, | 589 const FormField& field, |
| 568 int unique_id) { | 590 int unique_id) { |
| 569 const std::vector<AutofillProfile*>& profiles = personal_data_->profiles(); | 591 const std::vector<AutofillProfile*>& profiles = personal_data_->profiles(); |
| 570 const std::vector<CreditCard*>& credit_cards = personal_data_->credit_cards(); | 592 const std::vector<CreditCard*>& credit_cards = personal_data_->credit_cards(); |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 876 user_did_type_ = false; | 898 user_did_type_ = false; |
| 877 user_did_autofill_ = false; | 899 user_did_autofill_ = false; |
| 878 user_did_edit_autofilled_field_ = false; | 900 user_did_edit_autofilled_field_ = false; |
| 879 forms_loaded_timestamp_ = TimeTicks(); | 901 forms_loaded_timestamp_ = TimeTicks(); |
| 880 initial_interaction_timestamp_ = TimeTicks(); | 902 initial_interaction_timestamp_ = TimeTicks(); |
| 881 | 903 |
| 882 if (external_delegate_) | 904 if (external_delegate_) |
| 883 external_delegate_->Reset(); | 905 external_delegate_->Reset(); |
| 884 } | 906 } |
| 885 | 907 |
| 886 AutofillManager::AutofillManager(autofill::AutofillManagerDelegate* delegate, | 908 AutofillManager::AutofillManager(content::WebContents* web_contents, |
| 887 TabContents* tab_contents, | 909 autofill::AutofillManagerDelegate* delegate, |
| 888 PersonalDataManager* personal_data) | 910 PersonalDataManager* personal_data) |
| 889 : content::WebContentsObserver(tab_contents->web_contents()), | 911 : content::WebContentsObserver(web_contents), |
| 890 manager_delegate_(delegate), | 912 manager_delegate_(delegate), |
| 891 tab_contents_(tab_contents), | |
| 892 personal_data_(personal_data), | 913 personal_data_(personal_data), |
| 893 download_manager_(delegate->GetBrowserContext(), this), | 914 download_manager_(delegate->GetBrowserContext(), this), |
| 894 disable_download_manager_requests_(true), | 915 disable_download_manager_requests_(true), |
| 895 metric_logger_(new AutofillMetrics), | 916 metric_logger_(new AutofillMetrics), |
| 896 has_logged_autofill_enabled_(false), | 917 has_logged_autofill_enabled_(false), |
| 897 has_logged_address_suggestions_count_(false), | 918 has_logged_address_suggestions_count_(false), |
| 898 did_show_suggestions_(false), | 919 did_show_suggestions_(false), |
| 899 user_did_type_(false), | 920 user_did_type_(false), |
| 900 user_did_autofill_(false), | 921 user_did_autofill_(false), |
| 901 user_did_edit_autofilled_field_(false), | 922 user_did_edit_autofilled_field_(false), |
| 902 password_generation_enabled_(false), | 923 password_generation_enabled_(false), |
| 903 external_delegate_(NULL) { | 924 external_delegate_(NULL) { |
| 904 DCHECK(tab_contents_); | |
|
Jói
2012/10/01 10:45:19
Perhaps keep a DCHECK(web_contents_)?
Avi (use Gerrit)
2012/10/01 15:32:26
Done. I don't remember why I removed it.
| |
| 905 DCHECK(manager_delegate_); | 925 DCHECK(manager_delegate_); |
| 906 RegisterWithSyncService(); | 926 RegisterWithSyncService(); |
| 907 // Test code doesn't need registrar_. | 927 // Test code doesn't need registrar_. |
| 908 } | 928 } |
| 909 | 929 |
| 910 void AutofillManager::set_metric_logger(const AutofillMetrics* metric_logger) { | 930 void AutofillManager::set_metric_logger(const AutofillMetrics* metric_logger) { |
| 911 metric_logger_.reset(metric_logger); | 931 metric_logger_.reset(metric_logger); |
| 912 } | 932 } |
| 913 | 933 |
| 914 bool AutofillManager::GetHost(const std::vector<AutofillProfile*>& profiles, | 934 bool AutofillManager::GetHost(const std::vector<AutofillProfile*>& profiles, |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1389 *profile_guid = IDToGUID(profile_id); | 1409 *profile_guid = IDToGUID(profile_id); |
| 1390 } | 1410 } |
| 1391 | 1411 |
| 1392 void AutofillManager::UpdateInitialInteractionTimestamp( | 1412 void AutofillManager::UpdateInitialInteractionTimestamp( |
| 1393 const TimeTicks& interaction_timestamp) { | 1413 const TimeTicks& interaction_timestamp) { |
| 1394 if (initial_interaction_timestamp_.is_null() || | 1414 if (initial_interaction_timestamp_.is_null() || |
| 1395 interaction_timestamp < initial_interaction_timestamp_) { | 1415 interaction_timestamp < initial_interaction_timestamp_) { |
| 1396 initial_interaction_timestamp_ = interaction_timestamp; | 1416 initial_interaction_timestamp_ = interaction_timestamp; |
| 1397 } | 1417 } |
| 1398 } | 1418 } |
| OLD | NEW |