Index: components/autofill/content/browser/content_autofill_driver_factory.cc |
diff --git a/components/autofill/content/browser/content_autofill_driver_factory.cc b/components/autofill/content/browser/content_autofill_driver_factory.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0911f28e83925ed6066c68fa5497be1f2a99f020 |
--- /dev/null |
+++ b/components/autofill/content/browser/content_autofill_driver_factory.cc |
@@ -0,0 +1,108 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/autofill/content/browser/content_autofill_driver_factory.h" |
+ |
+#include "components/autofill/content/browser/content_autofill_driver.h" |
+#include "components/autofill/core/browser/autofill_client.h" |
+#include "components/autofill/core/browser/autofill_manager.h" |
+#include "components/autofill/core/browser/form_structure.h" |
+#include "components/autofill/core/common/autofill_switches.h" |
+#include "content/public/browser/render_frame_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "ipc/ipc_message_macros.h" |
+ |
+namespace autofill { |
+ |
+namespace { |
+ |
+const char kContentAutofillDriverFactoryWebContentsUserDataKey[] = |
+ "web_contents_autofill_driver_factory"; |
+ |
+} // namespace |
+ |
+// static |
+void ContentAutofillDriverFactory::CreateForWebContentsAndDelegate( |
+ content::WebContents* contents, |
+ AutofillClient* client, |
+ const std::string& app_locale, |
+ AutofillManager::AutofillDownloadManagerState enable_download_manager) { |
+ if (FromWebContents(contents)) |
+ return; |
+ |
+ contents->SetUserData( |
+ kContentAutofillDriverFactoryWebContentsUserDataKey, |
+ new ContentAutofillDriverFactory(contents, client, app_locale, |
+ enable_download_manager)); |
+} |
+ |
+// static |
+ContentAutofillDriverFactory* ContentAutofillDriverFactory::FromWebContents( |
+ content::WebContents* contents) { |
+ return static_cast<ContentAutofillDriverFactory*>(contents->GetUserData( |
+ kContentAutofillDriverFactoryWebContentsUserDataKey)); |
+} |
+ |
+ContentAutofillDriverFactory::ContentAutofillDriverFactory( |
+ content::WebContents* web_contents, |
+ AutofillClient* client, |
+ const std::string& app_locale, |
+ AutofillManager::AutofillDownloadManagerState enable_download_manager) |
+ : content::WebContentsObserver(web_contents), |
+ client_(client), |
+ app_locale_(app_locale), |
+ enable_download_manager_(enable_download_manager) { |
+ if (web_contents->GetMainFrame()) |
+ RenderFrameCreated(web_contents->GetMainFrame()); |
vabr (Chromium)
2014/11/10 14:34:39
It's usually a bad idea to call virtual methods fr
Evan Stade
2014/11/14 23:25:49
Done.
|
+} |
+ |
+ContentAutofillDriverFactory::~ContentAutofillDriverFactory() { |
+} |
+ |
+ContentAutofillDriver* ContentAutofillDriverFactory::DriverForFrame( |
+ content::RenderFrameHost* render_frame_host) { |
+ return frame_driver_map_[render_frame_host]; |
vabr (Chromium)
2014/11/10 14:34:39
Note that this creates a new entry in the map, if
Evan Stade
2014/11/14 23:25:49
actually it initializes with null
vabr (Chromium)
2014/11/17 15:08:48
You are right, sorry fir spreading misinformation.
|
+} |
+ |
+bool ContentAutofillDriverFactory::OnMessageReceived( |
+ const IPC::Message& message, |
+ content::RenderFrameHost* render_frame_host) { |
+ ContentAutofillDriver* driver = frame_driver_map_[render_frame_host]; |
+ DCHECK(driver); |
vabr (Chromium)
2014/11/10 14:34:39
Again, in addition to checking driver, the retriev
Evan Stade
2014/11/14 23:25:49
see other comments
vabr (Chromium)
2014/11/17 15:08:48
Acknowledged. Using the NULL-dereference to signal
|
+ return driver->HandleMessage(message); |
+} |
+ |
+void ContentAutofillDriverFactory::RenderFrameCreated( |
+ content::RenderFrameHost* render_frame_host) { |
+ frame_driver_map_[render_frame_host] = new ContentAutofillDriver( |
+ render_frame_host, client_, app_locale_, enable_download_manager_); |
+} |
+ |
+void ContentAutofillDriverFactory::RenderFrameDeleted( |
+ content::RenderFrameHost* render_frame_host) { |
+ ContentAutofillDriver* driver = frame_driver_map_[render_frame_host]; |
+ DCHECK(driver); |
vabr (Chromium)
2014/11/10 14:34:39
DCHECKing driver does not do much here -- if drive
Evan Stade
2014/11/14 23:25:49
see other comments
vabr (Chromium)
2014/11/17 15:08:48
Acknowledged.
|
+ delete driver; |
+ frame_driver_map_.erase(render_frame_host); |
+} |
+ |
+void ContentAutofillDriverFactory::DidNavigateAnyFrame( |
+ content::RenderFrameHost* render_frame_host, |
+ const content::LoadCommittedDetails& details, |
+ const content::FrameNavigateParams& params) { |
+ ContentAutofillDriver* driver = frame_driver_map_[render_frame_host]; |
vabr (Chromium)
2014/11/10 14:34:39
Please check the existence of the key, to avoid in
Evan Stade
2014/11/14 23:25:49
a) it's not inserting trash, it's inserting null
b
vabr (Chromium)
2014/11/17 15:08:49
Acknowledged.
|
+ DCHECK(driver); |
+ driver->DidNavigateFrame(details, params); |
+} |
+ |
+void ContentAutofillDriverFactory::NavigationEntryCommitted( |
+ const content::LoadCommittedDetails& load_details) { |
+ client_->HideAutofillPopup(); |
+} |
+ |
+void ContentAutofillDriverFactory::WasHidden() { |
+ client_->HideAutofillPopup(); |
+} |
+ |
+} // namespace autofill |