Home | History | Annotate | Download | only in policy
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/policy/configuration_policy_handler_list.h"
      6 
      7 #include <limits>
      8 
      9 #include "base/prefs/pref_value_map.h"
     10 #include "base/stl_util.h"
     11 #include "base/values.h"
     12 #include "chrome/browser/policy/configuration_policy_handler.h"
     13 #include "chrome/browser/policy/policy_error_map.h"
     14 #include "chrome/browser/policy/policy_map.h"
     15 #include "chrome/common/extensions/manifest.h"
     16 #include "chrome/common/pref_names.h"
     17 #include "grit/generated_resources.h"
     18 #include "policy/policy_constants.h"
     19 
     20 #if defined(OS_CHROMEOS)
     21 #include "ash/magnifier/magnifier_constants.h"
     22 #include "chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.h"
     23 #include "chromeos/dbus/power_policy_controller.h"
     24 #endif  // defined(OS_CHROMEOS)
     25 
     26 #if defined(OS_ANDROID)
     27 #include "chrome/browser/policy/configuration_policy_handler_android.h"
     28 #endif  // defined(OS_ANDROID)
     29 
     30 namespace policy {
     31 
     32 namespace {
     33 
     34 // Maps a policy type to a preference path, and to the expected value type.
     35 // This is the entry type of |kSimplePolicyMap| below.
     36 struct PolicyToPreferenceMapEntry {
     37   const char* policy_name;
     38   const char* preference_path;
     39   base::Value::Type value_type;
     40 };
     41 
     42 // List of policy types to preference names. This is used for simple policies
     43 // that directly map to a single preference.
     44 const PolicyToPreferenceMapEntry kSimplePolicyMap[] = {
     45   { key::kHomepageLocation,
     46     prefs::kHomePage,
     47     Value::TYPE_STRING },
     48   { key::kHomepageIsNewTabPage,
     49     prefs::kHomePageIsNewTabPage,
     50     Value::TYPE_BOOLEAN },
     51   { key::kRestoreOnStartupURLs,
     52     prefs::kURLsToRestoreOnStartup,
     53     Value::TYPE_LIST },
     54   { key::kAlternateErrorPagesEnabled,
     55     prefs::kAlternateErrorPagesEnabled,
     56     Value::TYPE_BOOLEAN },
     57   { key::kSearchSuggestEnabled,
     58     prefs::kSearchSuggestEnabled,
     59     Value::TYPE_BOOLEAN },
     60   { key::kDnsPrefetchingEnabled,
     61     prefs::kNetworkPredictionEnabled,
     62     Value::TYPE_BOOLEAN },
     63   { key::kBuiltInDnsClientEnabled,
     64     prefs::kBuiltInDnsClientEnabled,
     65     Value::TYPE_BOOLEAN },
     66   { key::kDisableSpdy,
     67     prefs::kDisableSpdy,
     68     Value::TYPE_BOOLEAN },
     69   { key::kSafeBrowsingEnabled,
     70     prefs::kSafeBrowsingEnabled,
     71     Value::TYPE_BOOLEAN },
     72   { key::kForceSafeSearch,
     73     prefs::kForceSafeSearch,
     74     Value::TYPE_BOOLEAN },
     75   { key::kPasswordManagerEnabled,
     76     prefs::kPasswordManagerEnabled,
     77     Value::TYPE_BOOLEAN },
     78   { key::kPasswordManagerAllowShowPasswords,
     79     prefs::kPasswordManagerAllowShowPasswords,
     80     Value::TYPE_BOOLEAN },
     81   { key::kPrintingEnabled,
     82     prefs::kPrintingEnabled,
     83     Value::TYPE_BOOLEAN },
     84   { key::kDisablePrintPreview,
     85     prefs::kPrintPreviewDisabled,
     86     Value::TYPE_BOOLEAN },
     87   { key::kMetricsReportingEnabled,
     88     prefs::kMetricsReportingEnabled,
     89     Value::TYPE_BOOLEAN },
     90   { key::kApplicationLocaleValue,
     91     prefs::kApplicationLocale,
     92     Value::TYPE_STRING },
     93   { key::kExtensionInstallForcelist,
     94     prefs::kExtensionInstallForceList,
     95     Value::TYPE_LIST },
     96   { key::kDisabledPlugins,
     97     prefs::kPluginsDisabledPlugins,
     98     Value::TYPE_LIST },
     99   { key::kDisabledPluginsExceptions,
    100     prefs::kPluginsDisabledPluginsExceptions,
    101     Value::TYPE_LIST },
    102   { key::kEnabledPlugins,
    103     prefs::kPluginsEnabledPlugins,
    104     Value::TYPE_LIST },
    105   { key::kShowHomeButton,
    106     prefs::kShowHomeButton,
    107     Value::TYPE_BOOLEAN },
    108   { key::kSavingBrowserHistoryDisabled,
    109     prefs::kSavingBrowserHistoryDisabled,
    110     Value::TYPE_BOOLEAN },
    111   { key::kAllowDeletingBrowserHistory,
    112     prefs::kAllowDeletingBrowserHistory,
    113     Value::TYPE_BOOLEAN },
    114   { key::kDeveloperToolsDisabled,
    115     prefs::kDevToolsDisabled,
    116     Value::TYPE_BOOLEAN },
    117   { key::kBlockThirdPartyCookies,
    118     prefs::kBlockThirdPartyCookies,
    119     Value::TYPE_BOOLEAN },
    120   { key::kDefaultCookiesSetting,
    121     prefs::kManagedDefaultCookiesSetting,
    122     Value::TYPE_INTEGER },
    123   { key::kDefaultImagesSetting,
    124     prefs::kManagedDefaultImagesSetting,
    125     Value::TYPE_INTEGER },
    126   { key::kDefaultPluginsSetting,
    127     prefs::kManagedDefaultPluginsSetting,
    128     Value::TYPE_INTEGER },
    129   { key::kDefaultPopupsSetting,
    130     prefs::kManagedDefaultPopupsSetting,
    131     Value::TYPE_INTEGER },
    132   { key::kAutoSelectCertificateForUrls,
    133     prefs::kManagedAutoSelectCertificateForUrls,
    134     Value::TYPE_LIST },
    135   { key::kCookiesAllowedForUrls,
    136     prefs::kManagedCookiesAllowedForUrls,
    137     Value::TYPE_LIST },
    138   { key::kCookiesBlockedForUrls,
    139     prefs::kManagedCookiesBlockedForUrls,
    140     Value::TYPE_LIST },
    141   { key::kCookiesSessionOnlyForUrls,
    142     prefs::kManagedCookiesSessionOnlyForUrls,
    143     Value::TYPE_LIST },
    144   { key::kImagesAllowedForUrls,
    145     prefs::kManagedImagesAllowedForUrls,
    146     Value::TYPE_LIST },
    147   { key::kImagesBlockedForUrls,
    148     prefs::kManagedImagesBlockedForUrls,
    149     Value::TYPE_LIST },
    150   { key::kJavaScriptAllowedForUrls,
    151     prefs::kManagedJavaScriptAllowedForUrls,
    152     Value::TYPE_LIST },
    153   { key::kJavaScriptBlockedForUrls,
    154     prefs::kManagedJavaScriptBlockedForUrls,
    155     Value::TYPE_LIST },
    156   { key::kPluginsAllowedForUrls,
    157     prefs::kManagedPluginsAllowedForUrls,
    158     Value::TYPE_LIST },
    159   { key::kPluginsBlockedForUrls,
    160     prefs::kManagedPluginsBlockedForUrls,
    161     Value::TYPE_LIST },
    162   { key::kPopupsAllowedForUrls,
    163     prefs::kManagedPopupsAllowedForUrls,
    164     Value::TYPE_LIST },
    165   { key::kPopupsBlockedForUrls,
    166     prefs::kManagedPopupsBlockedForUrls,
    167     Value::TYPE_LIST },
    168   { key::kNotificationsAllowedForUrls,
    169     prefs::kManagedNotificationsAllowedForUrls,
    170     Value::TYPE_LIST },
    171   { key::kNotificationsBlockedForUrls,
    172     prefs::kManagedNotificationsBlockedForUrls,
    173     Value::TYPE_LIST },
    174   { key::kDefaultNotificationsSetting,
    175     prefs::kManagedDefaultNotificationsSetting,
    176     Value::TYPE_INTEGER },
    177   { key::kDefaultGeolocationSetting,
    178     prefs::kManagedDefaultGeolocationSetting,
    179     Value::TYPE_INTEGER },
    180   { key::kSigninAllowed,
    181     prefs::kSigninAllowed,
    182     Value::TYPE_BOOLEAN },
    183   { key::kEnableOriginBoundCerts,
    184     prefs::kEnableOriginBoundCerts,
    185     Value::TYPE_BOOLEAN },
    186   { key::kDisableSSLRecordSplitting,
    187     prefs::kDisableSSLRecordSplitting,
    188     Value::TYPE_BOOLEAN },
    189   { key::kEnableOnlineRevocationChecks,
    190     prefs::kCertRevocationCheckingEnabled,
    191     Value::TYPE_BOOLEAN },
    192   { key::kRequireOnlineRevocationChecksForLocalAnchors,
    193     prefs::kCertRevocationCheckingRequiredLocalAnchors,
    194     Value::TYPE_BOOLEAN },
    195   { key::kAuthSchemes,
    196     prefs::kAuthSchemes,
    197     Value::TYPE_STRING },
    198   { key::kDisableAuthNegotiateCnameLookup,
    199     prefs::kDisableAuthNegotiateCnameLookup,
    200     Value::TYPE_BOOLEAN },
    201   { key::kEnableAuthNegotiatePort,
    202     prefs::kEnableAuthNegotiatePort,
    203     Value::TYPE_BOOLEAN },
    204   { key::kAuthServerWhitelist,
    205     prefs::kAuthServerWhitelist,
    206     Value::TYPE_STRING },
    207   { key::kAuthNegotiateDelegateWhitelist,
    208     prefs::kAuthNegotiateDelegateWhitelist,
    209     Value::TYPE_STRING },
    210   { key::kGSSAPILibraryName,
    211     prefs::kGSSAPILibraryName,
    212     Value::TYPE_STRING },
    213   { key::kAllowCrossOriginAuthPrompt,
    214     prefs::kAllowCrossOriginAuthPrompt,
    215     Value::TYPE_BOOLEAN },
    216   { key::kDisable3DAPIs,
    217     prefs::kDisable3DAPIs,
    218     Value::TYPE_BOOLEAN },
    219   { key::kDisablePluginFinder,
    220     prefs::kDisablePluginFinder,
    221     Value::TYPE_BOOLEAN },
    222   { key::kDiskCacheSize,
    223     prefs::kDiskCacheSize,
    224     Value::TYPE_INTEGER },
    225   { key::kMediaCacheSize,
    226     prefs::kMediaCacheSize,
    227     Value::TYPE_INTEGER },
    228   { key::kPolicyRefreshRate,
    229     prefs::kUserPolicyRefreshRate,
    230     Value::TYPE_INTEGER },
    231   { key::kDevicePolicyRefreshRate,
    232     prefs::kDevicePolicyRefreshRate,
    233     Value::TYPE_INTEGER },
    234   { key::kDefaultBrowserSettingEnabled,
    235     prefs::kDefaultBrowserSettingEnabled,
    236     Value::TYPE_BOOLEAN },
    237   { key::kRemoteAccessHostFirewallTraversal,
    238     prefs::kRemoteAccessHostFirewallTraversal,
    239     Value::TYPE_BOOLEAN },
    240   { key::kRemoteAccessHostRequireTwoFactor,
    241     prefs::kRemoteAccessHostRequireTwoFactor,
    242     Value::TYPE_BOOLEAN },
    243   { key::kRemoteAccessHostDomain,
    244     prefs::kRemoteAccessHostDomain,
    245     Value::TYPE_STRING },
    246   { key::kRemoteAccessHostTalkGadgetPrefix,
    247     prefs::kRemoteAccessHostTalkGadgetPrefix,
    248     Value::TYPE_STRING },
    249   { key::kRemoteAccessHostRequireCurtain,
    250     prefs::kRemoteAccessHostRequireCurtain,
    251     Value::TYPE_BOOLEAN },
    252   { key::kRemoteAccessHostAllowClientPairing,
    253     prefs::kRemoteAccessHostAllowClientPairing,
    254     Value::TYPE_BOOLEAN },
    255   { key::kCloudPrintProxyEnabled,
    256     prefs::kCloudPrintProxyEnabled,
    257     Value::TYPE_BOOLEAN },
    258   { key::kCloudPrintSubmitEnabled,
    259     prefs::kCloudPrintSubmitEnabled,
    260     Value::TYPE_BOOLEAN },
    261   { key::kTranslateEnabled,
    262     prefs::kEnableTranslate,
    263     Value::TYPE_BOOLEAN },
    264   { key::kAllowOutdatedPlugins,
    265     prefs::kPluginsAllowOutdated,
    266     Value::TYPE_BOOLEAN },
    267   { key::kAlwaysAuthorizePlugins,
    268     prefs::kPluginsAlwaysAuthorize,
    269     Value::TYPE_BOOLEAN },
    270   { key::kBookmarkBarEnabled,
    271     prefs::kShowBookmarkBar,
    272     Value::TYPE_BOOLEAN },
    273   { key::kEditBookmarksEnabled,
    274     prefs::kEditBookmarksEnabled,
    275     Value::TYPE_BOOLEAN },
    276   { key::kAllowFileSelectionDialogs,
    277     prefs::kAllowFileSelectionDialogs,
    278     Value::TYPE_BOOLEAN },
    279   { key::kImportBookmarks,
    280     prefs::kImportBookmarks,
    281     Value::TYPE_BOOLEAN },
    282   { key::kImportHistory,
    283     prefs::kImportHistory,
    284     Value::TYPE_BOOLEAN },
    285   { key::kImportHomepage,
    286     prefs::kImportHomepage,
    287     Value::TYPE_BOOLEAN },
    288   { key::kImportSearchEngine,
    289     prefs::kImportSearchEngine,
    290     Value::TYPE_BOOLEAN },
    291   { key::kImportSavedPasswords,
    292     prefs::kImportSavedPasswords,
    293     Value::TYPE_BOOLEAN },
    294   { key::kMaxConnectionsPerProxy,
    295     prefs::kMaxConnectionsPerProxy,
    296     Value::TYPE_INTEGER },
    297   { key::kURLWhitelist,
    298     prefs::kUrlWhitelist,
    299     Value::TYPE_LIST },
    300   { key::kEnableMemoryInfo,
    301     prefs::kEnableMemoryInfo,
    302     Value::TYPE_BOOLEAN },
    303   { key::kRestrictSigninToPattern,
    304     prefs::kGoogleServicesUsernamePattern,
    305     Value::TYPE_STRING },
    306   { key::kDefaultMediaStreamSetting,
    307     prefs::kManagedDefaultMediaStreamSetting,
    308     Value::TYPE_INTEGER },
    309   { key::kDisableSafeBrowsingProceedAnyway,
    310     prefs::kSafeBrowsingProceedAnywayDisabled,
    311     Value::TYPE_BOOLEAN },
    312   { key::kSpellCheckServiceEnabled,
    313     prefs::kSpellCheckUseSpellingService,
    314     Value::TYPE_BOOLEAN },
    315   { key::kDisableScreenshots,
    316     prefs::kDisableScreenshots,
    317     Value::TYPE_BOOLEAN },
    318   { key::kAudioCaptureAllowed,
    319     prefs::kAudioCaptureAllowed,
    320     Value::TYPE_BOOLEAN },
    321   { key::kVideoCaptureAllowed,
    322     prefs::kVideoCaptureAllowed,
    323     Value::TYPE_BOOLEAN },
    324   { key::kAudioCaptureAllowedUrls,
    325     prefs::kAudioCaptureAllowedUrls,
    326     Value::TYPE_LIST },
    327   { key::kVideoCaptureAllowedUrls,
    328     prefs::kVideoCaptureAllowedUrls,
    329     Value::TYPE_LIST },
    330   { key::kHideWebStoreIcon,
    331     prefs::kHideWebStoreIcon,
    332     Value::TYPE_BOOLEAN },
    333   { key::kVariationsRestrictParameter,
    334     prefs::kVariationsRestrictParameter,
    335     Value::TYPE_STRING },
    336   { key::kContentPackDefaultFilteringBehavior,
    337     prefs::kDefaultManagedModeFilteringBehavior,
    338     Value::TYPE_INTEGER },
    339   { key::kContentPackManualBehaviorHosts,
    340     prefs::kManagedModeManualHosts,
    341     Value::TYPE_DICTIONARY },
    342   { key::kContentPackManualBehaviorURLs,
    343     prefs::kManagedModeManualURLs,
    344     Value::TYPE_DICTIONARY },
    345   { key::kSupervisedUserCreationEnabled,
    346     prefs::kManagedUserCreationAllowed,
    347     Value::TYPE_BOOLEAN },
    348 
    349 #if defined(OS_CHROMEOS)
    350   { key::kChromeOsLockOnIdleSuspend,
    351     prefs::kEnableScreenLock,
    352     Value::TYPE_BOOLEAN },
    353   { key::kChromeOsReleaseChannel,
    354     prefs::kChromeOsReleaseChannel,
    355     Value::TYPE_STRING },
    356   { key::kDriveDisabled,
    357     prefs::kDisableDrive,
    358     Value::TYPE_BOOLEAN },
    359   { key::kDriveDisabledOverCellular,
    360     prefs::kDisableDriveOverCellular,
    361     Value::TYPE_BOOLEAN },
    362   { key::kExternalStorageDisabled,
    363     prefs::kExternalStorageDisabled,
    364     Value::TYPE_BOOLEAN },
    365   { key::kAudioOutputAllowed,
    366     prefs::kAudioOutputAllowed,
    367     Value::TYPE_BOOLEAN },
    368   { key::kShowLogoutButtonInTray,
    369     prefs::kShowLogoutButtonInTray,
    370     Value::TYPE_BOOLEAN },
    371   { key::kShelfAutoHideBehavior,
    372     prefs::kShelfAutoHideBehaviorLocal,
    373     Value::TYPE_STRING },
    374   { key::kSessionLengthLimit,
    375     prefs::kSessionLengthLimit,
    376     Value::TYPE_INTEGER },
    377   { key::kPowerManagementUsesAudioActivity,
    378     prefs::kPowerUseAudioActivity,
    379     Value::TYPE_BOOLEAN },
    380   { key::kPowerManagementUsesVideoActivity,
    381     prefs::kPowerUseVideoActivity,
    382     Value::TYPE_BOOLEAN },
    383   { key::kAllowScreenWakeLocks,
    384     prefs::kPowerAllowScreenWakeLocks,
    385     Value::TYPE_BOOLEAN },
    386   { key::kTermsOfServiceURL,
    387     prefs::kTermsOfServiceURL,
    388     Value::TYPE_STRING },
    389   { key::kShowAccessibilityOptionsInSystemTrayMenu,
    390     prefs::kShouldAlwaysShowAccessibilityMenu,
    391     Value::TYPE_BOOLEAN },
    392   { key::kLargeCursorEnabled,
    393     prefs::kLargeCursorEnabled,
    394     Value::TYPE_BOOLEAN },
    395   { key::kSpokenFeedbackEnabled,
    396     prefs::kSpokenFeedbackEnabled,
    397     Value::TYPE_BOOLEAN },
    398   { key::kHighContrastEnabled,
    399     prefs::kHighContrastEnabled,
    400     Value::TYPE_BOOLEAN },
    401   { key::kDeviceLoginScreenDefaultLargeCursorEnabled,
    402     NULL,
    403     Value::TYPE_BOOLEAN },
    404   { key::kDeviceLoginScreenDefaultSpokenFeedbackEnabled,
    405     NULL,
    406     Value::TYPE_BOOLEAN },
    407   { key::kDeviceLoginScreenDefaultHighContrastEnabled,
    408     NULL,
    409     Value::TYPE_BOOLEAN },
    410   { key::kRebootAfterUpdate,
    411     prefs::kRebootAfterUpdate,
    412     Value::TYPE_BOOLEAN },
    413   { key::kAttestationEnabledForUser,
    414     prefs::kAttestationEnabled,
    415     Value::TYPE_BOOLEAN },
    416 #endif  // defined(OS_CHROMEOS)
    417 
    418 #if !defined(OS_MACOSX) && !defined(OS_CHROMEOS)
    419   { key::kBackgroundModeEnabled,
    420     prefs::kBackgroundModeEnabled,
    421     Value::TYPE_BOOLEAN },
    422 #endif  // !defined(OS_MACOSX) && !defined(OS_CHROMEOS)
    423 };
    424 
    425 // Mapping from extension type names to Manifest::Type.
    426 StringToIntEnumListPolicyHandler::MappingEntry kExtensionAllowedTypesMap[] = {
    427   { "extension", extensions::Manifest::TYPE_EXTENSION },
    428   { "theme", extensions::Manifest::TYPE_THEME },
    429   { "user_script", extensions::Manifest::TYPE_USER_SCRIPT },
    430   { "hosted_app", extensions::Manifest::TYPE_HOSTED_APP },
    431   { "legacy_packaged_app", extensions::Manifest::TYPE_LEGACY_PACKAGED_APP },
    432   { "platform_app", extensions::Manifest::TYPE_PLATFORM_APP },
    433 };
    434 
    435 }  // namespace
    436 
    437 ConfigurationPolicyHandlerList::ConfigurationPolicyHandlerList() {
    438   for (size_t i = 0; i < arraysize(kSimplePolicyMap); ++i) {
    439     handlers_.push_back(
    440         new SimplePolicyHandler(kSimplePolicyMap[i].policy_name,
    441                                 kSimplePolicyMap[i].preference_path,
    442                                 kSimplePolicyMap[i].value_type));
    443   }
    444 
    445   handlers_.push_back(new AutofillPolicyHandler());
    446   handlers_.push_back(new DefaultSearchPolicyHandler());
    447   handlers_.push_back(new FileSelectionDialogsHandler());
    448   handlers_.push_back(new IncognitoModePolicyHandler());
    449   handlers_.push_back(new JavascriptPolicyHandler());
    450   handlers_.push_back(new ProxyPolicyHandler());
    451   handlers_.push_back(new RestoreOnStartupPolicyHandler());
    452   handlers_.push_back(new SyncPolicyHandler());
    453   handlers_.push_back(new URLBlacklistPolicyHandler());
    454 
    455   handlers_.push_back(
    456       new ExtensionListPolicyHandler(key::kExtensionInstallWhitelist,
    457                                      prefs::kExtensionInstallAllowList,
    458                                      false));
    459   handlers_.push_back(
    460       new ExtensionListPolicyHandler(key::kExtensionInstallBlacklist,
    461                                      prefs::kExtensionInstallDenyList,
    462                                      true));
    463   handlers_.push_back(new ExtensionInstallForcelistPolicyHandler());
    464   handlers_.push_back(
    465       new ExtensionURLPatternListPolicyHandler(
    466           key::kExtensionInstallSources,
    467           prefs::kExtensionAllowedInstallSites));
    468   handlers_.push_back(
    469       new StringToIntEnumListPolicyHandler(
    470           key::kExtensionAllowedTypes, prefs::kExtensionAllowedTypes,
    471           kExtensionAllowedTypesMap,
    472           kExtensionAllowedTypesMap + arraysize(kExtensionAllowedTypesMap)));
    473 #if defined(OS_CHROMEOS)
    474   handlers_.push_back(
    475       new ExtensionListPolicyHandler(key::kAttestationExtensionWhitelist,
    476                                      prefs::kAttestationExtensionWhitelist,
    477                                      false));
    478 #endif  // defined(OS_CHROMEOS)
    479 
    480 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
    481   handlers_.push_back(new DiskCacheDirPolicyHandler());
    482   handlers_.push_back(new DownloadDirPolicyHandler());
    483 #endif  // !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
    484 
    485 #if defined(OS_CHROMEOS)
    486   handlers_.push_back(
    487       NetworkConfigurationPolicyHandler::CreateForDevicePolicy());
    488   handlers_.push_back(NetworkConfigurationPolicyHandler::CreateForUserPolicy());
    489   handlers_.push_back(new PinnedLauncherAppsPolicyHandler());
    490   handlers_.push_back(new ScreenMagnifierPolicyHandler());
    491   handlers_.push_back(new LoginScreenPowerManagementPolicyHandler);
    492 
    493   handlers_.push_back(
    494       new IntRangePolicyHandler(
    495           key::kScreenDimDelayAC,
    496           prefs::kPowerAcScreenDimDelayMs,
    497           0, INT_MAX, true));
    498   handlers_.push_back(
    499       new IntRangePolicyHandler(
    500           key::kScreenOffDelayAC,
    501           prefs::kPowerAcScreenOffDelayMs,
    502           0, INT_MAX, true));
    503   handlers_.push_back(
    504       new IntRangePolicyHandler(
    505           key::kScreenLockDelayAC,
    506           prefs::kPowerAcScreenLockDelayMs,
    507           0, INT_MAX, true));
    508   handlers_.push_back(
    509       new IntRangePolicyHandler(
    510           key::kIdleWarningDelayAC,
    511           prefs::kPowerAcIdleWarningDelayMs,
    512           0, INT_MAX, true));
    513   handlers_.push_back(
    514       new IntRangePolicyHandler(
    515           key::kIdleDelayAC,
    516           prefs::kPowerAcIdleDelayMs,
    517           0, INT_MAX, true));
    518   handlers_.push_back(
    519       new IntRangePolicyHandler(
    520           key::kScreenDimDelayBattery,
    521           prefs::kPowerBatteryScreenDimDelayMs,
    522           0, INT_MAX, true));
    523   handlers_.push_back(
    524       new IntRangePolicyHandler(
    525           key::kScreenOffDelayBattery,
    526           prefs::kPowerBatteryScreenOffDelayMs,
    527           0, INT_MAX, true));
    528   handlers_.push_back(
    529       new IntRangePolicyHandler(
    530           key::kScreenLockDelayBattery,
    531           prefs::kPowerBatteryScreenLockDelayMs,
    532           0, INT_MAX, true));
    533   handlers_.push_back(
    534       new IntRangePolicyHandler(
    535           key::kIdleWarningDelayBattery,
    536           prefs::kPowerBatteryIdleWarningDelayMs,
    537           0, INT_MAX, true));
    538   handlers_.push_back(
    539       new IntRangePolicyHandler(
    540           key::kIdleDelayBattery,
    541           prefs::kPowerBatteryIdleDelayMs,
    542           0, INT_MAX, true));
    543   handlers_.push_back(
    544       new IntRangePolicyHandler(
    545           key::kIdleActionAC,
    546           prefs::kPowerAcIdleAction,
    547           chromeos::PowerPolicyController::ACTION_SUSPEND,
    548           chromeos::PowerPolicyController::ACTION_DO_NOTHING,
    549           false));
    550   handlers_.push_back(
    551       new IntRangePolicyHandler(
    552           key::kIdleActionBattery,
    553           prefs::kPowerBatteryIdleAction,
    554           chromeos::PowerPolicyController::ACTION_SUSPEND,
    555           chromeos::PowerPolicyController::ACTION_DO_NOTHING,
    556           false));
    557   handlers_.push_back(new DeprecatedIdleActionHandler());
    558   handlers_.push_back(
    559       new IntRangePolicyHandler(
    560           key::kLidCloseAction,
    561           prefs::kPowerLidClosedAction,
    562           chromeos::PowerPolicyController::ACTION_SUSPEND,
    563           chromeos::PowerPolicyController::ACTION_DO_NOTHING,
    564           false));
    565   handlers_.push_back(
    566       new IntPercentageToDoublePolicyHandler(
    567           key::kPresentationScreenDimDelayScale,
    568           prefs::kPowerPresentationScreenDimDelayFactor,
    569           100, INT_MAX, true));
    570   handlers_.push_back(
    571       new IntPercentageToDoublePolicyHandler(
    572           key::kUserActivityScreenDimDelayScale,
    573           prefs::kPowerUserActivityScreenDimDelayFactor,
    574           100, INT_MAX, true));
    575   handlers_.push_back(new IntRangePolicyHandler(key::kUptimeLimit,
    576                                                 prefs::kUptimeLimit,
    577                                                 3600, INT_MAX, true));
    578   handlers_.push_back(new IntRangePolicyHandler(
    579       key::kDeviceLoginScreenDefaultScreenMagnifierType,
    580       NULL,
    581       0, ash::MAGNIFIER_FULL, false));
    582 #endif  // defined(OS_CHROMEOS)
    583 
    584 #if defined(OS_ANDROID)
    585   handlers_.push_back(new ManagedBookmarksPolicyHandler());
    586 #endif
    587 }
    588 
    589 ConfigurationPolicyHandlerList::~ConfigurationPolicyHandlerList() {
    590   STLDeleteElements(&handlers_);
    591 }
    592 
    593 void ConfigurationPolicyHandlerList::ApplyPolicySettings(
    594     const PolicyMap& policies,
    595     PrefValueMap* prefs,
    596     PolicyErrorMap* errors) const {
    597   PolicyErrorMap scoped_errors;
    598   if (!errors)
    599     errors = &scoped_errors;
    600 
    601   std::vector<ConfigurationPolicyHandler*>::const_iterator handler;
    602   for (handler = handlers_.begin(); handler != handlers_.end(); ++handler) {
    603     if ((*handler)->CheckPolicySettings(policies, errors) && prefs)
    604       (*handler)->ApplyPolicySettings(policies, prefs);
    605   }
    606 
    607   for (PolicyMap::const_iterator it = policies.begin();
    608        it != policies.end();
    609        ++it) {
    610     if (IsDeprecatedPolicy(it->first))
    611       errors->AddError(it->first, IDS_POLICY_DEPRECATED);
    612   }
    613 }
    614 
    615 void ConfigurationPolicyHandlerList::PrepareForDisplaying(
    616     PolicyMap* policies) const {
    617   std::vector<ConfigurationPolicyHandler*>::const_iterator handler;
    618   for (handler = handlers_.begin(); handler != handlers_.end(); ++handler)
    619     (*handler)->PrepareForDisplaying(policies);
    620 }
    621 
    622 }  // namespace policy
    623