OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "base/string_util.h" | 5 #include "base/string_util.h" |
6 #include "base/path_service.h" | 6 #include "base/path_service.h" |
7 #include "chrome/browser/extensions/extension.h" | 7 #include "chrome/browser/extensions/extension.h" |
8 #include "chrome/common/chrome_paths.h" | 8 #include "chrome/common/chrome_paths.h" |
9 #include "chrome/common/json_value_serializer.h" | 9 #include "chrome/common/json_value_serializer.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 static_cast<DictionaryValue*>(serializer.Deserialize(&error))); | 36 static_cast<DictionaryValue*>(serializer.Deserialize(&error))); |
37 ASSERT_TRUE(valid_value.get()); | 37 ASSERT_TRUE(valid_value.get()); |
38 ASSERT_EQ("", error); | 38 ASSERT_EQ("", error); |
39 ASSERT_TRUE(extension.InitFromValue(*valid_value, &error)); | 39 ASSERT_TRUE(extension.InitFromValue(*valid_value, &error)); |
40 ASSERT_EQ("", error); | 40 ASSERT_EQ("", error); |
41 | 41 |
42 scoped_ptr<DictionaryValue> input_value; | 42 scoped_ptr<DictionaryValue> input_value; |
43 | 43 |
44 // Test missing and invalid format versions | 44 // Test missing and invalid format versions |
45 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 45 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
46 input_value->Remove(Extension::kFormatVersionKey, NULL); | 46 input_value->Remove(WideToUTF16Hack(Extension::kFormatVersionKey), NULL); |
47 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 47 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
48 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); | 48 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); |
49 | 49 |
50 input_value->SetString(Extension::kFormatVersionKey, "foo"); | 50 input_value->SetString(WideToUTF16Hack(Extension::kFormatVersionKey), "foo"); |
51 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 51 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
52 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); | 52 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); |
53 | 53 |
54 input_value->SetInteger(Extension::kFormatVersionKey, 2); | 54 input_value->SetInteger(WideToUTF16Hack(Extension::kFormatVersionKey), 2); |
55 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 55 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
56 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); | 56 EXPECT_EQ(Extension::kInvalidFormatVersionError, error); |
57 | 57 |
58 // Test missing and invalid ids | 58 // Test missing and invalid ids |
59 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 59 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
60 input_value->Remove(Extension::kIdKey, NULL); | 60 input_value->Remove(WideToUTF16Hack(Extension::kIdKey), NULL); |
61 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 61 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
62 EXPECT_EQ(Extension::kInvalidIdError, error); | 62 EXPECT_EQ(Extension::kInvalidIdError, error); |
63 | 63 |
64 input_value->SetInteger(Extension::kIdKey, 42); | 64 input_value->SetInteger(WideToUTF16Hack(Extension::kIdKey), 42); |
65 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 65 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
66 EXPECT_EQ(Extension::kInvalidIdError, error); | 66 EXPECT_EQ(Extension::kInvalidIdError, error); |
67 | 67 |
68 // Test missing and invalid versions | 68 // Test missing and invalid versions |
69 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 69 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
70 input_value->Remove(Extension::kVersionKey, NULL); | 70 input_value->Remove(WideToUTF16Hack(Extension::kVersionKey), NULL); |
71 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 71 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
72 EXPECT_EQ(Extension::kInvalidVersionError, error); | 72 EXPECT_EQ(Extension::kInvalidVersionError, error); |
73 | 73 |
74 input_value->SetInteger(Extension::kVersionKey, 42); | 74 input_value->SetInteger(WideToUTF16Hack(Extension::kVersionKey), 42); |
75 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 75 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
76 EXPECT_EQ(Extension::kInvalidVersionError, error); | 76 EXPECT_EQ(Extension::kInvalidVersionError, error); |
77 | 77 |
78 // Test missing and invalid names | 78 // Test missing and invalid names |
79 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 79 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
80 input_value->Remove(Extension::kNameKey, NULL); | 80 input_value->Remove(WideToUTF16Hack(Extension::kNameKey), NULL); |
81 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 81 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
82 EXPECT_EQ(Extension::kInvalidNameError, error); | 82 EXPECT_EQ(Extension::kInvalidNameError, error); |
83 | 83 |
84 input_value->SetInteger(Extension::kNameKey, 42); | 84 input_value->SetInteger(WideToUTF16Hack(Extension::kNameKey), 42); |
85 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 85 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
86 EXPECT_EQ(Extension::kInvalidNameError, error); | 86 EXPECT_EQ(Extension::kInvalidNameError, error); |
87 | 87 |
88 // Test invalid description | 88 // Test invalid description |
89 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 89 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
90 input_value->SetInteger(Extension::kDescriptionKey, 42); | 90 input_value->SetInteger(WideToUTF16Hack(Extension::kDescriptionKey), 42); |
91 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 91 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
92 EXPECT_EQ(Extension::kInvalidDescriptionError, error); | 92 EXPECT_EQ(Extension::kInvalidDescriptionError, error); |
93 | 93 |
94 // Test invalid user scripts list | 94 // Test invalid user scripts list |
95 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 95 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
96 input_value->SetInteger(Extension::kContentScriptsKey, 42); | 96 input_value->SetInteger(WideToUTF16Hack(Extension::kContentScriptsKey), 42); |
97 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 97 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
98 EXPECT_EQ(Extension::kInvalidContentScriptsListError, error); | 98 EXPECT_EQ(Extension::kInvalidContentScriptsListError, error); |
99 | 99 |
100 // Test invalid user script item | 100 // Test invalid user script item |
101 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 101 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
102 ListValue* content_scripts = NULL; | 102 ListValue* content_scripts = NULL; |
103 input_value->GetList(Extension::kContentScriptsKey, &content_scripts); | 103 input_value->GetList(WideToUTF16Hack(Extension::kContentScriptsKey), |
| 104 &content_scripts); |
104 ASSERT_FALSE(NULL == content_scripts); | 105 ASSERT_FALSE(NULL == content_scripts); |
105 content_scripts->Set(0, Value::CreateIntegerValue(42)); | 106 content_scripts->Set(0, Value::CreateIntegerValue(42)); |
106 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 107 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
107 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidContentScriptError)); | 108 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidContentScriptError)); |
108 | 109 |
109 // Test missing and invalid matches array | 110 // Test missing and invalid matches array |
110 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 111 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
111 input_value->GetList(Extension::kContentScriptsKey, &content_scripts); | 112 input_value->GetList(WideToUTF16Hack(Extension::kContentScriptsKey), |
| 113 &content_scripts); |
112 DictionaryValue* user_script = NULL; | 114 DictionaryValue* user_script = NULL; |
113 content_scripts->GetDictionary(0, &user_script); | 115 content_scripts->GetDictionary(0, &user_script); |
114 user_script->Remove(Extension::kMatchesKey, NULL); | 116 user_script->Remove(WideToUTF16Hack(Extension::kMatchesKey), NULL); |
115 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 117 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
116 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchesError)); | 118 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchesError)); |
117 | 119 |
118 user_script->Set(Extension::kMatchesKey, Value::CreateIntegerValue(42)); | 120 user_script->Set(WideToUTF16Hack(Extension::kMatchesKey), |
| 121 Value::CreateIntegerValue(42)); |
119 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 122 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
120 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchesError)); | 123 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchesError)); |
121 | 124 |
122 ListValue* matches = new ListValue; | 125 ListValue* matches = new ListValue; |
123 user_script->Set(Extension::kMatchesKey, matches); | 126 user_script->Set(WideToUTF16Hack(Extension::kMatchesKey), matches); |
124 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 127 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
125 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchCountError)); | 128 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchCountError)); |
126 | 129 |
127 // Test invalid match element | 130 // Test invalid match element |
128 matches->Set(0, Value::CreateIntegerValue(42)); | 131 matches->Set(0, Value::CreateIntegerValue(42)); |
129 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 132 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
130 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchError)); | 133 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidMatchError)); |
131 | 134 |
132 // Test missing and invalid files array | 135 // Test missing and invalid files array |
133 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); | 136 input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); |
134 input_value->GetList(Extension::kContentScriptsKey, &content_scripts); | 137 input_value->GetList(WideToUTF16Hack(Extension::kContentScriptsKey), |
| 138 &content_scripts); |
135 content_scripts->GetDictionary(0, &user_script); | 139 content_scripts->GetDictionary(0, &user_script); |
136 user_script->Remove(Extension::kJsKey, NULL); | 140 user_script->Remove(WideToUTF16Hack(Extension::kJsKey), NULL); |
137 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 141 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
138 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsListError)); | 142 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsListError)); |
139 | 143 |
140 user_script->Set(Extension::kJsKey, Value::CreateIntegerValue(42)); | 144 user_script->Set(WideToUTF16Hack(Extension::kJsKey), |
| 145 Value::CreateIntegerValue(42)); |
141 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 146 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
142 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsListError)); | 147 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsListError)); |
143 | 148 |
144 ListValue* files = new ListValue; | 149 ListValue* files = new ListValue; |
145 user_script->Set(Extension::kJsKey, files); | 150 user_script->Set(WideToUTF16Hack(Extension::kJsKey), files); |
146 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 151 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
147 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsCountError)); | 152 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsCountError)); |
148 | 153 |
149 // Test invalid file element | 154 // Test invalid file element |
150 files->Set(0, Value::CreateIntegerValue(42)); | 155 files->Set(0, Value::CreateIntegerValue(42)); |
151 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 156 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
152 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsError)); | 157 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsError)); |
153 | 158 |
154 // Test too many file elements (more than one not yet supported) | 159 // Test too many file elements (more than one not yet supported) |
155 files->Set(0, Value::CreateStringValue("foo.js")); | 160 files->Set(0, Value::CreateStringValue("foo.js")); |
156 files->Set(1, Value::CreateStringValue("bar.js")); | 161 files->Set(1, Value::CreateStringValue("bar.js")); |
157 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); | 162 EXPECT_FALSE(extension.InitFromValue(*input_value, &error)); |
158 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsCountError)); | 163 EXPECT_TRUE(MatchPattern(error, Extension::kInvalidJsCountError)); |
159 } | 164 } |
160 | 165 |
161 TEST(ExtensionTest, InitFromValueValid) { | 166 TEST(ExtensionTest, InitFromValueValid) { |
162 #if defined(OS_WIN) | 167 #if defined(OS_WIN) |
163 FilePath path(FILE_PATH_LITERAL("C:\\foo")); | 168 FilePath path(FILE_PATH_LITERAL("C:\\foo")); |
164 #elif defined(OS_POSIX) | 169 #elif defined(OS_POSIX) |
165 FilePath path(FILE_PATH_LITERAL("/foo")); | 170 FilePath path(FILE_PATH_LITERAL("/foo")); |
166 #endif | 171 #endif |
167 Extension extension(path); | 172 Extension extension(path); |
168 std::string error; | 173 std::string error; |
169 DictionaryValue input_value; | 174 DictionaryValue input_value; |
170 | 175 |
171 // Test minimal extension | 176 // Test minimal extension |
172 input_value.SetInteger(Extension::kFormatVersionKey, 1); | 177 input_value.SetInteger(WideToUTF16Hack(Extension::kFormatVersionKey), 1); |
173 input_value.SetString(Extension::kIdKey, | 178 input_value.SetString( |
174 "00123456789ABCDEF0123456789ABCDEF0123456"); | 179 WideToUTF16Hack(Extension::kIdKey), |
175 input_value.SetString(Extension::kVersionKey, "1.0.0.0"); | 180 ASCIIToUTF16("00123456789ABCDEF0123456789ABCDEF0123456")); |
176 input_value.SetString(Extension::kNameKey, "my extension"); | 181 input_value.SetString(WideToUTF16Hack(Extension::kVersionKey), |
| 182 ASCIIToUTF16("1.0.0.0")); |
| 183 input_value.SetString(WideToUTF16Hack(Extension::kNameKey), |
| 184 ASCIIToUTF16("my extension")); |
177 | 185 |
178 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); | 186 EXPECT_TRUE(extension.InitFromValue(input_value, &error)); |
179 EXPECT_EQ("", error); | 187 EXPECT_EQ("", error); |
180 EXPECT_EQ("00123456789abcdef0123456789abcdef0123456", extension.id()); | 188 EXPECT_EQ("00123456789abcdef0123456789abcdef0123456", extension.id()); |
181 EXPECT_EQ("1.0.0.0", extension.VersionString()); | 189 EXPECT_EQ("1.0.0.0", extension.VersionString()); |
182 EXPECT_EQ("my extension", extension.name()); | 190 EXPECT_EQ("my extension", extension.name()); |
183 EXPECT_EQ("chrome-extension://00123456789abcdef0123456789abcdef0123456/", | 191 EXPECT_EQ("chrome-extension://00123456789abcdef0123456789abcdef0123456/", |
184 extension.url().spec()); | 192 extension.url().spec()); |
185 EXPECT_EQ(path.value(), extension.path().value()); | 193 EXPECT_EQ(path.value(), extension.path().value()); |
186 } | 194 } |
187 | 195 |
188 TEST(ExtensionTest, GetResourceURLAndPath) { | 196 TEST(ExtensionTest, GetResourceURLAndPath) { |
189 #if defined(OS_WIN) | 197 #if defined(OS_WIN) |
190 FilePath path(FILE_PATH_LITERAL("C:\\foo")); | 198 FilePath path(FILE_PATH_LITERAL("C:\\foo")); |
191 #elif defined(OS_POSIX) | 199 #elif defined(OS_POSIX) |
192 FilePath path(FILE_PATH_LITERAL("/foo")); | 200 FilePath path(FILE_PATH_LITERAL("/foo")); |
193 #endif | 201 #endif |
194 Extension extension(path); | 202 Extension extension(path); |
195 DictionaryValue input_value; | 203 DictionaryValue input_value; |
196 input_value.SetInteger(Extension::kFormatVersionKey, 1); | 204 input_value.SetInteger(WideToUTF16Hack(Extension::kFormatVersionKey), 1); |
197 input_value.SetString(Extension::kIdKey, | 205 input_value.SetString( |
198 "00123456789ABCDEF0123456789ABCDEF0123456"); | 206 WideToUTF16Hack(Extension::kIdKey), |
199 input_value.SetString(Extension::kVersionKey, "1.0.0.0"); | 207 ASCIIToUTF16("00123456789ABCDEF0123456789ABCDEF0123456")); |
200 input_value.SetString(Extension::kNameKey, "my extension"); | 208 input_value.SetString(WideToUTF16Hack(Extension::kVersionKey), |
| 209 ASCIIToUTF16("1.0.0.0")); |
| 210 input_value.SetString(WideToUTF16Hack(Extension::kNameKey), |
| 211 ASCIIToUTF16("my extension")); |
201 EXPECT_TRUE(extension.InitFromValue(input_value, NULL)); | 212 EXPECT_TRUE(extension.InitFromValue(input_value, NULL)); |
202 | 213 |
203 EXPECT_EQ(extension.url().spec() + "bar/baz.js", | 214 EXPECT_EQ(extension.url().spec() + "bar/baz.js", |
204 Extension::GetResourceURL(extension.url(), "bar/baz.js").spec()); | 215 Extension::GetResourceURL(extension.url(), "bar/baz.js").spec()); |
205 EXPECT_EQ(extension.url().spec() + "baz.js", | 216 EXPECT_EQ(extension.url().spec() + "baz.js", |
206 Extension::GetResourceURL(extension.url(), "bar/../baz.js").spec()); | 217 Extension::GetResourceURL(extension.url(), "bar/../baz.js").spec()); |
207 EXPECT_EQ(extension.url().spec() + "baz.js", | 218 EXPECT_EQ(extension.url().spec() + "baz.js", |
208 Extension::GetResourceURL(extension.url(), "../baz.js").spec()); | 219 Extension::GetResourceURL(extension.url(), "../baz.js").spec()); |
209 | 220 |
210 EXPECT_EQ(path.Append(FILE_PATH_LITERAL("bar")) | 221 EXPECT_EQ(path.Append(FILE_PATH_LITERAL("bar")) |
211 .Append(FILE_PATH_LITERAL("baz.js")).value(), | 222 .Append(FILE_PATH_LITERAL("baz.js")).value(), |
212 Extension::GetResourcePath(extension.path(), "bar/baz.js").value()); | 223 Extension::GetResourcePath(extension.path(), "bar/baz.js").value()); |
213 EXPECT_EQ(path.Append(FILE_PATH_LITERAL("baz.js")).value(), | 224 EXPECT_EQ(path.Append(FILE_PATH_LITERAL("baz.js")).value(), |
214 Extension::GetResourcePath(extension.path(), "bar/../baz.js") | 225 Extension::GetResourcePath(extension.path(), "bar/../baz.js") |
215 .value()); | 226 .value()); |
216 EXPECT_EQ(FilePath().value(), | 227 EXPECT_EQ(FilePath().value(), |
217 Extension::GetResourcePath(extension.path(), "../baz.js").value()); | 228 Extension::GetResourcePath(extension.path(), "../baz.js").value()); |
218 } | 229 } |
OLD | NEW |