| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/extensions/manifest_handlers/ui_overrides_handler.h" | 5 #include "chrome/common/extensions/manifest_handlers/ui_overrides_handler.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" |
| 7 #include "base/json/json_string_value_serializer.h" | 8 #include "base/json/json_string_value_serializer.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 9 #include "chrome/common/extensions/features/feature_channel.h" | 10 #include "chrome/common/extensions/features/feature_channel.h" |
| 10 #include "chrome/common/extensions/manifest_url_handler.h" | 11 #include "chrome/common/extensions/manifest_url_handler.h" |
| 12 #include "extensions/common/error_utils.h" |
| 11 #include "extensions/common/extension.h" | 13 #include "extensions/common/extension.h" |
| 12 #include "extensions/common/manifest_constants.h" | 14 #include "extensions/common/manifest_constants.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 16 |
| 15 namespace { | 17 namespace { |
| 16 | 18 |
| 17 const char kManifest[] = "{" | 19 const char kManifest[] = "{" |
| 18 " \"version\" : \"1.0.0.0\"," | 20 " \"version\" : \"1.0.0.0\"," |
| 19 " \"name\" : \"Test\"," | 21 " \"name\" : \"Test\"," |
| 20 " \"chrome_settings_overrides\" : {" | 22 " \"chrome_ui_overrides\" : {" |
| 21 " \"homepage\" : \"http://www.homepage.com\"," | 23 " \"bookmarks_ui\" : {" |
| 22 " \"search_provider\" : {" | 24 " \"remove_button\" : true," |
| 23 " \"name\" : \"first\"," | 25 " \"remove_bookmark_shortcut\" : true" |
| 24 " \"keyword\" : \"firstkey\"," | 26 " }" |
| 25 " \"search_url\" : \"http://www.foo.com/s?q={searchTerms}\"," | |
| 26 " \"favicon_url\" : \"http://www.foo.com/favicon.ico\"," | |
| 27 " \"suggest_url\" : \"http://www.foo.com/s?q={searchTerms}\"," | |
| 28 " \"encoding\" : \"UTF-8\"," | |
| 29 " \"is_default\" : true" | |
| 30 " }," | |
| 31 " \"startup_pages\" : [\"http://www.startup.com\"]" | |
| 32 " }" | 27 " }" |
| 33 "}"; | 28 "}"; |
| 34 | 29 |
| 35 const char kBrokenManifest[] = "{" | 30 const char kBrokenManifest[] = "{" |
| 36 " \"version\" : \"1.0.0.0\"," | 31 " \"version\" : \"1.0.0.0\"," |
| 37 " \"name\" : \"Test\"," | 32 " \"name\" : \"Test\"," |
| 38 " \"chrome_settings_overrides\" : {" | 33 " \"chrome_ui_overrides\" : {" |
| 39 " \"homepage\" : \"{invalid}\"," | |
| 40 " \"search_provider\" : {" | |
| 41 " \"name\" : \"first\"," | |
| 42 " \"keyword\" : \"firstkey\"," | |
| 43 " \"search_url\" : \"{invalid}/s?q={searchTerms}\"," | |
| 44 " \"favicon_url\" : \"{invalid}/favicon.ico\"," | |
| 45 " \"encoding\" : \"UTF-8\"," | |
| 46 " \"is_default\" : true" | |
| 47 " }," | |
| 48 " \"startup_pages\" : [\"{invalid}\"]" | |
| 49 " }" | 34 " }" |
| 50 "}"; | 35 "}"; |
| 51 | 36 |
| 52 using extensions::api::manifest_types::ChromeSettingsOverrides; | 37 using extensions::api::manifest_types::ChromeUIOverrides; |
| 53 using extensions::Extension; | 38 using extensions::Extension; |
| 54 using extensions::Manifest; | 39 using extensions::Manifest; |
| 55 using extensions::SettingsOverrides; | 40 using extensions::UIOverrides; |
| 56 namespace manifest_keys = extensions::manifest_keys; | 41 namespace manifest_keys = extensions::manifest_keys; |
| 57 | 42 |
| 58 class OverrideSettingsTest : public testing::Test { | 43 class UIOverrideTest : public testing::Test { |
| 59 }; | 44 }; |
| 60 | 45 |
| 61 | 46 |
| 62 TEST_F(OverrideSettingsTest, ParseManifest) { | 47 TEST_F(UIOverrideTest, ParseManifest) { |
| 63 extensions::ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); | 48 extensions::ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); |
| 49 // This functionality requires a feature flag. |
| 50 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 51 "--enable-override-bookmarks-ui", |
| 52 "1"); |
| 64 std::string manifest(kManifest); | 53 std::string manifest(kManifest); |
| 65 JSONStringValueSerializer json(&manifest); | 54 JSONStringValueSerializer json(&manifest); |
| 66 std::string error; | 55 std::string error; |
| 67 scoped_ptr<base::Value> root(json.Deserialize(NULL, &error)); | 56 scoped_ptr<base::Value> root(json.Deserialize(NULL, &error)); |
| 68 ASSERT_TRUE(root); | 57 ASSERT_TRUE(root); |
| 69 ASSERT_TRUE(root->IsType(base::Value::TYPE_DICTIONARY)); | 58 ASSERT_TRUE(root->IsType(base::Value::TYPE_DICTIONARY)); |
| 70 scoped_refptr<Extension> extension = Extension::Create( | 59 scoped_refptr<Extension> extension = Extension::Create( |
| 71 base::FilePath(FILE_PATH_LITERAL("//nonexistent")), | 60 base::FilePath(FILE_PATH_LITERAL("//nonexistent")), |
| 72 Manifest::INVALID_LOCATION, | 61 Manifest::INVALID_LOCATION, |
| 73 *static_cast<base::DictionaryValue*>(root.get()), | 62 *static_cast<base::DictionaryValue*>(root.get()), |
| 74 Extension::NO_FLAGS, | 63 Extension::NO_FLAGS, |
| 75 &error); | 64 &error); |
| 76 ASSERT_TRUE(extension); | 65 ASSERT_TRUE(extension) << error; |
| 77 #if defined(OS_WIN) | 66 ASSERT_TRUE(extension->manifest()->HasPath(manifest_keys::kUIOverride)); |
| 78 ASSERT_TRUE(extension->manifest()->HasPath(manifest_keys::kSettingsOverride)); | |
| 79 | 67 |
| 80 SettingsOverrides* settings_override = static_cast<SettingsOverrides*>( | 68 UIOverrides* ui_override = static_cast<UIOverrides*>( |
| 81 extension->GetManifestData(manifest_keys::kSettingsOverride)); | 69 extension->GetManifestData(manifest_keys::kUIOverride)); |
| 82 ASSERT_TRUE(settings_override); | 70 ASSERT_TRUE(ui_override); |
| 83 ASSERT_TRUE(settings_override->search_engine); | 71 ASSERT_TRUE(ui_override->bookmarks_ui); |
| 84 EXPECT_TRUE(settings_override->search_engine->is_default); | 72 EXPECT_TRUE(ui_override->bookmarks_ui->remove_button); |
| 85 const ChromeSettingsOverrides::Search_provider* search_engine = | 73 EXPECT_TRUE(ui_override->bookmarks_ui->remove_bookmark_shortcut); |
| 86 settings_override->search_engine.get(); | |
| 87 EXPECT_EQ("first", search_engine->name); | |
| 88 EXPECT_EQ("firstkey", search_engine->keyword); | |
| 89 EXPECT_EQ("http://www.foo.com/s?q={searchTerms}", search_engine->search_url); | |
| 90 EXPECT_EQ("http://www.foo.com/favicon.ico", search_engine->favicon_url); | |
| 91 EXPECT_EQ("http://www.foo.com/s?q={searchTerms}", | |
| 92 *search_engine->suggest_url); | |
| 93 EXPECT_EQ("UTF-8", search_engine->encoding); | |
| 94 | |
| 95 EXPECT_EQ(std::vector<GURL>(1, GURL("http://www.startup.com")), | |
| 96 settings_override->startup_pages); | |
| 97 | |
| 98 ASSERT_TRUE(settings_override->homepage); | |
| 99 EXPECT_EQ(GURL("http://www.homepage.com"), *settings_override->homepage); | |
| 100 #else | |
| 101 EXPECT_FALSE( | |
| 102 extension->manifest()->HasPath(manifest_keys::kSettingsOverride)); | |
| 103 #endif | |
| 104 } | 74 } |
| 105 | 75 |
| 106 TEST_F(OverrideSettingsTest, ParseBrokenManifest) { | 76 TEST_F(UIOverrideTest, ParseBrokenManifest) { |
| 107 extensions::ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); | 77 extensions::ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV); |
| 78 // This functionality requires a feature flag. |
| 79 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 80 "--enable-override-bookmarks-ui", |
| 81 "1"); |
| 108 std::string manifest(kBrokenManifest); | 82 std::string manifest(kBrokenManifest); |
| 109 JSONStringValueSerializer json(&manifest); | 83 JSONStringValueSerializer json(&manifest); |
| 110 std::string error; | 84 std::string error; |
| 111 scoped_ptr<base::Value> root(json.Deserialize(NULL, &error)); | 85 scoped_ptr<base::Value> root(json.Deserialize(NULL, &error)); |
| 112 ASSERT_TRUE(root); | 86 ASSERT_TRUE(root); |
| 113 ASSERT_TRUE(root->IsType(base::Value::TYPE_DICTIONARY)); | 87 ASSERT_TRUE(root->IsType(base::Value::TYPE_DICTIONARY)); |
| 114 scoped_refptr<Extension> extension = Extension::Create( | 88 scoped_refptr<Extension> extension = Extension::Create( |
| 115 base::FilePath(FILE_PATH_LITERAL("//nonexistent")), | 89 base::FilePath(FILE_PATH_LITERAL("//nonexistent")), |
| 116 Manifest::INVALID_LOCATION, | 90 Manifest::INVALID_LOCATION, |
| 117 *static_cast<base::DictionaryValue*>(root.get()), | 91 *static_cast<base::DictionaryValue*>(root.get()), |
| 118 Extension::NO_FLAGS, | 92 Extension::NO_FLAGS, |
| 119 &error); | 93 &error); |
| 120 #if defined(OS_WIN) | |
| 121 EXPECT_FALSE(extension); | 94 EXPECT_FALSE(extension); |
| 122 EXPECT_EQ( | 95 EXPECT_EQ( |
| 123 std::string(extensions::manifest_errors::kInvalidEmptySettingsOverrides), | 96 extensions::ErrorUtils::FormatErrorMessage( |
| 97 extensions::manifest_errors::kInvalidEmptyDictionary, |
| 98 extensions::manifest_keys::kUIOverride), |
| 124 error); | 99 error); |
| 125 #else | |
| 126 EXPECT_TRUE(extension); | |
| 127 EXPECT_FALSE( | |
| 128 extension->manifest()->HasPath(manifest_keys::kSettingsOverride)); | |
| 129 #endif | |
| 130 } | 100 } |
| 131 | 101 |
| 132 } // namespace | 102 } // namespace |
| OLD | NEW |