Commit e657f3fa authored by Olivier Robin's avatar Olivier Robin Committed by Commit Bot

Fix filling unowned fields.

The fetchForms... uses an empty form name to fetch all the forms.
This conflicts with the empty form name for filling formless checkouts.

Add a specific parameter and fix the javascript method to fill these fields.


Bug: 780050
Change-Id: Ia9fc514db6118a79af40dcd12b2312387f7ae726
Reviewed-on: https://chromium-review.googlesource.com/747101
Commit-Queue: Olivier Robin <olivierrobin@chromium.org>
Reviewed-by: default avatarMoe Ahmadi <mahmadi@chromium.org>
Reviewed-by: default avatarPeter Lee <pkl@chromium.org>
Cr-Commit-Position: refs/heads/master@{#515197}
parent 3ce8989f
......@@ -98,13 +98,17 @@ void GetFormAndField(autofill::FormData* form,
// Invokes the form extraction script and loads the output into the format
// expected by the AutofillManager.
// If |formName| is non-empty, only a form of that name is extracted.
// If |filtered| is NO, all forms are extracted.
// If |filtered| is YES,
// - if |formName| is non-empty, only a form of that name is extracted.
// - if |formName| is empty, unowned fields are extracted.
// Only forms with at least |requiredFieldsCount| fields are extracted.
// Calls |completionHandler| with a success BOOL of YES and the form data that
// was extracted.
// Calls |completionHandler| with NO if the forms could not be extracted.
// |completionHandler| cannot be nil.
- (void)fetchFormsWithName:(const base::string16&)formName
- (void)fetchFormsFiltered:(BOOL)filtered
withName:(const base::string16&)formName
minimumRequiredFieldsCount:(NSUInteger)requiredFieldsCount
pageURL:(const GURL&)pageURL
completionHandler:(FetchFormsCompletionHandler)completionHandler;
......@@ -112,9 +116,14 @@ void GetFormAndField(autofill::FormData* form,
// Processes the JSON form data extracted from the page into the format expected
// by AutofillManager and fills it in |formsData|.
// |formsData| cannot be nil.
// |filtered| and |formName| limit the field that will be returned in
// |formData|. See
// |fetchFormsFiltered:withName:minimumRequiredFieldsCount:pageURL:
// completionHandler:| for details.
// Returns a BOOL indicating the success value and the vector of form data.
- (BOOL)getExtractedFormsData:(FormDataVector*)formsData
fromJSON:(NSString*)formJSON
filtered:(BOOL)filtered
formName:(const base::string16&)formName
pageURL:(const GURL&)pageURL;
......@@ -309,7 +318,8 @@ void GetFormAndField(autofill::FormData* form,
autofill::KeyboardAccessoryMetricsLogger::OnFormSubmitted();
}
- (void)fetchFormsWithName:(const base::string16&)formName
- (void)fetchFormsFiltered:(BOOL)filtered
withName:(const base::string16&)formName
minimumRequiredFieldsCount:(NSUInteger)requiredFieldsCount
pageURL:(const GURL&)pageURL
completionHandler:(FetchFormsCompletionHandler)completionHandler {
......@@ -337,6 +347,7 @@ void GetFormAndField(autofill::FormData* form,
BOOL success =
[weakSelf getExtractedFormsData:&formData
fromJSON:formJSON
filtered:filtered
formName:formNameCopy
pageURL:pageURLCopy];
completionHandler(success, formData);
......@@ -345,6 +356,7 @@ void GetFormAndField(autofill::FormData* form,
- (BOOL)getExtractedFormsData:(FormDataVector*)formsData
fromJSON:(NSString*)formJSON
filtered:(BOOL)filtered
formName:(const base::string16&)formName
pageURL:(const GURL&)pageURL {
DCHECK(formsData);
......@@ -382,7 +394,7 @@ void GetFormAndField(autofill::FormData* form,
autofill::FormData form;
if (!formData->GetString("name", &form.name))
return NO;
if (!formName.empty() && formName != form.name)
if (filtered && formName != form.name)
continue;
// Origin is mandatory.
......@@ -553,7 +565,8 @@ void GetFormAndField(autofill::FormData* form,
// Re-extract the active form and field only. All forms with at least one
// input element are considered because key/value suggestions are offered
// even on short forms.
[self fetchFormsWithName:base::SysNSStringToUTF16(formName)
[self fetchFormsFiltered:YES
withName:base::SysNSStringToUTF16(formName)
minimumRequiredFieldsCount:1
pageURL:pageURL
completionHandler:completionHandler];
......@@ -646,7 +659,8 @@ void GetFormAndField(autofill::FormData* form,
// password form data if the page has changed. In most cases this code wins
// the race.
// TODO(crbug.com/418827): Fix this by passing in more data from the JS side.
[self fetchFormsWithName:base::UTF8ToUTF16(formName)
[self fetchFormsFiltered:YES
withName:base::UTF8ToUTF16(formName)
minimumRequiredFieldsCount:1
pageURL:pageURL
completionHandler:completionHandler];
......@@ -698,7 +712,8 @@ void GetFormAndField(autofill::FormData* form,
// Because of the cost of communicating with the server, only forms that have
// enough forms to make them likely candidates for profile completion are
// extracted.
[self fetchFormsWithName:base::string16()
[self fetchFormsFiltered:NO
withName:base::string16()
minimumRequiredFieldsCount:autofill::kRequiredFieldsForPredictionRoutines
pageURL:pageURL
completionHandler:completionHandler];
......@@ -750,8 +765,9 @@ void GetFormAndField(autofill::FormData* form,
};
// Re-extract the active form and field only. There is no minimum field
// requirement because key/value suggestions are offered event on short forms.
[self fetchFormsWithName:base::UTF8ToUTF16(params.form_name)
// requirement because key/value suggestions are offered even on short forms.
[self fetchFormsFiltered:YES
withName:base::UTF8ToUTF16(params.form_name)
minimumRequiredFieldsCount:1
pageURL:pageURL
completionHandler:completionHandler];
......
......@@ -604,7 +604,14 @@ __gCrWeb.autofill['fillForm'] = function(data, forceFillFieldName) {
};
var form = __gCrWeb.common.getFormElementFromIdentifier(data.formName);
var controlElements = __gCrWeb.common.getFormControlElements(form);
var controlElements = [];
if (form) {
controlElements = __gCrWeb.common.getFormControlElements(form);
} else {
var fieldsets = [];
controlElements =
getUnownedAutofillableFormFieldElements_(document.all, fieldsets);
}
for (var i = 0; i < controlElements.length; ++i) {
var element = controlElements[i];
if (!__gCrWeb.autofill.isAutofillableElement(element)) {
......@@ -644,18 +651,20 @@ __gCrWeb.autofill['fillForm'] = function(data, forceFillFieldName) {
element.addEventListener('input', controlElementInputListener);
}
// Remove Autofill styling when form receives 'reset' event.
// Individual control elements may be left with 'input' event listeners but
// they are harmless.
var formResetListener = function(evt) {
var controlElements = __gCrWeb.common.getFormControlElements(evt.target);
for (var i = 0; i < controlElements.length; ++i) {
controlElements[i].removeAttribute('chrome-autofilled');
controlElements[i].isAutofilled = false;
}
evt.target.removeEventListener('reset', formResetListener);
};
form.addEventListener('reset', formResetListener);
if (form) {
// Remove Autofill styling when form receives 'reset' event.
// Individual control elements may be left with 'input' event listeners but
// they are harmless.
var formResetListener = function(evt) {
var controlElements = __gCrWeb.common.getFormControlElements(evt.target);
for (var i = 0; i < controlElements.length; ++i) {
controlElements[i].removeAttribute('chrome-autofilled');
controlElements[i].isAutofilled = false;
}
evt.target.removeEventListener('reset', formResetListener);
};
form.addEventListener('reset', formResetListener);
}
};
/**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment