1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 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) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_l10n_util.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "extensions/common/error_utils.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_paths.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "extensions/common/manifest_constants.h" 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/message_bundle.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace extensions { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace errors = manifest_errors; 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace keys = manifest_keys; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST(ExtensionL10nUtil, ValidateLocalesWithBadLocale) { 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::ScopedTempDir temp; 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath src_path = temp.path().Append(kLocaleFolder); 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath locale = src_path.AppendASCII("ms"); 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(locale)); 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath messages_file = locale.Append(kMessagesFilename); 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string data = "{ \"name\":"; 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile(messages_file, data.c_str(), data.length())); 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::DictionaryValue manifest; 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) manifest.SetString(keys::kDefaultLocale, "en"); 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string error; 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FALSE(extension_l10n_util::ValidateExtensionLocales( 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) temp.path(), &manifest, &error)); 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_THAT( 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch error, 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch testing::HasSubstr(base::UTF16ToUTF8(messages_file.LossyDisplayName()))); 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetValidLocalesEmptyLocaleFolder) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_path = temp.path().Append(kLocaleFolder); 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(src_path)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> locales; 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE( 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_l10n_util::GetValidLocales(src_path, &locales, &error)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(locales.empty()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetValidLocalesWithValidLocaleNoMessagesFile) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_path = temp.path().Append(kLocaleFolder); 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(src_path)); 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(src_path.AppendASCII("sr"))); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> locales; 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE( 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_l10n_util::GetValidLocales(src_path, &locales, &error)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(locales.empty()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetValidLocalesWithUnsupportedLocale) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_path = temp.path().Append(kLocaleFolder); 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(src_path)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Supported locale. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath locale_1 = src_path.AppendASCII("sr"); 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(locale_1)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data("whatever"); 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile( 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch locale_1.Append(kMessagesFilename), data.c_str(), data.length())); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unsupported locale. 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(src_path.AppendASCII("xxx_yyy"))); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> locales; 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(extension_l10n_util::GetValidLocales(src_path, &locales, &error)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(locales.empty()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(locales.find("sr") != locales.end()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(locales.find("xxx_yyy") != locales.end()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetValidLocalesWithValidLocalesAndMessagesFile) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath install_dir; 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &install_dir)); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci install_dir = 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci install_dir.AppendASCII("extension_with_locales").Append(kLocaleFolder); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> locales; 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE( 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_l10n_util::GetValidLocales(install_dir, &locales, &error)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3U, locales.size()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(locales.find("sr") != locales.end()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(locales.find("en") != locales.end()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(locales.find("en_US") != locales.end()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LoadMessageCatalogsValidFallback) { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath install_dir; 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &install_dir)); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci install_dir = 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci install_dir.AppendASCII("extension_with_locales").Append(kLocaleFolder); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> locales; 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE( 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_l10n_util::GetValidLocales(install_dir, &locales, &error)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> bundle(extension_l10n_util::LoadMessageCatalogs( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_dir, "sr", "en_US", locales, &error)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(NULL == bundle.get()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Color", bundle->GetL10nMessage("color")); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Not in the US or GB.", bundle->GetL10nMessage("not_in_US_or_GB")); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LoadMessageCatalogsMissingFiles) { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_path = temp.path().Append(kLocaleFolder); 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(src_path)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> valid_locales; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_locales.insert("sr"); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_locales.insert("en"); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(NULL == extension_l10n_util::LoadMessageCatalogs( 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch src_path, "en", "sr", valid_locales, &error)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(error.empty()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LoadMessageCatalogsBadJSONFormat) { 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_path = temp.path().Append(kLocaleFolder); 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(src_path)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath locale = src_path.AppendASCII("sr"); 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(locale)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data = "{ \"name\":"; 170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath messages_file = locale.Append(kMessagesFilename); 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(base::WriteFile(messages_file, data.c_str(), data.length())); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> valid_locales; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_locales.insert("sr"); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_locales.insert("en_US"); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(NULL == extension_l10n_util::LoadMessageCatalogs( 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch src_path, "en_US", "sr", valid_locales, &error)); 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(ErrorUtils::FormatErrorMessage( 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch errors::kLocalesInvalidLocale, 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::UTF16ToUTF8(messages_file.LossyDisplayName()), 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "Line: 1, column: 10, Unexpected token."), 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch error); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LoadMessageCatalogsDuplicateKeys) { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_path = temp.path().Append(kLocaleFolder); 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(src_path)); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath locale_1 = src_path.AppendASCII("en"); 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(locale_1)); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data = 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "{ \"name\": { \"message\": \"something\" }, " 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "\"name\": { \"message\": \"something else\" } }"; 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(base::WriteFile( 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch locale_1.Append(kMessagesFilename), data.c_str(), data.length())); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath locale_2 = src_path.AppendASCII("sr"); 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateDirectory(locale_2)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(base::WriteFile( 206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch locale_2.Append(kMessagesFilename), data.c_str(), data.length())); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> valid_locales; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_locales.insert("sr"); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_locales.insert("en"); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // JSON parser hides duplicates. We are going to get only one key/value 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pair at the end. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> message_bundle( 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extension_l10n_util::LoadMessageCatalogs( 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch src_path, "en", "sr", valid_locales, &error)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != message_bundle.get()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Caller owns the returned object. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageBundle* CreateManifestBundle() { 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) linked_ptr<base::DictionaryValue> catalog(new base::DictionaryValue); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* name_tree = new base::DictionaryValue(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_tree->SetString("message", "name"); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catalog->Set("name", name_tree); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::DictionaryValue* short_name_tree = new base::DictionaryValue(); 2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) short_name_tree->SetString("message", "short_name"); 2318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) catalog->Set("short_name", short_name_tree); 2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* description_tree = new base::DictionaryValue(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description_tree->SetString("message", "description"); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catalog->Set("description", description_tree); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* action_title_tree = new base::DictionaryValue(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_title_tree->SetString("message", "action title"); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catalog->Set("title", action_title_tree); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* omnibox_keyword_tree = new base::DictionaryValue(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) omnibox_keyword_tree->SetString("message", "omnibox keyword"); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catalog->Set("omnibox_keyword", omnibox_keyword_tree); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* file_handler_title_tree = new base::DictionaryValue(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_handler_title_tree->SetString("message", "file handler title"); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catalog->Set("file_handler_title", file_handler_title_tree); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* launch_local_path_tree = new base::DictionaryValue(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launch_local_path_tree->SetString("message", "main.html"); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catalog->Set("launch_local_path", launch_local_path_tree); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* launch_web_url_tree = new base::DictionaryValue(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launch_web_url_tree->SetString("message", "http://www.google.com/"); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catalog->Set("launch_web_url", launch_web_url_tree); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::DictionaryValue* first_command_description_tree = 2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new base::DictionaryValue(); 2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) first_command_description_tree->SetString("message", "first command"); 2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) catalog->Set("first_command_description", first_command_description_tree); 2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::DictionaryValue* second_command_description_tree = 2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new base::DictionaryValue(); 2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) second_command_description_tree->SetString("message", "second command"); 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) catalog->Set("second_command_description", second_command_description_tree); 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::DictionaryValue* url_country_tree = new base::DictionaryValue(); 2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) url_country_tree->SetString("message", "de"); 2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) catalog->Set("country", url_country_tree); 2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<linked_ptr<base::DictionaryValue> > catalogs; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catalogs.push_back(catalog); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageBundle* bundle = MessageBundle::Create(catalogs, &error); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bundle); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bundle; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeEmptyManifest) { 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE( 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(errors::kInvalidName), error); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithoutNameMsgAndEmptyDescription) { 2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "no __MSG"); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kName, &result)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("no __MSG", result); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manifest.HasKey(keys::kDescription)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameMsgAndEmptyDescription) { 3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "__MSG_name__"); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kName, &result)); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name", result); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manifest.HasKey(keys::kDescription)); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithLocalLaunchURL) { 3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "name"); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kLaunchLocalPath, "__MSG_launch_local_path__"); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kLaunchLocalPath, &result)); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("main.html", result); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithHostedLaunchURL) { 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "name"); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kLaunchWebURL, "__MSG_launch_web_url__"); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kLaunchWebURL, &result)); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://www.google.com/", result); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithBadNameMsg) { 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "__MSG_name_is_bad__"); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kDescription, "__MSG_description__"); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE( 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kName, &result)); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("__MSG_name_is_bad__", result); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kDescription, &result)); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("__MSG_description__", result); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Variable __MSG_name_is_bad__ used but not defined.", error); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionDefaultTitleMsgs) { 3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "__MSG_name__"); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kDescription, "__MSG_description__"); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string action_title(keys::kBrowserAction); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_title.append("."); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action_title.append(keys::kPageActionDefaultTitle); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(action_title, "__MSG_title__"); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kName, &result)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name", result); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kDescription, &result)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("description", result); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(action_title, &result)); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("action title", result); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionOmniboxMsgs) { 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "__MSG_name__"); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kDescription, "__MSG_description__"); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kOmniboxKeyword, "__MSG_omnibox_keyword__"); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kName, &result)); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name", result); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kDescription, &result)); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("description", result); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kOmniboxKeyword, &result)); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("omnibox keyword", result); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionFileHandlerTitle) { 4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kName, "__MSG_name__"); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kDescription, "__MSG_description__"); 4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::ListValue* handlers = new base::ListValue(); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.Set(keys::kFileBrowserHandlers, handlers); 4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue* handler = new base::DictionaryValue(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlers->Append(handler); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler->SetString(keys::kPageActionDefaultTitle, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "__MSG_file_handler_title__"); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kName, &result)); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("name", result); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kDescription, &result)); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("description", result); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler->GetString(keys::kPageActionDefaultTitle, &result)); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("file handler title", result); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error.empty()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionCommandDescription) { 4663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::DictionaryValue manifest; 4673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) manifest.SetString(keys::kName, "__MSG_name__"); 4683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) manifest.SetString(keys::kDescription, "__MSG_description__"); 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* commands = new base::DictionaryValue(); 4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string commands_title(keys::kCommands); 4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) manifest.Set(commands_title, commands); 4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* first_command = new base::DictionaryValue(); 4743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) commands->Set("first_command", first_command); 4753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) first_command->SetString(keys::kDescription, 4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "__MSG_first_command_description__"); 4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* second_command = new base::DictionaryValue(); 4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) commands->Set("second_command", second_command); 4803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) second_command->SetString(keys::kDescription, 4813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "__MSG_second_command_description__"); 4823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string error; 4843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 4853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE( 4873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 4883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string result; 4903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kName, &result)); 4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("name", result); 4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kDescription, &result)); 4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("description", result); 4953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE( 497c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manifest.GetString("commands.first_command.description", &result)); 4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("first command", result); 4993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE( 501c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manifest.GetString("commands.second_command.description", &result)); 5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ("second command", result); 5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(error.empty()); 5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithShortName) { 5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::DictionaryValue manifest; 5098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) manifest.SetString(keys::kName, "extension name"); 5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) manifest.SetString(keys::kShortName, "__MSG_short_name__"); 5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string error; 5138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 5148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE( 5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE(error.empty()); 5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string result; 5208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kShortName, &result)); 5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ("short_name", result); 5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithBadShortName) { 5258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::DictionaryValue manifest; 5268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) manifest.SetString(keys::kName, "extension name"); 5278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) manifest.SetString(keys::kShortName, "__MSG_short_name_bad__"); 5288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string error; 5308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 5318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE( 5338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 5348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE(error.empty()); 5358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string result; 5378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kShortName, &result)); 5388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ("__MSG_short_name_bad__", result); 5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithSearchProviderMsgs) { 5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::DictionaryValue manifest; 5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) manifest.SetString(keys::kName, "__MSG_name__"); 5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) manifest.SetString(keys::kDescription, "__MSG_description__"); 5451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::DictionaryValue* search_provider = new base::DictionaryValue; 5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) search_provider->SetString("name", "__MSG_country__"); 5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) search_provider->SetString("keyword", "__MSG_omnibox_keyword__"); 5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) search_provider->SetString("search_url", "http://www.foo.__MSG_country__"); 5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) search_provider->SetString("favicon_url", "http://www.foo.__MSG_country__"); 5511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) search_provider->SetString("suggest_url", "http://www.foo.__MSG_country__"); 552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch manifest.Set(keys::kOverrideSearchProvider, search_provider); 553effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch manifest.SetString(keys::kOverrideHomepage, "http://www.foo.__MSG_country__"); 555effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::ListValue* startup_pages = new base::ListValue; 557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch startup_pages->AppendString("http://www.foo.__MSG_country__"); 558effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch manifest.Set(keys::kOverrideStartupPage, startup_pages); 5591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string error; 5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<MessageBundle> messages(CreateManifestBundle()); 5621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE( 5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) extension_l10n_util::LocalizeManifest(*messages, &manifest, &error)); 5651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string result; 5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kName, &result)); 5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("name", result); 5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(keys::kDescription, &result)); 5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("description", result); 5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 573effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string key_prefix(keys::kOverrideSearchProvider); 5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) key_prefix += '.'; 5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(key_prefix + "name", &result)); 5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("de", result); 5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(key_prefix + "keyword", &result)); 5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("omnibox keyword", result); 5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(key_prefix + "search_url", &result)); 5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("http://www.foo.de", result); 5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(key_prefix + "favicon_url", &result)); 5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("http://www.foo.de", result); 5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(manifest.GetString(key_prefix + "suggest_url", &result)); 5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ("http://www.foo.de", result); 5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 590effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(manifest.GetString(keys::kOverrideHomepage, &result)); 591effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("http://www.foo.de", result); 592effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 593effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(manifest.GetList(keys::kOverrideStartupPage, &startup_pages)); 594effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(startup_pages->GetString(0, &result)); 595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ("http://www.foo.de", result); 596effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(error.empty()); 5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with NULL manifest. 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithNullManifest) { 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(NULL)); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with default and current locales missing. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestEmptyManifest) { 6077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest)); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with missing current_locale. 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithDefaultLocale) { 6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kDefaultLocale, "en_US"); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(&manifest)); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with missing default_locale. 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithCurrentLocale) { 6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kCurrentLocale, 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::CurrentLocaleOrDefault()); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest)); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with all data present, but with same current_locale as system locale. 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestSameCurrentLocale) { 6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kDefaultLocale, "en_US"); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kCurrentLocale, 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::CurrentLocaleOrDefault()); 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest)); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with all data present, but with different current_locale. 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestDifferentCurrentLocale) { 6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::DictionaryValue manifest; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kDefaultLocale, "en_US"); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString(keys::kCurrentLocale, "sr"); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(&manifest)); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetAllFallbackLocales) { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> fallback_locales; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::GetAllFallbackLocales("en_US", "all", &fallback_locales); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fallback_locales.size()); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ("en_US", fallback_locales[0]); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ("en", fallback_locales[1]); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ("all", fallback_locales[2]); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace extensions 655