Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Side by Side Diff: components/autofill/content/renderer/password_generation_agent.cc

Issue 662493002: [Password Generation] Enable generation for dynamically created forms. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "components/autofill/content/renderer/password_generation_agent.h" 5 #include "components/autofill/content/renderer/password_generation_agent.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "components/autofill/content/common/autofill_messages.h" 10 #include "components/autofill/content/common/autofill_messages.h"
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 // document load finishes, so we need to clear previous states here before we 116 // document load finishes, so we need to clear previous states here before we
117 // hear back from the browser. We only clear this state on main frame load 117 // hear back from the browser. We only clear this state on main frame load
118 // as we don't want subframe loads to clear state that we have received from 118 // as we don't want subframe loads to clear state that we have received from
119 // the main frame. Note that we assume there is only one account creation 119 // the main frame. Note that we assume there is only one account creation
120 // form, but there could be multiple password forms in each frame. 120 // form, but there could be multiple password forms in each frame.
121 if (!frame->parent()) { 121 if (!frame->parent()) {
122 not_blacklisted_password_form_origins_.clear(); 122 not_blacklisted_password_form_origins_.clear();
123 generation_enabled_forms_.clear(); 123 generation_enabled_forms_.clear();
124 generation_element_.reset(); 124 generation_element_.reset();
125 possible_account_creation_form_.reset(new PasswordForm()); 125 possible_account_creation_form_.reset(new PasswordForm());
126 if (password_elements_.empty()) {
vabr (Chromium) 2014/10/16 07:46:15 If I understand correctly, this logs the event fro
Garrett Casto 2014/10/16 19:14:06 I think that happens rarely enough not to worry ab
127 password_generation::LogPasswordGenerationEvent(
128 password_generation::NO_SIGN_UP_DETECTED);
129 } else {
130 password_generation::LogPasswordGenerationEvent(
131 password_generation::SIGN_UP_DETECTED);
132 }
126 password_elements_.clear(); 133 password_elements_.clear();
127 password_is_generated_ = false; 134 password_is_generated_ = false;
128 if (password_edited_) { 135 if (password_edited_) {
129 password_generation::LogPasswordGenerationEvent( 136 password_generation::LogPasswordGenerationEvent(
130 password_generation::PASSWORD_EDITED); 137 password_generation::PASSWORD_EDITED);
131 } 138 }
132 password_edited_ = false; 139 password_edited_ = false;
133 140
134 if (generation_popup_shown_) { 141 if (generation_popup_shown_) {
135 password_generation::LogPasswordGenerationEvent( 142 password_generation::LogPasswordGenerationEvent(
136 password_generation::GENERATION_POPUP_SHOWN); 143 password_generation::GENERATION_POPUP_SHOWN);
137 } 144 }
138 generation_popup_shown_ = false; 145 generation_popup_shown_ = false;
139 146
140 if (editing_popup_shown_) { 147 if (editing_popup_shown_) {
141 password_generation::LogPasswordGenerationEvent( 148 password_generation::LogPasswordGenerationEvent(
142 password_generation::EDITING_POPUP_SHOWN); 149 password_generation::EDITING_POPUP_SHOWN);
143 } 150 }
144 editing_popup_shown_ = false; 151 editing_popup_shown_ = false;
145 } 152 }
146 } 153 }
147 154
155 void PasswordGenerationAgent::OnDynamicFormsSeen(blink::WebLocalFrame* frame) {
156 FindPossibleGenerationForm(frame);
157 }
158
148 void PasswordGenerationAgent::DidFinishLoad(blink::WebLocalFrame* frame) { 159 void PasswordGenerationAgent::DidFinishLoad(blink::WebLocalFrame* frame) {
160 FindPossibleGenerationForm(frame);
161 }
162
163 void PasswordGenerationAgent::FindPossibleGenerationForm(
164 blink::WebLocalFrame* frame) {
149 if (!enabled_) 165 if (!enabled_)
150 return; 166 return;
151 167
152 // We don't want to generate passwords if the browser won't store or sync 168 // We don't want to generate passwords if the browser won't store or sync
153 // them. 169 // them.
154 if (!ShouldAnalyzeDocument(frame->document())) 170 if (!ShouldAnalyzeDocument(frame->document()))
155 return; 171 return;
156 172
173 // If we have already found a signup form for this page, no need to continue.
174 if (!password_elements_.empty())
175 return;
176
157 blink::WebVector<blink::WebFormElement> forms; 177 blink::WebVector<blink::WebFormElement> forms;
158 frame->document().forms(forms); 178 frame->document().forms(forms);
159 for (size_t i = 0; i < forms.size(); ++i) { 179 for (size_t i = 0; i < forms.size(); ++i) {
160 if (forms[i].isNull()) 180 if (forms[i].isNull())
161 continue; 181 continue;
162 182
163 // If we can't get a valid PasswordForm, we skip this form because the 183 // If we can't get a valid PasswordForm, we skip this form because the
164 // the password won't get saved even if we generate it. 184 // the password won't get saved even if we generate it.
165 scoped_ptr<PasswordForm> password_form( 185 scoped_ptr<PasswordForm> password_form(
166 CreatePasswordForm(forms[i])); 186 CreatePasswordForm(forms[i]));
167 if (!password_form.get()) { 187 if (!password_form.get()) {
168 DVLOG(2) << "Skipping form as it would not be saved"; 188 DVLOG(2) << "Skipping form as it would not be saved";
169 continue; 189 continue;
170 } 190 }
171 191
172 // Do not generate password for GAIA since it is used to retrieve the 192 // Do not generate password for GAIA since it is used to retrieve the
173 // generated paswords. 193 // generated paswords.
174 GURL realm(password_form->signon_realm); 194 GURL realm(password_form->signon_realm);
175 if (realm == GaiaUrls::GetInstance()->gaia_login_form_realm()) 195 if (realm == GaiaUrls::GetInstance()->gaia_login_form_realm())
176 continue; 196 continue;
177 197
178 std::vector<blink::WebInputElement> passwords; 198 std::vector<blink::WebInputElement> passwords;
179 if (GetAccountCreationPasswordFields(forms[i], &passwords)) { 199 if (GetAccountCreationPasswordFields(forms[i], &passwords)) {
180 DVLOG(2) << "Account creation form detected"; 200 DVLOG(2) << "Account creation form detected";
181 password_generation::LogPasswordGenerationEvent(
182 password_generation::SIGN_UP_DETECTED);
183 password_elements_ = passwords; 201 password_elements_ = passwords;
184 possible_account_creation_form_.swap(password_form); 202 possible_account_creation_form_.swap(password_form);
185 DetermineGenerationElement(); 203 DetermineGenerationElement();
186 // We assume that there is only one account creation field per URL. 204 // We assume that there is only one account creation field per URL.
187 return; 205 return;
188 } 206 }
189 } 207 }
190 password_generation::LogPasswordGenerationEvent(
191 password_generation::NO_SIGN_UP_DETECTED);
192 } 208 }
193 209
194 bool PasswordGenerationAgent::ShouldAnalyzeDocument( 210 bool PasswordGenerationAgent::ShouldAnalyzeDocument(
195 const blink::WebDocument& document) const { 211 const blink::WebDocument& document) const {
196 // Make sure that this security origin is allowed to use password manager. 212 // Make sure that this security origin is allowed to use password manager.
197 // Generating a password that can't be saved is a bad idea. 213 // Generating a password that can't be saved is a bad idea.
198 blink::WebSecurityOrigin origin = document.securityOrigin(); 214 blink::WebSecurityOrigin origin = document.securityOrigin();
199 if (!origin.canAccessPasswordManager()) { 215 if (!origin.canAccessPasswordManager()) {
200 DVLOG(1) << "No PasswordManager access"; 216 DVLOG(1) << "No PasswordManager access";
201 return false; 217 return false;
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 *possible_account_creation_form_)); 396 *possible_account_creation_form_));
381 397
382 editing_popup_shown_ = true; 398 editing_popup_shown_ = true;
383 } 399 }
384 400
385 void PasswordGenerationAgent::HidePopup() { 401 void PasswordGenerationAgent::HidePopup() {
386 Send(new AutofillHostMsg_HidePasswordGenerationPopup(routing_id())); 402 Send(new AutofillHostMsg_HidePasswordGenerationPopup(routing_id()));
387 } 403 }
388 404
389 } // namespace autofill 405 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698