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

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

Issue 788183004: Add a flag for fill on account select without highlighting (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Rebase on ToT Created 5 years, 12 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_autofill_agent.h" 5 #include "components/autofill/content/renderer/password_autofill_agent.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 30 matching lines...) Expand all
41 #include "url/gurl.h" 41 #include "url/gurl.h"
42 42
43 namespace autofill { 43 namespace autofill {
44 namespace { 44 namespace {
45 45
46 // The size above which we stop triggering autocomplete. 46 // The size above which we stop triggering autocomplete.
47 static const size_t kMaximumTextSizeForAutocomplete = 1000; 47 static const size_t kMaximumTextSizeForAutocomplete = 1000;
48 48
49 // Experiment information 49 // Experiment information
50 const char kFillOnAccountSelectFieldTrialName[] = "FillOnAccountSelect"; 50 const char kFillOnAccountSelectFieldTrialName[] = "FillOnAccountSelect";
51 const char kFillOnAccountSelectFieldTrialEnabledGroup[] = "Enable"; 51 const char kFillOnAccountSelectFieldTrialEnabledWithHighlightGroup[] =
52 "EnableWithHighlight";
53 const char kFillOnAccountSelectFieldTrialEnabledWithNoHighlightGroup[] =
54 "EnableWithNoHighlight";
52 55
53 // Maps element names to the actual elements to simplify form filling. 56 // Maps element names to the actual elements to simplify form filling.
54 typedef std::map<base::string16, blink::WebInputElement> FormInputElementMap; 57 typedef std::map<base::string16, blink::WebInputElement> FormInputElementMap;
55 58
56 // Use the shorter name when referencing SavePasswordProgressLogger::StringID 59 // Use the shorter name when referencing SavePasswordProgressLogger::StringID
57 // values to spare line breaks. The code provides enough context for that 60 // values to spare line breaks. The code provides enough context for that
58 // already. 61 // already.
59 typedef SavePasswordProgressLogger Logger; 62 typedef SavePasswordProgressLogger Logger;
60 63
61 // Utility struct for form lookup and autofill. When we parse the DOM to look up 64 // Utility struct for form lookup and autofill. When we parse the DOM to look up
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 bool ShouldFillOnAccountSelect() { 134 bool ShouldFillOnAccountSelect() {
132 std::string group_name = 135 std::string group_name =
133 base::FieldTrialList::FindFullName(kFillOnAccountSelectFieldTrialName); 136 base::FieldTrialList::FindFullName(kFillOnAccountSelectFieldTrialName);
134 137
135 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 138 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
136 switches::kDisableFillOnAccountSelect)) { 139 switches::kDisableFillOnAccountSelect)) {
137 return false; 140 return false;
138 } 141 }
139 142
140 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 143 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
144 switches::kEnableFillOnAccountSelect) ||
145 base::CommandLine::ForCurrentProcess()->HasSwitch(
146 switches::kEnableFillOnAccountSelectNoHighlighting)) {
147 return true;
148 }
149
150 return group_name ==
151 kFillOnAccountSelectFieldTrialEnabledWithHighlightGroup ||
152 group_name ==
153 kFillOnAccountSelectFieldTrialEnabledWithNoHighlightGroup;
154 }
155
156 bool ShouldHighlightFields() {
157 std::string group_name =
158 base::FieldTrialList::FindFullName(kFillOnAccountSelectFieldTrialName);
159 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
160 switches::kDisableFillOnAccountSelect) ||
161 base::CommandLine::ForCurrentProcess()->HasSwitch(
141 switches::kEnableFillOnAccountSelect)) { 162 switches::kEnableFillOnAccountSelect)) {
142 return true; 163 return true;
143 } 164 }
144 165
145 return group_name == kFillOnAccountSelectFieldTrialEnabledGroup; 166 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
167 switches::kEnableFillOnAccountSelectNoHighlighting)) {
168 return false;
169 }
170
171 return group_name !=
172 kFillOnAccountSelectFieldTrialEnabledWithNoHighlightGroup;
146 } 173 }
147 174
148 // Helper to search the given form element for the specified input elements in 175 // Helper to search the given form element for the specified input elements in
149 // |data|, and add results to |result|. 176 // |data|, and add results to |result|.
150 bool FindFormInputElements(blink::WebFormElement* form_element, 177 bool FindFormInputElements(blink::WebFormElement* form_element,
151 const PasswordFormFillData& data, 178 const PasswordFormFillData& data,
152 FormElements* result) { 179 FormElements* result) {
153 return FindFormInputElement(form_element, data.password_field, result) && 180 return FindFormInputElement(form_element, data.password_field, result) &&
154 (!FillDataContainsUsername(data) || 181 (!FillDataContainsUsername(data) ||
155 FindFormInputElement(form_element, data.username_field, result)); 182 FindFormInputElement(form_element, data.username_field, result));
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 // If we can't modify the password, don't try to set the username 441 // If we can't modify the password, don't try to set the username
415 if (!IsElementAutocompletable(password_element)) 442 if (!IsElementAutocompletable(password_element))
416 return false; 443 return false;
417 444
418 bool form_contains_username_field = FillDataContainsUsername(fill_data); 445 bool form_contains_username_field = FillDataContainsUsername(fill_data);
419 // If the form contains an autocompletable username field, try to set the 446 // If the form contains an autocompletable username field, try to set the
420 // username to the preferred name, but only if: 447 // username to the preferred name, but only if:
421 // (a) The fill-on-account-select flag is not set, and 448 // (a) The fill-on-account-select flag is not set, and
422 // (b) The username element isn't prefilled 449 // (b) The username element isn't prefilled
423 // 450 //
424 // If (a) is false, then just mark the username element as autofilled and 451 // If (a) is false, then just mark the username element as autofilled if the
425 // return so the fill step is skipped. 452 // user is not in the "no highlighting" group and return so the fill step is
453 // skipped.
426 // 454 //
427 // If there is no autocompletable username field, and (a) is false, then the 455 // If there is no autocompletable username field, and (a) is false, then the
428 // username element cannot be autofilled, but the user should still be able to 456 // username element cannot be autofilled, but the user should still be able to
429 // select to fill the password element, so the password element must be marked 457 // select to fill the password element, so the password element must be marked
430 // as autofilled and the fill step should also be skipped. 458 // as autofilled and the fill step should also be skipped if the user is not
459 // in the "no highlighting" group.
431 // 460 //
432 // In all other cases, do nothing. 461 // In all other cases, do nothing.
433 bool form_has_fillable_username = form_contains_username_field && 462 bool form_has_fillable_username = form_contains_username_field &&
434 IsElementAutocompletable(username_element); 463 IsElementAutocompletable(username_element);
435 464
436 if (ShouldFillOnAccountSelect()) { 465 if (ShouldFillOnAccountSelect()) {
466 if (!ShouldHighlightFields()) {
467 return false;
468 }
469
437 if (form_has_fillable_username) { 470 if (form_has_fillable_username) {
438 username_element.setAutofilled(true); 471 username_element.setAutofilled(true);
439 } else { 472 } else {
440 password_element.setAutofilled(true); 473 password_element.setAutofilled(true);
441 } 474 }
442 return false; 475 return false;
443 } 476 }
444 477
445 if (form_has_fillable_username && username_element.value().isEmpty()) { 478 if (form_has_fillable_username && username_element.value().isEmpty()) {
446 // TODO(tkent): Check maxlength and pattern. 479 // TODO(tkent): Check maxlength and pattern.
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after
1322 DidStartProvisionalLoad(blink::WebLocalFrame* navigated_frame) { 1355 DidStartProvisionalLoad(blink::WebLocalFrame* navigated_frame) {
1323 agent_->LegacyDidStartProvisionalLoad(navigated_frame); 1356 agent_->LegacyDidStartProvisionalLoad(navigated_frame);
1324 } 1357 }
1325 1358
1326 void PasswordAutofillAgent::LegacyPasswordAutofillAgent::FrameDetached( 1359 void PasswordAutofillAgent::LegacyPasswordAutofillAgent::FrameDetached(
1327 blink::WebFrame* frame) { 1360 blink::WebFrame* frame) {
1328 agent_->FrameDetached(frame); 1361 agent_->FrameDetached(frame);
1329 } 1362 }
1330 1363
1331 } // namespace autofill 1364 } // namespace autofill
OLDNEW
« no previous file with comments | « chrome/browser/chrome_content_browser_client.cc ('k') | components/autofill/core/common/autofill_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698