diff options
-rw-r--r-- | chrome/browser/history/visit_database_unittest.cc | 23 | ||||
-rw-r--r-- | chrome/chrome.xcodeproj/project.pbxproj | 6 | ||||
-rw-r--r-- | chrome/common/common.scons | 2 | ||||
-rw-r--r-- | chrome/common/l10n_util.cc | 89 | ||||
-rw-r--r-- | chrome/common/l10n_util_unittest.cc | 15 | ||||
-rw-r--r-- | chrome/test/unit/unit_tests.scons | 4 |
6 files changed, 108 insertions, 31 deletions
diff --git a/chrome/browser/history/visit_database_unittest.cc b/chrome/browser/history/visit_database_unittest.cc index 47846b6..1373e83 100644 --- a/chrome/browser/history/visit_database_unittest.cc +++ b/chrome/browser/history/visit_database_unittest.cc @@ -10,6 +10,7 @@ #include "chrome/common/sqlite_compiled_statement.h" #include "chrome/common/sqlite_utils.h" #include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" using base::Time; using base::TimeDelta; @@ -30,7 +31,7 @@ bool IsVisitInfoEqual(const VisitRow& a, } // namespace -class VisitDatabaseTest : public testing::Test, +class VisitDatabaseTest : public PlatformTest, public URLDatabase, public VisitDatabase { public: @@ -40,6 +41,7 @@ class VisitDatabaseTest : public testing::Test, private: // Test setup. void SetUp() { + PlatformTest::SetUp(); PathService::Get(base::DIR_TEMP, &db_file_); db_file_.push_back(FilePath::kSeparators[0]); db_file_.append(L"VisitTest.db"); @@ -58,6 +60,7 @@ class VisitDatabaseTest : public testing::Test, delete statement_cache_; sqlite3_close(db_); file_util::Delete(db_file_, false); + PlatformTest::TearDown(); } // Provided for URL/VisitDatabase. @@ -93,7 +96,7 @@ TEST_F(VisitDatabaseTest, Add) { // Query the first two. std::vector<VisitRow> matches; EXPECT_TRUE(GetVisitsForURL(visit_info1.url_id, &matches)); - EXPECT_EQ(2, matches.size()); + EXPECT_EQ(static_cast<size_t>(2), matches.size()); // Make sure we got both (order in result set is visit time). EXPECT_TRUE(IsVisitInfoEqual(matches[0], visit_info1) && @@ -122,7 +125,7 @@ TEST_F(VisitDatabaseTest, Delete) { // First make sure all the visits are there. std::vector<VisitRow> matches; EXPECT_TRUE(GetVisitsForURL(visit_info1.url_id, &matches)); - EXPECT_EQ(3, matches.size()); + EXPECT_EQ(static_cast<size_t>(3), matches.size()); EXPECT_TRUE(IsVisitInfoEqual(matches[0], visit_info1) && IsVisitInfoEqual(matches[1], visit_info2) && IsVisitInfoEqual(matches[2], visit_info3)); @@ -135,7 +138,7 @@ TEST_F(VisitDatabaseTest, Delete) { visit_info3.referring_visit = visit_info1.visit_id; matches.clear(); EXPECT_TRUE(GetVisitsForURL(visit_info1.url_id, &matches)); - EXPECT_EQ(2, matches.size()); + EXPECT_EQ(static_cast<size_t>(2), matches.size()); EXPECT_TRUE(IsVisitInfoEqual(matches[0], visit_info1) && IsVisitInfoEqual(matches[1], visit_info3)); } @@ -162,6 +165,8 @@ TEST_F(VisitDatabaseTest, Update) { // TODO(brettw) write test for GetMostRecentVisitForURL! +#if defined(OS_WIN) +// TODO(playmobil): Enable on POSIX TEST_F(VisitDatabaseTest, GetVisibleVisitsInRange) { // Add one visit. VisitRow visit_info1(1, Time::Now(), 0, @@ -214,7 +219,7 @@ TEST_F(VisitDatabaseTest, GetVisibleVisitsInRange) { // order, but not the redirect & subframe ones later. VisitVector results; GetVisibleVisitsInRange(Time(), Time(), false, 0, &results); - ASSERT_EQ(3, results.size()); + ASSERT_EQ(static_cast<size_t>(3), results.size()); EXPECT_TRUE(IsVisitInfoEqual(results[0], visit_info4) && IsVisitInfoEqual(results[1], visit_info2) && IsVisitInfoEqual(results[2], visit_info1)); @@ -222,7 +227,7 @@ TEST_F(VisitDatabaseTest, GetVisibleVisitsInRange) { // If we want only the most recent one, it should give us the same results // minus the first (duplicate of the second) one. GetVisibleVisitsInRange(Time(), Time(), true, 0, &results); - ASSERT_EQ(2, results.size()); + ASSERT_EQ(static_cast<size_t>(2), results.size()); EXPECT_TRUE(IsVisitInfoEqual(results[0], visit_info4) && IsVisitInfoEqual(results[1], visit_info2)); @@ -230,14 +235,14 @@ TEST_F(VisitDatabaseTest, GetVisibleVisitsInRange) { // exclusive. GetVisibleVisitsInRange(visit_info2.visit_time, visit_info4.visit_time, false, 0, &results); - ASSERT_EQ(1, results.size()); + ASSERT_EQ(static_cast<size_t>(1), results.size()); EXPECT_TRUE(IsVisitInfoEqual(results[0], visit_info2)); // Query for a max count and make sure we get only that number. GetVisibleVisitsInRange(Time(), Time(), false, 2, &results); - ASSERT_EQ(2, results.size()); + ASSERT_EQ(static_cast<size_t>(2), results.size()); EXPECT_TRUE(IsVisitInfoEqual(results[0], visit_info4) && IsVisitInfoEqual(results[1], visit_info2)); } - +#endif // defined(OS_WIN) } // namespace history diff --git a/chrome/chrome.xcodeproj/project.pbxproj b/chrome/chrome.xcodeproj/project.pbxproj index 8a3e1c9..f331fed 100644 --- a/chrome/chrome.xcodeproj/project.pbxproj +++ b/chrome/chrome.xcodeproj/project.pbxproj @@ -153,11 +153,14 @@ 4DDC64580EAE394200FB5EBE /* libzlib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DDC64550EAE392400FB5EBE /* libzlib.a */; }; A54612DC0EE9958600A8EE5D /* extensions_service_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = A54612DB0EE9958600A8EE5D /* extensions_service_unittest.cc */; }; A54612E20EE995F600A8EE5D /* extensions_service.cc in Sources */ = {isa = PBXBuildFile; fileRef = A54612D90EE9957000A8EE5D /* extensions_service.cc */; }; + B502DA280F098056005BE90C /* visit_database_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFA180E9D48F7009A6919 /* visit_database_unittest.cc */; }; + B502DA520F098888005BE90C /* l10n_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFBC90E9D4C9F009A6919 /* l10n_util.cc */; }; B503E0F00F0175FD00547DC6 /* greasemonkey_slave.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D640CC90EAE868600EBCFC0 /* greasemonkey_slave.cc */; }; B503E0FC0F01764800547DC6 /* greasemonkey_slave_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B503E0FB0F01764800547DC6 /* greasemonkey_slave_unittest.cc */; }; B503E1030F017C1000547DC6 /* librenderer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D640CEB0EAE86BD00EBCFC0 /* librenderer.a */; }; B507AC1F0F0048E10060FEE8 /* ipc_sync_message.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFBBA0E9D4C9F009A6919 /* ipc_sync_message.cc */; }; B507AC440F004B610060FEE8 /* ipc_sync_message_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFBBC0E9D4C9F009A6919 /* ipc_sync_message_unittest.cc */; }; + B52E29BE0F0AA333008AD1C8 /* l10n_util_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFBCB0E9D4C9F009A6919 /* l10n_util_unittest.cc */; }; B54BD8FC0ED622C00093FD54 /* mach_message_source_mac.cc in Sources */ = {isa = PBXBuildFile; fileRef = B54BD8FA0ED622C00093FD54 /* mach_message_source_mac.cc */; }; B562C8430ED49C830077A23F /* mach_ipc_mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = B562C8420ED49C830077A23F /* mach_ipc_mac.mm */; }; B562E2C70F0582F800FB1A4F /* common_glue.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFB9F0E9D4C9F009A6919 /* common_glue.cc */; }; @@ -3243,6 +3246,7 @@ B507AC440F004B610060FEE8 /* ipc_sync_message_unittest.cc in Sources */, 4D7BFCE30E9D4DCE009A6919 /* jpeg_codec_unittest.cc in Sources */, 4D7BFCE70E9D4DD4009A6919 /* json_value_serializer_unittest.cc in Sources */, + B52E29BE0F0AA333008AD1C8 /* l10n_util_unittest.cc in Sources */, 4DDC63E70EAE344300FB5EBE /* metrics_response_unittest.cc in Sources */, 4D7BFB580E9D4C43009A6919 /* page_range_unittest.cc in Sources */, 4D7BFB5F0E9D4C46009A6919 /* page_setup_unittest.cc in Sources */, @@ -3254,6 +3258,7 @@ E4F324980EE5D7DE002533CE /* snippet_unittest.cc in Sources */, 4D7BFB3E0E9D4C2F009A6919 /* text_database_unittest.cc in Sources */, 4D7BFB610E9D4C4B009A6919 /* units_unittest.cc in Sources */, + B502DA280F098056005BE90C /* visit_database_unittest.cc in Sources */, 4D7BFB420E9D4C35009A6919 /* visit_tracker_unittest.cc in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3280,6 +3285,7 @@ B507AC1F0F0048E10060FEE8 /* ipc_sync_message.cc in Sources */, 4D7BFC580E9D4D0E009A6919 /* jpeg_codec.cc in Sources */, 4D7BFC4B0E9D4D06009A6919 /* json_value_serializer.cc in Sources */, + B502DA520F098888005BE90C /* l10n_util.cc in Sources */, 4D7BFC540E9D4D09009A6919 /* libxml_utils.cc in Sources */, E4F3242C0EE5CBBF002533CE /* logging_chrome.cc in Sources */, B562C8430ED49C830077A23F /* mach_ipc_mac.mm in Sources */, diff --git a/chrome/common/common.scons b/chrome/common/common.scons index cfdc390..e72ed47 100644 --- a/chrome/common/common.scons +++ b/chrome/common/common.scons @@ -58,6 +58,7 @@ input_files.extend([ 'ipc_sync_message.cc', 'jpeg_codec.cc', 'json_value_serializer.cc', + 'l10n_util.cc', 'libxml_utils.cc', 'logging_chrome.cc', 'message_router.cc', @@ -103,7 +104,6 @@ if env.Bit('windows'): 'ipc_logging.cc', 'ipc_sync_channel.cc', 'jstemplate_builder.cc', - 'l10n_util.cc', 'net/url_request_intercept_job.cc', 'os_exchange_data.cc', 'plugin_messages.cc', diff --git a/chrome/common/l10n_util.cc b/chrome/common/l10n_util.cc index 199d937..71b2450 100644 --- a/chrome/common/l10n_util.cc +++ b/chrome/common/l10n_util.cc @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "build/build_config.h" + #include <algorithm> #include "chrome/common/l10n_util.h" @@ -15,13 +17,21 @@ #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/gfx/chrome_canvas.h" +#if defined(OS_WIN) +// TODO(port): re-enable. #include "chrome/common/resource_bundle.h" #include "chrome/views/view.h" +#endif // defined(OS_WIN) #include "unicode/coll.h" #include "unicode/locid.h" #include "unicode/rbbi.h" #include "unicode/uchar.h" +// TODO(playmobil): remove this undef once SkPostConfig.h is fixed. +// skia/include/corecg/SkPostConfig.h #defines strcasecmp() so we can't use +// base::strcasecmp() without #undefing it here. +#undef strcasecmp + namespace { // Added to the end of strings that are too big in TrucateString. @@ -99,10 +109,24 @@ class StringComparator : public std::binary_function<const std::wstring&, // Returns true if lhs preceeds rhs. bool operator() (const std::wstring& lhs, const std::wstring& rhs) { UErrorCode error = U_ZERO_ERROR; +#if defined(WCHAR_T_IS_UTF32) + // Need to convert to UTF-16 to be compatible with UnicodeString's + // constructor. + string16 lhs_utf16 = WideToUTF16(lhs); + string16 rhs_utf16 = WideToUTF16(rhs); + + UCollationResult result = collator_->compare( + static_cast<const UChar*>(lhs_utf16.c_str()), + static_cast<int>(lhs_utf16.length()), + static_cast<const UChar*>(rhs_utf16.c_str()), + static_cast<int>(rhs_utf16.length()), + error); +#else UCollationResult result = collator_->compare( static_cast<const UChar*>(lhs.c_str()), static_cast<int>(lhs.length()), static_cast<const UChar*>(rhs.c_str()), static_cast<int>(rhs.length()), error); +#endif DCHECK(U_SUCCESS(error)); return result == UCOL_LESS; @@ -127,8 +151,8 @@ bool IsDuplicateName(const std::string& locale_name) { // has to be added manually in GetAvailableLocales(). if (LowerCaseEqualsASCII(locale_name.substr(0, 3), "es_")) return true; - for (int i = 0; i < arraysize(kDuplicateNames); ++i) { - if (_stricmp(kDuplicateNames[i], locale_name.c_str()) == 0) + for (size_t i = 0; i < arraysize(kDuplicateNames); ++i) { + if (base::strcasecmp(kDuplicateNames[i], locale_name.c_str()) == 0) return true; } return false; @@ -195,7 +219,7 @@ bool CheckAndResolveLocale(const std::wstring& locale, {"en", L"en-US"}, }; - for (int i = 0; i < arraysize(alias_map); ++i) { + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(alias_map); ++i) { if (LowerCaseEqualsASCII(locale, alias_map[i].source)) { std::wstring tmp_locale(alias_map[i].dest); if (IsLocaleAvailable(tmp_locale, locale_path)) { @@ -274,9 +298,17 @@ std::wstring GetLocalName(const std::wstring& locale_code_wstr, const char* locale_code = locale_code_str.c_str(); UErrorCode error = U_ZERO_ERROR; const int buffer_size = 1024; + +#if defined(WCHAR_T_IS_UTF32) + string16 name_local_utf16; + int actual_size = uloc_getDisplayName(locale_code, app_locale.c_str(), + WriteInto(&name_local_utf16, buffer_size + 1), buffer_size, &error); + std::wstring name_local = UTF16ToWide(name_local_utf16); +#else std::wstring name_local; int actual_size = uloc_getDisplayName(locale_code, app_locale.c_str(), WriteInto(&name_local, buffer_size + 1), buffer_size, &error); +#endif DCHECK(U_SUCCESS(error)); name_local.resize(actual_size); // Add an RTL mark so parentheses are properly placed. @@ -286,6 +318,8 @@ std::wstring GetLocalName(const std::wstring& locale_code_wstr, return name_local; } +#if defined(OS_WIN) +// TODO(port): re-enable. std::wstring GetString(int message_id) { ResourceBundle &rb = ResourceBundle::GetSharedInstance(); return rb.GetLocalizedString(message_id); @@ -348,6 +382,7 @@ std::wstring GetStringF(int message_id, int a) { std::wstring GetStringF(int message_id, int64 a) { return GetStringF(message_id, Int64ToWString(a)); } +#endif // defined(OS_WIN) std::wstring TruncateString(const std::wstring& string, size_t length) { if (string.size() <= length) @@ -365,20 +400,25 @@ std::wstring TruncateString(const std::wstring& string, size_t length) { return kElideString; } +#if defined(WCHAR_T_IS_UTF32) + const string16 string_utf16 = WideToUTF16(string); +#else + const std::wstring &string_utf16 = string; +#endif // Use a line iterator to find the first boundary. UErrorCode status = U_ZERO_ERROR; scoped_ptr<RuleBasedBreakIterator> bi(static_cast<RuleBasedBreakIterator*>( RuleBasedBreakIterator::createLineInstance(Locale::getDefault(), status))); if (U_FAILURE(status)) return string.substr(0, max) + kElideString; - bi->setText(string.c_str()); + bi->setText(string_utf16.c_str()); int32_t index = bi->preceding(static_cast<int32_t>(max)); if (index == BreakIterator::DONE) { index = static_cast<int32_t>(max); } else { // Found a valid break (may be the beginning of the string). Now use // a character iterator to find the previous non-whitespace character. - StringCharacterIterator char_iterator(string.c_str()); + StringCharacterIterator char_iterator(string_utf16.c_str()); if (index == 0) { // No valid line breaks. Start at the end again. This ensures we break // on a valid character boundary. @@ -407,6 +447,18 @@ std::wstring TruncateString(const std::wstring& string, size_t length) { return string.substr(0, index) + kElideString; } +#if defined(WCHAR_T_IS_UTF32) +std::wstring ToLower(const std::wstring& string) { + string16 string_utf16 = WideToUTF16(string); + UnicodeString lower_u_str( + UnicodeString(string_utf16.c_str()).toLower(Locale::getDefault())); + string16 result_utf16; + lower_u_str.extract(0, lower_u_str.length(), + WriteInto(&result_utf16, lower_u_str.length() + 1)); + std::wstring result = UTF16ToWide(result_utf16); + return result; +} +#else std::wstring ToLower(const std::wstring& string) { UnicodeString lower_u_str( UnicodeString(string.c_str()).toLower(Locale::getDefault())); @@ -415,6 +467,7 @@ std::wstring ToLower(const std::wstring& string) { WriteInto(&result, lower_u_str.length() + 1)); return result; } +#endif // defined(WCHAR_T_IS_UTF32) // Returns the text direction. // This function retrieves the language corresponding to the default ICU locale @@ -497,7 +550,15 @@ void WrapStringWithRTLFormatting(std::wstring* text) { text->append(L"\x202C"); } -// Returns locale-dependent externded window styles. +int DefaultCanvasTextAlignment() { + if (GetTextDirection() == LEFT_TO_RIGHT) { + return ChromeCanvas::TEXT_ALIGN_LEFT; + } else { + return ChromeCanvas::TEXT_ALIGN_RIGHT; + } +} + +#if defined(OS_WIN) int GetExtendedStyles() { return GetTextDirection() == LEFT_TO_RIGHT ? 0 : WS_EX_LAYOUTRTL | WS_EX_RTLREADING; @@ -507,14 +568,6 @@ int GetExtendedTooltipStyles() { return GetTextDirection() == LEFT_TO_RIGHT ? 0 : WS_EX_LAYOUTRTL; } -int DefaultCanvasTextAlignment() { - if (GetTextDirection() == LEFT_TO_RIGHT) { - return ChromeCanvas::TEXT_ALIGN_LEFT; - } else { - return ChromeCanvas::TEXT_ALIGN_RIGHT; - } -} - void HWNDSetRTLLayout(HWND hwnd) { DWORD ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE); @@ -529,6 +582,7 @@ void HWNDSetRTLLayout(HWND hwnd) { ::InvalidateRect(hwnd, NULL, true); } } +#endif // defined(OS_WIN) void SortStrings(const std::wstring& locale, std::vector<std::wstring>* strings) { @@ -589,7 +643,12 @@ UBool BiDiLineIterator::Open(const std::wstring& text, return false; if (right_to_left && url) ubidi_setReorderingMode(bidi_, UBIDI_REORDER_RUNS_ONLY); - ubidi_setPara(bidi_, text.data(), static_cast<int>(text.length()), +#if defined(WCHAR_T_IS_UTF32) + const string16 text_utf16 = WideToUTF16(text); +#else + const std::wstring &text_utf16 = text; +#endif // U_SIZEOF_WCHAR_T != 4 + ubidi_setPara(bidi_, text_utf16.data(), static_cast<int>(text_utf16.length()), right_to_left ? UBIDI_DEFAULT_RTL : UBIDI_DEFAULT_LTR, NULL, &error); return U_SUCCESS(error); diff --git a/chrome/common/l10n_util_unittest.cc b/chrome/common/l10n_util_unittest.cc index ee14f23..18cb8f0 100644 --- a/chrome/common/l10n_util_unittest.cc +++ b/chrome/common/l10n_util_unittest.cc @@ -2,21 +2,27 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "build/build_config.h" + #include "base/file_util.h" #include "base/path_service.h" #include "base/string_util.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/l10n_util.h" +#if !defined(OS_MACOSX) #include "chrome/test/data/resource.h" +#endif #include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" #include "unicode/locid.h" namespace { -class L10nUtilTest: public testing::Test { +class L10nUtilTest: public PlatformTest { }; -TEST(L10nUtilTest, GetString) { +#if defined(OS_WIN) +TEST_F(L10nUtilTest, GetString) { std::wstring s = l10n_util::GetString(IDS_SIMPLE); EXPECT_EQ(std::wstring(L"Hello World!"), s); @@ -26,8 +32,9 @@ TEST(L10nUtilTest, GetString) { s = l10n_util::GetStringF(IDS_PLACEHOLDERS_2, 20); EXPECT_EQ(std::wstring(L"You owe me $20."), s); } +#endif // defined(OS_WIN) -TEST(L10nUtilTest, TruncateString) { +TEST_F(L10nUtilTest, TruncateString) { std::wstring string(L"foooooey bxxxar baz"); // Make sure it doesn't modify the string if length > string length. @@ -61,7 +68,7 @@ void SetICUDefaultLocale(const std::wstring& locale_string) { EXPECT_TRUE(U_SUCCESS(error_code)); } -TEST(L10nUtilTest, GetAppLocale) { +TEST_F(L10nUtilTest, GetAppLocale) { // Use a temporary locale dir so we don't have to actually build the locale // dlls for this test. std::wstring orig_locale_dir; diff --git a/chrome/test/unit/unit_tests.scons b/chrome/test/unit/unit_tests.scons index 14c1206..4fe3332 100644 --- a/chrome/test/unit/unit_tests.scons +++ b/chrome/test/unit/unit_tests.scons @@ -111,9 +111,11 @@ unit_test_files = [] unit_test_files.extend([ '$CHROME_DIR/common/ipc_sync_message_unittest.cc', + '$CHROME_DIR/common/l10n_util_unittest.cc', '$CHROME_DIR/common/property_bag_unittest.cc', '$CHROME_DIR/common/unzip_unittest.cc', '$CHROME_DIR/renderer/greasemonkey_slave_unittest.cc', + '$CHROME_DIR/browser/history/visit_database_unittest.cc', ]) if not env.Bit('mac'): @@ -180,7 +182,6 @@ if env.Bit('windows'): '$CHROME_DIR/browser/history/text_database_manager_unittest.cc', '$CHROME_DIR/browser/history/thumbnail_database_unittest.cc', '$CHROME_DIR/browser/history/url_database_unittest.cc', - '$CHROME_DIR/browser/history/visit_database_unittest.cc', '$CHROME_DIR/browser/importer/firefox_importer_unittest.cc', '$CHROME_DIR/browser/importer/importer_unittest.cc', '$CHROME_DIR/browser/metrics_log_unittest.cc', @@ -220,7 +221,6 @@ if env.Bit('windows'): '$CHROME_DIR/common/gfx/icon_util_unittest.cc', '$CHROME_DIR/common/gfx/text_elider_unittest.cc', '$CHROME_DIR/common/ipc_sync_channel_unittest.cc', - '$CHROME_DIR/common/l10n_util_unittest.cc', '$CHROME_DIR/common/os_exchange_data_unittest.cc', '$CHROME_DIR/common/pref_member_unittest.cc', '$CHROME_DIR/common/pref_service_unittest.cc', |