Index: chrome/browser/autofill/autofill_manager.cc |
diff --git a/chrome/browser/autofill/autofill_manager.cc b/chrome/browser/autofill/autofill_manager.cc |
index 9793ad62bb3d0b3d2fce665bbaeb0ba067c44bc5..44b658d30d204bd94445a89c2c76280eec3121ef 100644 |
--- a/chrome/browser/autofill/autofill_manager.cc |
+++ b/chrome/browser/autofill/autofill_manager.cc |
@@ -17,6 +17,7 @@ |
#include "base/logging.h" |
#include "base/string16.h" |
#include "base/string_util.h" |
+#include "base/supports_user_data.h" |
#include "base/threading/sequenced_worker_pool.h" |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/api/infobars/infobar_service.h" |
@@ -68,6 +69,8 @@ using switches::kEnableAutofillFeedback; |
namespace { |
+const char* kAutofillManagerWebContentsUserDataKey = "web_contents_autofill"; |
+ |
// We only send a fraction of the forms to upload server. |
// The rate for positive/negative matches potentially could be different. |
const double kAutofillPositiveUploadRateDefaultValue = 0.20; |
@@ -169,11 +172,29 @@ void DeterminePossibleFieldTypesForUpload( |
} // namespace |
-AutofillManager::AutofillManager(autofill::AutofillManagerDelegate* delegate, |
- TabContents* tab_contents) |
- : content::WebContentsObserver(tab_contents->web_contents()), |
+// static |
+void AutofillManager::CreateForWebContentsAndDelegate( |
+ content::WebContents* contents, |
+ autofill::AutofillManagerDelegate* delegate) { |
+ if (FromWebContents(contents)) |
+ return; |
+ |
+ contents->SetUserData(kAutofillManagerWebContentsUserDataKey, |
+ new base::UserDataAdapter<AutofillManager>( |
+ new AutofillManager(contents, delegate))); |
+} |
+ |
+// static |
+AutofillManager* AutofillManager::FromWebContents( |
+ content::WebContents* contents) { |
+ return base::UserDataAdapter<AutofillManager>::Get( |
+ contents, kAutofillManagerWebContentsUserDataKey); |
+} |
+ |
+AutofillManager::AutofillManager(content::WebContents* web_contents, |
+ autofill::AutofillManagerDelegate* delegate) |
+ : content::WebContentsObserver(web_contents), |
manager_delegate_(delegate), |
- tab_contents_(tab_contents), |
personal_data_(NULL), |
download_manager_(delegate->GetBrowserContext(), this), |
disable_download_manager_requests_(false), |
@@ -192,6 +213,7 @@ AutofillManager::AutofillManager(autofill::AutofillManagerDelegate* delegate, |
RegisterWithSyncService(); |
registrar_.Init(manager_delegate_->GetPrefs()); |
registrar_.Add(prefs::kPasswordGenerationEnabled, this); |
+ TabContents* tab_contents = TabContents::FromWebContents(web_contents); |
notification_registrar_.Add(this, |
chrome::NOTIFICATION_TAB_CONTENTS_DESTROYED, |
content::Source<TabContents>(tab_contents)); |
@@ -351,7 +373,7 @@ bool AutofillManager::OnMessageReceived(const IPC::Message& message) { |
bool AutofillManager::OnFormSubmitted(const FormData& form, |
const TimeTicks& timestamp) { |
// Let AutoComplete know as well. |
- AutocompleteHistoryManager::FromWebContents(tab_contents_->web_contents())-> |
+ AutocompleteHistoryManager::FromWebContents(web_contents())-> |
OnFormSubmitted(form); |
if (!IsAutofillEnabled()) |
@@ -554,7 +576,7 @@ void AutofillManager::OnQueryFormFieldAutofill(int query_id, |
// Add the results from AutoComplete. They come back asynchronously, so we |
// hand off what we generated and they will send the results back to the |
// renderer. |
- AutocompleteHistoryManager::FromWebContents(tab_contents_->web_contents())-> |
+ AutocompleteHistoryManager::FromWebContents(web_contents())-> |
OnGetAutocompleteSuggestions( |
query_id, field.name, field.value, values, labels, icons, unique_ids); |
} |
@@ -880,12 +902,11 @@ void AutofillManager::Reset() { |
external_delegate_->Reset(); |
} |
-AutofillManager::AutofillManager(autofill::AutofillManagerDelegate* delegate, |
- TabContents* tab_contents, |
+AutofillManager::AutofillManager(content::WebContents* web_contents, |
+ autofill::AutofillManagerDelegate* delegate, |
PersonalDataManager* personal_data) |
- : content::WebContentsObserver(tab_contents->web_contents()), |
+ : content::WebContentsObserver(web_contents), |
manager_delegate_(delegate), |
- tab_contents_(tab_contents), |
personal_data_(personal_data), |
download_manager_(delegate->GetBrowserContext(), this), |
disable_download_manager_requests_(true), |
@@ -898,7 +919,7 @@ AutofillManager::AutofillManager(autofill::AutofillManagerDelegate* delegate, |
user_did_edit_autofilled_field_(false), |
password_generation_enabled_(false), |
external_delegate_(NULL) { |
- DCHECK(tab_contents_); |
+ DCHECK(web_contents); |
DCHECK(manager_delegate_); |
RegisterWithSyncService(); |
// Test code doesn't need registrar_. |