1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/autofill/core/common/save_password_progress_logger.h"
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <algorithm>
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/json/json_writer.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/logging.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/numerics/safe_conversions.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/string16.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/string_util.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/utf_string_conversions.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/values.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/autofill/core/common/password_form.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::checked_cast;
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::Value;
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::DictionaryValue;
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::FundamentalValue;
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::StringValue;
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace autofill {
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Note 1: Caching the ID->string map in an array would be probably faster, but
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// the switch statement is (a) robust against re-ordering, and (b) checks in
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// compile-time, that all IDs get a string assigned. The expected frequency of
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// calls is low enough (in particular, zero if password manager internals page
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// is not open), that optimizing for code robustness is preferred against speed.
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Note 2: The messages can be used as dictionary keys. Do not use '.' in them.
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstd::string GetStringFromID(SavePasswordProgressLogger::StringID id) {
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  switch (id) {
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_DECISION_ASK:
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Decision: ASK the user";
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_DECISION_DROP:
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Decision: DROP the password";
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_DECISION_SAVE:
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Decision: SAVE the password";
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_METHOD:
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Form method";
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_METHOD_GET:
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "GET";
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_METHOD_POST:
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "POST";
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_METHOD_EMPTY:
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "(empty)";
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_OTHER:
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "(other)";
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_SCHEME_HTML:
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "HTML";
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_SCHEME_BASIC:
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Basic";
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_SCHEME_DIGEST:
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Digest";
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_SCHEME_MESSAGE:
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Scheme";
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_SIGNON_REALM:
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Signon realm";
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_ORIGINAL_SIGNON_REALM:
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Original signon realm";
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_ORIGIN:
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Origin";
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_ACTION:
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Action";
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_USERNAME_ELEMENT:
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Username element";
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_PASSWORD_ELEMENT:
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Password element";
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_PASSWORD_AUTOCOMPLETE_SET:
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Password autocomplete set";
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_OLD_PASSWORD_ELEMENT:
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Old password element";
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_SSL_VALID:
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "SSL valid";
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_PASSWORD_GENERATED:
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Password generated";
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_TIMES_USED:
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Times used";
820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_USE_ADDITIONAL_AUTHENTICATION:
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Use additional authentication";
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_PSL_MATCH:
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "PSL match";
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_NAME_OR_ID:
870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Form name or ID";
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_MESSAGE:
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "Message";
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_SET_AUTH_METHOD:
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "LoginHandler::SetAuth";
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_AUTHENTICATION_HANDLED:
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Authentication already handled";
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_LOGINHANDLER_FORM:
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "LoginHandler reports this form";
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_SEND_PASSWORD_FORMS_METHOD:
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "PasswordAutofillAgent::SendPasswordForms";
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_SECURITY_ORIGIN:
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Security origin";
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_SECURITY_ORIGIN_FAILURE:
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Security origin cannot access password manager.";
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_WEBPAGE_EMPTY:
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Webpage is empty.";
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_NUMBER_OF_ALL_FORMS:
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Number of all forms";
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_FORM_FOUND_ON_PAGE:
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Form found on page";
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_FORM_IS_VISIBLE:
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Form is visible";
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_FORM_IS_PASSWORD:
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Form is a password form";
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_WILL_SUBMIT_FORM_METHOD:
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "PasswordAutofillAgent::WillSubmitForm";
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_HTML_FORM_FOR_SUBMIT:
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "HTML form for submit";
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_CREATED_PASSWORD_FORM:
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Created PasswordForm";
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_SUBMITTED_PASSWORD_REPLACED:
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Submitted password replaced with the provisionally saved one.";
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_DID_START_PROVISIONAL_LOAD_METHOD:
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "PasswordAutofillAgent::DidStartProvisionalLoad";
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_FORM_FRAME_EQ_FRAME:
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "form_frame == frame";
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_PROVISIONALLY_SAVED_FORM_FOR_FRAME:
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "provisionally_saved_forms_[form_frame]";
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_PASSWORD_FORM_FOUND_ON_PAGE:
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "PasswordForm found on the page";
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_PROVISIONALLY_SAVE_PASSWORD_METHOD:
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "PasswordManager::ProvisionallySavePassword";
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_PROVISIONALLY_SAVE_PASSWORD_FORM:
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "ProvisionallySavePassword form";
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_IS_SAVING_ENABLED:
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return "IsSavingEnabledForCurrentPage";
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_EMPTY_PASSWORD:
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Empty password";
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_EXACT_MATCH:
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Form manager found, exact match.";
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_MATCH_WITHOUT_ACTION:
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Form manager found, match except for action.";
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_NO_FORM_MANAGER:
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "No form manager found.";
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_FORM_BLACKLISTED:
1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Form blacklisted.";
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_INVALID_FORM:
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Invalid form.";
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_AUTOCOMPLETE_OFF:
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Autocomplete=off.";
1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_PROVISIONALLY_SAVED_FORM:
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "provisionally_saved_form";
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_IGNORE_POSSIBLE_USERNAMES:
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Ignore other possible usernames";
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_ON_PASSWORD_FORMS_RENDERED_METHOD:
1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "PasswordManager::OnPasswordFormsRendered";
1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_NO_PROVISIONAL_SAVE_MANAGER:
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "No provisional save manager";
1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_NUMBER_OF_VISIBLE_FORMS:
1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Number of visible forms";
1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_PASSWORD_FORM_REAPPEARED:
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Password form re-appeared";
1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_SAVING_DISABLED:
1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "Saving disabled";
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case SavePasswordProgressLogger::STRING_NO_MATCHING_FORM:
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return "No matching form";
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case SavePasswordProgressLogger::STRING_SSL_ERRORS_PRESENT:
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return "SSL errors present";
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case SavePasswordProgressLogger::STRING_ONLY_VISIBLE:
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return "only_visible";
1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case SavePasswordProgressLogger::STRING_INVALID:
1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return "INVALID";
1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      // Intentionally no default: clause here -- all IDs need to get covered.
1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  NOTREACHED();  // Win compilers don't believe this is unreachable.
1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return std::string();
1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Removes privacy sensitive parts of |url| (currently all but host and scheme).
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string ScrubURL(const GURL& url) {
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (url.is_valid())
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return url.GetWithEmptyPath().spec();
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return std::string();
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Returns true for all characters which we don't want to see in the logged IDs
1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// or names of HTML elements.
1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool IsUnwantedInElementID(char c) {
1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return !(c == '_' || c == '-' || IsAsciiAlpha(c) || IsAsciiDigit(c));
1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Replaces all characters satisfying IsUnwantedInElementID by a ' ', and turns
1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// all characters to lowercase. This damages some valid HTML element IDs or
1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// names, but it is likely that it will be still possible to match the scrubbed
1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// string to the original ID or name in the HTML doc. That's good enough for the
1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// logging purposes, and provides some security benefits.
1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstd::string ScrubElementID(std::string element_id) {
1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::replace_if(
1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      element_id.begin(), element_id.end(), IsUnwantedInElementID, ' ');
1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return StringToLowerASCII(element_id);
1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstd::string ScrubElementID(const base::string16& element_id) {
2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return ScrubElementID(base::UTF16ToUTF8(element_id));
2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string FormSchemeToString(PasswordForm::Scheme scheme) {
2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SavePasswordProgressLogger::StringID result_id =
2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      SavePasswordProgressLogger::STRING_INVALID;
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  switch (scheme) {
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case PasswordForm::SCHEME_HTML:
2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      result_id = SavePasswordProgressLogger::STRING_SCHEME_HTML;
2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case PasswordForm::SCHEME_BASIC:
2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      result_id = SavePasswordProgressLogger::STRING_SCHEME_BASIC;
2130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case PasswordForm::SCHEME_DIGEST:
2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      result_id = SavePasswordProgressLogger::STRING_SCHEME_DIGEST;
2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case PasswordForm::SCHEME_OTHER:
2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      result_id = SavePasswordProgressLogger::STRING_OTHER;
2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return GetStringFromID(result_id);
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstd::string FormMethodToString(const std::string& method) {
2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string method_processed;
2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  base::TrimWhitespaceASCII(
2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      StringToLowerASCII(method), base::TRIM_ALL, &method_processed);
2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SavePasswordProgressLogger::StringID result_id =
2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      SavePasswordProgressLogger::STRING_OTHER;
2300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (method_processed.empty())
2310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    result_id = SavePasswordProgressLogger::STRING_METHOD_EMPTY;
2320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  else if (method_processed == "get")
2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    result_id = SavePasswordProgressLogger::STRING_METHOD_GET;
2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  else if (method_processed == "post")
2350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    result_id = SavePasswordProgressLogger::STRING_METHOD_POST;
2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return GetStringFromID(result_id);
237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace
240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2410529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSavePasswordProgressLogger::SavePasswordProgressLogger() {
2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2440529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSavePasswordProgressLogger::~SavePasswordProgressLogger() {
2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogPasswordForm(
2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SavePasswordProgressLogger::StringID label,
2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const PasswordForm& form) {
250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DictionaryValue log;
2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_SCHEME_MESSAGE),
2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                FormSchemeToString(form.scheme));
2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_SCHEME_MESSAGE),
2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                FormSchemeToString(form.scheme));
2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_SIGNON_REALM),
2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                ScrubURL(GURL(form.signon_realm)));
2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_ORIGINAL_SIGNON_REALM),
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                ScrubURL(GURL(form.original_signon_realm)));
2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_ORIGIN), ScrubURL(form.origin));
2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_ACTION), ScrubURL(form.action));
2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_USERNAME_ELEMENT),
2620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                ScrubElementID(form.username_element));
2630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_PASSWORD_ELEMENT),
2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                ScrubElementID(form.password_element));
2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetBoolean(GetStringFromID(STRING_PASSWORD_AUTOCOMPLETE_SET),
2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 form.password_autocomplete_set);
2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_OLD_PASSWORD_ELEMENT),
2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                ScrubElementID(form.old_password_element));
2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetBoolean(GetStringFromID(STRING_SSL_VALID), form.ssl_valid);
2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetBoolean(GetStringFromID(STRING_PASSWORD_GENERATED),
271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                 form.type == PasswordForm::TYPE_GENERATED);
2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetInteger(GetStringFromID(STRING_TIMES_USED), form.times_used);
2730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetBoolean(GetStringFromID(STRING_USE_ADDITIONAL_AUTHENTICATION),
274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                 form.use_additional_authentication);
2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetBoolean(GetStringFromID(STRING_PSL_MATCH), form.IsPublicSuffixMatch());
2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LogValue(label, log);
277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogHTMLForm(
2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SavePasswordProgressLogger::StringID label,
2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const std::string& name_or_id,
2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const std::string& method,
2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const GURL& action) {
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DictionaryValue log;
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_NAME_OR_ID), ScrubElementID(name_or_id));
2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_METHOD), FormMethodToString(method));
2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  log.SetString(GetStringFromID(STRING_ACTION), ScrubURL(action));
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LogValue(label, log);
289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogURL(
2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SavePasswordProgressLogger::StringID label,
2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const GURL& url) {
2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LogValue(label, StringValue(ScrubURL(url)));
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogBoolean(
2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SavePasswordProgressLogger::StringID label,
2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool truth_value) {
3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LogValue(label, FundamentalValue(truth_value));
301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogNumber(
3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SavePasswordProgressLogger::StringID label,
3050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int signed_number) {
3060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LogValue(label, FundamentalValue(signed_number));
307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogNumber(
3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SavePasswordProgressLogger::StringID label,
3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    size_t unsigned_number) {
3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int signed_number = checked_cast<int, size_t>(unsigned_number);
3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LogNumber(label, signed_number);
314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogMessage(
3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SavePasswordProgressLogger::StringID message) {
3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LogValue(STRING_MESSAGE, StringValue(GetStringFromID(message)));
319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogValue(StringID label, const Value& log) {
322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string log_string;
323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool conversion_to_string_successful = base::JSONWriter::WriteWithOptions(
324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      &log, base::JSONWriter::OPTIONS_PRETTY_PRINT, &log_string);
325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(conversion_to_string_successful);
3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SendLog(GetStringFromID(label) + ": " + log_string);
327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace autofill
330