diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-17 21:04:36 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-17 21:04:36 +0000 |
commit | e9e079909c486a3d7561c1a0433762b395c0f48d (patch) | |
tree | 724ad3f933b6b4155c2fa073611a1562b5980331 /chrome | |
parent | 00e70b534d98b39ee179f643a50d35698f58d5bf (diff) | |
download | chromium_src-e9e079909c486a3d7561c1a0433762b395c0f48d.zip chromium_src-e9e079909c486a3d7561c1a0433762b395c0f48d.tar.gz chromium_src-e9e079909c486a3d7561c1a0433762b395c0f48d.tar.bz2 |
Relanding r38479. The underlying memory leak in WebKit has been fixed.
Send forms seen in the renderer to the AutoFillManager.
TBR=dglazkov
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/623003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39264 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/autofill/autofill_manager.cc | 14 | ||||
-rw-r--r-- | chrome/browser/autofill/autofill_manager.h | 5 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 9 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.h | 2 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host_delegate.h | 5 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 7 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 25 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 7 |
8 files changed, 67 insertions, 7 deletions
diff --git a/chrome/browser/autofill/autofill_manager.cc b/chrome/browser/autofill/autofill_manager.cc index 23f9574..bf0857d 100644 --- a/chrome/browser/autofill/autofill_manager.cc +++ b/chrome/browser/autofill/autofill_manager.cc @@ -61,6 +61,18 @@ void AutoFillManager::FormFieldValuesSubmitted( } } +void AutoFillManager::FormsSeen( + const std::vector<webkit_glue::FormFieldValues>& forms) { + form_structures_.reset(); + for (std::vector<webkit_glue::FormFieldValues>::const_iterator iter = + forms.begin(); + iter != forms.end(); ++iter) { + FormStructure* form_structure = new FormStructure(*iter); + DeterminePossibleFieldTypes(form_structure); + form_structures_.push_back(form_structure); + } +} + void AutoFillManager::OnAutoFillDialogApply( std::vector<AutoFillProfile>* profiles, std::vector<CreditCard>* credit_cards) { @@ -102,7 +114,7 @@ void AutoFillManager::HandleSubmit() { // If there wasn't enough data to import then we don't want to send an upload // to the server. if (personal_data_ && - !personal_data_->ImportFormData(form_structures_, this)) + !personal_data_->ImportFormData(form_structures_.get(), this)) return; UploadFormData(); diff --git a/chrome/browser/autofill/autofill_manager.h b/chrome/browser/autofill/autofill_manager.h index 85905c8..ea7ae691 100644 --- a/chrome/browser/autofill/autofill_manager.h +++ b/chrome/browser/autofill/autofill_manager.h @@ -8,6 +8,7 @@ #include <vector> #include "base/scoped_ptr.h" +#include "base/scoped_vector.h" #include "chrome/browser/autofill/autofill_dialog.h" #include "chrome/browser/autofill/personal_data_manager.h" #include "chrome/browser/renderer_host/render_view_host_delegate.h" @@ -38,6 +39,8 @@ class AutoFillManager : public RenderViewHostDelegate::AutoFill, // RenderViewHostDelegate::AutoFill implementation: virtual void FormFieldValuesSubmitted( const webkit_glue::FormFieldValues& form); + virtual void FormsSeen( + const std::vector<webkit_glue::FormFieldValues>& forms); // AutoFillDialogObserver implementation: virtual void OnAutoFillDialogApply( @@ -75,7 +78,7 @@ class AutoFillManager : public RenderViewHostDelegate::AutoFill, PersonalDataManager* personal_data_; // Our copy of the form data. - std::vector<FormStructure*> form_structures_; + ScopedVector<FormStructure> form_structures_; scoped_ptr<FormStructure> upload_form_structure_; // The infobar that asks for permission to store form information. diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index dd93494..2c1bdf2 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -757,6 +757,7 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) { OnMsgRunBeforeUnloadConfirm) IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ShowModalHTMLDialog, OnMsgShowModalHTMLDialog) + IPC_MESSAGE_HANDLER(ViewHostMsg_FormsSeen, OnMsgFormsSeen) IPC_MESSAGE_HANDLER(ViewHostMsg_PasswordFormsSeen, OnMsgPasswordFormsSeen) IPC_MESSAGE_HANDLER(ViewHostMsg_FormFieldValuesSubmitted, OnMsgFormFieldValuesSubmitted) @@ -1342,6 +1343,14 @@ void RenderViewHost::MediaPlayerActionAt(const gfx::Point& location, Send(new ViewMsg_MediaPlayerActionAt(routing_id(), location, action)); } +void RenderViewHost::OnMsgFormsSeen( + const std::vector<webkit_glue::FormFieldValues>& forms) { + RenderViewHostDelegate::AutoFill* autofill_delegate = + delegate_->GetAutoFillDelegate(); + if (autofill_delegate) + autofill_delegate->FormsSeen(forms); +} + void RenderViewHost::OnMsgPasswordFormsSeen( const std::vector<webkit_glue::PasswordForm>& forms) { delegate_->PasswordFormsSeen(forms); diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index bf00762..5e952d9 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -535,6 +535,8 @@ class RenderViewHost : public RenderWidgetHost { void OnMsgShowModalHTMLDialog(const GURL& url, int width, int height, const std::string& json_arguments, IPC::Message* reply_msg); + void OnMsgFormsSeen( + const std::vector<webkit_glue::FormFieldValues>& forms); void OnMsgPasswordFormsSeen( const std::vector<webkit_glue::PasswordForm>& forms); void OnMsgFormFieldValuesSubmitted(const webkit_glue::FormFieldValues& forms); diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h index 9756d78..3dd7b9a 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.h +++ b/chrome/browser/renderer_host/render_view_host_delegate.h @@ -390,6 +390,11 @@ class RenderViewHostDelegate { // Called when the user submits a form. virtual void FormFieldValuesSubmitted( const webkit_glue::FormFieldValues& form) = 0; + + // Called when the frame has finished loading and there are forms in the + // frame. + virtual void FormsSeen( + const std::vector<webkit_glue::FormFieldValues>& forms) = 0; }; // --------------------------------------------------------------------------- diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index 8aef0f0..00cf0ed 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -1347,8 +1347,13 @@ IPC_BEGIN_MESSAGES(ViewHost) string16 /* title */, FilePath /* Default file name */) + // Notification that forms have been seen that are candidates for + // filling/submitting by the AutoFillManager. + IPC_MESSAGE_ROUTED1(ViewHostMsg_FormsSeen, + std::vector<webkit_glue::FormFieldValues> /* forms */) + // Notification that password forms have been seen that are candidates for - // filling/submitting by the password manager + // filling/submitting by the password manager. IPC_MESSAGE_ROUTED1(ViewHostMsg_PasswordFormsSeen, std::vector<webkit_glue::PasswordForm> /* forms */) diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index cef9b6d..c387004 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -2529,8 +2529,10 @@ void RenderView::didFinishDocumentLoad(WebFrame* frame) { Send(new ViewHostMsg_DocumentLoadedInFrame(routing_id_)); - // The document has now been fully loaded. Scan for password forms to be - // sent up to the browser. + // The document has now been fully loaded. Scan for forms to be sent up to + // the browser. + // TODO(jhawkins): Make these use the FormManager. + SendForms(frame); SendPasswordForms(frame); // Check whether we have new encoding name. @@ -4249,6 +4251,25 @@ void RenderView::focusAccessibilityObject( #endif } +void RenderView::SendForms(WebFrame* frame) { + WebVector<WebFormElement> web_forms; + frame->forms(web_forms); + + std::vector<FormFieldValues> forms; + for (size_t i = 0; i < web_forms.size(); ++i) { + const WebFormElement& web_form = web_forms[i]; + + if (web_form.autoComplete()) { + scoped_ptr<FormFieldValues> form(FormFieldValues::Create(web_form)); + if (form.get()) + forms.push_back(*form); + } + } + + if (!forms.empty()) + Send(new ViewHostMsg_FormsSeen(routing_id_, forms)); +} + void RenderView::SendPasswordForms(WebFrame* frame) { WebVector<WebFormElement> forms; frame->forms(forms); diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 0027d89..690a6b3 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -805,7 +805,10 @@ class RenderView : public RenderWidget, void LogNavigationState(const NavigationState* state, const WebKit::WebDataSource* ds) const; - // Scan the given frame for password forms and send them up to the browser. + // Scans the given frame for forms and sends them up to the browser. + void SendForms(WebKit::WebFrame* frame); + + // Scans the given frame for password forms and sends them up to the browser. void SendPasswordForms(WebKit::WebFrame* frame); void Print(WebKit::WebFrame* frame, bool script_initiated); @@ -841,7 +844,7 @@ class RenderView : public RenderWidget, bool AllowContentType(ContentSettingsType settings_type, bool enabled_per_settings); - // Resets the |content_blocked_| array. + // Resets the |content_blocked_| array. void ClearBlockedContentSettings(); // Bitwise-ORed set of extra bindings that have been enabled. See |