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

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: Update after review. Created 3 years, 5 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 21 matching lines...) Expand all
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 "ash/public/cpp/ash_pref_names.h" // nogncheck 36 #include "ash/public/cpp/ash_pref_names.h" // nogncheck
37 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h" 37 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
38 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact ory.h" 38 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_fact ory.h"
39 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 39 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
40 #include "chrome/browser/chromeos/profiles/profile_helper.h" 40 #include "chrome/browser/chromeos/profiles/profile_helper.h"
41 #include "chrome/browser/chromeos/settings/cros_settings.h" 41 #include "chrome/browser/chromeos/settings/cros_settings.h"
42 #include "chrome/browser/chromeos/system/timezone_util.h"
42 #include "chromeos/settings/cros_settings_names.h" 43 #include "chromeos/settings/cros_settings_names.h"
43 #include "ui/chromeos/events/pref_names.h" 44 #include "ui/chromeos/events/pref_names.h"
44 #endif 45 #endif
45 46
46 namespace { 47 namespace {
47 48
48 #if defined(OS_CHROMEOS) 49 #if defined(OS_CHROMEOS)
49 bool IsPrivilegedCrosSetting(const std::string& pref_name) { 50 bool IsPrivilegedCrosSetting(const std::string& pref_name) {
50 if (!chromeos::CrosSettings::IsCrosSettings(pref_name)) 51 if (!chromeos::CrosSettings::IsCrosSettings(pref_name))
51 return false; 52 return false;
52 // kSystemTimezone should be changeable by all users. 53 if (!chromeos::system::PerUserTimezoneEnabled()) {
53 if (pref_name == chromeos::kSystemTimezone) 54 // kSystemTimezone should be changeable by all users.
54 return false; 55 if (pref_name == chromeos::kSystemTimezone)
55 // All other Cros settings are considered privileged and are either policy 56 return false;
57 // All other Cros settings are considered privileged and are either policy
58 // controlled or owner controlled.
stevenjb 2017/07/10 19:10:52 I still think this is confusing. This comment is a
Alexander Alekseev 2017/07/14 03:32:47 Done.
59 }
60 // All Cros settings are considered privileged and are either policy
stevenjb 2017/07/10 19:10:52 You can remove the 'All' to make this a bit more c
Alexander Alekseev 2017/07/14 03:32:47 Done.
56 // controlled or owner controlled. 61 // controlled or owner controlled.
57 return true; 62 return true;
58 } 63 }
64
65 bool IsCrosSettingReadOnly(const std::string& pref_name) {
66 if (chromeos::system::PerUserTimezoneEnabled()) {
67 // System timezone is never directly changable by user.
68 return pref_name == chromeos::kSystemTimezone;
69 }
70 return false;
71 }
59 #endif 72 #endif
60 73
61 } // namespace 74 } // namespace
62 75
63 namespace extensions { 76 namespace extensions {
64 77
65 namespace settings_private = api::settings_private; 78 namespace settings_private = api::settings_private;
66 79
67 PrefsUtil::PrefsUtil(Profile* profile) : profile_(profile) {} 80 PrefsUtil::PrefsUtil(Profile* profile) : profile_(profile) {}
68 81
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 settings_private::PrefType::PREF_TYPE_BOOLEAN; 295 settings_private::PrefType::PREF_TYPE_BOOLEAN;
283 (*s_whitelist)[proxy_config::prefs::kUseSharedProxies] = 296 (*s_whitelist)[proxy_config::prefs::kUseSharedProxies] =
284 settings_private::PrefType::PREF_TYPE_BOOLEAN; 297 settings_private::PrefType::PREF_TYPE_BOOLEAN;
285 (*s_whitelist)[::prefs::kWakeOnWifiDarkConnect] = 298 (*s_whitelist)[::prefs::kWakeOnWifiDarkConnect] =
286 settings_private::PrefType::PREF_TYPE_BOOLEAN; 299 settings_private::PrefType::PREF_TYPE_BOOLEAN;
287 (*s_whitelist)[::chromeos::kSignedDataRoamingEnabled] = 300 (*s_whitelist)[::chromeos::kSignedDataRoamingEnabled] =
288 settings_private::PrefType::PREF_TYPE_BOOLEAN; 301 settings_private::PrefType::PREF_TYPE_BOOLEAN;
289 302
290 // Timezone settings. 303 // Timezone settings.
291 (*s_whitelist)[chromeos::kSystemTimezone] = 304 (*s_whitelist)[chromeos::kSystemTimezone] =
305 settings_private::PrefType::PREF_TYPE_STRING;
306 (*s_whitelist)[prefs::kUserTimezone] =
307 settings_private::PrefType::PREF_TYPE_STRING;
308 (*s_whitelist)[::prefs::kResolveTimezoneByGeolocation] =
292 settings_private::PrefType::PREF_TYPE_BOOLEAN; 309 settings_private::PrefType::PREF_TYPE_BOOLEAN;
293 (*s_whitelist)[::prefs::kResolveTimezoneByGeolocation] = 310 (*s_whitelist)[chromeos::kPerUserTimezoneEnabled] =
294 settings_private::PrefType::PREF_TYPE_BOOLEAN; 311 settings_private::PrefType::PREF_TYPE_BOOLEAN;
295 312
296 // Ash settings. 313 // Ash settings.
297 (*s_whitelist)[::prefs::kEnableStylusTools] = 314 (*s_whitelist)[::prefs::kEnableStylusTools] =
298 settings_private::PrefType::PREF_TYPE_BOOLEAN; 315 settings_private::PrefType::PREF_TYPE_BOOLEAN;
299 (*s_whitelist)[::prefs::kLaunchPaletteOnEjectEvent] = 316 (*s_whitelist)[::prefs::kLaunchPaletteOnEjectEvent] =
300 settings_private::PrefType::PREF_TYPE_BOOLEAN; 317 settings_private::PrefType::PREF_TYPE_BOOLEAN;
301 (*s_whitelist)[::prefs::kNoteTakingAppEnabledOnLockScreen] = 318 (*s_whitelist)[::prefs::kNoteTakingAppEnabledOnLockScreen] =
302 settings_private::PrefType::PREF_TYPE_BOOLEAN; 319 settings_private::PrefType::PREF_TYPE_BOOLEAN;
303 (*s_whitelist)[ash::prefs::kNightLightEnabled] = 320 (*s_whitelist)[ash::prefs::kNightLightEnabled] =
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 pref = pref_service->FindPreference(name); 473 pref = pref_service->FindPreference(name);
457 if (!pref) 474 if (!pref)
458 return nullptr; 475 return nullptr;
459 pref_object.reset(new settings_private::PrefObject()); 476 pref_object.reset(new settings_private::PrefObject());
460 pref_object->key = pref->name(); 477 pref_object->key = pref->name();
461 pref_object->type = GetType(name, pref->GetType()); 478 pref_object->type = GetType(name, pref->GetType());
462 pref_object->value.reset(pref->GetValue()->DeepCopy()); 479 pref_object->value.reset(pref->GetValue()->DeepCopy());
463 } 480 }
464 481
465 #if defined(OS_CHROMEOS) 482 #if defined(OS_CHROMEOS)
483 // We first check for enterprise-managed, then for primary-user managed.
484 // Otherwise in multiprofile mode enterprise preference for the secondary
485 // user will appear primary-user-controlled, which looks strange, because
486 // primary user preference will be disabled with "enterprise controlled"
487 // status.
488 if (IsPrefEnterpriseManaged(name)) {
489 // Enterprise managed prefs are treated the same as device policy restricted
490 // prefs in the UI.
491 pref_object->controlled_by =
492 settings_private::ControlledBy::CONTROLLED_BY_DEVICE_POLICY;
493 pref_object->enforcement =
494 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
495 return pref_object;
496 }
497
466 if (IsPrefPrimaryUserControlled(name)) { 498 if (IsPrefPrimaryUserControlled(name)) {
467 pref_object->controlled_by = 499 pref_object->controlled_by =
468 settings_private::ControlledBy::CONTROLLED_BY_PRIMARY_USER; 500 settings_private::ControlledBy::CONTROLLED_BY_PRIMARY_USER;
469 pref_object->enforcement = 501 pref_object->enforcement =
470 settings_private::Enforcement::ENFORCEMENT_ENFORCED; 502 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
471 pref_object->controlled_by_name.reset( 503 pref_object->controlled_by_name.reset(
472 new std::string(user_manager::UserManager::Get() 504 new std::string(user_manager::UserManager::Get()
473 ->GetPrimaryUser() 505 ->GetPrimaryUser()
474 ->GetAccountId() 506 ->GetAccountId()
475 .GetUserEmail())); 507 .GetUserEmail()));
476 return pref_object; 508 return pref_object;
477 } 509 }
478
479 if (IsPrefEnterpriseManaged(name)) {
480 // Enterprise managed prefs are treated the same as device policy restricted
481 // prefs in the UI.
482 pref_object->controlled_by =
483 settings_private::ControlledBy::CONTROLLED_BY_DEVICE_POLICY;
484 pref_object->enforcement =
485 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
486 return pref_object;
487 }
488 #endif 510 #endif
489 511
490 if (pref && pref->IsManaged()) { 512 if (pref && pref->IsManaged()) {
491 pref_object->controlled_by = 513 pref_object->controlled_by =
492 settings_private::ControlledBy::CONTROLLED_BY_USER_POLICY; 514 settings_private::ControlledBy::CONTROLLED_BY_USER_POLICY;
493 pref_object->enforcement = 515 pref_object->enforcement =
494 settings_private::Enforcement::ENFORCEMENT_ENFORCED; 516 settings_private::Enforcement::ENFORCEMENT_ENFORCED;
495 return pref_object; 517 return pref_object;
496 } 518 }
497 519
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 #endif 685 #endif
664 } 686 }
665 687
666 bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) { 688 bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) {
667 return GetWhitelistedPrefType(pref_name) == 689 return GetWhitelistedPrefType(pref_name) ==
668 settings_private::PrefType::PREF_TYPE_URL; 690 settings_private::PrefType::PREF_TYPE_URL;
669 } 691 }
670 692
671 #if defined(OS_CHROMEOS) 693 #if defined(OS_CHROMEOS)
672 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) { 694 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) {
673 if (IsPrivilegedCrosSetting(pref_name)) { 695 if (chromeos::system::PerUserTimezoneEnabled()) {
674 policy::BrowserPolicyConnectorChromeOS* connector = 696 policy::BrowserPolicyConnectorChromeOS* connector =
675 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 697 g_browser_process->platform_part()->browser_policy_connector_chromeos();
676 if (connector->IsEnterpriseManaged()) 698 if (connector->IsEnterpriseManaged()) {
677 return true; 699 if (IsPrivilegedCrosSetting(pref_name))
700 return true;
701
702 if (pref_name == prefs::kUserTimezone ||
703 pref_name == prefs::kResolveTimezoneByGeolocation) {
704 return chromeos::system::IsTimezonePrefsManaged(pref_name);
705 }
706 }
707 } else {
708 if (IsPrivilegedCrosSetting(pref_name)) {
709 policy::BrowserPolicyConnectorChromeOS* connector =
710 g_browser_process->platform_part()
711 ->browser_policy_connector_chromeos();
712 if (connector->IsEnterpriseManaged())
713 return true;
714 }
678 } 715 }
stevenjb 2017/07/10 19:10:52 The above is confusing to read and duplicates logi
Alexander Alekseev 2017/07/14 03:32:47 Done.
679 return false; 716 return false;
680 } 717 }
681 718
682 bool PrefsUtil::IsPrefOwnerControlled(const std::string& pref_name) { 719 bool PrefsUtil::IsPrefOwnerControlled(const std::string& pref_name) {
720 // chromeos::kSystemTimezone is global display-only preference and
721 // it should appear as disabled, but not owned.
722 if (pref_name == chromeos::kSystemTimezone)
723 return false;
724
683 if (IsPrivilegedCrosSetting(pref_name)) { 725 if (IsPrivilegedCrosSetting(pref_name)) {
684 if (!chromeos::ProfileHelper::IsOwnerProfile(profile_)) 726 if (!chromeos::ProfileHelper::IsOwnerProfile(profile_))
685 return true; 727 return true;
686 } 728 }
687 return false; 729 return false;
688 } 730 }
689 731
690 bool PrefsUtil::IsPrefPrimaryUserControlled(const std::string& pref_name) { 732 bool PrefsUtil::IsPrefPrimaryUserControlled(const std::string& pref_name) {
691 if (pref_name == prefs::kWakeOnWifiDarkConnect) { 733 // chromeos::kSystemTimezone is read-only, but for the non-primary users
734 // it should have "primary user controlled" attribute.
735 if (pref_name == prefs::kWakeOnWifiDarkConnect ||
736 pref_name == prefs::kResolveTimezoneByGeolocation ||
737 pref_name == prefs::kUserTimezone ||
738 pref_name == chromeos::kSystemTimezone) {
692 user_manager::UserManager* user_manager = user_manager::UserManager::Get(); 739 user_manager::UserManager* user_manager = user_manager::UserManager::Get();
693 const user_manager::User* user = 740 const user_manager::User* user =
694 chromeos::ProfileHelper::Get()->GetUserByProfile(profile_); 741 chromeos::ProfileHelper::Get()->GetUserByProfile(profile_);
695 if (user && 742 if (user && user->GetAccountId() !=
696 user->GetAccountId() != user_manager->GetPrimaryUser()->GetAccountId()) 743 user_manager->GetPrimaryUser()->GetAccountId()) {
697 return true; 744 return true;
745 }
698 } 746 }
699 return false; 747 return false;
700 } 748 }
701 #endif 749 #endif
702 750
703 bool PrefsUtil::IsPrefSupervisorControlled(const std::string& pref_name) { 751 bool PrefsUtil::IsPrefSupervisorControlled(const std::string& pref_name) {
704 if (pref_name != prefs::kBrowserGuestModeEnabled && 752 if (pref_name != prefs::kBrowserGuestModeEnabled &&
705 pref_name != prefs::kBrowserAddPersonEnabled) { 753 pref_name != prefs::kBrowserAddPersonEnabled) {
706 return false; 754 return false;
707 } 755 }
708 return profile_->IsSupervised(); 756 return profile_->IsSupervised();
709 } 757 }
710 758
711 bool PrefsUtil::IsPrefUserModifiable(const std::string& pref_name) { 759 bool PrefsUtil::IsPrefUserModifiable(const std::string& pref_name) {
760 #if defined(OS_CHROMEOS)
761 if (IsCrosSettingReadOnly(pref_name))
762 return false;
763 #endif
764
712 const PrefService::Preference* profile_pref = 765 const PrefService::Preference* profile_pref =
713 profile_->GetPrefs()->FindPreference(pref_name); 766 profile_->GetPrefs()->FindPreference(pref_name);
714 if (profile_pref) 767 if (profile_pref)
715 return profile_pref->IsUserModifiable(); 768 return profile_pref->IsUserModifiable();
716 769
717 const PrefService::Preference* local_state_pref = 770 const PrefService::Preference* local_state_pref =
718 g_browser_process->local_state()->FindPreference(pref_name); 771 g_browser_process->local_state()->FindPreference(pref_name);
719 if (local_state_pref) 772 if (local_state_pref)
720 return local_state_pref->IsUserModifiable(); 773 return local_state_pref->IsUserModifiable();
721 774
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 ExtensionPrefValueMapFactory::GetForBrowserContext(profile_) 842 ExtensionPrefValueMapFactory::GetForBrowserContext(profile_)
790 ->GetExtensionControllingPref(pref_object.key); 843 ->GetExtensionControllingPref(pref_object.key);
791 if (extension_id.empty()) 844 if (extension_id.empty())
792 return nullptr; 845 return nullptr;
793 846
794 return ExtensionRegistry::Get(profile_)->GetExtensionById( 847 return ExtensionRegistry::Get(profile_)->GetExtensionById(
795 extension_id, ExtensionRegistry::ENABLED); 848 extension_id, ExtensionRegistry::ENABLED);
796 } 849 }
797 850
798 } // namespace extensions 851 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698