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

Side by Side Diff: chrome/browser/extensions/api/settings_private/prefs_util.cc

Issue 2849823003: ChromeOS: implement per-user time zone preferences. (Closed)
Patch Set: Fixed tests. Created 3 years, 7 months 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 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 20 matching lines...) Expand all
31 #include "extensions/browser/extension_system.h" 31 #include "extensions/browser/extension_system.h"
32 #include "extensions/browser/management_policy.h" 32 #include "extensions/browser/management_policy.h"
33 #include "extensions/common/extension.h" 33 #include "extensions/common/extension.h"
34 34
35 #if defined(OS_CHROMEOS) 35 #if defined(OS_CHROMEOS)
36 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" 36 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
37 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact ory.h" 37 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact ory.h"
38 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 38 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
39 #include "chrome/browser/chromeos/profiles/profile_helper.h" 39 #include "chrome/browser/chromeos/profiles/profile_helper.h"
40 #include "chrome/browser/chromeos/settings/cros_settings.h" 40 #include "chrome/browser/chromeos/settings/cros_settings.h"
41 #include "chrome/browser/chromeos/system/timezone_util.h"
41 #include "chromeos/settings/cros_settings_names.h" 42 #include "chromeos/settings/cros_settings_names.h"
42 #include "ui/chromeos/events/pref_names.h" 43 #include "ui/chromeos/events/pref_names.h"
43 #endif 44 #endif
44 45
45 namespace { 46 namespace {
46 47
47 #if defined(OS_CHROMEOS) 48 #if defined(OS_CHROMEOS)
49 const size_t primary_user_prefs_len = 4;
50 const char* const primary_user_prefs[primary_user_prefs_len] = {
51 prefs::kResolveTimezoneByGeolocation,
52 prefs::kUserTimezone,
53 prefs::kWakeOnWifiDarkConnect,
54 prefs::kWakeOnWifiDarkConnect
55 };
stevenjb 2017/05/15 17:08:02 const char* const primary_user_prefs[] = { ... };
Alexander Alekseev 2017/05/16 01:11:56 Done.
56
48 bool IsPrivilegedCrosSetting(const std::string& pref_name) { 57 bool IsPrivilegedCrosSetting(const std::string& pref_name) {
49 if (!chromeos::CrosSettings::IsCrosSettings(pref_name)) 58 if (!chromeos::CrosSettings::IsCrosSettings(pref_name))
50 return false; 59 return false;
51 // kSystemTimezone should be changeable by all users. 60 // All Cros settings are considered privileged and are either policy
52 if (pref_name == chromeos::kSystemTimezone)
53 return false;
54 // All other Cros settings are considered privileged and are either policy
55 // controlled or owner controlled. 61 // controlled or owner controlled.
56 return true; 62 return true;
57 } 63 }
64
65 bool IsCrosSettingReadOnly(const std::string& pref_name) {
66 // System timezone is never directly changable by user.
67 return pref_name == chromeos::kSystemTimezone;
68 }
58 #endif 69 #endif
59 70
60 } // namespace 71 } // namespace
61 72
62 namespace extensions { 73 namespace extensions {
63 74
64 namespace settings_private = api::settings_private; 75 namespace settings_private = api::settings_private;
65 76
66 PrefsUtil::PrefsUtil(Profile* profile) : profile_(profile) {} 77 PrefsUtil::PrefsUtil(Profile* profile) : profile_(profile) {}
67 78
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 settings_private::PrefType::PREF_TYPE_BOOLEAN; 288 settings_private::PrefType::PREF_TYPE_BOOLEAN;
278 (*s_whitelist)[proxy_config::prefs::kUseSharedProxies] = 289 (*s_whitelist)[proxy_config::prefs::kUseSharedProxies] =
279 settings_private::PrefType::PREF_TYPE_BOOLEAN; 290 settings_private::PrefType::PREF_TYPE_BOOLEAN;
280 (*s_whitelist)[::prefs::kWakeOnWifiDarkConnect] = 291 (*s_whitelist)[::prefs::kWakeOnWifiDarkConnect] =
281 settings_private::PrefType::PREF_TYPE_BOOLEAN; 292 settings_private::PrefType::PREF_TYPE_BOOLEAN;
282 (*s_whitelist)[::chromeos::kSignedDataRoamingEnabled] = 293 (*s_whitelist)[::chromeos::kSignedDataRoamingEnabled] =
283 settings_private::PrefType::PREF_TYPE_BOOLEAN; 294 settings_private::PrefType::PREF_TYPE_BOOLEAN;
284 295
285 // Timezone settings. 296 // Timezone settings.
286 (*s_whitelist)[chromeos::kSystemTimezone] = 297 (*s_whitelist)[chromeos::kSystemTimezone] =
287 settings_private::PrefType::PREF_TYPE_BOOLEAN; 298 settings_private::PrefType::PREF_TYPE_STRING;
299 (*s_whitelist)[prefs::kUserTimezone] =
300 settings_private::PrefType::PREF_TYPE_STRING;
288 (*s_whitelist)[::prefs::kResolveTimezoneByGeolocation] = 301 (*s_whitelist)[::prefs::kResolveTimezoneByGeolocation] =
289 settings_private::PrefType::PREF_TYPE_BOOLEAN; 302 settings_private::PrefType::PREF_TYPE_BOOLEAN;
290 303
291 // Ash settings. 304 // Ash settings.
292 (*s_whitelist)[::prefs::kEnableStylusTools] = 305 (*s_whitelist)[::prefs::kEnableStylusTools] =
293 settings_private::PrefType::PREF_TYPE_BOOLEAN; 306 settings_private::PrefType::PREF_TYPE_BOOLEAN;
294 (*s_whitelist)[::prefs::kLaunchPaletteOnEjectEvent] = 307 (*s_whitelist)[::prefs::kLaunchPaletteOnEjectEvent] =
295 settings_private::PrefType::PREF_TYPE_BOOLEAN; 308 settings_private::PrefType::PREF_TYPE_BOOLEAN;
296 309
297 // Input method settings. 310 // Input method settings.
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 pref = pref_service->FindPreference(name); 452 pref = pref_service->FindPreference(name);
440 if (!pref) 453 if (!pref)
441 return nullptr; 454 return nullptr;
442 pref_object.reset(new settings_private::PrefObject()); 455 pref_object.reset(new settings_private::PrefObject());
443 pref_object->key = pref->name(); 456 pref_object->key = pref->name();
444 pref_object->type = GetType(name, pref->GetType()); 457 pref_object->type = GetType(name, pref->GetType());
445 pref_object->value.reset(pref->GetValue()->DeepCopy()); 458 pref_object->value.reset(pref->GetValue()->DeepCopy());
446 } 459 }
447 460
448 #if defined(OS_CHROMEOS) 461 #if defined(OS_CHROMEOS)
462 // We first check for enterprise-managed, then for primary-user managed.
463 // Otherwise in multiprofile mode enterprise preference for the secondary
464 // user will appear primary-user-controlled, which looks strange, because
465 // primary user preference will be disabled with "enterprise controlled"
466 // status.
467 if (IsPrefEnterpriseManaged(name)) {
468 // Enterprise managed prefs are treated the same as device policy restricted
469 // prefs in the UI.
470 pref_object->controlled_by =
471 settings_private::ControlledBy::CONTROLLED_BY_DEVICE_POLICY;
472 pref_object->enforcement =
473 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
474 return pref_object;
475 }
476
449 if (IsPrefPrimaryUserControlled(name)) { 477 if (IsPrefPrimaryUserControlled(name)) {
450 pref_object->controlled_by = 478 pref_object->controlled_by =
451 settings_private::ControlledBy::CONTROLLED_BY_PRIMARY_USER; 479 settings_private::ControlledBy::CONTROLLED_BY_PRIMARY_USER;
452 pref_object->enforcement = 480 pref_object->enforcement =
453 settings_private::Enforcement::ENFORCEMENT_ENFORCED; 481 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
454 pref_object->controlled_by_name.reset( 482 pref_object->controlled_by_name.reset(
455 new std::string(user_manager::UserManager::Get() 483 new std::string(user_manager::UserManager::Get()
456 ->GetPrimaryUser() 484 ->GetPrimaryUser()
457 ->GetAccountId() 485 ->GetAccountId()
458 .GetUserEmail())); 486 .GetUserEmail()));
459 return pref_object; 487 return pref_object;
460 } 488 }
461
462 if (IsPrefEnterpriseManaged(name)) {
463 // Enterprise managed prefs are treated the same as device policy restricted
464 // prefs in the UI.
465 pref_object->controlled_by =
466 settings_private::ControlledBy::CONTROLLED_BY_DEVICE_POLICY;
467 pref_object->enforcement =
468 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
469 return pref_object;
470 }
471 #endif 489 #endif
472 490
473 if (pref && pref->IsManaged()) { 491 if (pref && pref->IsManaged()) {
474 pref_object->controlled_by = 492 pref_object->controlled_by =
475 settings_private::ControlledBy::CONTROLLED_BY_USER_POLICY; 493 settings_private::ControlledBy::CONTROLLED_BY_USER_POLICY;
476 pref_object->enforcement = 494 pref_object->enforcement =
477 settings_private::Enforcement::ENFORCEMENT_ENFORCED; 495 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
478 return pref_object; 496 return pref_object;
479 } 497 }
480 498
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 settings_private::Enforcement::ENFORCEMENT_ENFORCED; 531 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
514 pref_object->extension_id.reset(new std::string(extension->id())); 532 pref_object->extension_id.reset(new std::string(extension->id()));
515 pref_object->controlled_by_name.reset(new std::string(extension->name())); 533 pref_object->controlled_by_name.reset(new std::string(extension->name()));
516 bool can_be_disabled = !ExtensionSystem::Get(profile_)->management_policy() 534 bool can_be_disabled = !ExtensionSystem::Get(profile_)->management_policy()
517 ->MustRemainEnabled(extension, nullptr); 535 ->MustRemainEnabled(extension, nullptr);
518 pref_object->extension_can_be_disabled.reset(new bool(can_be_disabled)); 536 pref_object->extension_can_be_disabled.reset(new bool(can_be_disabled));
519 return pref_object; 537 return pref_object;
520 } 538 }
521 539
522 // TODO(dbeam): surface !IsUserModifiable or IsPrefSupervisorControlled? 540 // TODO(dbeam): surface !IsUserModifiable or IsPrefSupervisorControlled?
523
524 return pref_object; 541 return pref_object;
525 } 542 }
526 543
527 PrefsUtil::SetPrefResult PrefsUtil::SetPref(const std::string& pref_name, 544 PrefsUtil::SetPrefResult PrefsUtil::SetPref(const std::string& pref_name,
528 const base::Value* value) { 545 const base::Value* value) {
529 if (GetWhitelistedPrefType(pref_name) == 546 if (GetWhitelistedPrefType(pref_name) ==
530 settings_private::PrefType::PREF_TYPE_NONE) { 547 settings_private::PrefType::PREF_TYPE_NONE) {
531 return PREF_NOT_FOUND; 548 return PREF_NOT_FOUND;
532 } 549 }
533 550
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 return false; 661 return false;
645 #endif 662 #endif
646 } 663 }
647 664
648 bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) { 665 bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) {
649 return GetWhitelistedPrefType(pref_name) == 666 return GetWhitelistedPrefType(pref_name) ==
650 settings_private::PrefType::PREF_TYPE_URL; 667 settings_private::PrefType::PREF_TYPE_URL;
651 } 668 }
652 669
653 #if defined(OS_CHROMEOS) 670 #if defined(OS_CHROMEOS)
671
654 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) { 672 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) {
655 if (IsPrivilegedCrosSetting(pref_name)) { 673 policy::BrowserPolicyConnectorChromeOS* connector =
656 policy::BrowserPolicyConnectorChromeOS* connector = 674 g_browser_process->platform_part()->browser_policy_connector_chromeos();
657 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 675 if (connector->IsEnterpriseManaged()) {
658 if (connector->IsEnterpriseManaged()) 676 if (IsPrivilegedCrosSetting(pref_name))
659 return true; 677 return true;
678
679 if (pref_name == prefs::kUserTimezone ||
680 pref_name == prefs::kResolveTimezoneByGeolocation) {
681 return chromeos::system::IfTimezonePrefsmanaged(pref_name);
682 }
660 } 683 }
661 return false; 684 return false;
662 } 685 }
663 686
664 bool PrefsUtil::IsPrefOwnerControlled(const std::string& pref_name) { 687 bool PrefsUtil::IsPrefOwnerControlled(const std::string& pref_name) {
665 if (IsPrivilegedCrosSetting(pref_name)) { 688 if (IsPrivilegedCrosSetting(pref_name)) {
666 if (!chromeos::ProfileHelper::IsOwnerProfile(profile_)) 689 if (!chromeos::ProfileHelper::IsOwnerProfile(profile_))
667 return true; 690 return true;
668 } 691 }
669 return false; 692 return false;
670 } 693 }
671 694
672 bool PrefsUtil::IsPrefPrimaryUserControlled(const std::string& pref_name) { 695 bool PrefsUtil::IsPrefPrimaryUserControlled(const std::string& pref_name) {
673 if (pref_name == prefs::kWakeOnWifiDarkConnect) { 696 const char* const* end = primary_user_prefs + primary_user_prefs_len;
674 user_manager::UserManager* user_manager = user_manager::UserManager::Get(); 697 if (std::find(primary_user_prefs, end, pref_name) == end)
675 const user_manager::User* user = 698 return false;
stevenjb 2017/05/15 17:08:02 Since this appears to be the only place we use |pr
Alexander Alekseev 2017/05/16 01:11:56 Done.
676 chromeos::ProfileHelper::Get()->GetUserByProfile(profile_); 699
677 if (user && 700 user_manager::UserManager* user_manager = user_manager::UserManager::Get();
678 user->GetAccountId() != user_manager->GetPrimaryUser()->GetAccountId()) 701 const user_manager::User* user =
679 return true; 702 chromeos::ProfileHelper::Get()->GetUserByProfile(profile_);
680 } 703 if (user->GetAccountId() != user_manager->GetPrimaryUser()->GetAccountId())
704 return true;
705
681 return false; 706 return false;
682 } 707 }
683 #endif 708 #endif
684 709
685 bool PrefsUtil::IsPrefSupervisorControlled(const std::string& pref_name) { 710 bool PrefsUtil::IsPrefSupervisorControlled(const std::string& pref_name) {
686 if (pref_name != prefs::kBrowserGuestModeEnabled && 711 if (pref_name != prefs::kBrowserGuestModeEnabled &&
687 pref_name != prefs::kBrowserAddPersonEnabled) { 712 pref_name != prefs::kBrowserAddPersonEnabled) {
688 return false; 713 return false;
689 } 714 }
690 return profile_->IsSupervised(); 715 return profile_->IsSupervised();
691 } 716 }
692 717
693 bool PrefsUtil::IsPrefUserModifiable(const std::string& pref_name) { 718 bool PrefsUtil::IsPrefUserModifiable(const std::string& pref_name) {
719 #if defined(OS_CHROMEOS)
720 if (IsCrosSettingReadOnly(pref_name))
721 return false;
722 #endif
723
694 const PrefService::Preference* profile_pref = 724 const PrefService::Preference* profile_pref =
695 profile_->GetPrefs()->FindPreference(pref_name); 725 profile_->GetPrefs()->FindPreference(pref_name);
696 if (profile_pref) 726 if (profile_pref)
697 return profile_pref->IsUserModifiable(); 727 return profile_pref->IsUserModifiable();
698 728
699 const PrefService::Preference* local_state_pref = 729 const PrefService::Preference* local_state_pref =
700 g_browser_process->local_state()->FindPreference(pref_name); 730 g_browser_process->local_state()->FindPreference(pref_name);
701 if (local_state_pref) 731 if (local_state_pref)
702 return local_state_pref->IsUserModifiable(); 732 return local_state_pref->IsUserModifiable();
703 733
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 ExtensionPrefValueMapFactory::GetForBrowserContext(profile_) 801 ExtensionPrefValueMapFactory::GetForBrowserContext(profile_)
772 ->GetExtensionControllingPref(pref_object.key); 802 ->GetExtensionControllingPref(pref_object.key);
773 if (extension_id.empty()) 803 if (extension_id.empty())
774 return nullptr; 804 return nullptr;
775 805
776 return ExtensionRegistry::Get(profile_)->GetExtensionById( 806 return ExtensionRegistry::Get(profile_)->GetExtensionById(
777 extension_id, ExtensionRegistry::ENABLED); 807 extension_id, ExtensionRegistry::ENABLED);
778 } 808 }
779 809
780 } // namespace extensions 810 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698