OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/browser/extensions/api/settings_private/prefs_util.h" | 5 #include "chrome/browser/extensions/api/settings_private/prefs_util.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 #include "chrome/browser/browser_process.h" | 8 #include "chrome/browser/browser_process.h" |
9 #include "chrome/browser/extensions/chrome_extension_function.h" | 9 #include "chrome/browser/extensions/chrome_extension_function.h" |
10 #include "chrome/browser/extensions/settings_api_helpers.h" | 10 #include "chrome/browser/extensions/settings_api_helpers.h" |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
365 settings_private::PrefType::PREF_TYPE_DICTIONARY; | 365 settings_private::PrefType::PREF_TYPE_DICTIONARY; |
366 | 366 |
367 #if defined(GOOGLE_CHROME_BUILD) | 367 #if defined(GOOGLE_CHROME_BUILD) |
368 (*s_whitelist)[::prefs::kMediaRouterEnableCloudServices] = | 368 (*s_whitelist)[::prefs::kMediaRouterEnableCloudServices] = |
369 settings_private::PrefType::PREF_TYPE_BOOLEAN; | 369 settings_private::PrefType::PREF_TYPE_BOOLEAN; |
370 #endif // defined(GOOGLE_CHROME_BUILD) | 370 #endif // defined(GOOGLE_CHROME_BUILD) |
371 | 371 |
372 return *s_whitelist; | 372 return *s_whitelist; |
373 } | 373 } |
374 | 374 |
375 settings_private::PrefType PrefsUtil::GetWhitelistedPrefType( | |
376 const std::string& pref_name) { | |
377 const TypedPrefMap& keys = GetWhitelistedKeys(); | |
378 const auto& iter = keys.find(pref_name); | |
michaelpg
2017/04/04 00:37:09
nit: keys.count(pref_name) ? : is (IMO) prettier t
stevenjb
2017/04/04 18:18:11
We need to return iter->second.
| |
379 return iter != keys.end() ? iter->second | |
380 : settings_private::PrefType::PREF_TYPE_NONE; | |
381 } | |
382 | |
375 settings_private::PrefType PrefsUtil::GetType(const std::string& name, | 383 settings_private::PrefType PrefsUtil::GetType(const std::string& name, |
376 base::Value::Type type) { | 384 base::Value::Type type) { |
377 switch (type) { | 385 switch (type) { |
378 case base::Value::Type::BOOLEAN: | 386 case base::Value::Type::BOOLEAN: |
379 return settings_private::PrefType::PREF_TYPE_BOOLEAN; | 387 return settings_private::PrefType::PREF_TYPE_BOOLEAN; |
380 case base::Value::Type::INTEGER: | 388 case base::Value::Type::INTEGER: |
381 case base::Value::Type::DOUBLE: | 389 case base::Value::Type::DOUBLE: |
382 return settings_private::PrefType::PREF_TYPE_NUMBER; | 390 return settings_private::PrefType::PREF_TYPE_NUMBER; |
383 case base::Value::Type::STRING: | 391 case base::Value::Type::STRING: |
384 return IsPrefTypeURL(name) ? settings_private::PrefType::PREF_TYPE_URL | 392 return IsPrefTypeURL(name) ? settings_private::PrefType::PREF_TYPE_URL |
385 : settings_private::PrefType::PREF_TYPE_STRING; | 393 : settings_private::PrefType::PREF_TYPE_STRING; |
386 case base::Value::Type::LIST: | 394 case base::Value::Type::LIST: |
387 return settings_private::PrefType::PREF_TYPE_LIST; | 395 return settings_private::PrefType::PREF_TYPE_LIST; |
388 case base::Value::Type::DICTIONARY: | 396 case base::Value::Type::DICTIONARY: |
389 return settings_private::PrefType::PREF_TYPE_DICTIONARY; | 397 return settings_private::PrefType::PREF_TYPE_DICTIONARY; |
390 default: | 398 default: |
391 return settings_private::PrefType::PREF_TYPE_NONE; | 399 return settings_private::PrefType::PREF_TYPE_NONE; |
392 } | 400 } |
393 } | 401 } |
394 | 402 |
395 std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetCrosSettingsPref( | 403 std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetCrosSettingsPref( |
396 const std::string& name) { | 404 const std::string& name) { |
397 std::unique_ptr<settings_private::PrefObject> pref_object( | 405 std::unique_ptr<settings_private::PrefObject> pref_object( |
398 new settings_private::PrefObject()); | 406 new settings_private::PrefObject()); |
399 | 407 |
400 #if defined(OS_CHROMEOS) | 408 #if defined(OS_CHROMEOS) |
401 const base::Value* value = CrosSettings::Get()->GetPref(name); | 409 const base::Value* value = CrosSettings::Get()->GetPref(name); |
402 DCHECK(value) << "Pref not found: " << name; | 410 if (!value) { |
411 LOG(ERROR) << "Cros settings pref not found: " << name; | |
michaelpg
2017/04/04 00:37:09
would NOTREACHED be more appropriate than removing
stevenjb
2017/04/04 18:18:11
We should only use DCHECK for code that is logical
| |
412 return nullptr; | |
413 } | |
403 pref_object->key = name; | 414 pref_object->key = name; |
404 pref_object->type = GetType(name, value->GetType()); | 415 pref_object->type = GetType(name, value->GetType()); |
405 pref_object->value.reset(value->DeepCopy()); | 416 pref_object->value.reset(value->DeepCopy()); |
406 #endif | 417 #endif |
407 | 418 |
408 return pref_object; | 419 return pref_object; |
409 } | 420 } |
410 | 421 |
411 std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetPref( | 422 std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetPref( |
412 const std::string& name) { | 423 const std::string& name) { |
424 if (GetWhitelistedPrefType(name) == | |
425 settings_private::PrefType::PREF_TYPE_NONE) { | |
426 return nullptr; | |
427 } | |
428 | |
413 const PrefService::Preference* pref = nullptr; | 429 const PrefService::Preference* pref = nullptr; |
414 std::unique_ptr<settings_private::PrefObject> pref_object; | 430 std::unique_ptr<settings_private::PrefObject> pref_object; |
415 if (IsCrosSetting(name)) { | 431 if (IsCrosSetting(name)) { |
416 pref_object = GetCrosSettingsPref(name); | 432 pref_object = GetCrosSettingsPref(name); |
433 if (!pref_object) | |
434 return nullptr; | |
417 } else { | 435 } else { |
418 PrefService* pref_service = FindServiceForPref(name); | 436 PrefService* pref_service = FindServiceForPref(name); |
419 pref = pref_service->FindPreference(name); | 437 pref = pref_service->FindPreference(name); |
420 if (!pref) | 438 if (!pref) |
421 return nullptr; | 439 return nullptr; |
422 pref_object.reset(new settings_private::PrefObject()); | 440 pref_object.reset(new settings_private::PrefObject()); |
423 pref_object->key = pref->name(); | 441 pref_object->key = pref->name(); |
424 pref_object->type = GetType(name, pref->GetType()); | 442 pref_object->type = GetType(name, pref->GetType()); |
425 pref_object->value.reset(pref->GetValue()->DeepCopy()); | 443 pref_object->value.reset(pref->GetValue()->DeepCopy()); |
426 } | 444 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
499 return pref_object; | 517 return pref_object; |
500 } | 518 } |
501 | 519 |
502 // TODO(dbeam): surface !IsUserModifiable or IsPrefSupervisorControlled? | 520 // TODO(dbeam): surface !IsUserModifiable or IsPrefSupervisorControlled? |
503 | 521 |
504 return pref_object; | 522 return pref_object; |
505 } | 523 } |
506 | 524 |
507 PrefsUtil::SetPrefResult PrefsUtil::SetPref(const std::string& pref_name, | 525 PrefsUtil::SetPrefResult PrefsUtil::SetPref(const std::string& pref_name, |
508 const base::Value* value) { | 526 const base::Value* value) { |
527 if (GetWhitelistedPrefType(pref_name) == | |
528 settings_private::PrefType::PREF_TYPE_NONE) { | |
529 return PREF_NOT_FOUND; | |
530 } | |
531 | |
509 if (IsCrosSetting(pref_name)) | 532 if (IsCrosSetting(pref_name)) |
510 return SetCrosSettingsPref(pref_name, value); | 533 return SetCrosSettingsPref(pref_name, value); |
511 | 534 |
512 PrefService* pref_service = FindServiceForPref(pref_name); | 535 PrefService* pref_service = FindServiceForPref(pref_name); |
513 | 536 |
514 if (!IsPrefUserModifiable(pref_name)) | 537 if (!IsPrefUserModifiable(pref_name)) |
515 return PREF_NOT_MODIFIABLE; | 538 return PREF_NOT_MODIFIABLE; |
516 | 539 |
517 const PrefService::Preference* pref = pref_service->FindPreference(pref_name); | 540 const PrefService::Preference* pref = pref_service->FindPreference(pref_name); |
518 if (!pref) | 541 if (!pref) |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
614 } | 637 } |
615 | 638 |
616 CrosSettings::Get()->RemoveFromList(pref_name, &value); | 639 CrosSettings::Get()->RemoveFromList(pref_name, &value); |
617 return true; | 640 return true; |
618 #else | 641 #else |
619 return false; | 642 return false; |
620 #endif | 643 #endif |
621 } | 644 } |
622 | 645 |
623 bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) { | 646 bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) { |
624 settings_private::PrefType pref_type = | 647 return GetWhitelistedPrefType(pref_name) == |
625 settings_private::PrefType::PREF_TYPE_NONE; | 648 settings_private::PrefType::PREF_TYPE_URL; |
626 | |
627 const TypedPrefMap keys = GetWhitelistedKeys(); | |
628 const auto& iter = keys.find(pref_name); | |
629 if (iter != keys.end()) | |
630 pref_type = iter->second; | |
631 | |
632 return pref_type == settings_private::PrefType::PREF_TYPE_URL; | |
633 } | 649 } |
634 | 650 |
635 #if defined(OS_CHROMEOS) | 651 #if defined(OS_CHROMEOS) |
636 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) { | 652 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) { |
637 if (IsPrivilegedCrosSetting(pref_name)) { | 653 if (IsPrivilegedCrosSetting(pref_name)) { |
638 policy::BrowserPolicyConnectorChromeOS* connector = | 654 policy::BrowserPolicyConnectorChromeOS* connector = |
639 g_browser_process->platform_part()->browser_policy_connector_chromeos(); | 655 g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
640 if (connector->IsEnterpriseManaged()) | 656 if (connector->IsEnterpriseManaged()) |
641 return true; | 657 return true; |
642 } | 658 } |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
751 ExtensionPrefValueMapFactory::GetForBrowserContext(profile_) | 767 ExtensionPrefValueMapFactory::GetForBrowserContext(profile_) |
752 ->GetExtensionControllingPref(pref_object.key); | 768 ->GetExtensionControllingPref(pref_object.key); |
753 if (extension_id.empty()) | 769 if (extension_id.empty()) |
754 return nullptr; | 770 return nullptr; |
755 | 771 |
756 return ExtensionRegistry::Get(profile_)->GetExtensionById( | 772 return ExtensionRegistry::Get(profile_)->GetExtensionById( |
757 extension_id, ExtensionRegistry::ENABLED); | 773 extension_id, ExtensionRegistry::ENABLED); |
758 } | 774 } |
759 | 775 |
760 } // namespace extensions | 776 } // namespace extensions |
OLD | NEW |