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

Side by Side Diff: extensions/common/features/simple_feature.cc

Issue 801603002: Add support for command line switches to Features, and as proof that it works, (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: test fixes Created 6 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/common/features/simple_feature.h" 5 #include "extensions/common/features/simple_feature.h"
6 6
7 #include <map> 7 #include <map>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 } 241 }
242 return display_name_list; 242 return display_name_list;
243 } 243 }
244 244
245 std::string HashExtensionId(const std::string& extension_id) { 245 std::string HashExtensionId(const std::string& extension_id) {
246 const std::string id_hash = base::SHA1HashString(extension_id); 246 const std::string id_hash = base::SHA1HashString(extension_id);
247 DCHECK(id_hash.length() == base::kSHA1Length); 247 DCHECK(id_hash.length() == base::kSHA1Length);
248 return base::HexEncode(id_hash.c_str(), id_hash.length()); 248 return base::HexEncode(id_hash.c_str(), id_hash.length());
249 } 249 }
250 250
251 bool IsCommandLineSwitchEnabled(const std::string& switch_name) {
252 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
253 if (command_line->HasSwitch(switch_name + "=1"))
254 return true;
255 if (command_line->HasSwitch(std::string("enable-") + switch_name))
256 return true;
257 return false;
258 }
259
251 } // namespace 260 } // namespace
252 261
253 SimpleFeature::SimpleFeature() 262 SimpleFeature::SimpleFeature()
254 : location_(UNSPECIFIED_LOCATION), 263 : location_(UNSPECIFIED_LOCATION),
255 min_manifest_version_(0), 264 min_manifest_version_(0),
256 max_manifest_version_(0), 265 max_manifest_version_(0),
257 has_parent_(false),
258 component_extensions_auto_granted_(true) {} 266 component_extensions_auto_granted_(true) {}
259 267
260 SimpleFeature::~SimpleFeature() {} 268 SimpleFeature::~SimpleFeature() {}
261 269
262 bool SimpleFeature::HasDependencies() { 270 bool SimpleFeature::HasDependencies() {
263 return !dependencies_.empty(); 271 return !dependencies_.empty();
264 } 272 }
265 273
266 void SimpleFeature::AddFilter(scoped_ptr<SimpleFeatureFilter> filter) { 274 void SimpleFeature::AddFilter(scoped_ptr<SimpleFeatureFilter> filter) {
267 filters_.push_back(make_linked_ptr(filter.release())); 275 filters_.push_back(make_linked_ptr(filter.release()));
(...skipping 11 matching lines...) Expand all
279 ParseEnum<Location>(value, "location", &location_, 287 ParseEnum<Location>(value, "location", &location_,
280 g_mappings.Get().locations); 288 g_mappings.Get().locations);
281 ParseEnumSet<Platform>(value, "platforms", &platforms_, 289 ParseEnumSet<Platform>(value, "platforms", &platforms_,
282 g_mappings.Get().platforms); 290 g_mappings.Get().platforms);
283 value->GetInteger("min_manifest_version", &min_manifest_version_); 291 value->GetInteger("min_manifest_version", &min_manifest_version_);
284 value->GetInteger("max_manifest_version", &max_manifest_version_); 292 value->GetInteger("max_manifest_version", &max_manifest_version_);
285 293
286 no_parent_ = false; 294 no_parent_ = false;
287 value->GetBoolean("noparent", &no_parent_); 295 value->GetBoolean("noparent", &no_parent_);
288 296
289 component_extensions_auto_granted_ = true;
290 value->GetBoolean("component_extensions_auto_granted", 297 value->GetBoolean("component_extensions_auto_granted",
291 &component_extensions_auto_granted_); 298 &component_extensions_auto_granted_);
292 299
300 value->GetString("command_line_switch", &command_line_switch_);
301
293 // NOTE: ideally we'd sanity check that "matches" can be specified if and 302 // NOTE: ideally we'd sanity check that "matches" can be specified if and
294 // only if there's a "web_page" or "webui" context, but without 303 // only if there's a "web_page" or "webui" context, but without
295 // (Simple)Features being aware of their own heirarchy this is impossible. 304 // (Simple)Features being aware of their own heirarchy this is impossible.
296 // 305 //
297 // For example, we might have feature "foo" available to "web_page" context 306 // For example, we might have feature "foo" available to "web_page" context
298 // and "matches" google.com/*. Then a sub-feature "foo.bar" might override 307 // and "matches" google.com/*. Then a sub-feature "foo.bar" might override
299 // "matches" to be chromium.org/*. That sub-feature doesn't need to specify 308 // "matches" to be chromium.org/*. That sub-feature doesn't need to specify
300 // "web_page" context because it's inherited, but we don't know that here. 309 // "web_page" context because it's inherited, but we don't know that here.
301 310
302 for (FilterList::iterator filter_iter = filters_.begin(); 311 for (FilterList::iterator filter_iter = filters_.begin();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 if (!platforms_.empty() && 369 if (!platforms_.empty() &&
361 platforms_.find(platform) == platforms_.end()) 370 platforms_.find(platform) == platforms_.end())
362 return CreateAvailability(INVALID_PLATFORM, type); 371 return CreateAvailability(INVALID_PLATFORM, type);
363 372
364 if (min_manifest_version_ != 0 && manifest_version < min_manifest_version_) 373 if (min_manifest_version_ != 0 && manifest_version < min_manifest_version_)
365 return CreateAvailability(INVALID_MIN_MANIFEST_VERSION, type); 374 return CreateAvailability(INVALID_MIN_MANIFEST_VERSION, type);
366 375
367 if (max_manifest_version_ != 0 && manifest_version > max_manifest_version_) 376 if (max_manifest_version_ != 0 && manifest_version > max_manifest_version_)
368 return CreateAvailability(INVALID_MAX_MANIFEST_VERSION, type); 377 return CreateAvailability(INVALID_MAX_MANIFEST_VERSION, type);
369 378
379 if (!command_line_switch_.empty() &&
380 !IsCommandLineSwitchEnabled(command_line_switch_)) {
381 return CreateAvailability(MISSING_COMMAND_LINE_SWITCH, type);
382 }
383
370 for (FilterList::const_iterator filter_iter = filters_.begin(); 384 for (FilterList::const_iterator filter_iter = filters_.begin();
371 filter_iter != filters_.end(); 385 filter_iter != filters_.end();
372 ++filter_iter) { 386 ++filter_iter) {
373 Availability availability = (*filter_iter)->IsAvailableToManifest( 387 Availability availability = (*filter_iter)->IsAvailableToManifest(
374 extension_id, type, location, manifest_version, platform); 388 extension_id, type, location, manifest_version, platform);
375 if (!availability.is_available()) 389 if (!availability.is_available())
376 return availability; 390 return availability;
377 } 391 }
378 392
379 return CheckDependencies(base::Bind(&IsAvailableToManifestForBind, 393 return CheckDependencies(base::Bind(&IsAvailableToManifestForBind,
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 name().c_str(), 488 name().c_str(),
475 max_manifest_version_); 489 max_manifest_version_);
476 case NOT_PRESENT: 490 case NOT_PRESENT:
477 return base::StringPrintf( 491 return base::StringPrintf(
478 "'%s' requires a different Feature that is not present.", 492 "'%s' requires a different Feature that is not present.",
479 name().c_str()); 493 name().c_str());
480 case UNSUPPORTED_CHANNEL: 494 case UNSUPPORTED_CHANNEL:
481 return base::StringPrintf( 495 return base::StringPrintf(
482 "'%s' is unsupported in this version of the platform.", 496 "'%s' is unsupported in this version of the platform.",
483 name().c_str()); 497 name().c_str());
498 case MISSING_COMMAND_LINE_SWITCH:
499 return base::StringPrintf(
500 "'%s' requires the '%s' command line switch to be enabled.",
501 name().c_str(), command_line_switch_.c_str());
484 } 502 }
485 503
486 NOTREACHED(); 504 NOTREACHED();
487 return std::string(); 505 return std::string();
488 } 506 }
489 507
490 Feature::Availability SimpleFeature::CreateAvailability( 508 Feature::Availability SimpleFeature::CreateAvailability(
491 AvailabilityResult result) const { 509 AvailabilityResult result) const {
492 return Availability( 510 return Availability(
493 result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, GURL(), 511 result, GetAvailabilityMessage(result, Manifest::TYPE_UNKNOWN, GURL(),
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 if (!dependency) 590 if (!dependency)
573 return CreateAvailability(NOT_PRESENT); 591 return CreateAvailability(NOT_PRESENT);
574 Availability dependency_availability = checker.Run(dependency); 592 Availability dependency_availability = checker.Run(dependency);
575 if (!dependency_availability.is_available()) 593 if (!dependency_availability.is_available())
576 return dependency_availability; 594 return dependency_availability;
577 } 595 }
578 return CreateAvailability(IS_AVAILABLE); 596 return CreateAvailability(IS_AVAILABLE);
579 } 597 }
580 598
581 } // namespace extensions 599 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/common/features/simple_feature.h ('k') | extensions/common/features/simple_feature_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698