| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/i18n/rtl.h" |
| #include "base/path_service.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/common/extensions/extension.h" |
| #include "chrome/common/extensions/extension_manifest_constants.h" |
| #include "chrome/common/extensions/manifest_tests/extension_manifest_test.h" |
| #include "chrome/common/extensions/manifest_url_handler.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| #if defined(TOOLKIT_GTK) |
| #include <gtk/gtk.h> |
| #endif |
| |
| namespace errors = extension_manifest_errors; |
| namespace keys = extensions::manifest_keys; |
| |
| namespace extensions { |
| |
| class InitValueManifestTest : public ExtensionManifestTest { |
| }; |
| |
| TEST_F(InitValueManifestTest, InitFromValueInvalid) { |
| Testcase testcases[] = { |
| Testcase("init_invalid_version_missing.json", errors::kInvalidVersion), |
| Testcase("init_invalid_version_invalid.json", errors::kInvalidVersion), |
| Testcase("init_invalid_name_missing.json", errors::kInvalidName), |
| Testcase("init_invalid_name_invalid.json", errors::kInvalidName), |
| Testcase("init_invalid_description_invalid.json", |
| errors::kInvalidDescription), |
| Testcase("init_invalid_icons_invalid.json", errors::kInvalidIcons), |
| Testcase("init_invalid_icons_path_invalid.json", errors::kInvalidIconPath), |
| Testcase("init_invalid_script_invalid.json", |
| errors::kInvalidContentScriptsList), |
| Testcase("init_invalid_script_item_invalid.json", |
| errors::kInvalidContentScript), |
| Testcase("init_invalid_script_matches_missing.json", |
| errors::kInvalidMatches), |
| Testcase("init_invalid_script_matches_invalid.json", |
| errors::kInvalidMatches), |
| Testcase("init_invalid_script_matches_empty.json", |
| errors::kInvalidMatchCount), |
| Testcase("init_invalid_script_match_item_invalid.json", |
| errors::kInvalidMatch), |
| Testcase("init_invalid_script_match_item_invalid_2.json", |
| errors::kInvalidMatch), |
| Testcase("init_invalid_script_files_missing.json", errors::kMissingFile), |
| Testcase("init_invalid_files_js_invalid.json", errors::kInvalidJsList), |
| Testcase("init_invalid_files_empty.json", errors::kMissingFile), |
| Testcase("init_invalid_files_js_empty_css_missing.json", |
| errors::kMissingFile), |
| Testcase("init_invalid_files_js_item_invalid.json", errors::kInvalidJs), |
| Testcase("init_invalid_files_css_invalid.json", errors::kInvalidCssList), |
| Testcase("init_invalid_files_css_item_invalid.json", errors::kInvalidCss), |
| Testcase("init_invalid_permissions_invalid.json", |
| errors::kInvalidPermissions), |
| Testcase("init_invalid_permissions_item_invalid.json", |
| errors::kInvalidPermission), |
| Testcase("init_invalid_page_actions_multi.json", |
| errors::kInvalidPageActionsListSize), |
| Testcase("init_invalid_options_url_invalid.json", |
| errors::kInvalidOptionsPage), |
| Testcase("init_invalid_locale_invalid.json", errors::kInvalidDefaultLocale), |
| Testcase("init_invalid_locale_empty.json", errors::kInvalidDefaultLocale), |
| Testcase("init_invalid_min_chrome_invalid.json", |
| errors::kInvalidMinimumChromeVersion), |
| Testcase("init_invalid_chrome_version_too_low.json", |
| errors::kChromeVersionTooLow), |
| }; |
| |
| RunTestcases(testcases, arraysize(testcases), |
| EXPECT_TYPE_ERROR); |
| } |
| |
| TEST_F(InitValueManifestTest, InitFromValueValid) { |
| scoped_refptr<Extension> extension(LoadAndExpectSuccess( |
| "init_valid_minimal.json")); |
| |
| base::FilePath path; |
| PathService::Get(chrome::DIR_TEST_DATA, &path); |
| path = path.AppendASCII("extensions"); |
| |
| EXPECT_TRUE(Extension::IdIsValid(extension->id())); |
| EXPECT_EQ("1.0.0.0", extension->VersionString()); |
| EXPECT_EQ("my extension", extension->name()); |
| EXPECT_EQ(extension->id(), extension->url().host()); |
| EXPECT_EQ(extension->path(), path); |
| EXPECT_EQ(path, extension->path()); |
| |
| // Test permissions scheme. |
| // We allow unknown API permissions, so this will be valid until we better |
| // distinguish between API and host permissions. |
| LoadAndExpectSuccess("init_valid_permissions.json"); |
| |
| // Test with an options page. |
| extension = LoadAndExpectSuccess("init_valid_options.json"); |
| EXPECT_EQ("chrome-extension", |
| ManifestURL::GetOptionsPage(extension.get()).scheme()); |
| EXPECT_EQ("/options.html", |
| ManifestURL::GetOptionsPage(extension.get()).path()); |
| |
| Testcase testcases[] = { |
| // Test that an empty list of page actions does not stop a browser action |
| // from being loaded. |
| Testcase("init_valid_empty_page_actions.json"), |
| |
| // Test with a minimum_chrome_version. |
| Testcase("init_valid_minimum_chrome.json"), |
| |
| // Test a hosted app with a minimum_chrome_version. |
| Testcase("init_valid_app_minimum_chrome.json"), |
| |
| // Test a hosted app with a requirements section. |
| Testcase("init_valid_app_requirements.json"), |
| |
| // Verify empty permission settings are considered valid. |
| Testcase("init_valid_permissions_empty.json"), |
| |
| // We allow unknown API permissions, so this will be valid until we better |
| // distinguish between API and host permissions. |
| Testcase("init_valid_permissions_unknown.json") |
| }; |
| |
| RunTestcases(testcases, arraysize(testcases), |
| EXPECT_TYPE_SUCCESS); |
| } |
| |
| TEST_F(InitValueManifestTest, InitFromValueValidNameInRTL) { |
| #if defined(TOOLKIT_GTK) |
| GtkTextDirection gtk_dir = gtk_widget_get_default_direction(); |
| gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL); |
| #else |
| std::string locale = l10n_util::GetApplicationLocale(""); |
| base::i18n::SetICUDefaultLocale("he"); |
| #endif |
| |
| // No strong RTL characters in name. |
| scoped_refptr<Extension> extension(LoadAndExpectSuccess( |
| "init_valid_name_no_rtl.json")); |
| |
| string16 localized_name(ASCIIToUTF16("Dictionary (by Google)")); |
| base::i18n::AdjustStringForLocaleDirection(&localized_name); |
| EXPECT_EQ(localized_name, UTF8ToUTF16(extension->name())); |
| |
| // Strong RTL characters in name. |
| extension = LoadAndExpectSuccess("init_valid_name_strong_rtl.json"); |
| |
| localized_name = WideToUTF16(L"Dictionary (\x05D1\x05D2" L" Google)"); |
| base::i18n::AdjustStringForLocaleDirection(&localized_name); |
| EXPECT_EQ(localized_name, UTF8ToUTF16(extension->name())); |
| |
| // Reset locale. |
| #if defined(TOOLKIT_GTK) |
| gtk_widget_set_default_direction(gtk_dir); |
| #else |
| base::i18n::SetICUDefaultLocale(locale); |
| #endif |
| } |
| |
| } // namespace extensions |