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 |