| Index: components/autofill/content/renderer/password_autofill_agent.cc
 | 
| diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
 | 
| index aee3f94116bd88b2d321da9d06828be675d15112..5c2ade82e0320fd2c0d1198c0c62de58937ac1ec 100644
 | 
| --- a/components/autofill/content/renderer/password_autofill_agent.cc
 | 
| +++ b/components/autofill/content/renderer/password_autofill_agent.cc
 | 
| @@ -12,11 +12,13 @@
 | 
|  #include <vector>
 | 
|  
 | 
|  #include "base/bind.h"
 | 
| +#include "base/command_line.h"
 | 
|  #include "base/i18n/case_conversion.h"
 | 
|  #include "base/memory/linked_ptr.h"
 | 
|  #include "base/memory/ptr_util.h"
 | 
|  #include "base/message_loop/message_loop.h"
 | 
|  #include "base/metrics/histogram_macros.h"
 | 
| +#include "base/strings/string_number_conversions.h"
 | 
|  #include "base/strings/string_util.h"
 | 
|  #include "base/strings/utf_string_conversions.h"
 | 
|  #include "base/threading/thread_task_runner_handle.h"
 | 
| @@ -25,6 +27,7 @@
 | 
|  #include "components/autofill/content/renderer/password_form_conversion_utils.h"
 | 
|  #include "components/autofill/content/renderer/renderer_save_password_progress_logger.h"
 | 
|  #include "components/autofill/core/common/autofill_constants.h"
 | 
| +#include "components/autofill/core/common/autofill_switches.h"
 | 
|  #include "components/autofill/core/common/autofill_util.h"
 | 
|  #include "components/autofill/core/common/form_field_data.h"
 | 
|  #include "components/autofill/core/common/password_form_fill_data.h"
 | 
| @@ -60,6 +63,9 @@ static const size_t kMaximumTextSizeForAutocomplete = 1000;
 | 
|  const char kDummyUsernameField[] = "anonymous_username";
 | 
|  const char kDummyPasswordField[] = "anonymous_password";
 | 
|  
 | 
| +const char kDebugAttributeForFormSignature[] = "form_signature";
 | 
| +const char kDebugAttributeForFieldSignature[] = "field_signature";
 | 
| +
 | 
|  // Maps element names to the actual elements to simplify form filling.
 | 
|  typedef std::map<base::string16, blink::WebInputElement> FormInputElementMap;
 | 
|  
 | 
| @@ -562,6 +568,37 @@ bool FillFormOnPasswordReceived(
 | 
|        field_value_and_properties_map, registration_callback, logger);
 | 
|  }
 | 
|  
 | 
| +// Annotate |forms| with form and field signatures as HTML attributes.
 | 
| +void AnnotateFormsWithSignatures(
 | 
| +    blink::WebVector<blink::WebFormElement> forms) {
 | 
| +  for (blink::WebFormElement form : forms) {
 | 
| +    std::unique_ptr<PasswordForm> password_form(
 | 
| +        CreatePasswordFormFromWebForm(form, nullptr, nullptr));
 | 
| +    if (password_form) {
 | 
| +      form.setAttribute(
 | 
| +          blink::WebString::fromASCII(kDebugAttributeForFormSignature),
 | 
| +          blink::WebString::fromUTF8(base::Uint64ToString(
 | 
| +              CalculateFormSignature(password_form->form_data))));
 | 
| +
 | 
| +      blink::WebVector<blink::WebFormControlElement> control_elements =
 | 
| +          form_util::ExtractAutofillableElementsInForm(form);
 | 
| +      DCHECK(control_elements.size() == password_form->form_data.fields.size());
 | 
| +      for (size_t i = 0; i < control_elements.size(); ++i) {
 | 
| +        blink::WebFormControlElement& control_element = control_elements[i];
 | 
| +        if (!form_util::IsAutofillableElement(control_element))
 | 
| +          continue;
 | 
| +
 | 
| +        const FormFieldData& field = password_form->form_data.fields[i];
 | 
| +        DCHECK(field.name == control_element.nameForAutofill().utf16());
 | 
| +        control_element.setAttribute(
 | 
| +            blink::WebString::fromASCII(kDebugAttributeForFieldSignature),
 | 
| +            blink::WebString::fromUTF8(
 | 
| +                base::Uint64ToString(CalculateFieldSignatureForField(field))));
 | 
| +      }
 | 
| +    }
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  ////////////////////////////////////////////////////////////////////////////////
 | 
| @@ -1016,6 +1053,10 @@ void PasswordAutofillAgent::SendPasswordForms(bool only_visible) {
 | 
|  
 | 
|    blink::WebVector<blink::WebFormElement> forms;
 | 
|    frame->document().forms(forms);
 | 
| +  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
 | 
| +          switches::kShowAutofillSignatures)) {
 | 
| +    AnnotateFormsWithSignatures(forms);
 | 
| +  }
 | 
|    if (logger)
 | 
|      logger->LogNumber(Logger::STRING_NUMBER_OF_ALL_FORMS, forms.size());
 | 
|  
 | 
| 
 |