1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_field.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_field.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FormFieldTest, Match) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillField field; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty strings match. 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, base::string16(), 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FormField::MATCH_LABEL)); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty pattern matches non-empty string. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("a"); 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, base::string16(), 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FormField::MATCH_LABEL)); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Strictly empty pattern matches empty string. 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) field.label = base::string16(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^$"), 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Strictly empty pattern does not match non-empty string. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("a"); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^$"), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-empty pattern doesn't match empty string. 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) field.label = base::string16(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("a"), 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Beginning of line. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("head_tail"); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^head"), 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^tail"), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // End of line. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("head_tail"); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("head$"), 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("tail$"), 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exact. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("head_tail"); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^head$"), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("^tail$"), 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("^head_tail$"), 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Escaped dots. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("m.i."); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: This pattern is misleading as the "." characters are wild cards. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m.i."), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m\\.i\\."), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("mXiX"); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("m.i."), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("m\\.i\\."), 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Repetition. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("headtail"); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("headXtail"); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("headXXXtail"); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.*tail"), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("headtail"); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("head.+tail"), 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("headXtail"); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.+tail"), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("headXXXtail"); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head.+tail"), 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Alternation. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("head_tail"); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head|other"), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("tail|other"), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("bad|good"), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Case sensitivity. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("xxxHeAd_tAiLxxx"); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("head_tail"), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Word boundaries. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field.label = ASCIIToUTF16("contains word:"); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormField::Match(&field, ASCIIToUTF16("\\bword\\b"), 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("\\bcon\\b"), 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the circumflex in 'crepe' is not treated as a word boundary. 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field.label = base::UTF8ToUTF16("cr" "\xC3\xAA" "pe"); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormField::Match(&field, ASCIIToUTF16("\\bcr\\b"), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormField::MATCH_LABEL)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that we ignore checkable elements. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(FormFieldTest, ParseFormFields) { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<AutofillField> fields; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormFieldData field_data; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_data.form_control_type = "text"; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_data.label = ASCIIToUTF16("Address line1"); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fields.push_back(new AutofillField(field_data, field_data.label)); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_data.is_checkable = true; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_data.label = ASCIIToUTF16("Is PO Box"); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fields.push_back(new AutofillField(field_data, field_data.label)); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // reset is_checkable to false. 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_data.is_checkable = false; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_data.label = ASCIIToUTF16("Address line2"); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fields.push_back(new AutofillField(field_data, field_data.label)); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldTypeMap field_type_map; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormField::ParseFormFields(fields.get(), &field_type_map); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checkable element shouldn't interfere with inference of Address line2. 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2U, field_type_map.size()); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ADDRESS_HOME_LINE1, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_type_map.find(ASCIIToUTF16("Address line1"))->second); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ADDRESS_HOME_LINE2, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_type_map.find(ASCIIToUTF16("Address line2"))->second); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 155