Index: components/autofill/content/renderer/password_autofill_agent.h |
diff --git a/components/autofill/content/renderer/password_autofill_agent.h b/components/autofill/content/renderer/password_autofill_agent.h |
index 99f2a94567338cd656bc1e13727d9af50ae56f3a..f749c021f591e130839593fbbe6e851f93ee4237 100644 |
--- a/components/autofill/content/renderer/password_autofill_agent.h |
+++ b/components/autofill/content/renderer/password_autofill_agent.h |
@@ -8,9 +8,11 @@ |
#include <map> |
#include <vector> |
-#include "base/memory/linked_ptr.h" |
+#include "base/gtest_prod_util.h" |
+#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
#include "components/autofill/core/common/password_form_fill_data.h" |
+#include "content/public/renderer/render_frame_observer.h" |
#include "content/public/renderer/render_view_observer.h" |
#include "third_party/WebKit/public/web/WebInputElement.h" |
@@ -24,13 +26,12 @@ class WebView; |
namespace autofill { |
// This class is responsible for filling password forms. |
-// There is one PasswordAutofillAgent per RenderView. |
-class PasswordAutofillAgent : public content::RenderViewObserver { |
+class PasswordAutofillAgent : public content::RenderFrameObserver { |
public: |
- explicit PasswordAutofillAgent(content::RenderView* render_view); |
+ explicit PasswordAutofillAgent(content::RenderFrame* render_frame); |
~PasswordAutofillAgent() override; |
- // WebViewClient editor related calls forwarded by the RenderView. |
+ // WebFrameClient editor related calls forwarded by AutofillAgent. |
// If they return true, it indicates the event was consumed and should not |
// be used for any other autofill activity. |
bool TextFieldDidEndEditing(const blink::WebInputElement& element); |
@@ -54,6 +55,7 @@ class PasswordAutofillAgent : public content::RenderViewObserver { |
// their previous filled state. Return false if no login information was |
// found for the form. |
bool DidClearAutofillSelection(const blink::WebNode& node); |
+ |
// Shows an Autofill popup with username suggestions for |element|. If |
// |show_all| is |true|, will show all possible suggestions for that element, |
// otherwise shows suggestions based on current value of |element|. |
@@ -61,7 +63,7 @@ class PasswordAutofillAgent : public content::RenderViewObserver { |
bool ShowSuggestions(const blink::WebInputElement& element, bool show_all); |
// Called when new form controls are inserted. |
- void OnDynamicFormsSeen(blink::WebFrame* frame); |
+ void OnDynamicFormsSeen(); |
// Called when the user first interacts with the page after a load. This is a |
// signal to make autofilled values of password input elements accessible to |
@@ -100,8 +102,6 @@ class PasswordAutofillAgent : public content::RenderViewObserver { |
typedef std::map<blink::WebElement, PasswordInfo> LoginToPasswordInfoMap; |
typedef std::map<blink::WebElement, int> LoginToPasswordInfoKeyMap; |
typedef std::map<blink::WebElement, blink::WebElement> PasswordToLoginMap; |
- typedef std::map<blink::WebFrame*, |
- linked_ptr<PasswordForm> > FrameToPasswordFormMap; |
// This class keeps track of autofilled password input elements and makes sure |
// the autofilled password value is not accessible to JavaScript code until |
@@ -132,19 +132,53 @@ class PasswordAutofillAgent : public content::RenderViewObserver { |
DISALLOW_COPY_AND_ASSIGN(PasswordValueGatekeeper); |
}; |
- // RenderViewObserver: |
+ // Thunk class for RenderViewObserver methods that haven't yet been migrated |
+ // to RenderFrameObserver. Should eventually be removed. |
+ // http://crbug.com/433486 |
+ class LegacyPasswordAutofillAgent : public content::RenderViewObserver { |
+ public: |
+ LegacyPasswordAutofillAgent(content::RenderView* render_view, |
+ PasswordAutofillAgent* agent); |
+ ~LegacyPasswordAutofillAgent() override; |
+ |
+ // RenderViewObserver: |
+ void OnDestruct() override; |
+ void DidStartLoading() override; |
+ void DidStopLoading() override; |
+ void FrameDetached(blink::WebFrame* frame) override; |
+ void WillSendSubmitEvent(blink::WebLocalFrame* frame, |
+ const blink::WebFormElement& form) override; |
+ void WillSubmitForm(blink::WebLocalFrame* frame, |
+ const blink::WebFormElement& form) override; |
+ |
+ private: |
+ PasswordAutofillAgent* agent_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LegacyPasswordAutofillAgent); |
+ }; |
+ friend class LegacyPasswordAutofillAgent; |
+ FRIEND_TEST_ALL_PREFIXES(PasswordAutofillAgentTest, |
+ RememberLastNonEmptyPasswordOnSubmit_ScriptCleared); |
+ FRIEND_TEST_ALL_PREFIXES(PasswordAutofillAgentTest, |
+ RememberLastNonEmptyPasswordOnSubmit_UserCleared); |
+ FRIEND_TEST_ALL_PREFIXES(PasswordAutofillAgentTest, |
+ RememberLastNonEmptyPasswordOnSubmit_NewPassword); |
+ |
+ // RenderFrameObserver: |
bool OnMessageReceived(const IPC::Message& message) override; |
- void DidStartProvisionalLoad(blink::WebLocalFrame* frame) override; |
- void DidStartLoading() override; |
- void DidFinishDocumentLoad(blink::WebLocalFrame* frame) override; |
- void DidFinishLoad(blink::WebLocalFrame* frame) override; |
- void DidStopLoading() override; |
- void FrameDetached(blink::WebFrame* frame) override; |
- void FrameWillClose(blink::WebFrame* frame) override; |
+ void DidStartProvisionalLoad() override; |
+ void DidFinishDocumentLoad() override; |
+ void DidFinishLoad() override; |
+ void FrameWillClose() override; |
+ |
+ // Legacy RenderViewObserver: |
+ void DidStartLoading(); |
+ void DidStopLoading(); |
+ void FrameDetached(blink::WebFrame* frame); |
void WillSendSubmitEvent(blink::WebLocalFrame* frame, |
- const blink::WebFormElement& form) override; |
+ const blink::WebFormElement& form); |
void WillSubmitForm(blink::WebLocalFrame* frame, |
- const blink::WebFormElement& form) override; |
+ const blink::WebFormElement& form); |
// RenderView IPC handlers: |
void OnFillPasswordForm(int key, const PasswordFormFillData& form_data); |
@@ -152,7 +186,7 @@ class PasswordAutofillAgent : public content::RenderViewObserver { |
// Scans the given frame for password forms and sends them up to the browser. |
// If |only_visible| is true, only forms visible in the layout are sent. |
- void SendPasswordForms(blink::WebFrame* frame, bool only_visible); |
+ void SendPasswordForms(bool only_visible); |
bool ShowSuggestionPopup(const PasswordFormFillData& fill_data, |
const blink::WebInputElement& user_input, |
@@ -165,9 +199,8 @@ class PasswordAutofillAgent : public content::RenderViewObserver { |
const blink::WebInputElement& password, |
const PasswordFormFillData& fill_data); |
- // Invoked when the passed frame is closing. Gives us a chance to clear any |
- // reference we may have to elements in that frame. |
- void FrameClosing(const blink::WebFrame* frame); |
+ // Invoked when the frame is closing. |
+ void FrameClosing(); |
// Finds login information for a |node| that was previously filled. |
bool FindLoginInfo(const blink::WebNode& node, |
@@ -179,17 +212,14 @@ class PasswordAutofillAgent : public content::RenderViewObserver { |
void ClearPreview(blink::WebInputElement* username, |
blink::WebInputElement* password); |
- // If |provisionally_saved_forms_| contains a form for |current_frame| or its |
- // children, return such frame. |
- blink::WebFrame* CurrentOrChildFrameWithSavedForms( |
- const blink::WebFrame* current_frame); |
- |
// Extracts a PasswordForm from |form| and saves it as |
- // |provisionally_saved_forms_[frame]|, as long as it satisfies |restriction|. |
- void ProvisionallySavePassword(blink::WebLocalFrame* frame, |
- const blink::WebFormElement& form, |
+ // |provisionally_saved_form_|, as long as it satisfies |restriction|. |
+ void ProvisionallySavePassword(const blink::WebFormElement& form, |
ProvisionallySaveRestriction restriction); |
+ // Passes through |RenderViewObserver| method to |this|. |
+ LegacyPasswordAutofillAgent legacy_; |
+ |
// The logins we have filled so far with their associated info. |
LoginToPasswordInfoMap login_to_password_info_; |
// And the keys under which PasswordAutofillManager can find the same info. |
@@ -205,7 +235,7 @@ class PasswordAutofillAgent : public content::RenderViewObserver { |
// Set if the user might be submitting a password form on the current page, |
// but the submit may still fail (i.e. doesn't pass JavaScript validation). |
- FrameToPasswordFormMap provisionally_saved_forms_; |
+ scoped_ptr<PasswordForm> provisionally_saved_form_; |
PasswordValueGatekeeper gatekeeper_; |