1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/strings/string_util.h" 6 #include "base/strings/utf_string_conversions.h" 7 #include "components/password_manager/core/browser/password_form_data.h" 8 9 using autofill::PasswordForm; 10 11 namespace password_manager { 12 13 PasswordForm* CreatePasswordFormFromData( 14 const PasswordFormData& form_data) { 15 PasswordForm* form = new PasswordForm(); 16 form->scheme = form_data.scheme; 17 form->preferred = form_data.preferred; 18 form->ssl_valid = form_data.ssl_valid; 19 form->date_created = base::Time::FromDoubleT(form_data.creation_time); 20 if (form_data.signon_realm) 21 form->signon_realm = std::string(form_data.signon_realm); 22 if (form_data.origin) 23 form->origin = GURL(form_data.origin); 24 if (form_data.action) 25 form->action = GURL(form_data.action); 26 if (form_data.submit_element) 27 form->submit_element = base::WideToUTF16(form_data.submit_element); 28 if (form_data.username_element) 29 form->username_element = base::WideToUTF16(form_data.username_element); 30 if (form_data.password_element) 31 form->password_element = base::WideToUTF16(form_data.password_element); 32 if (form_data.username_value) { 33 form->username_value = base::WideToUTF16(form_data.username_value); 34 if (form_data.password_value) 35 form->password_value = base::WideToUTF16(form_data.password_value); 36 } else { 37 form->blacklisted_by_user = true; 38 } 39 return form; 40 } 41 42 typedef std::set<const autofill::PasswordForm*> SetOfForms; 43 44 bool ContainsSamePasswordFormsPtr( 45 const std::vector<PasswordForm*>& first, 46 const std::vector<PasswordForm*>& second) { 47 if (first.size() != second.size()) 48 return false; 49 50 // TODO(cramya): As per b/7079906, the STLport of Android causes a crash 51 // if we use expectations(first.begin(), first.end()) to copy a vector 52 // into a set rather than std::copy that is used below. 53 // Need to revert this once STLport is fixed. 54 SetOfForms expectations; 55 std::copy(first.begin(), first.end(), std::inserter(expectations, 56 expectations.begin())); 57 for (unsigned int i = 0; i < second.size(); ++i) { 58 const PasswordForm* actual = second[i]; 59 bool found_match = false; 60 for (SetOfForms::iterator it = expectations.begin(); 61 it != expectations.end(); ++it) { 62 const PasswordForm* expected = *it; 63 if (*expected == *actual) { 64 found_match = true; 65 expectations.erase(it); 66 break; 67 } 68 } 69 if (!found_match) { 70 LOG(ERROR) << "No match for:" << std::endl << *actual; 71 return false; 72 } 73 } 74 return true; 75 } 76 77 bool ContainsSamePasswordForms( 78 std::vector<autofill::PasswordForm>& first, 79 std::vector<autofill::PasswordForm>& second) { 80 std::vector<PasswordForm*> first_ptr; 81 for (unsigned int i = 0; i < first.size(); ++i) { 82 first_ptr.push_back(&first[i]); 83 } 84 std::vector<PasswordForm*> second_ptr; 85 for (unsigned int i = 0; i < second.size(); ++i) { 86 second_ptr.push_back(&second[i]); 87 } 88 return ContainsSamePasswordFormsPtr(first_ptr, second_ptr); 89 } 90 91 } // namespace password_manager 92