1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file. 4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/pickle.h" 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h" 10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace { 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This function serializes the form data into the pickle in version one format. 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// It should always be possible to deserialize it using DeserializeFormData(), 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// even when version changes. See kPickleVersion in form_data.cc. 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SerializeInVersion1Format(const autofill::FormData& form_data, 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Pickle* pickle) { 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteInt(1); 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteString16(form_data.name); 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::string16 method(base::ASCIIToUTF16("POST")); 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteString16(method); 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteString(form_data.origin.spec()); 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteString(form_data.action.spec()); 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteBool(form_data.user_submitted); 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteInt(static_cast<int>(form_data.fields.size())); 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t i = 0; i < form_data.fields.size(); ++i) { 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SerializeFormFieldData(form_data.fields[i], pickle); 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This function serializes the form data into the pickle in incorrect format 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// (no version number). 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SerializeIncorrectFormat(const autofill::FormData& form_data, 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Pickle* pickle) { 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteString16(form_data.name); 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteString(form_data.origin.spec()); 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteString(form_data.action.spec()); 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteBool(form_data.user_submitted); 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pickle->WriteInt(static_cast<int>(form_data.fields.size())); 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t i = 0; i < form_data.fields.size(); ++i) { 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SerializeFormFieldData(form_data.fields[i], pickle); 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace autofill { 49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST(FormDataTest, SerializeAndDeserialize) { 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FormData data; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.name = base::ASCIIToUTF16("name"); 53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) data.origin = GURL("origin"); 54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) data.action = GURL("action"); 55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) data.user_submitted = true; 56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FormFieldData field_data; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.label = base::ASCIIToUTF16("label"); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.name = base::ASCIIToUTF16("name"); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.value = base::ASCIIToUTF16("value"); 61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.form_control_type = "password"; 62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.autocomplete_attribute = "off"; 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.max_length = 200; 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.is_autofilled = true; 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.is_checked = true; 66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.is_checkable = true; 67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.is_focusable = true; 68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.should_autocomplete = false; 69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.text_direction = base::i18n::RIGHT_TO_LEFT; 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("First")); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("Second")); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("First")); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("Second")); 74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) data.fields.push_back(field_data); 76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Change a few fields. 78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) field_data.max_length = 150; 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("Third")); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("Third")); 81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) data.fields.push_back(field_data); 82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Pickle pickle; 84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SerializeFormData(data, &pickle); 85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PickleIterator iter(pickle); 87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FormData actual; 88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(DeserializeFormData(&iter, &actual)); 89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(actual, data); 91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(FormDataTest, Serialize_v1_Deserialize_vCurrent) { 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FormData data; 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.name = base::ASCIIToUTF16("name"); 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.origin = GURL("origin"); 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.action = GURL("action"); 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.user_submitted = true; 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FormFieldData field_data; 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.label = base::ASCIIToUTF16("label"); 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.name = base::ASCIIToUTF16("name"); 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.value = base::ASCIIToUTF16("value"); 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.form_control_type = "password"; 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.autocomplete_attribute = "off"; 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.max_length = 200; 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.is_autofilled = true; 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.is_checked = true; 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.is_checkable = true; 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.is_focusable = true; 11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.should_autocomplete = false; 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.text_direction = base::i18n::RIGHT_TO_LEFT; 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("First")); 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("Second")); 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("First")); 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("Second")); 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.fields.push_back(field_data); 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Change a few fields. 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.max_length = 150; 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("Third")); 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("Third")); 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.fields.push_back(field_data); 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Pickle pickle; 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SerializeInVersion1Format(data, &pickle); 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PickleIterator iter(pickle); 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FormData actual; 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(DeserializeFormData(&iter, &actual)); 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(actual, data); 13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(FormDataTest, SerializeIncorrectFormatAndDeserialize) { 13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FormData data; 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.name = base::ASCIIToUTF16("name"); 13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.origin = GURL("origin"); 14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.action = GURL("action"); 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.user_submitted = true; 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FormFieldData field_data; 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.label = base::ASCIIToUTF16("label"); 14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.name = base::ASCIIToUTF16("name"); 14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.value = base::ASCIIToUTF16("value"); 14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.form_control_type = "password"; 14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.autocomplete_attribute = "off"; 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.max_length = 200; 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.is_autofilled = true; 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.is_checked = true; 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.is_checkable = true; 15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.is_focusable = true; 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.should_autocomplete = false; 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.text_direction = base::i18n::RIGHT_TO_LEFT; 15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("First")); 15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("Second")); 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("First")); 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("Second")); 16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.fields.push_back(field_data); 16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Change a few fields. 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.max_length = 150; 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_values.push_back(base::ASCIIToUTF16("Third")); 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) field_data.option_contents.push_back(base::ASCIIToUTF16("Third")); 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.fields.push_back(field_data); 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Pickle pickle; 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SerializeIncorrectFormat(data, &pickle); 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PickleIterator iter(pickle); 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FormData actual; 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(DeserializeFormData(&iter, &actual)); 17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace autofill 178