Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Side by Side Diff: chrome/common/extensions/features/simple_feature_unittest.cc

Issue 11316164: Implement ComplexFeature to support permission features with multiple rules. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Renames and add TODO Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/features/feature.h" 5 #include "chrome/common/extensions/features/simple_feature.h"
6 6
7 #include "chrome/common/extensions/value_builder.h"
7 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
8 9
9 using chrome::VersionInfo; 10 using chrome::VersionInfo;
11 using extensions::DictionaryBuilder;
10 using extensions::Extension; 12 using extensions::Extension;
11 using extensions::Feature; 13 using extensions::Feature;
14 using extensions::ListBuilder;
15 using extensions::SimpleFeature;
12 16
13 namespace { 17 namespace {
14 18
15 struct IsAvailableTestData { 19 struct IsAvailableTestData {
16 std::string extension_id; 20 std::string extension_id;
17 Extension::Type extension_type; 21 Extension::Type extension_type;
18 Feature::Location location; 22 Feature::Location location;
19 Feature::Platform platform; 23 Feature::Platform platform;
20 int manifest_version; 24 int manifest_version;
21 Feature::AvailabilityResult expected_result; 25 Feature::AvailabilityResult expected_result;
22 }; 26 };
23 27
24 class ExtensionFeatureTest : public testing::Test { 28 class ExtensionSimpleFeatureTest : public testing::Test {
25 protected: 29 protected:
26 ExtensionFeatureTest() 30 ExtensionSimpleFeatureTest()
27 : current_channel_(VersionInfo::CHANNEL_UNKNOWN) {} 31 : current_channel_(VersionInfo::CHANNEL_UNKNOWN) {}
28 virtual ~ExtensionFeatureTest() {} 32 virtual ~ExtensionSimpleFeatureTest() {}
29 33
30 private: 34 private:
31 Feature::ScopedCurrentChannel current_channel_; 35 Feature::ScopedCurrentChannel current_channel_;
32 }; 36 };
33 37
34 TEST_F(ExtensionFeatureTest, IsAvailableNullCase) { 38 TEST_F(ExtensionSimpleFeatureTest, IsAvailableNullCase) {
35 const IsAvailableTestData tests[] = { 39 const IsAvailableTestData tests[] = {
36 { "", Extension::TYPE_UNKNOWN, 40 { "", Extension::TYPE_UNKNOWN,
37 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, 41 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1,
38 Feature::IS_AVAILABLE }, 42 Feature::IS_AVAILABLE },
39 { "random-extension", Extension::TYPE_UNKNOWN, 43 { "random-extension", Extension::TYPE_UNKNOWN,
40 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, 44 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1,
41 Feature::IS_AVAILABLE }, 45 Feature::IS_AVAILABLE },
42 { "", Extension::TYPE_LEGACY_PACKAGED_APP, 46 { "", Extension::TYPE_LEGACY_PACKAGED_APP,
43 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, 47 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1,
44 Feature::IS_AVAILABLE }, 48 Feature::IS_AVAILABLE },
45 { "", Extension::TYPE_UNKNOWN, 49 { "", Extension::TYPE_UNKNOWN,
46 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, 50 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1,
47 Feature::IS_AVAILABLE }, 51 Feature::IS_AVAILABLE },
48 { "", Extension::TYPE_UNKNOWN, 52 { "", Extension::TYPE_UNKNOWN,
49 Feature::COMPONENT_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, 53 Feature::COMPONENT_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1,
50 Feature::IS_AVAILABLE }, 54 Feature::IS_AVAILABLE },
51 { "", Extension::TYPE_UNKNOWN, 55 { "", Extension::TYPE_UNKNOWN,
52 Feature::UNSPECIFIED_LOCATION, Feature::CHROMEOS_PLATFORM, -1, 56 Feature::UNSPECIFIED_LOCATION, Feature::CHROMEOS_PLATFORM, -1,
53 Feature::IS_AVAILABLE }, 57 Feature::IS_AVAILABLE },
54 { "", Extension::TYPE_UNKNOWN, 58 { "", Extension::TYPE_UNKNOWN,
55 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, 25, 59 Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, 25,
56 Feature::IS_AVAILABLE } 60 Feature::IS_AVAILABLE }
57 }; 61 };
58 62
59 Feature feature; 63 SimpleFeature feature;
60 for (size_t i = 0; i < arraysize(tests); ++i) { 64 for (size_t i = 0; i < arraysize(tests); ++i) {
61 const IsAvailableTestData& test = tests[i]; 65 const IsAvailableTestData& test = tests[i];
62 EXPECT_EQ(test.expected_result, 66 EXPECT_EQ(test.expected_result,
63 feature.IsAvailableToManifest(test.extension_id, 67 feature.IsAvailableToManifest(test.extension_id,
64 test.extension_type, 68 test.extension_type,
65 test.location, 69 test.location,
66 test.manifest_version, 70 test.manifest_version,
67 test.platform).result()); 71 test.platform).result());
68 } 72 }
69 } 73 }
70 74
71 TEST_F(ExtensionFeatureTest, Whitelist) { 75 TEST_F(ExtensionSimpleFeatureTest, Whitelist) {
72 Feature feature; 76 SimpleFeature feature;
73 feature.whitelist()->insert("foo"); 77 feature.whitelist()->insert("foo");
74 feature.whitelist()->insert("bar"); 78 feature.whitelist()->insert("bar");
75 79
76 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( 80 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
77 "foo", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, 81 "foo", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
78 Feature::UNSPECIFIED_PLATFORM).result()); 82 Feature::UNSPECIFIED_PLATFORM).result());
79 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( 83 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
80 "bar", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, 84 "bar", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
81 Feature::UNSPECIFIED_PLATFORM).result()); 85 Feature::UNSPECIFIED_PLATFORM).result());
82 86
83 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest( 87 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest(
84 "baz", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, 88 "baz", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
85 Feature::UNSPECIFIED_PLATFORM).result()); 89 Feature::UNSPECIFIED_PLATFORM).result());
86 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest( 90 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest(
87 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, 91 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
88 Feature::UNSPECIFIED_PLATFORM).result()); 92 Feature::UNSPECIFIED_PLATFORM).result());
89 93
90 feature.extension_types()->insert(Extension::TYPE_LEGACY_PACKAGED_APP); 94 feature.extension_types()->insert(Extension::TYPE_LEGACY_PACKAGED_APP);
91 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest( 95 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature.IsAvailableToManifest(
92 "baz", Extension::TYPE_LEGACY_PACKAGED_APP, 96 "baz", Extension::TYPE_LEGACY_PACKAGED_APP,
93 Feature::UNSPECIFIED_LOCATION, -1, 97 Feature::UNSPECIFIED_LOCATION, -1,
94 Feature::UNSPECIFIED_PLATFORM).result()); 98 Feature::UNSPECIFIED_PLATFORM).result());
95 } 99 }
96 100
97 TEST_F(ExtensionFeatureTest, PackageType) { 101 TEST_F(ExtensionSimpleFeatureTest, PackageType) {
98 Feature feature; 102 SimpleFeature feature;
99 feature.extension_types()->insert(Extension::TYPE_EXTENSION); 103 feature.extension_types()->insert(Extension::TYPE_EXTENSION);
100 feature.extension_types()->insert(Extension::TYPE_LEGACY_PACKAGED_APP); 104 feature.extension_types()->insert(Extension::TYPE_LEGACY_PACKAGED_APP);
101 105
102 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( 106 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
103 "", Extension::TYPE_EXTENSION, Feature::UNSPECIFIED_LOCATION, -1, 107 "", Extension::TYPE_EXTENSION, Feature::UNSPECIFIED_LOCATION, -1,
104 Feature::UNSPECIFIED_PLATFORM).result()); 108 Feature::UNSPECIFIED_PLATFORM).result());
105 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( 109 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
106 "", Extension::TYPE_LEGACY_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION, 110 "", Extension::TYPE_LEGACY_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION,
107 -1, Feature::UNSPECIFIED_PLATFORM).result()); 111 -1, Feature::UNSPECIFIED_PLATFORM).result());
108 112
109 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToManifest( 113 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToManifest(
110 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, 114 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
111 Feature::UNSPECIFIED_PLATFORM).result()); 115 Feature::UNSPECIFIED_PLATFORM).result());
112 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToManifest( 116 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToManifest(
113 "", Extension::TYPE_THEME, Feature::UNSPECIFIED_LOCATION, -1, 117 "", Extension::TYPE_THEME, Feature::UNSPECIFIED_LOCATION, -1,
114 Feature::UNSPECIFIED_PLATFORM).result()); 118 Feature::UNSPECIFIED_PLATFORM).result());
115 } 119 }
116 120
117 TEST_F(ExtensionFeatureTest, Context) { 121 TEST_F(ExtensionSimpleFeatureTest, Context) {
118 Feature feature; 122 SimpleFeature feature;
119 feature.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT); 123 feature.GetContexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT);
120 feature.extension_types()->insert(Extension::TYPE_LEGACY_PACKAGED_APP); 124 feature.extension_types()->insert(Extension::TYPE_LEGACY_PACKAGED_APP);
121 feature.set_platform(Feature::CHROMEOS_PLATFORM); 125 feature.set_platform(Feature::CHROMEOS_PLATFORM);
122 feature.set_min_manifest_version(21); 126 feature.set_min_manifest_version(21);
123 feature.set_max_manifest_version(25); 127 feature.set_max_manifest_version(25);
124 128
125 DictionaryValue manifest; 129 DictionaryValue manifest;
126 manifest.SetString("name", "test"); 130 manifest.SetString("name", "test");
127 manifest.SetString("version", "1"); 131 manifest.SetString("version", "1");
128 manifest.SetInteger("manifest_version", 21); 132 manifest.SetInteger("manifest_version", 21);
129 manifest.SetString("app.launch.local_path", "foo.html"); 133 manifest.SetString("app.launch.local_path", "foo.html");
(...skipping 11 matching lines...) Expand all
141 feature.whitelist()->clear(); 145 feature.whitelist()->clear();
142 146
143 feature.extension_types()->clear(); 147 feature.extension_types()->clear();
144 feature.extension_types()->insert(Extension::TYPE_THEME); 148 feature.extension_types()->insert(Extension::TYPE_THEME);
145 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToContext( 149 EXPECT_EQ(Feature::INVALID_TYPE, feature.IsAvailableToContext(
146 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, 150 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
147 Feature::CHROMEOS_PLATFORM).result()); 151 Feature::CHROMEOS_PLATFORM).result());
148 feature.extension_types()->clear(); 152 feature.extension_types()->clear();
149 feature.extension_types()->insert(Extension::TYPE_LEGACY_PACKAGED_APP); 153 feature.extension_types()->insert(Extension::TYPE_LEGACY_PACKAGED_APP);
150 154
151 feature.contexts()->clear(); 155 feature.GetContexts()->clear();
152 feature.contexts()->insert(Feature::UNBLESSED_EXTENSION_CONTEXT); 156 feature.GetContexts()->insert(Feature::UNBLESSED_EXTENSION_CONTEXT);
153 EXPECT_EQ(Feature::INVALID_CONTEXT, feature.IsAvailableToContext( 157 EXPECT_EQ(Feature::INVALID_CONTEXT, feature.IsAvailableToContext(
154 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, 158 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
155 Feature::CHROMEOS_PLATFORM).result()); 159 Feature::CHROMEOS_PLATFORM).result());
156 feature.contexts()->clear(); 160 feature.GetContexts()->clear();
157 feature.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT); 161 feature.GetContexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT);
158 162
159 feature.set_location(Feature::COMPONENT_LOCATION); 163 feature.set_location(Feature::COMPONENT_LOCATION);
160 EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailableToContext( 164 EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailableToContext(
161 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, 165 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
162 Feature::CHROMEOS_PLATFORM).result()); 166 Feature::CHROMEOS_PLATFORM).result());
163 feature.set_location(Feature::UNSPECIFIED_LOCATION); 167 feature.set_location(Feature::UNSPECIFIED_LOCATION);
164 168
165 EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailableToContext( 169 EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailableToContext(
166 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, 170 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
167 Feature::UNSPECIFIED_PLATFORM).result()); 171 Feature::UNSPECIFIED_PLATFORM).result());
168 172
169 feature.set_min_manifest_version(22); 173 feature.set_min_manifest_version(22);
170 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, feature.IsAvailableToContext( 174 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, feature.IsAvailableToContext(
171 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, 175 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
172 Feature::CHROMEOS_PLATFORM).result()); 176 Feature::CHROMEOS_PLATFORM).result());
173 feature.set_min_manifest_version(21); 177 feature.set_min_manifest_version(21);
174 178
175 feature.set_max_manifest_version(18); 179 feature.set_max_manifest_version(18);
176 EXPECT_EQ(Feature::INVALID_MAX_MANIFEST_VERSION, feature.IsAvailableToContext( 180 EXPECT_EQ(Feature::INVALID_MAX_MANIFEST_VERSION, feature.IsAvailableToContext(
177 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT, 181 extension.get(), Feature::BLESSED_EXTENSION_CONTEXT,
178 Feature::CHROMEOS_PLATFORM).result()); 182 Feature::CHROMEOS_PLATFORM).result());
179 feature.set_max_manifest_version(25); 183 feature.set_max_manifest_version(25);
180 } 184 }
181 185
182 TEST_F(ExtensionFeatureTest, Location) { 186 TEST_F(ExtensionSimpleFeatureTest, Location) {
183 Feature feature; 187 SimpleFeature feature;
184 188
185 // If the feature specifies "component" as its location, then only component 189 // If the feature specifies "component" as its location, then only component
186 // extensions can access it. 190 // extensions can access it.
187 feature.set_location(Feature::COMPONENT_LOCATION); 191 feature.set_location(Feature::COMPONENT_LOCATION);
188 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( 192 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
189 "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, -1, 193 "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, -1,
190 Feature::UNSPECIFIED_PLATFORM).result()); 194 Feature::UNSPECIFIED_PLATFORM).result());
191 EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailableToManifest( 195 EXPECT_EQ(Feature::INVALID_LOCATION, feature.IsAvailableToManifest(
192 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, 196 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
193 Feature::UNSPECIFIED_PLATFORM).result()); 197 Feature::UNSPECIFIED_PLATFORM).result());
194 198
195 // But component extensions can access anything else, whatever their location. 199 // But component extensions can access anything else, whatever their location.
196 feature.set_location(Feature::UNSPECIFIED_LOCATION); 200 feature.set_location(Feature::UNSPECIFIED_LOCATION);
197 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( 201 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
198 "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, -1, 202 "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION, -1,
199 Feature::UNSPECIFIED_PLATFORM).result()); 203 Feature::UNSPECIFIED_PLATFORM).result());
200 } 204 }
201 205
202 TEST_F(ExtensionFeatureTest, Platform) { 206 TEST_F(ExtensionSimpleFeatureTest, Platform) {
203 Feature feature; 207 SimpleFeature feature;
204 feature.set_platform(Feature::CHROMEOS_PLATFORM); 208 feature.set_platform(Feature::CHROMEOS_PLATFORM);
205 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( 209 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
206 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, 210 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
207 Feature::CHROMEOS_PLATFORM).result()); 211 Feature::CHROMEOS_PLATFORM).result());
208 EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailableToManifest( 212 EXPECT_EQ(Feature::INVALID_PLATFORM, feature.IsAvailableToManifest(
209 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1, 213 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, -1,
210 Feature::UNSPECIFIED_PLATFORM).result()); 214 Feature::UNSPECIFIED_PLATFORM).result());
211 } 215 }
212 216
213 TEST_F(ExtensionFeatureTest, Version) { 217 TEST_F(ExtensionSimpleFeatureTest, Version) {
214 Feature feature; 218 SimpleFeature feature;
215 feature.set_min_manifest_version(5); 219 feature.set_min_manifest_version(5);
216 220
217 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, 221 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION,
218 feature.IsAvailableToManifest( 222 feature.IsAvailableToManifest(
219 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, 223 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
220 0, Feature::UNSPECIFIED_PLATFORM).result()); 224 0, Feature::UNSPECIFIED_PLATFORM).result());
221 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION, 225 EXPECT_EQ(Feature::INVALID_MIN_MANIFEST_VERSION,
222 feature.IsAvailableToManifest( 226 feature.IsAvailableToManifest(
223 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, 227 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
224 4, Feature::UNSPECIFIED_PLATFORM).result()); 228 4, Feature::UNSPECIFIED_PLATFORM).result());
(...skipping 13 matching lines...) Expand all
238 10, Feature::UNSPECIFIED_PLATFORM).result()); 242 10, Feature::UNSPECIFIED_PLATFORM).result());
239 EXPECT_EQ(Feature::IS_AVAILABLE, 243 EXPECT_EQ(Feature::IS_AVAILABLE,
240 feature.IsAvailableToManifest( 244 feature.IsAvailableToManifest(
241 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, 245 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
242 8, Feature::UNSPECIFIED_PLATFORM).result()); 246 8, Feature::UNSPECIFIED_PLATFORM).result());
243 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest( 247 EXPECT_EQ(Feature::IS_AVAILABLE, feature.IsAvailableToManifest(
244 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION, 248 "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
245 7, Feature::UNSPECIFIED_PLATFORM).result()); 249 7, Feature::UNSPECIFIED_PLATFORM).result());
246 } 250 }
247 251
248 TEST_F(ExtensionFeatureTest, ParseNull) { 252 TEST_F(ExtensionSimpleFeatureTest, ParseNull) {
249 scoped_ptr<DictionaryValue> value(new DictionaryValue()); 253 scoped_ptr<DictionaryValue> value(new DictionaryValue());
250 scoped_ptr<Feature> feature(new Feature()); 254 scoped_ptr<SimpleFeature> feature(new SimpleFeature());
251 feature->Parse(value.get()); 255 feature->Parse(value.get());
252 EXPECT_TRUE(feature->whitelist()->empty()); 256 EXPECT_TRUE(feature->whitelist()->empty());
253 EXPECT_TRUE(feature->extension_types()->empty()); 257 EXPECT_TRUE(feature->extension_types()->empty());
254 EXPECT_TRUE(feature->contexts()->empty()); 258 EXPECT_TRUE(feature->GetContexts()->empty());
255 EXPECT_EQ(Feature::UNSPECIFIED_LOCATION, feature->location()); 259 EXPECT_EQ(Feature::UNSPECIFIED_LOCATION, feature->location());
256 EXPECT_EQ(Feature::UNSPECIFIED_PLATFORM, feature->platform()); 260 EXPECT_EQ(Feature::UNSPECIFIED_PLATFORM, feature->platform());
257 EXPECT_EQ(0, feature->min_manifest_version()); 261 EXPECT_EQ(0, feature->min_manifest_version());
258 EXPECT_EQ(0, feature->max_manifest_version()); 262 EXPECT_EQ(0, feature->max_manifest_version());
259 } 263 }
260 264
261 TEST_F(ExtensionFeatureTest, ParseWhitelist) { 265 TEST_F(ExtensionSimpleFeatureTest, ParseWhitelist) {
262 scoped_ptr<DictionaryValue> value(new DictionaryValue()); 266 scoped_ptr<DictionaryValue> value(new DictionaryValue());
263 ListValue* whitelist = new ListValue(); 267 ListValue* whitelist = new ListValue();
264 whitelist->Append(Value::CreateStringValue("foo")); 268 whitelist->Append(Value::CreateStringValue("foo"));
265 whitelist->Append(Value::CreateStringValue("bar")); 269 whitelist->Append(Value::CreateStringValue("bar"));
266 value->Set("whitelist", whitelist); 270 value->Set("whitelist", whitelist);
267 scoped_ptr<Feature> feature(new Feature()); 271 scoped_ptr<SimpleFeature> feature(new SimpleFeature());
268 feature->Parse(value.get()); 272 feature->Parse(value.get());
269 EXPECT_EQ(2u, feature->whitelist()->size()); 273 EXPECT_EQ(2u, feature->whitelist()->size());
270 EXPECT_TRUE(feature->whitelist()->count("foo")); 274 EXPECT_TRUE(feature->whitelist()->count("foo"));
271 EXPECT_TRUE(feature->whitelist()->count("bar")); 275 EXPECT_TRUE(feature->whitelist()->count("bar"));
272 } 276 }
273 277
274 TEST_F(ExtensionFeatureTest, ParsePackageTypes) { 278 TEST_F(ExtensionSimpleFeatureTest, ParsePackageTypes) {
275 scoped_ptr<DictionaryValue> value(new DictionaryValue()); 279 scoped_ptr<DictionaryValue> value(new DictionaryValue());
276 ListValue* extension_types = new ListValue(); 280 ListValue* extension_types = new ListValue();
277 extension_types->Append(Value::CreateStringValue("extension")); 281 extension_types->Append(Value::CreateStringValue("extension"));
278 extension_types->Append(Value::CreateStringValue("theme")); 282 extension_types->Append(Value::CreateStringValue("theme"));
279 extension_types->Append(Value::CreateStringValue("packaged_app")); 283 extension_types->Append(Value::CreateStringValue("packaged_app"));
280 extension_types->Append(Value::CreateStringValue("hosted_app")); 284 extension_types->Append(Value::CreateStringValue("hosted_app"));
281 extension_types->Append(Value::CreateStringValue("platform_app")); 285 extension_types->Append(Value::CreateStringValue("platform_app"));
282 value->Set("extension_types", extension_types); 286 value->Set("extension_types", extension_types);
283 scoped_ptr<Feature> feature(new Feature()); 287 scoped_ptr<SimpleFeature> feature(new SimpleFeature());
284 feature->Parse(value.get()); 288 feature->Parse(value.get());
285 EXPECT_EQ(5u, feature->extension_types()->size()); 289 EXPECT_EQ(5u, feature->extension_types()->size());
286 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_EXTENSION)); 290 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_EXTENSION));
287 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_THEME)); 291 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_THEME));
288 EXPECT_TRUE(feature->extension_types()->count( 292 EXPECT_TRUE(feature->extension_types()->count(
289 Extension::TYPE_LEGACY_PACKAGED_APP)); 293 Extension::TYPE_LEGACY_PACKAGED_APP));
290 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_HOSTED_APP)); 294 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_HOSTED_APP));
291 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_PLATFORM_APP)); 295 EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_PLATFORM_APP));
292 296
293 value->SetString("extension_types", "all"); 297 value->SetString("extension_types", "all");
294 scoped_ptr<Feature> feature2(new Feature()); 298 scoped_ptr<SimpleFeature> feature2(new SimpleFeature());
295 feature2->Parse(value.get()); 299 feature2->Parse(value.get());
296 EXPECT_EQ(*(feature->extension_types()), *(feature2->extension_types())); 300 EXPECT_EQ(*(feature->extension_types()), *(feature2->extension_types()));
297 } 301 }
298 302
299 TEST_F(ExtensionFeatureTest, ParseContexts) { 303 TEST_F(ExtensionSimpleFeatureTest, ParseContexts) {
300 scoped_ptr<DictionaryValue> value(new DictionaryValue()); 304 scoped_ptr<DictionaryValue> value(new DictionaryValue());
301 ListValue* contexts = new ListValue(); 305 ListValue* contexts = new ListValue();
302 contexts->Append(Value::CreateStringValue("blessed_extension")); 306 contexts->Append(Value::CreateStringValue("blessed_extension"));
303 contexts->Append(Value::CreateStringValue("unblessed_extension")); 307 contexts->Append(Value::CreateStringValue("unblessed_extension"));
304 contexts->Append(Value::CreateStringValue("content_script")); 308 contexts->Append(Value::CreateStringValue("content_script"));
305 contexts->Append(Value::CreateStringValue("web_page")); 309 contexts->Append(Value::CreateStringValue("web_page"));
306 value->Set("contexts", contexts); 310 value->Set("contexts", contexts);
307 scoped_ptr<Feature> feature(new Feature()); 311 scoped_ptr<SimpleFeature> feature(new SimpleFeature());
308 feature->Parse(value.get()); 312 feature->Parse(value.get());
309 EXPECT_EQ(4u, feature->contexts()->size()); 313 EXPECT_EQ(4u, feature->GetContexts()->size());
310 EXPECT_TRUE(feature->contexts()->count(Feature::BLESSED_EXTENSION_CONTEXT)); 314 EXPECT_TRUE(
311 EXPECT_TRUE(feature->contexts()->count(Feature::UNBLESSED_EXTENSION_CONTEXT)); 315 feature->GetContexts()->count(Feature::BLESSED_EXTENSION_CONTEXT));
312 EXPECT_TRUE(feature->contexts()->count(Feature::CONTENT_SCRIPT_CONTEXT)); 316 EXPECT_TRUE(
313 EXPECT_TRUE(feature->contexts()->count(Feature::WEB_PAGE_CONTEXT)); 317 feature->GetContexts()->count(Feature::UNBLESSED_EXTENSION_CONTEXT));
318 EXPECT_TRUE(
319 feature->GetContexts()->count(Feature::CONTENT_SCRIPT_CONTEXT));
320 EXPECT_TRUE(
321 feature->GetContexts()->count(Feature::WEB_PAGE_CONTEXT));
314 322
315 value->SetString("contexts", "all"); 323 value->SetString("contexts", "all");
316 scoped_ptr<Feature> feature2(new Feature()); 324 scoped_ptr<SimpleFeature> feature2(new SimpleFeature());
317 feature2->Parse(value.get()); 325 feature2->Parse(value.get());
318 EXPECT_EQ(*(feature->contexts()), *(feature2->contexts())); 326 EXPECT_EQ(*(feature->GetContexts()), *(feature2->GetContexts()));
319 } 327 }
320 328
321 TEST_F(ExtensionFeatureTest, ParseLocation) { 329 TEST_F(ExtensionSimpleFeatureTest, ParseLocation) {
322 scoped_ptr<DictionaryValue> value(new DictionaryValue()); 330 scoped_ptr<DictionaryValue> value(new DictionaryValue());
323 value->SetString("location", "component"); 331 value->SetString("location", "component");
324 scoped_ptr<Feature> feature(new Feature()); 332 scoped_ptr<SimpleFeature> feature(new SimpleFeature());
325 feature->Parse(value.get()); 333 feature->Parse(value.get());
326 EXPECT_EQ(Feature::COMPONENT_LOCATION, feature->location()); 334 EXPECT_EQ(Feature::COMPONENT_LOCATION, feature->location());
327 } 335 }
328 336
329 TEST_F(ExtensionFeatureTest, ParsePlatform) { 337 TEST_F(ExtensionSimpleFeatureTest, ParsePlatform) {
330 scoped_ptr<DictionaryValue> value(new DictionaryValue()); 338 scoped_ptr<DictionaryValue> value(new DictionaryValue());
331 value->SetString("platform", "chromeos"); 339 value->SetString("platform", "chromeos");
332 scoped_ptr<Feature> feature(new Feature()); 340 scoped_ptr<SimpleFeature> feature(new SimpleFeature());
333 feature->Parse(value.get()); 341 feature->Parse(value.get());
334 EXPECT_EQ(Feature::CHROMEOS_PLATFORM, feature->platform()); 342 EXPECT_EQ(Feature::CHROMEOS_PLATFORM, feature->platform());
335 } 343 }
336 344
337 TEST_F(ExtensionFeatureTest, ManifestVersion) { 345 TEST_F(ExtensionSimpleFeatureTest, ManifestVersion) {
338 scoped_ptr<DictionaryValue> value(new DictionaryValue()); 346 scoped_ptr<DictionaryValue> value(new DictionaryValue());
339 value->SetInteger("min_manifest_version", 1); 347 value->SetInteger("min_manifest_version", 1);
340 value->SetInteger("max_manifest_version", 5); 348 value->SetInteger("max_manifest_version", 5);
341 scoped_ptr<Feature> feature(new Feature()); 349 scoped_ptr<SimpleFeature> feature(new SimpleFeature());
342 feature->Parse(value.get()); 350 feature->Parse(value.get());
343 EXPECT_EQ(1, feature->min_manifest_version()); 351 EXPECT_EQ(1, feature->min_manifest_version());
344 EXPECT_EQ(5, feature->max_manifest_version()); 352 EXPECT_EQ(5, feature->max_manifest_version());
345 } 353 }
346 354
347 TEST_F(ExtensionFeatureTest, Inheritance) { 355 TEST_F(ExtensionSimpleFeatureTest, Inheritance) {
348 Feature feature; 356 SimpleFeature feature;
349 feature.whitelist()->insert("foo"); 357 feature.whitelist()->insert("foo");
350 feature.extension_types()->insert(Extension::TYPE_THEME); 358 feature.extension_types()->insert(Extension::TYPE_THEME);
351 feature.contexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT); 359 feature.GetContexts()->insert(Feature::BLESSED_EXTENSION_CONTEXT);
352 feature.set_location(Feature::COMPONENT_LOCATION); 360 feature.set_location(Feature::COMPONENT_LOCATION);
353 feature.set_platform(Feature::CHROMEOS_PLATFORM); 361 feature.set_platform(Feature::CHROMEOS_PLATFORM);
354 feature.set_min_manifest_version(1); 362 feature.set_min_manifest_version(1);
355 feature.set_max_manifest_version(2); 363 feature.set_max_manifest_version(2);
356 364
357 Feature feature2 = feature; 365 SimpleFeature feature2 = feature;
358 EXPECT_TRUE(feature2.Equals(feature)); 366 EXPECT_TRUE(feature2.Equals(feature));
359 367
360 DictionaryValue definition; 368 DictionaryValue definition;
361 feature2.Parse(&definition); 369 feature2.Parse(&definition);
362 EXPECT_TRUE(feature2.Equals(feature)); 370 EXPECT_TRUE(feature2.Equals(feature));
363 371
364 ListValue* whitelist = new ListValue(); 372 ListValue* whitelist = new ListValue();
365 ListValue* extension_types = new ListValue(); 373 ListValue* extension_types = new ListValue();
366 ListValue* contexts = new ListValue(); 374 ListValue* contexts = new ListValue();
367 whitelist->Append(Value::CreateStringValue("bar")); 375 whitelist->Append(Value::CreateStringValue("bar"));
368 extension_types->Append(Value::CreateStringValue("extension")); 376 extension_types->Append(Value::CreateStringValue("extension"));
369 contexts->Append(Value::CreateStringValue("unblessed_extension")); 377 contexts->Append(Value::CreateStringValue("unblessed_extension"));
370 definition.Set("whitelist", whitelist); 378 definition.Set("whitelist", whitelist);
371 definition.Set("extension_types", extension_types); 379 definition.Set("extension_types", extension_types);
372 definition.Set("contexts", contexts); 380 definition.Set("contexts", contexts);
373 // Can't test location or platform because we only have one value so far. 381 // Can't test location or platform because we only have one value so far.
374 definition.Set("min_manifest_version", Value::CreateIntegerValue(2)); 382 definition.Set("min_manifest_version", Value::CreateIntegerValue(2));
375 definition.Set("max_manifest_version", Value::CreateIntegerValue(3)); 383 definition.Set("max_manifest_version", Value::CreateIntegerValue(3));
376 384
377 feature2.Parse(&definition); 385 feature2.Parse(&definition);
378 EXPECT_FALSE(feature2.Equals(feature)); 386 EXPECT_FALSE(feature2.Equals(feature));
379 EXPECT_EQ(1u, feature2.whitelist()->size()); 387 EXPECT_EQ(1u, feature2.whitelist()->size());
380 EXPECT_EQ(1u, feature2.extension_types()->size()); 388 EXPECT_EQ(1u, feature2.extension_types()->size());
381 EXPECT_EQ(1u, feature2.contexts()->size()); 389 EXPECT_EQ(1u, feature2.GetContexts()->size());
382 EXPECT_EQ(1u, feature2.whitelist()->count("bar")); 390 EXPECT_EQ(1u, feature2.whitelist()->count("bar"));
383 EXPECT_EQ(1u, feature2.extension_types()->count(Extension::TYPE_EXTENSION)); 391 EXPECT_EQ(1u, feature2.extension_types()->count(Extension::TYPE_EXTENSION));
384 EXPECT_EQ(1u, 392 EXPECT_EQ(1u, feature2.GetContexts()->count(
385 feature2.contexts()->count(Feature::UNBLESSED_EXTENSION_CONTEXT)); 393 Feature::UNBLESSED_EXTENSION_CONTEXT));
386 EXPECT_EQ(2, feature2.min_manifest_version()); 394 EXPECT_EQ(2, feature2.min_manifest_version());
387 EXPECT_EQ(3, feature2.max_manifest_version()); 395 EXPECT_EQ(3, feature2.max_manifest_version());
388 } 396 }
389 397
390 TEST_F(ExtensionFeatureTest, Equals) { 398 TEST_F(ExtensionSimpleFeatureTest, Equals) {
391 Feature feature; 399 SimpleFeature feature;
392 feature.whitelist()->insert("foo"); 400 feature.whitelist()->insert("foo");
393 feature.extension_types()->insert(Extension::TYPE_THEME); 401 feature.extension_types()->insert(Extension::TYPE_THEME);
394 feature.contexts()->insert(Feature::UNBLESSED_EXTENSION_CONTEXT); 402 feature.GetContexts()->insert(Feature::UNBLESSED_EXTENSION_CONTEXT);
395 feature.set_location(Feature::COMPONENT_LOCATION); 403 feature.set_location(Feature::COMPONENT_LOCATION);
396 feature.set_platform(Feature::CHROMEOS_PLATFORM); 404 feature.set_platform(Feature::CHROMEOS_PLATFORM);
397 feature.set_min_manifest_version(18); 405 feature.set_min_manifest_version(18);
398 feature.set_max_manifest_version(25); 406 feature.set_max_manifest_version(25);
399 407
400 Feature feature2(feature); 408 SimpleFeature feature2(feature);
401 EXPECT_TRUE(feature2.Equals(feature)); 409 EXPECT_TRUE(feature2.Equals(feature));
402 410
403 feature2.whitelist()->clear(); 411 feature2.whitelist()->clear();
404 EXPECT_FALSE(feature2.Equals(feature)); 412 EXPECT_FALSE(feature2.Equals(feature));
405 413
406 feature2 = feature; 414 feature2 = feature;
407 feature2.extension_types()->clear(); 415 feature2.extension_types()->clear();
408 EXPECT_FALSE(feature2.Equals(feature)); 416 EXPECT_FALSE(feature2.Equals(feature));
409 417
410 feature2 = feature; 418 feature2 = feature;
411 feature2.contexts()->clear(); 419 feature2.GetContexts()->clear();
412 EXPECT_FALSE(feature2.Equals(feature)); 420 EXPECT_FALSE(feature2.Equals(feature));
413 421
414 feature2 = feature; 422 feature2 = feature;
415 feature2.set_location(Feature::UNSPECIFIED_LOCATION); 423 feature2.set_location(Feature::UNSPECIFIED_LOCATION);
416 EXPECT_FALSE(feature2.Equals(feature)); 424 EXPECT_FALSE(feature2.Equals(feature));
417 425
418 feature2 = feature; 426 feature2 = feature;
419 feature2.set_platform(Feature::UNSPECIFIED_PLATFORM); 427 feature2.set_platform(Feature::UNSPECIFIED_PLATFORM);
420 EXPECT_FALSE(feature2.Equals(feature)); 428 EXPECT_FALSE(feature2.Equals(feature));
421 429
422 feature2 = feature; 430 feature2 = feature;
423 feature2.set_min_manifest_version(0); 431 feature2.set_min_manifest_version(0);
424 EXPECT_FALSE(feature2.Equals(feature)); 432 EXPECT_FALSE(feature2.Equals(feature));
425 433
426 feature2 = feature; 434 feature2 = feature;
427 feature2.set_max_manifest_version(0); 435 feature2.set_max_manifest_version(0);
428 EXPECT_FALSE(feature2.Equals(feature)); 436 EXPECT_FALSE(feature2.Equals(feature));
429 } 437 }
430 438
431 Feature::AvailabilityResult IsAvailableInChannel( 439 Feature::AvailabilityResult IsAvailableInChannel(
432 const std::string& channel, VersionInfo::Channel channel_for_testing) { 440 const std::string& channel, VersionInfo::Channel channel_for_testing) {
433 Feature::ScopedCurrentChannel current_channel(channel_for_testing); 441 Feature::ScopedCurrentChannel current_channel(channel_for_testing);
434 442
435 Feature feature; 443 SimpleFeature feature;
436 if (!channel.empty()) { 444 if (!channel.empty()) {
437 DictionaryValue feature_value; 445 DictionaryValue feature_value;
438 feature_value.SetString("channel", channel); 446 feature_value.SetString("channel", channel);
439 feature.Parse(&feature_value); 447 feature.Parse(&feature_value);
440 } 448 }
441 449
442 return feature.IsAvailableToManifest( 450 return feature.IsAvailableToManifest(
443 "random-extension", 451 "random-extension",
444 Extension::TYPE_UNKNOWN, 452 Extension::TYPE_UNKNOWN,
445 Feature::UNSPECIFIED_LOCATION, 453 Feature::UNSPECIFIED_LOCATION,
446 -1).result(); 454 -1,
455 Feature::GetCurrentPlatform()).result();
447 } 456 }
448 457
449 TEST_F(ExtensionFeatureTest, SupportedChannel) { 458 TEST_F(ExtensionSimpleFeatureTest, SupportedChannel) {
450 // stable supported. 459 // stable supported.
451 EXPECT_EQ(Feature::IS_AVAILABLE, 460 EXPECT_EQ(Feature::IS_AVAILABLE,
452 IsAvailableInChannel("stable", VersionInfo::CHANNEL_UNKNOWN)); 461 IsAvailableInChannel("stable", VersionInfo::CHANNEL_UNKNOWN));
453 EXPECT_EQ(Feature::IS_AVAILABLE, 462 EXPECT_EQ(Feature::IS_AVAILABLE,
454 IsAvailableInChannel("stable", VersionInfo::CHANNEL_CANARY)); 463 IsAvailableInChannel("stable", VersionInfo::CHANNEL_CANARY));
455 EXPECT_EQ(Feature::IS_AVAILABLE, 464 EXPECT_EQ(Feature::IS_AVAILABLE,
456 IsAvailableInChannel("stable", VersionInfo::CHANNEL_DEV)); 465 IsAvailableInChannel("stable", VersionInfo::CHANNEL_DEV));
457 EXPECT_EQ(Feature::IS_AVAILABLE, 466 EXPECT_EQ(Feature::IS_AVAILABLE,
458 IsAvailableInChannel("stable", VersionInfo::CHANNEL_BETA)); 467 IsAvailableInChannel("stable", VersionInfo::CHANNEL_BETA));
459 EXPECT_EQ(Feature::IS_AVAILABLE, 468 EXPECT_EQ(Feature::IS_AVAILABLE,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 IsAvailableInChannel("", VersionInfo::CHANNEL_CANARY)); 523 IsAvailableInChannel("", VersionInfo::CHANNEL_CANARY));
515 EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL, 524 EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
516 IsAvailableInChannel("", VersionInfo::CHANNEL_DEV)); 525 IsAvailableInChannel("", VersionInfo::CHANNEL_DEV));
517 EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL, 526 EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
518 IsAvailableInChannel("", VersionInfo::CHANNEL_BETA)); 527 IsAvailableInChannel("", VersionInfo::CHANNEL_BETA));
519 EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL, 528 EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
520 IsAvailableInChannel("", VersionInfo::CHANNEL_STABLE)); 529 IsAvailableInChannel("", VersionInfo::CHANNEL_STABLE));
521 } 530 }
522 531
523 } // namespace 532 } // namespace
OLDNEW
« no previous file with comments | « chrome/common/extensions/features/simple_feature_provider_unittest.cc ('k') | chrome/common/extensions/manifest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698