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/browser/extensions/api/preference/preference_api.h" | 5 #include "chrome/browser/extensions/api/preference/preference_api.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <memory> | 10 #include <memory> |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 bool incognito = (pref_service != profile_->GetPrefs()); | 376 bool incognito = (pref_service != profile_->GetPrefs()); |
377 | 377 |
378 std::string event_name; | 378 std::string event_name; |
379 APIPermission::ID permission = APIPermission::kInvalid; | 379 APIPermission::ID permission = APIPermission::kInvalid; |
380 bool rv = PrefMapping::GetInstance()->FindEventForBrowserPref( | 380 bool rv = PrefMapping::GetInstance()->FindEventForBrowserPref( |
381 browser_pref, &event_name, &permission); | 381 browser_pref, &event_name, &permission); |
382 DCHECK(rv); | 382 DCHECK(rv); |
383 | 383 |
384 base::ListValue args; | 384 base::ListValue args; |
385 const PrefService::Preference* pref = | 385 const PrefService::Preference* pref = |
386 pref_service->FindPreference(browser_pref.c_str()); | 386 pref_service->FindPreference(browser_pref); |
387 CHECK(pref); | 387 CHECK(pref); |
388 PrefTransformerInterface* transformer = | 388 PrefTransformerInterface* transformer = |
389 PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref); | 389 PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref); |
390 base::Value* transformed_value = | 390 base::Value* transformed_value = |
391 transformer->BrowserToExtensionPref(pref->GetValue()); | 391 transformer->BrowserToExtensionPref(pref->GetValue()); |
392 if (!transformed_value) { | 392 if (!transformed_value) { |
393 LOG(ERROR) << ErrorUtils::FormatErrorMessage(kConversionErrorMessage, | 393 LOG(ERROR) << ErrorUtils::FormatErrorMessage(kConversionErrorMessage, |
394 pref->name()); | 394 pref->name()); |
395 return; | 395 return; |
396 } | 396 } |
(...skipping 23 matching lines...) Expand all Loading... |
420 browser_pref); | 420 browser_pref); |
421 } | 421 } |
422 | 422 |
423 void PreferenceAPIBase::SetExtensionControlledPref( | 423 void PreferenceAPIBase::SetExtensionControlledPref( |
424 const std::string& extension_id, | 424 const std::string& extension_id, |
425 const std::string& pref_key, | 425 const std::string& pref_key, |
426 ExtensionPrefsScope scope, | 426 ExtensionPrefsScope scope, |
427 base::Value* value) { | 427 base::Value* value) { |
428 #ifndef NDEBUG | 428 #ifndef NDEBUG |
429 const PrefService::Preference* pref = | 429 const PrefService::Preference* pref = |
430 extension_prefs()->pref_service()->FindPreference(pref_key.c_str()); | 430 extension_prefs()->pref_service()->FindPreference(pref_key); |
431 DCHECK(pref) << "Extension controlled preference key " << pref_key | 431 DCHECK(pref) << "Extension controlled preference key " << pref_key |
432 << " not registered."; | 432 << " not registered."; |
433 DCHECK_EQ(pref->GetType(), value->GetType()) | 433 DCHECK_EQ(pref->GetType(), value->GetType()) |
434 << "Extension controlled preference " << pref_key << " has wrong type."; | 434 << "Extension controlled preference " << pref_key << " has wrong type."; |
435 #endif | 435 #endif |
436 | 436 |
437 std::string scope_string; | 437 std::string scope_string; |
438 // ScopeToPrefName() returns false if the scope is not persisted. | 438 // ScopeToPrefName() returns false if the scope is not persisted. |
439 if (pref_names::ScopeToPrefName(scope, &scope_string)) { | 439 if (pref_names::ScopeToPrefName(scope, &scope_string)) { |
440 // Also store in persisted Preferences file to recover after a | 440 // Also store in persisted Preferences file to recover after a |
441 // browser restart. | 441 // browser restart. |
442 ExtensionPrefs::ScopedDictionaryUpdate update(extension_prefs(), | 442 ExtensionPrefs::ScopedDictionaryUpdate update(extension_prefs(), |
443 extension_id, | 443 extension_id, |
444 scope_string); | 444 scope_string); |
445 base::DictionaryValue* preference = update.Get(); | 445 base::DictionaryValue* preference = update.Get(); |
446 if (!preference) | 446 if (!preference) |
447 preference = update.Create(); | 447 preference = update.Create(); |
448 preference->SetWithoutPathExpansion(pref_key, value->DeepCopy()); | 448 preference->SetWithoutPathExpansion(pref_key, value->DeepCopy()); |
449 } | 449 } |
450 extension_pref_value_map()->SetExtensionPref( | 450 extension_pref_value_map()->SetExtensionPref( |
451 extension_id, pref_key, scope, value); | 451 extension_id, pref_key, scope, value); |
452 } | 452 } |
453 | 453 |
454 void PreferenceAPIBase::RemoveExtensionControlledPref( | 454 void PreferenceAPIBase::RemoveExtensionControlledPref( |
455 const std::string& extension_id, | 455 const std::string& extension_id, |
456 const std::string& pref_key, | 456 const std::string& pref_key, |
457 ExtensionPrefsScope scope) { | 457 ExtensionPrefsScope scope) { |
458 DCHECK(extension_prefs()->pref_service()->FindPreference(pref_key.c_str())) | 458 DCHECK(extension_prefs()->pref_service()->FindPreference(pref_key)) |
459 << "Extension controlled preference key " << pref_key | 459 << "Extension controlled preference key " << pref_key |
460 << " not registered."; | 460 << " not registered."; |
461 | 461 |
462 std::string scope_string; | 462 std::string scope_string; |
463 if (pref_names::ScopeToPrefName(scope, &scope_string)) { | 463 if (pref_names::ScopeToPrefName(scope, &scope_string)) { |
464 ExtensionPrefs::ScopedDictionaryUpdate update(extension_prefs(), | 464 ExtensionPrefs::ScopedDictionaryUpdate update(extension_prefs(), |
465 extension_id, | 465 extension_id, |
466 scope_string); | 466 scope_string); |
467 base::DictionaryValue* preference = update.Get(); | 467 base::DictionaryValue* preference = update.Get(); |
468 if (preference) | 468 if (preference) |
469 preference->RemoveWithoutPathExpansion(pref_key, NULL); | 469 preference->RemoveWithoutPathExpansion(pref_key, NULL); |
470 } | 470 } |
471 extension_pref_value_map()->RemoveExtensionPref( | 471 extension_pref_value_map()->RemoveExtensionPref( |
472 extension_id, pref_key, scope); | 472 extension_id, pref_key, scope); |
473 } | 473 } |
474 | 474 |
475 bool PreferenceAPIBase::CanExtensionControlPref( | 475 bool PreferenceAPIBase::CanExtensionControlPref( |
476 const std::string& extension_id, | 476 const std::string& extension_id, |
477 const std::string& pref_key, | 477 const std::string& pref_key, |
478 bool incognito) { | 478 bool incognito) { |
479 DCHECK(extension_prefs()->pref_service()->FindPreference(pref_key.c_str())) | 479 DCHECK(extension_prefs()->pref_service()->FindPreference(pref_key)) |
480 << "Extension controlled preference key " << pref_key | 480 << "Extension controlled preference key " << pref_key |
481 << " not registered."; | 481 << " not registered."; |
482 | 482 |
483 return extension_pref_value_map()->CanExtensionControlPref( | 483 return extension_pref_value_map()->CanExtensionControlPref( |
484 extension_id, pref_key, incognito); | 484 extension_id, pref_key, incognito); |
485 } | 485 } |
486 | 486 |
487 bool PreferenceAPIBase::DoesExtensionControlPref( | 487 bool PreferenceAPIBase::DoesExtensionControlPref( |
488 const std::string& extension_id, | 488 const std::string& extension_id, |
489 const std::string& pref_key, | 489 const std::string& pref_key, |
490 bool* from_incognito) { | 490 bool* from_incognito) { |
491 DCHECK(extension_prefs()->pref_service()->FindPreference(pref_key.c_str())) | 491 DCHECK(extension_prefs()->pref_service()->FindPreference(pref_key)) |
492 << "Extension controlled preference key " << pref_key | 492 << "Extension controlled preference key " << pref_key |
493 << " not registered."; | 493 << " not registered."; |
494 | 494 |
495 return extension_pref_value_map()->DoesExtensionControlPref( | 495 return extension_pref_value_map()->DoesExtensionControlPref( |
496 extension_id, pref_key, from_incognito); | 496 extension_id, pref_key, from_incognito); |
497 } | 497 } |
498 | 498 |
499 PreferenceAPI::PreferenceAPI(content::BrowserContext* context) | 499 PreferenceAPI::PreferenceAPI(content::BrowserContext* context) |
500 : profile_(Profile::FromBrowserContext(context)) { | 500 : profile_(Profile::FromBrowserContext(context)) { |
501 for (size_t i = 0; i < arraysize(kPrefMapping); ++i) { | 501 for (size_t i = 0; i < arraysize(kPrefMapping); ++i) { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 EXTENSION_FUNCTION_VALIDATE( | 612 EXTENSION_FUNCTION_VALIDATE( |
613 PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref( | 613 PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref( |
614 pref_key, &browser_pref, &read_permission, &write_permission)); | 614 pref_key, &browser_pref, &read_permission, &write_permission)); |
615 if (!extension()->permissions_data()->HasAPIPermission(read_permission)) | 615 if (!extension()->permissions_data()->HasAPIPermission(read_permission)) |
616 return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); | 616 return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); |
617 | 617 |
618 Profile* profile = Profile::FromBrowserContext(browser_context()); | 618 Profile* profile = Profile::FromBrowserContext(browser_context()); |
619 PrefService* prefs = | 619 PrefService* prefs = |
620 incognito ? profile->GetOffTheRecordPrefs() : profile->GetPrefs(); | 620 incognito ? profile->GetOffTheRecordPrefs() : profile->GetPrefs(); |
621 const PrefService::Preference* pref = | 621 const PrefService::Preference* pref = |
622 prefs->FindPreference(browser_pref.c_str()); | 622 prefs->FindPreference(browser_pref); |
623 CHECK(pref); | 623 CHECK(pref); |
624 | 624 |
625 std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue); | 625 std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue); |
626 | 626 |
627 // Retrieve level of control. | 627 // Retrieve level of control. |
628 std::string level_of_control = helpers::GetLevelOfControl( | 628 std::string level_of_control = helpers::GetLevelOfControl( |
629 profile, extension_id(), browser_pref, incognito); | 629 profile, extension_id(), browser_pref, incognito); |
630 result->SetString(keys::kLevelOfControl, level_of_control); | 630 result->SetString(keys::kLevelOfControl, level_of_control); |
631 | 631 |
632 // Retrieve pref value. | 632 // Retrieve pref value. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 APIPermission::ID read_permission = APIPermission::kInvalid; | 700 APIPermission::ID read_permission = APIPermission::kInvalid; |
701 APIPermission::ID write_permission = APIPermission::kInvalid; | 701 APIPermission::ID write_permission = APIPermission::kInvalid; |
702 EXTENSION_FUNCTION_VALIDATE( | 702 EXTENSION_FUNCTION_VALIDATE( |
703 PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref( | 703 PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref( |
704 pref_key, &browser_pref, &read_permission, &write_permission)); | 704 pref_key, &browser_pref, &read_permission, &write_permission)); |
705 if (!extension()->permissions_data()->HasAPIPermission(write_permission)) | 705 if (!extension()->permissions_data()->HasAPIPermission(write_permission)) |
706 return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); | 706 return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); |
707 | 707 |
708 ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context()); | 708 ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context()); |
709 const PrefService::Preference* pref = | 709 const PrefService::Preference* pref = |
710 prefs->pref_service()->FindPreference(browser_pref.c_str()); | 710 prefs->pref_service()->FindPreference(browser_pref); |
711 CHECK(pref); | 711 CHECK(pref); |
712 | 712 |
713 // Validate new value. | 713 // Validate new value. |
714 PrefTransformerInterface* transformer = | 714 PrefTransformerInterface* transformer = |
715 PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref); | 715 PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref); |
716 std::string error; | 716 std::string error; |
717 bool bad_message = false; | 717 bool bad_message = false; |
718 std::unique_ptr<base::Value> browser_pref_value( | 718 std::unique_ptr<base::Value> browser_pref_value( |
719 transformer->ExtensionToBrowserPref(value, &error, &bad_message)); | 719 transformer->ExtensionToBrowserPref(value, &error, &bad_message)); |
720 if (!browser_pref_value) { | 720 if (!browser_pref_value) { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 pref_key, &browser_pref, &read_permission, &write_permission)); | 774 pref_key, &browser_pref, &read_permission, &write_permission)); |
775 if (!extension()->permissions_data()->HasAPIPermission(write_permission)) | 775 if (!extension()->permissions_data()->HasAPIPermission(write_permission)) |
776 return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); | 776 return RespondNow(Error(keys::kPermissionErrorMessage, pref_key)); |
777 | 777 |
778 PreferenceAPI::Get(browser_context()) | 778 PreferenceAPI::Get(browser_context()) |
779 ->RemoveExtensionControlledPref(extension_id(), browser_pref, scope); | 779 ->RemoveExtensionControlledPref(extension_id(), browser_pref, scope); |
780 return RespondNow(NoArguments()); | 780 return RespondNow(NoArguments()); |
781 } | 781 } |
782 | 782 |
783 } // namespace extensions | 783 } // namespace extensions |
OLD | NEW |