OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/api/extension_api.h" | 5 #include "chrome/common/extensions/api/extension_api.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
10 #include "base/json/json_writer.h" | |
10 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
11 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
12 #include "base/values.h" | 13 #include "base/values.h" |
13 #include "chrome/common/extensions/extension.h" | 14 #include "chrome/common/extensions/extension.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
15 | 16 |
16 namespace extensions { | 17 namespace extensions { |
17 namespace { | 18 namespace { |
18 | 19 |
20 TEST(ExtensionAPI, Creation) { | |
21 ExtensionAPI* shared_instance = ExtensionAPI::GetSharedInstance(); | |
22 EXPECT_EQ(shared_instance, ExtensionAPI::GetSharedInstance()); | |
23 | |
24 scoped_ptr<ExtensionAPI> new_instance( | |
25 ExtensionAPI::CreateWithDefaultConfiguration()); | |
26 EXPECT_NE(new_instance.get(), | |
27 scoped_ptr<ExtensionAPI>( | |
28 ExtensionAPI::CreateWithDefaultConfiguration()).get()); | |
29 | |
30 ExtensionAPI empty_instance; | |
31 | |
32 struct { | |
33 ExtensionAPI* api; | |
34 bool expect_populated; | |
35 } test_data[] = { | |
36 { shared_instance, true }, | |
37 { new_instance.get(), true }, | |
38 { &empty_instance, false } | |
39 }; | |
40 | |
41 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | |
42 EXPECT_EQ(test_data[i].expect_populated, | |
43 test_data[i].api->GetSchema("bookmarks.create") != NULL); | |
44 } | |
45 } | |
46 | |
47 TEST(ExtensionAPI, SplitDependencyName) { | |
48 struct { | |
49 std::string input; | |
50 std::string expected_feature_type; | |
51 std::string expected_feature_name; | |
52 } test_data[] = { | |
53 { "", "api", "" }, // assumes "api" when no type is present | |
54 { "foo", "api", "foo" }, | |
55 { "foo:", "foo", "" }, | |
56 { ":foo", "", "foo" }, | |
57 { "foo:bar", "foo", "bar" }, | |
58 { "foo:bar.baz", "foo", "bar.baz" } | |
59 }; | |
60 | |
61 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | |
62 std::string feature_type; | |
63 std::string feature_name; | |
64 ExtensionAPI::SplitDependencyName(test_data[i].input, &feature_type, | |
65 &feature_name); | |
66 EXPECT_EQ(test_data[i].expected_feature_type, feature_type) << i; | |
67 EXPECT_EQ(test_data[i].expected_feature_name, feature_name) << i; | |
68 } | |
69 } | |
70 | |
19 TEST(ExtensionAPI, IsPrivileged) { | 71 TEST(ExtensionAPI, IsPrivileged) { |
20 ExtensionAPI extension_api; | 72 scoped_ptr<ExtensionAPI> extension_api( |
73 ExtensionAPI::CreateWithDefaultConfiguration()); | |
21 | 74 |
22 EXPECT_FALSE(extension_api.IsPrivileged("extension.connect")); | 75 EXPECT_FALSE(extension_api->IsPrivileged("extension.connect")); |
23 EXPECT_FALSE(extension_api.IsPrivileged("extension.onConnect")); | 76 EXPECT_FALSE(extension_api->IsPrivileged("extension.onConnect")); |
24 | 77 |
25 // Properties are not supported yet. | 78 // Properties are not supported yet. |
26 EXPECT_TRUE(extension_api.IsPrivileged("extension.lastError")); | 79 EXPECT_TRUE(extension_api->IsPrivileged("extension.lastError")); |
27 | 80 |
28 // Default unknown names to privileged for paranoia's sake. | 81 // Default unknown names to privileged for paranoia's sake. |
29 EXPECT_TRUE(extension_api.IsPrivileged("")); | 82 EXPECT_TRUE(extension_api->IsPrivileged("")); |
30 EXPECT_TRUE(extension_api.IsPrivileged("<unknown-namespace>")); | 83 EXPECT_TRUE(extension_api->IsPrivileged("<unknown-namespace>")); |
31 EXPECT_TRUE(extension_api.IsPrivileged("extension.<unknown-member>")); | 84 EXPECT_TRUE(extension_api->IsPrivileged("extension.<unknown-member>")); |
32 | 85 |
33 // Exists, but privileged. | 86 // Exists, but privileged. |
34 EXPECT_TRUE(extension_api.IsPrivileged("extension.getViews")); | 87 EXPECT_TRUE(extension_api->IsPrivileged("extension.getViews")); |
35 EXPECT_TRUE(extension_api.IsPrivileged("history.search")); | 88 EXPECT_TRUE(extension_api->IsPrivileged("history.search")); |
36 | 89 |
37 // Whole APIs that are unprivileged. | 90 // Whole APIs that are unprivileged. |
38 EXPECT_FALSE(extension_api.IsPrivileged("app.getDetails")); | 91 EXPECT_FALSE(extension_api->IsPrivileged("app.getDetails")); |
39 EXPECT_FALSE(extension_api.IsPrivileged("app.isInstalled")); | 92 EXPECT_FALSE(extension_api->IsPrivileged("app.isInstalled")); |
40 EXPECT_FALSE(extension_api.IsPrivileged("storage.local")); | 93 EXPECT_FALSE(extension_api->IsPrivileged("storage.local")); |
41 EXPECT_FALSE(extension_api.IsPrivileged("storage.local.onChanged")); | 94 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.onChanged")); |
42 EXPECT_FALSE(extension_api.IsPrivileged("storage.local.set")); | 95 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.set")); |
43 EXPECT_FALSE(extension_api.IsPrivileged("storage.local.MAX_ITEMS")); | 96 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.MAX_ITEMS")); |
44 EXPECT_FALSE(extension_api.IsPrivileged("storage.set")); | 97 EXPECT_FALSE(extension_api->IsPrivileged("storage.set")); |
45 } | 98 } |
46 | 99 |
47 TEST(ExtensionAPI, LazyGetSchema) { | 100 TEST(ExtensionAPI, LazyGetSchema) { |
48 ExtensionAPI apis; | 101 scoped_ptr<ExtensionAPI> apis(ExtensionAPI::CreateWithDefaultConfiguration()); |
49 | 102 |
50 EXPECT_EQ(NULL, apis.GetSchema("")); | 103 EXPECT_EQ(NULL, apis->GetSchema("")); |
51 EXPECT_EQ(NULL, apis.GetSchema("")); | 104 EXPECT_EQ(NULL, apis->GetSchema("")); |
52 EXPECT_EQ(NULL, apis.GetSchema("experimental")); | 105 EXPECT_EQ(NULL, apis->GetSchema("experimental")); |
53 EXPECT_EQ(NULL, apis.GetSchema("experimental")); | 106 EXPECT_EQ(NULL, apis->GetSchema("experimental")); |
54 EXPECT_EQ(NULL, apis.GetSchema("foo")); | 107 EXPECT_EQ(NULL, apis->GetSchema("foo")); |
55 EXPECT_EQ(NULL, apis.GetSchema("foo")); | 108 EXPECT_EQ(NULL, apis->GetSchema("foo")); |
56 | 109 |
57 EXPECT_TRUE(apis.GetSchema("experimental.dns")); | 110 EXPECT_TRUE(apis->GetSchema("experimental.dns")); |
58 EXPECT_TRUE(apis.GetSchema("experimental.dns")); | 111 EXPECT_TRUE(apis->GetSchema("experimental.dns")); |
59 EXPECT_TRUE(apis.GetSchema("experimental.infobars")); | 112 EXPECT_TRUE(apis->GetSchema("experimental.infobars")); |
60 EXPECT_TRUE(apis.GetSchema("experimental.infobars")); | 113 EXPECT_TRUE(apis->GetSchema("experimental.infobars")); |
61 EXPECT_TRUE(apis.GetSchema("extension")); | 114 EXPECT_TRUE(apis->GetSchema("extension")); |
62 EXPECT_TRUE(apis.GetSchema("extension")); | 115 EXPECT_TRUE(apis->GetSchema("extension")); |
63 EXPECT_TRUE(apis.GetSchema("omnibox")); | 116 EXPECT_TRUE(apis->GetSchema("omnibox")); |
64 EXPECT_TRUE(apis.GetSchema("omnibox")); | 117 EXPECT_TRUE(apis->GetSchema("omnibox")); |
65 EXPECT_TRUE(apis.GetSchema("storage")); | 118 EXPECT_TRUE(apis->GetSchema("storage")); |
66 EXPECT_TRUE(apis.GetSchema("storage")); | 119 EXPECT_TRUE(apis->GetSchema("storage")); |
67 } | 120 } |
68 | 121 |
69 scoped_refptr<Extension> CreateExtensionWithPermissions( | 122 scoped_refptr<Extension> CreateExtensionWithPermissions( |
70 const std::set<std::string>& permissions) { | 123 const std::set<std::string>& permissions) { |
71 DictionaryValue manifest; | 124 DictionaryValue manifest; |
72 manifest.SetString("name", "extension"); | 125 manifest.SetString("name", "extension"); |
73 manifest.SetString("version", "1.0"); | 126 manifest.SetString("version", "1.0"); |
74 manifest.SetInteger("manifest_version", 2); | 127 manifest.SetInteger("manifest_version", 2); |
75 { | 128 { |
76 scoped_ptr<ListValue> permissions_list(new ListValue()); | 129 scoped_ptr<ListValue> permissions_list(new ListValue()); |
(...skipping 22 matching lines...) Expand all Loading... | |
99 | 152 |
100 TEST(ExtensionAPI, ExtensionWithUnprivilegedAPIs) { | 153 TEST(ExtensionAPI, ExtensionWithUnprivilegedAPIs) { |
101 scoped_refptr<Extension> extension; | 154 scoped_refptr<Extension> extension; |
102 { | 155 { |
103 std::set<std::string> permissions; | 156 std::set<std::string> permissions; |
104 permissions.insert("storage"); | 157 permissions.insert("storage"); |
105 permissions.insert("history"); | 158 permissions.insert("history"); |
106 extension = CreateExtensionWithPermissions(permissions); | 159 extension = CreateExtensionWithPermissions(permissions); |
107 } | 160 } |
108 | 161 |
109 ExtensionAPI extension_api; | 162 scoped_ptr<ExtensionAPI> extension_api( |
163 ExtensionAPI::CreateWithDefaultConfiguration()); | |
110 | 164 |
111 scoped_ptr<std::set<std::string> > privileged_apis = | 165 scoped_ptr<std::set<std::string> > privileged_apis = |
112 extension_api.GetAPIsForContext( | 166 extension_api->GetAPIsForContext( |
113 Feature::BLESSED_EXTENSION_CONTEXT, extension.get(), GURL()); | 167 Feature::BLESSED_EXTENSION_CONTEXT, extension.get(), GURL()); |
114 | 168 |
115 scoped_ptr<std::set<std::string> > unprivileged_apis = | 169 scoped_ptr<std::set<std::string> > unprivileged_apis = |
116 extension_api.GetAPIsForContext( | 170 extension_api->GetAPIsForContext( |
117 Feature::UNBLESSED_EXTENSION_CONTEXT, extension.get(), GURL()); | 171 Feature::UNBLESSED_EXTENSION_CONTEXT, extension.get(), GURL()); |
118 | 172 |
119 scoped_ptr<std::set<std::string> > content_script_apis = | 173 scoped_ptr<std::set<std::string> > content_script_apis = |
120 extension_api.GetAPIsForContext( | 174 extension_api->GetAPIsForContext( |
121 Feature::CONTENT_SCRIPT_CONTEXT, extension.get(), GURL()); | 175 Feature::CONTENT_SCRIPT_CONTEXT, extension.get(), GURL()); |
122 | 176 |
123 // "storage" is completely unprivileged. | 177 // "storage" is completely unprivileged. |
124 EXPECT_EQ(1u, privileged_apis->count("storage")); | 178 EXPECT_EQ(1u, privileged_apis->count("storage")); |
125 EXPECT_EQ(1u, unprivileged_apis->count("storage")); | 179 EXPECT_EQ(1u, unprivileged_apis->count("storage")); |
126 EXPECT_EQ(1u, content_script_apis->count("storage")); | 180 EXPECT_EQ(1u, content_script_apis->count("storage")); |
127 | 181 |
128 // "extension" is partially unprivileged. | 182 // "extension" is partially unprivileged. |
129 EXPECT_EQ(1u, privileged_apis->count("extension")); | 183 EXPECT_EQ(1u, privileged_apis->count("extension")); |
130 EXPECT_EQ(1u, unprivileged_apis->count("extension")); | 184 EXPECT_EQ(1u, unprivileged_apis->count("extension")); |
131 EXPECT_EQ(1u, content_script_apis->count("extension")); | 185 EXPECT_EQ(1u, content_script_apis->count("extension")); |
132 | 186 |
133 // "history" is entirely privileged. | 187 // "history" is entirely privileged. |
134 EXPECT_EQ(1u, privileged_apis->count("history")); | 188 EXPECT_EQ(1u, privileged_apis->count("history")); |
135 EXPECT_EQ(0u, unprivileged_apis->count("history")); | 189 EXPECT_EQ(0u, unprivileged_apis->count("history")); |
136 EXPECT_EQ(0u, content_script_apis->count("history")); | 190 EXPECT_EQ(0u, content_script_apis->count("history")); |
137 } | 191 } |
138 | 192 |
139 TEST(ExtensionAPI, ExtensionWithDependencies) { | 193 TEST(ExtensionAPI, ExtensionWithDependencies) { |
140 // Extension with the "ttsEngine" permission but not the "tts" permission; it | 194 // Extension with the "ttsEngine" permission but not the "tts" permission; it |
141 // must load TTS. | 195 // must load TTS. |
142 { | 196 { |
143 scoped_refptr<Extension> extension = | 197 scoped_refptr<Extension> extension = |
144 CreateExtensionWithPermission("ttsEngine"); | 198 CreateExtensionWithPermission("ttsEngine"); |
145 scoped_ptr<std::set<std::string> > apis = | 199 scoped_ptr<ExtensionAPI> api( |
146 ExtensionAPI().GetAPIsForContext( | 200 ExtensionAPI::CreateWithDefaultConfiguration()); |
147 Feature::BLESSED_EXTENSION_CONTEXT, extension.get(), GURL()); | 201 scoped_ptr<std::set<std::string> > apis = api->GetAPIsForContext( |
202 Feature::BLESSED_EXTENSION_CONTEXT, extension.get(), GURL()); | |
148 EXPECT_EQ(1u, apis->count("ttsEngine")); | 203 EXPECT_EQ(1u, apis->count("ttsEngine")); |
149 EXPECT_EQ(1u, apis->count("tts")); | 204 EXPECT_EQ(1u, apis->count("tts")); |
150 } | 205 } |
151 | 206 |
152 // Conversely, extension with the "tts" permission but not the "ttsEngine" | 207 // Conversely, extension with the "tts" permission but not the "ttsEngine" |
153 // permission shouldn't get the "ttsEngine" permission. | 208 // permission shouldn't get the "ttsEngine" permission. |
154 { | 209 { |
155 scoped_refptr<Extension> extension = | 210 scoped_refptr<Extension> extension = |
156 CreateExtensionWithPermission("tts"); | 211 CreateExtensionWithPermission("tts"); |
157 scoped_ptr<std::set<std::string> > apis = | 212 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()) ; |
158 ExtensionAPI().GetAPIsForContext( | 213 scoped_ptr<std::set<std::string> > apis = api->GetAPIsForContext( |
159 Feature::BLESSED_EXTENSION_CONTEXT, extension.get(), GURL()); | 214 Feature::BLESSED_EXTENSION_CONTEXT, extension.get(), GURL()); |
160 EXPECT_EQ(0u, apis->count("ttsEngine")); | 215 EXPECT_EQ(0u, apis->count("ttsEngine")); |
161 EXPECT_EQ(1u, apis->count("tts")); | 216 EXPECT_EQ(1u, apis->count("tts")); |
162 } | 217 } |
163 } | 218 } |
164 | 219 |
165 bool MatchesURL( | 220 bool MatchesURL( |
166 ExtensionAPI* api, const std::string& api_name, const std::string& url) { | 221 ExtensionAPI* api, const std::string& api_name, const std::string& url) { |
167 scoped_ptr<std::set<std::string> > apis = | 222 scoped_ptr<std::set<std::string> > apis = |
168 api->GetAPIsForContext(Feature::WEB_PAGE_CONTEXT, NULL, GURL(url)); | 223 api->GetAPIsForContext(Feature::WEB_PAGE_CONTEXT, NULL, GURL(url)); |
169 return apis->count(api_name); | 224 return apis->count(api_name); |
170 } | 225 } |
171 | 226 |
172 TEST(ExtensionAPI, URLMatching) { | 227 TEST(ExtensionAPI, URLMatching) { |
173 ExtensionAPI api; | 228 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); |
174 | 229 |
175 // "app" API is available to all URLs that content scripts can be injected. | 230 // "app" API is available to all URLs that content scripts can be injected. |
176 EXPECT_TRUE(MatchesURL(&api, "app", "http://example.com/example.html")); | 231 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html")); |
177 EXPECT_TRUE(MatchesURL(&api, "app", "https://blah.net")); | 232 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); |
178 EXPECT_TRUE(MatchesURL(&api, "app", "file://somefile.html")); | 233 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); |
179 | 234 |
180 // But not internal URLs (for chrome-extension:// the app API is injected by | 235 // But not internal URLs (for chrome-extension:// the app API is injected by |
181 // GetSchemasForExtension). | 236 // GetSchemasForExtension). |
182 EXPECT_FALSE(MatchesURL(&api, "app", "about:flags")); | 237 EXPECT_FALSE(MatchesURL(api.get(), "app", "about:flags")); |
183 EXPECT_FALSE(MatchesURL(&api, "app", "chrome://flags")); | 238 EXPECT_FALSE(MatchesURL(api.get(), "app", "chrome://flags")); |
184 EXPECT_FALSE(MatchesURL(&api, "app", "chrome-extension://fakeextension")); | 239 EXPECT_FALSE(MatchesURL(api.get(), "app", |
240 "chrome-extension://fakeextension")); | |
185 | 241 |
186 // "storage" API (for example) isn't available to any URLs. | 242 // "storage" API (for example) isn't available to any URLs. |
187 EXPECT_FALSE(MatchesURL(&api, "storage", "http://example.com/example.html")); | 243 EXPECT_FALSE(MatchesURL(api.get(), "storage", |
188 EXPECT_FALSE(MatchesURL(&api, "storage", "https://blah.net")); | 244 "http://example.com/example.html")); |
189 EXPECT_FALSE(MatchesURL(&api, "storage", "file://somefile.html")); | 245 EXPECT_FALSE(MatchesURL(api.get(), "storage", "https://blah.net")); |
190 EXPECT_FALSE(MatchesURL(&api, "storage", "about:flags")); | 246 EXPECT_FALSE(MatchesURL(api.get(), "storage", "file://somefile.html")); |
191 EXPECT_FALSE(MatchesURL(&api, "storage", "chrome://flags")); | 247 EXPECT_FALSE(MatchesURL(api.get(), "storage", "about:flags")); |
192 EXPECT_FALSE(MatchesURL(&api, "storage", "chrome-extension://fakeextension")); | 248 EXPECT_FALSE(MatchesURL(api.get(), "storage", "chrome://flags")); |
249 EXPECT_FALSE(MatchesURL(api.get(), "storage", | |
250 "chrome-extension://fakeextension")); | |
251 } | |
252 | |
253 TEST(ExtensionAPI, GetAPINameForFullName) { | |
254 struct { | |
255 std::string input; | |
256 std::string api_name; | |
257 std::string child_name; | |
258 } test_data[] = { | |
259 { "", "", "" }, | |
260 { "unknown", "", "" }, | |
261 { "bookmarks", "bookmarks", "" }, | |
262 { "bookmarks.", "bookmarks", "" }, | |
263 { ".bookmarks", "", "" }, | |
264 { "bookmarks.create", "bookmarks", "create" }, | |
265 { "bookmarks.create.", "bookmarks", "create." }, | |
266 { "bookmarks.create.monkey", "bookmarks", "create.monkey" }, | |
267 { "experimental.bookmarkManager", "experimental.bookmarkManager", "" }, | |
268 { "experimental.bookmarkManager.copy", "experimental.bookmarkManager", | |
269 "copy" } | |
270 }; | |
271 | |
272 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); | |
273 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | |
274 std::string child_name; | |
275 std::string api_name = api->GetAPINameForFullName(test_data[i].input, | |
276 &child_name); | |
277 EXPECT_EQ(test_data[i].api_name, api_name) << test_data[i].input; | |
278 EXPECT_EQ(test_data[i].child_name, child_name) << test_data[i].input; | |
279 } | |
280 } | |
281 | |
282 TEST(ExtensionAPI, Features) { | |
koz (OOO until 15th September)
2012/04/02 06:39:48
Features -> TestFeatureProperties?
Aaron Boodman
2012/04/02 08:21:54
Done.
| |
283 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); | |
284 | |
285 scoped_ptr<Feature> bookmarks(api->GetFeature("bookmarks")); | |
286 scoped_ptr<Feature> bookmarks_create(api->GetFeature("bookmarks.create")); | |
287 | |
288 struct { | |
289 Feature* feature; | |
290 // TODO(aa): More stuff to test over time. | |
291 } test_data[] = { | |
292 { bookmarks.get() }, | |
293 { bookmarks_create.get() } | |
294 }; | |
295 | |
296 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | |
297 Feature* feature = test_data[i].feature; | |
298 ASSERT_TRUE(feature) << i; | |
299 | |
300 EXPECT_TRUE(feature->whitelist()->empty()); | |
301 EXPECT_TRUE(feature->extension_types()->empty()); | |
302 | |
303 EXPECT_EQ(1u, feature->contexts()->size()); | |
304 EXPECT_TRUE(feature->contexts()->count( | |
305 Feature::BLESSED_EXTENSION_CONTEXT)); | |
306 | |
307 EXPECT_EQ(Feature::UNSPECIFIED_LOCATION, feature->location()); | |
308 EXPECT_EQ(Feature::UNSPECIFIED_PLATFORM, feature->platform()); | |
309 EXPECT_EQ(0, feature->min_manifest_version()); | |
310 EXPECT_EQ(0, feature->max_manifest_version()); | |
311 } | |
312 } | |
313 | |
314 TEST(ExtensionAPI, FeaturesRequireContexts) { | |
315 scoped_ptr<ListValue> schema1(new ListValue()); | |
316 DictionaryValue* feature_definition = new DictionaryValue(); | |
317 schema1->Append(feature_definition); | |
318 feature_definition->SetString("namespace", "test"); | |
319 feature_definition->SetBoolean("uses_feature_system", true); | |
320 | |
321 scoped_ptr<ListValue> schema2(schema1->DeepCopy()); | |
322 | |
323 ListValue* contexts = new ListValue(); | |
324 contexts->Append(Value::CreateStringValue("content_script")); | |
325 feature_definition->Set("contexts", contexts); | |
326 | |
327 struct { | |
328 ListValue* schema; | |
329 bool expect_success; | |
330 } test_data[] = { | |
331 { schema1.get(), true }, | |
332 { schema2.get(), false } | |
333 }; | |
334 | |
335 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | |
336 std::string schema_source; | |
337 base::JSONWriter::Write(test_data[i].schema, &schema_source); | |
338 | |
339 ExtensionAPI api; | |
340 api.RegisterSchema("test", base::StringPiece(schema_source)); | |
341 | |
342 scoped_ptr<Feature> feature(api.GetFeature("test")); | |
343 EXPECT_EQ(test_data[i].expect_success, feature.get() != NULL) << i; | |
344 } | |
193 } | 345 } |
194 | 346 |
195 } // namespace | 347 } // namespace |
196 } // namespace extensions | 348 } // namespace extensions |
OLD | NEW |