1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "extensions/common/extension_l10n_util.h"
7 #include "base/files/file_path.h"
8 #include "base/files/file_util.h"
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/memory/linked_ptr.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/path_service.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "base/values.h"
15 #include "extensions/common/constants.h"
16 #include "extensions/common/error_utils.h"
17 #include "extensions/common/extension_paths.h"
18 #include "extensions/common/manifest_constants.h"
19 #include "extensions/common/message_bundle.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22 #include "ui/base/l10n/l10n_util.h"
24 namespace extensions
{
26 namespace errors
= manifest_errors
;
27 namespace keys
= manifest_keys
;
31 TEST(ExtensionL10nUtil
, ValidateLocalesWithBadLocale
) {
32 base::ScopedTempDir temp
;
33 ASSERT_TRUE(temp
.CreateUniqueTempDir());
35 base::FilePath src_path
= temp
.path().Append(kLocaleFolder
);
36 base::FilePath locale
= src_path
.AppendASCII("ms");
37 ASSERT_TRUE(base::CreateDirectory(locale
));
39 base::FilePath messages_file
= locale
.Append(kMessagesFilename
);
40 std::string data
= "{ \"name\":";
41 ASSERT_TRUE(base::WriteFile(messages_file
, data
.c_str(), data
.length()));
43 base::DictionaryValue manifest
;
44 manifest
.SetString(keys::kDefaultLocale
, "en");
46 EXPECT_FALSE(extension_l10n_util::ValidateExtensionLocales(
47 temp
.path(), &manifest
, &error
));
50 testing::HasSubstr(base::UTF16ToUTF8(messages_file
.LossyDisplayName())));
53 TEST(ExtensionL10nUtil
, GetValidLocalesEmptyLocaleFolder
) {
54 base::ScopedTempDir temp
;
55 ASSERT_TRUE(temp
.CreateUniqueTempDir());
57 base::FilePath src_path
= temp
.path().Append(kLocaleFolder
);
58 ASSERT_TRUE(base::CreateDirectory(src_path
));
61 std::set
<std::string
> locales
;
63 extension_l10n_util::GetValidLocales(src_path
, &locales
, &error
));
65 EXPECT_TRUE(locales
.empty());
68 TEST(ExtensionL10nUtil
, GetValidLocalesWithValidLocaleNoMessagesFile
) {
69 base::ScopedTempDir temp
;
70 ASSERT_TRUE(temp
.CreateUniqueTempDir());
72 base::FilePath src_path
= temp
.path().Append(kLocaleFolder
);
73 ASSERT_TRUE(base::CreateDirectory(src_path
));
74 ASSERT_TRUE(base::CreateDirectory(src_path
.AppendASCII("sr")));
77 std::set
<std::string
> locales
;
79 extension_l10n_util::GetValidLocales(src_path
, &locales
, &error
));
81 EXPECT_TRUE(locales
.empty());
84 TEST(ExtensionL10nUtil
, GetValidLocalesWithUnsupportedLocale
) {
85 base::ScopedTempDir temp
;
86 ASSERT_TRUE(temp
.CreateUniqueTempDir());
88 base::FilePath src_path
= temp
.path().Append(kLocaleFolder
);
89 ASSERT_TRUE(base::CreateDirectory(src_path
));
91 base::FilePath locale_1
= src_path
.AppendASCII("sr");
92 ASSERT_TRUE(base::CreateDirectory(locale_1
));
93 std::string
data("whatever");
94 ASSERT_TRUE(base::WriteFile(
95 locale_1
.Append(kMessagesFilename
), data
.c_str(), data
.length()));
96 // Unsupported locale.
97 ASSERT_TRUE(base::CreateDirectory(src_path
.AppendASCII("xxx_yyy")));
100 std::set
<std::string
> locales
;
101 EXPECT_TRUE(extension_l10n_util::GetValidLocales(src_path
, &locales
, &error
));
103 EXPECT_FALSE(locales
.empty());
104 EXPECT_TRUE(locales
.find("sr") != locales
.end());
105 EXPECT_FALSE(locales
.find("xxx_yyy") != locales
.end());
108 TEST(ExtensionL10nUtil
, GetValidLocalesWithValidLocalesAndMessagesFile
) {
109 base::FilePath install_dir
;
110 ASSERT_TRUE(PathService::Get(DIR_TEST_DATA
, &install_dir
));
112 install_dir
.AppendASCII("extension_with_locales").Append(kLocaleFolder
);
115 std::set
<std::string
> locales
;
117 extension_l10n_util::GetValidLocales(install_dir
, &locales
, &error
));
118 EXPECT_EQ(3U, locales
.size());
119 EXPECT_TRUE(locales
.find("sr") != locales
.end());
120 EXPECT_TRUE(locales
.find("en") != locales
.end());
121 EXPECT_TRUE(locales
.find("en_US") != locales
.end());
124 TEST(ExtensionL10nUtil
, LoadMessageCatalogsValidFallback
) {
125 base::FilePath install_dir
;
126 ASSERT_TRUE(PathService::Get(DIR_TEST_DATA
, &install_dir
));
128 install_dir
.AppendASCII("extension_with_locales").Append(kLocaleFolder
);
131 std::set
<std::string
> locales
;
133 extension_l10n_util::GetValidLocales(install_dir
, &locales
, &error
));
135 scoped_ptr
<MessageBundle
> bundle(extension_l10n_util::LoadMessageCatalogs(
136 install_dir
, "sr", "en_US", locales
, &error
));
137 ASSERT_FALSE(NULL
== bundle
.get());
138 EXPECT_TRUE(error
.empty());
139 EXPECT_EQ("Color", bundle
->GetL10nMessage("color"));
140 EXPECT_EQ("Not in the US or GB.", bundle
->GetL10nMessage("not_in_US_or_GB"));
143 TEST(ExtensionL10nUtil
, LoadMessageCatalogsMissingFiles
) {
144 base::ScopedTempDir temp
;
145 ASSERT_TRUE(temp
.CreateUniqueTempDir());
147 base::FilePath src_path
= temp
.path().Append(kLocaleFolder
);
148 ASSERT_TRUE(base::CreateDirectory(src_path
));
150 std::set
<std::string
> valid_locales
;
151 valid_locales
.insert("sr");
152 valid_locales
.insert("en");
154 EXPECT_TRUE(NULL
== extension_l10n_util::LoadMessageCatalogs(
155 src_path
, "en", "sr", valid_locales
, &error
));
156 EXPECT_FALSE(error
.empty());
159 TEST(ExtensionL10nUtil
, LoadMessageCatalogsBadJSONFormat
) {
160 base::ScopedTempDir temp
;
161 ASSERT_TRUE(temp
.CreateUniqueTempDir());
163 base::FilePath src_path
= temp
.path().Append(kLocaleFolder
);
164 ASSERT_TRUE(base::CreateDirectory(src_path
));
166 base::FilePath locale
= src_path
.AppendASCII("sr");
167 ASSERT_TRUE(base::CreateDirectory(locale
));
169 std::string data
= "{ \"name\":";
170 base::FilePath messages_file
= locale
.Append(kMessagesFilename
);
171 ASSERT_TRUE(base::WriteFile(messages_file
, data
.c_str(), data
.length()));
173 std::set
<std::string
> valid_locales
;
174 valid_locales
.insert("sr");
175 valid_locales
.insert("en_US");
177 EXPECT_TRUE(NULL
== extension_l10n_util::LoadMessageCatalogs(
178 src_path
, "en_US", "sr", valid_locales
, &error
));
179 EXPECT_EQ(ErrorUtils::FormatErrorMessage(
180 errors::kLocalesInvalidLocale
,
181 base::UTF16ToUTF8(messages_file
.LossyDisplayName()),
182 "Line: 1, column: 10, Unexpected token."),
186 TEST(ExtensionL10nUtil
, LoadMessageCatalogsDuplicateKeys
) {
187 base::ScopedTempDir temp
;
188 ASSERT_TRUE(temp
.CreateUniqueTempDir());
190 base::FilePath src_path
= temp
.path().Append(kLocaleFolder
);
191 ASSERT_TRUE(base::CreateDirectory(src_path
));
193 base::FilePath locale_1
= src_path
.AppendASCII("en");
194 ASSERT_TRUE(base::CreateDirectory(locale_1
));
197 "{ \"name\": { \"message\": \"something\" }, "
198 "\"name\": { \"message\": \"something else\" } }";
199 ASSERT_TRUE(base::WriteFile(
200 locale_1
.Append(kMessagesFilename
), data
.c_str(), data
.length()));
202 base::FilePath locale_2
= src_path
.AppendASCII("sr");
203 ASSERT_TRUE(base::CreateDirectory(locale_2
));
205 ASSERT_TRUE(base::WriteFile(
206 locale_2
.Append(kMessagesFilename
), data
.c_str(), data
.length()));
208 std::set
<std::string
> valid_locales
;
209 valid_locales
.insert("sr");
210 valid_locales
.insert("en");
212 // JSON parser hides duplicates. We are going to get only one key/value
214 scoped_ptr
<MessageBundle
> message_bundle(
215 extension_l10n_util::LoadMessageCatalogs(
216 src_path
, "en", "sr", valid_locales
, &error
));
217 EXPECT_TRUE(NULL
!= message_bundle
.get());
218 EXPECT_TRUE(error
.empty());
221 // Caller owns the returned object.
222 MessageBundle
* CreateManifestBundle() {
223 linked_ptr
<base::DictionaryValue
> catalog(new base::DictionaryValue
);
225 base::DictionaryValue
* name_tree
= new base::DictionaryValue();
226 name_tree
->SetString("message", "name");
227 catalog
->Set("name", name_tree
);
229 base::DictionaryValue
* short_name_tree
= new base::DictionaryValue();
230 short_name_tree
->SetString("message", "short_name");
231 catalog
->Set("short_name", short_name_tree
);
233 base::DictionaryValue
* description_tree
= new base::DictionaryValue();
234 description_tree
->SetString("message", "description");
235 catalog
->Set("description", description_tree
);
237 base::DictionaryValue
* action_title_tree
= new base::DictionaryValue();
238 action_title_tree
->SetString("message", "action title");
239 catalog
->Set("title", action_title_tree
);
241 base::DictionaryValue
* omnibox_keyword_tree
= new base::DictionaryValue();
242 omnibox_keyword_tree
->SetString("message", "omnibox keyword");
243 catalog
->Set("omnibox_keyword", omnibox_keyword_tree
);
245 base::DictionaryValue
* file_handler_title_tree
= new base::DictionaryValue();
246 file_handler_title_tree
->SetString("message", "file handler title");
247 catalog
->Set("file_handler_title", file_handler_title_tree
);
249 base::DictionaryValue
* launch_local_path_tree
= new base::DictionaryValue();
250 launch_local_path_tree
->SetString("message", "main.html");
251 catalog
->Set("launch_local_path", launch_local_path_tree
);
253 base::DictionaryValue
* launch_web_url_tree
= new base::DictionaryValue();
254 launch_web_url_tree
->SetString("message", "http://www.google.com/");
255 catalog
->Set("launch_web_url", launch_web_url_tree
);
257 base::DictionaryValue
* first_command_description_tree
=
258 new base::DictionaryValue();
259 first_command_description_tree
->SetString("message", "first command");
260 catalog
->Set("first_command_description", first_command_description_tree
);
262 base::DictionaryValue
* second_command_description_tree
=
263 new base::DictionaryValue();
264 second_command_description_tree
->SetString("message", "second command");
265 catalog
->Set("second_command_description", second_command_description_tree
);
267 base::DictionaryValue
* url_country_tree
= new base::DictionaryValue();
268 url_country_tree
->SetString("message", "de");
269 catalog
->Set("country", url_country_tree
);
271 std::vector
<linked_ptr
<base::DictionaryValue
> > catalogs
;
272 catalogs
.push_back(catalog
);
275 MessageBundle
* bundle
= MessageBundle::Create(catalogs
, &error
);
277 EXPECT_TRUE(error
.empty());
282 TEST(ExtensionL10nUtil
, LocalizeEmptyManifest
) {
283 base::DictionaryValue manifest
;
285 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
288 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
289 EXPECT_EQ(std::string(errors::kInvalidName
), error
);
292 TEST(ExtensionL10nUtil
, LocalizeManifestWithoutNameMsgAndEmptyDescription
) {
293 base::DictionaryValue manifest
;
294 manifest
.SetString(keys::kName
, "no __MSG");
296 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
299 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
302 ASSERT_TRUE(manifest
.GetString(keys::kName
, &result
));
303 EXPECT_EQ("no __MSG", result
);
305 EXPECT_FALSE(manifest
.HasKey(keys::kDescription
));
307 EXPECT_TRUE(error
.empty());
310 TEST(ExtensionL10nUtil
, LocalizeManifestWithNameMsgAndEmptyDescription
) {
311 base::DictionaryValue manifest
;
312 manifest
.SetString(keys::kName
, "__MSG_name__");
314 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
317 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
320 ASSERT_TRUE(manifest
.GetString(keys::kName
, &result
));
321 EXPECT_EQ("name", result
);
323 EXPECT_FALSE(manifest
.HasKey(keys::kDescription
));
325 EXPECT_TRUE(error
.empty());
328 TEST(ExtensionL10nUtil
, LocalizeManifestWithLocalLaunchURL
) {
329 base::DictionaryValue manifest
;
330 manifest
.SetString(keys::kName
, "name");
331 manifest
.SetString(keys::kLaunchLocalPath
, "__MSG_launch_local_path__");
333 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
336 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
339 ASSERT_TRUE(manifest
.GetString(keys::kLaunchLocalPath
, &result
));
340 EXPECT_EQ("main.html", result
);
342 EXPECT_TRUE(error
.empty());
345 TEST(ExtensionL10nUtil
, LocalizeManifestWithHostedLaunchURL
) {
346 base::DictionaryValue manifest
;
347 manifest
.SetString(keys::kName
, "name");
348 manifest
.SetString(keys::kLaunchWebURL
, "__MSG_launch_web_url__");
350 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
353 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
356 ASSERT_TRUE(manifest
.GetString(keys::kLaunchWebURL
, &result
));
357 EXPECT_EQ("http://www.google.com/", result
);
359 EXPECT_TRUE(error
.empty());
362 TEST(ExtensionL10nUtil
, LocalizeManifestWithBadNameMsg
) {
363 base::DictionaryValue manifest
;
364 manifest
.SetString(keys::kName
, "__MSG_name_is_bad__");
365 manifest
.SetString(keys::kDescription
, "__MSG_description__");
367 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
370 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
373 ASSERT_TRUE(manifest
.GetString(keys::kName
, &result
));
374 EXPECT_EQ("__MSG_name_is_bad__", result
);
376 ASSERT_TRUE(manifest
.GetString(keys::kDescription
, &result
));
377 EXPECT_EQ("__MSG_description__", result
);
379 EXPECT_EQ("Variable __MSG_name_is_bad__ used but not defined.", error
);
382 TEST(ExtensionL10nUtil
, LocalizeManifestWithNameDescriptionDefaultTitleMsgs
) {
383 base::DictionaryValue manifest
;
384 manifest
.SetString(keys::kName
, "__MSG_name__");
385 manifest
.SetString(keys::kDescription
, "__MSG_description__");
386 std::string
action_title(keys::kBrowserAction
);
387 action_title
.append(".");
388 action_title
.append(keys::kPageActionDefaultTitle
);
389 manifest
.SetString(action_title
, "__MSG_title__");
392 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
395 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
398 ASSERT_TRUE(manifest
.GetString(keys::kName
, &result
));
399 EXPECT_EQ("name", result
);
401 ASSERT_TRUE(manifest
.GetString(keys::kDescription
, &result
));
402 EXPECT_EQ("description", result
);
404 ASSERT_TRUE(manifest
.GetString(action_title
, &result
));
405 EXPECT_EQ("action title", result
);
407 EXPECT_TRUE(error
.empty());
410 TEST(ExtensionL10nUtil
, LocalizeManifestWithNameDescriptionOmniboxMsgs
) {
411 base::DictionaryValue manifest
;
412 manifest
.SetString(keys::kName
, "__MSG_name__");
413 manifest
.SetString(keys::kDescription
, "__MSG_description__");
414 manifest
.SetString(keys::kOmniboxKeyword
, "__MSG_omnibox_keyword__");
417 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
420 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
423 ASSERT_TRUE(manifest
.GetString(keys::kName
, &result
));
424 EXPECT_EQ("name", result
);
426 ASSERT_TRUE(manifest
.GetString(keys::kDescription
, &result
));
427 EXPECT_EQ("description", result
);
429 ASSERT_TRUE(manifest
.GetString(keys::kOmniboxKeyword
, &result
));
430 EXPECT_EQ("omnibox keyword", result
);
432 EXPECT_TRUE(error
.empty());
435 TEST(ExtensionL10nUtil
, LocalizeManifestWithNameDescriptionFileHandlerTitle
) {
436 base::DictionaryValue manifest
;
437 manifest
.SetString(keys::kName
, "__MSG_name__");
438 manifest
.SetString(keys::kDescription
, "__MSG_description__");
439 base::ListValue
* handlers
= new base::ListValue();
440 manifest
.Set(keys::kFileBrowserHandlers
, handlers
);
441 base::DictionaryValue
* handler
= new base::DictionaryValue();
442 handlers
->Append(handler
);
443 handler
->SetString(keys::kPageActionDefaultTitle
,
444 "__MSG_file_handler_title__");
447 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
450 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
453 ASSERT_TRUE(manifest
.GetString(keys::kName
, &result
));
454 EXPECT_EQ("name", result
);
456 ASSERT_TRUE(manifest
.GetString(keys::kDescription
, &result
));
457 EXPECT_EQ("description", result
);
459 ASSERT_TRUE(handler
->GetString(keys::kPageActionDefaultTitle
, &result
));
460 EXPECT_EQ("file handler title", result
);
462 EXPECT_TRUE(error
.empty());
465 TEST(ExtensionL10nUtil
, LocalizeManifestWithNameDescriptionCommandDescription
) {
466 base::DictionaryValue manifest
;
467 manifest
.SetString(keys::kName
, "__MSG_name__");
468 manifest
.SetString(keys::kDescription
, "__MSG_description__");
469 base::DictionaryValue
* commands
= new base::DictionaryValue();
470 std::string
commands_title(keys::kCommands
);
471 manifest
.Set(commands_title
, commands
);
473 base::DictionaryValue
* first_command
= new base::DictionaryValue();
474 commands
->Set("first_command", first_command
);
475 first_command
->SetString(keys::kDescription
,
476 "__MSG_first_command_description__");
478 base::DictionaryValue
* second_command
= new base::DictionaryValue();
479 commands
->Set("second_command", second_command
);
480 second_command
->SetString(keys::kDescription
,
481 "__MSG_second_command_description__");
484 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
487 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
490 ASSERT_TRUE(manifest
.GetString(keys::kName
, &result
));
491 EXPECT_EQ("name", result
);
493 ASSERT_TRUE(manifest
.GetString(keys::kDescription
, &result
));
494 EXPECT_EQ("description", result
);
497 manifest
.GetString("commands.first_command.description", &result
));
498 EXPECT_EQ("first command", result
);
501 manifest
.GetString("commands.second_command.description", &result
));
502 EXPECT_EQ("second command", result
);
504 EXPECT_TRUE(error
.empty());
507 TEST(ExtensionL10nUtil
, LocalizeManifestWithShortName
) {
508 base::DictionaryValue manifest
;
509 manifest
.SetString(keys::kName
, "extension name");
510 manifest
.SetString(keys::kShortName
, "__MSG_short_name__");
513 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
516 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
517 EXPECT_TRUE(error
.empty());
520 ASSERT_TRUE(manifest
.GetString(keys::kShortName
, &result
));
521 EXPECT_EQ("short_name", result
);
524 TEST(ExtensionL10nUtil
, LocalizeManifestWithBadShortName
) {
525 base::DictionaryValue manifest
;
526 manifest
.SetString(keys::kName
, "extension name");
527 manifest
.SetString(keys::kShortName
, "__MSG_short_name_bad__");
530 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
533 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
534 EXPECT_FALSE(error
.empty());
537 ASSERT_TRUE(manifest
.GetString(keys::kShortName
, &result
));
538 EXPECT_EQ("__MSG_short_name_bad__", result
);
541 TEST(ExtensionL10nUtil
, LocalizeManifestWithSearchProviderMsgs
) {
542 base::DictionaryValue manifest
;
543 manifest
.SetString(keys::kName
, "__MSG_name__");
544 manifest
.SetString(keys::kDescription
, "__MSG_description__");
546 base::DictionaryValue
* search_provider
= new base::DictionaryValue
;
547 search_provider
->SetString("name", "__MSG_country__");
548 search_provider
->SetString("keyword", "__MSG_omnibox_keyword__");
549 search_provider
->SetString("search_url", "http://www.foo.__MSG_country__");
550 search_provider
->SetString("favicon_url", "http://www.foo.__MSG_country__");
551 search_provider
->SetString("suggest_url", "http://www.foo.__MSG_country__");
552 manifest
.Set(keys::kOverrideSearchProvider
, search_provider
);
554 manifest
.SetString(keys::kOverrideHomepage
, "http://www.foo.__MSG_country__");
556 base::ListValue
* startup_pages
= new base::ListValue
;
557 startup_pages
->AppendString("http://www.foo.__MSG_country__");
558 manifest
.Set(keys::kOverrideStartupPage
, startup_pages
);
561 scoped_ptr
<MessageBundle
> messages(CreateManifestBundle());
564 extension_l10n_util::LocalizeManifest(*messages
, &manifest
, &error
));
567 ASSERT_TRUE(manifest
.GetString(keys::kName
, &result
));
568 EXPECT_EQ("name", result
);
570 ASSERT_TRUE(manifest
.GetString(keys::kDescription
, &result
));
571 EXPECT_EQ("description", result
);
573 std::string
key_prefix(keys::kOverrideSearchProvider
);
575 ASSERT_TRUE(manifest
.GetString(key_prefix
+ "name", &result
));
576 EXPECT_EQ("de", result
);
578 ASSERT_TRUE(manifest
.GetString(key_prefix
+ "keyword", &result
));
579 EXPECT_EQ("omnibox keyword", result
);
581 ASSERT_TRUE(manifest
.GetString(key_prefix
+ "search_url", &result
));
582 EXPECT_EQ("http://www.foo.de", result
);
584 ASSERT_TRUE(manifest
.GetString(key_prefix
+ "favicon_url", &result
));
585 EXPECT_EQ("http://www.foo.de", result
);
587 ASSERT_TRUE(manifest
.GetString(key_prefix
+ "suggest_url", &result
));
588 EXPECT_EQ("http://www.foo.de", result
);
590 ASSERT_TRUE(manifest
.GetString(keys::kOverrideHomepage
, &result
));
591 EXPECT_EQ("http://www.foo.de", result
);
593 ASSERT_TRUE(manifest
.GetList(keys::kOverrideStartupPage
, &startup_pages
));
594 ASSERT_TRUE(startup_pages
->GetString(0, &result
));
595 EXPECT_EQ("http://www.foo.de", result
);
597 EXPECT_TRUE(error
.empty());
600 // Try with NULL manifest.
601 TEST(ExtensionL10nUtil
, ShouldRelocalizeManifestWithNullManifest
) {
602 EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(NULL
));
605 // Try with default and current locales missing.
606 TEST(ExtensionL10nUtil
, ShouldRelocalizeManifestEmptyManifest
) {
607 base::DictionaryValue manifest
;
608 EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest
));
611 // Try with missing current_locale.
612 TEST(ExtensionL10nUtil
, ShouldRelocalizeManifestWithDefaultLocale
) {
613 base::DictionaryValue manifest
;
614 manifest
.SetString(keys::kDefaultLocale
, "en_US");
615 EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(&manifest
));
618 // Try with missing default_locale.
619 TEST(ExtensionL10nUtil
, ShouldRelocalizeManifestWithCurrentLocale
) {
620 base::DictionaryValue manifest
;
621 manifest
.SetString(keys::kCurrentLocale
,
622 extension_l10n_util::CurrentLocaleOrDefault());
623 EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest
));
626 // Try with all data present, but with same current_locale as system locale.
627 TEST(ExtensionL10nUtil
, ShouldRelocalizeManifestSameCurrentLocale
) {
628 base::DictionaryValue manifest
;
629 manifest
.SetString(keys::kDefaultLocale
, "en_US");
630 manifest
.SetString(keys::kCurrentLocale
,
631 extension_l10n_util::CurrentLocaleOrDefault());
632 EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest
));
635 // Try with all data present, but with different current_locale.
636 TEST(ExtensionL10nUtil
, ShouldRelocalizeManifestDifferentCurrentLocale
) {
637 base::DictionaryValue manifest
;
638 manifest
.SetString(keys::kDefaultLocale
, "en_US");
639 manifest
.SetString(keys::kCurrentLocale
, "sr");
640 EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(&manifest
));
643 TEST(ExtensionL10nUtil
, GetAllFallbackLocales
) {
644 std::vector
<std::string
> fallback_locales
;
645 extension_l10n_util::GetAllFallbackLocales("en_US", "all", &fallback_locales
);
646 ASSERT_EQ(3U, fallback_locales
.size());
648 CHECK_EQ("en_US", fallback_locales
[0]);
649 CHECK_EQ("en", fallback_locales
[1]);
650 CHECK_EQ("all", fallback_locales
[2]);
654 } // namespace extensions