Home | History | Annotate | Download | only in policy
      1 // Copyright 2013 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_factory.h"
      6 
      7 #include "base/basictypes.h"
      8 #include "base/bind.h"
      9 #include "base/memory/scoped_vector.h"
     10 #include "base/values.h"
     11 #include "chrome/browser/net/proxy_policy_handler.h"
     12 #include "chrome/browser/policy/managed_bookmarks_policy_handler.h"
     13 #include "chrome/browser/profiles/incognito_mode_policy_handler.h"
     14 #include "chrome/browser/search_engines/default_search_policy_handler.h"
     15 #include "chrome/common/chrome_switches.h"
     16 #include "chrome/common/pref_names.h"
     17 #include "components/password_manager/core/common/password_manager_pref_names.h"
     18 #include "components/policy/core/browser/autofill_policy_handler.h"
     19 #include "components/policy/core/browser/configuration_policy_handler.h"
     20 #include "components/policy/core/browser/configuration_policy_handler_list.h"
     21 #include "components/policy/core/browser/configuration_policy_handler_parameters.h"
     22 #include "components/policy/core/browser/url_blacklist_policy_handler.h"
     23 #include "components/policy/core/common/policy_details.h"
     24 #include "components/policy/core/common/policy_map.h"
     25 #include "components/policy/core/common/policy_pref_names.h"
     26 #include "components/policy/core/common/schema.h"
     27 #include "components/translate/core/common/translate_pref_names.h"
     28 #include "grit/components_strings.h"
     29 #include "policy/policy_constants.h"
     30 
     31 #if !defined(OS_IOS)
     32 #include "chrome/browser/extensions/api/messaging/native_messaging_policy_handler.h"
     33 #include "chrome/browser/extensions/policy_handlers.h"
     34 #include "chrome/browser/net/disk_cache_dir_policy_handler.h"
     35 #include "chrome/browser/policy/file_selection_dialogs_policy_handler.h"
     36 #include "chrome/browser/policy/javascript_policy_handler.h"
     37 #include "chrome/browser/sessions/restore_on_startup_policy_handler.h"
     38 #include "chrome/browser/sync/sync_policy_handler.h"
     39 #include "extensions/browser/pref_names.h"
     40 #include "extensions/common/manifest.h"
     41 #endif
     42 
     43 #if defined(OS_CHROMEOS)
     44 #include "ash/magnifier/magnifier_constants.h"
     45 #include "chrome/browser/chromeos/login/users/user.h"
     46 #include "chrome/browser/chromeos/login/users/user_manager.h"
     47 #include "chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.h"
     48 #include "chromeos/dbus/power_policy_controller.h"
     49 #endif
     50 
     51 #if !defined(OS_ANDROID) && !defined(OS_IOS)
     52 #include "chrome/browser/download/download_dir_policy_handler.h"
     53 #endif
     54 
     55 #if !defined(OS_MACOSX) && !defined(OS_IOS)
     56 #include "apps/pref_names.h"
     57 #endif
     58 
     59 namespace policy {
     60 
     61 namespace {
     62 
     63 // List of policy types to preference names. This is used for simple policies
     64 // that directly map to a single preference.
     65 const PolicyToPreferenceMapEntry kSimplePolicyMap[] = {
     66   { key::kHomepageLocation,
     67     prefs::kHomePage,
     68     base::Value::TYPE_STRING },
     69   { key::kHomepageIsNewTabPage,
     70     prefs::kHomePageIsNewTabPage,
     71     base::Value::TYPE_BOOLEAN },
     72   { key::kRestoreOnStartupURLs,
     73     prefs::kURLsToRestoreOnStartup,
     74     base::Value::TYPE_LIST },
     75   { key::kAlternateErrorPagesEnabled,
     76     prefs::kAlternateErrorPagesEnabled,
     77     base::Value::TYPE_BOOLEAN },
     78   { key::kSearchSuggestEnabled,
     79     prefs::kSearchSuggestEnabled,
     80     base::Value::TYPE_BOOLEAN },
     81   { key::kDnsPrefetchingEnabled,
     82     prefs::kNetworkPredictionEnabled,
     83     base::Value::TYPE_BOOLEAN },
     84   { key::kBuiltInDnsClientEnabled,
     85     prefs::kBuiltInDnsClientEnabled,
     86     base::Value::TYPE_BOOLEAN },
     87   { key::kWPADQuickCheckEnabled,
     88     prefs::kQuickCheckEnabled,
     89     base::Value::TYPE_BOOLEAN },
     90   { key::kDisableSpdy,
     91     prefs::kDisableSpdy,
     92     base::Value::TYPE_BOOLEAN },
     93   { key::kSafeBrowsingEnabled,
     94     prefs::kSafeBrowsingEnabled,
     95     base::Value::TYPE_BOOLEAN },
     96   { key::kForceSafeSearch,
     97     prefs::kForceSafeSearch,
     98     base::Value::TYPE_BOOLEAN },
     99   { key::kPasswordManagerEnabled,
    100     password_manager::prefs::kPasswordManagerEnabled,
    101     base::Value::TYPE_BOOLEAN },
    102   { key::kPasswordManagerAllowShowPasswords,
    103     password_manager::prefs::kPasswordManagerAllowShowPasswords,
    104     base::Value::TYPE_BOOLEAN },
    105   { key::kPrintingEnabled,
    106     prefs::kPrintingEnabled,
    107     base::Value::TYPE_BOOLEAN },
    108   { key::kDisablePrintPreview,
    109     prefs::kPrintPreviewDisabled,
    110     base::Value::TYPE_BOOLEAN },
    111   { key::kMetricsReportingEnabled,
    112     prefs::kMetricsReportingEnabled,
    113     base::Value::TYPE_BOOLEAN },
    114   { key::kApplicationLocaleValue,
    115     prefs::kApplicationLocale,
    116     base::Value::TYPE_STRING },
    117   { key::kDisabledPlugins,
    118     prefs::kPluginsDisabledPlugins,
    119     base::Value::TYPE_LIST },
    120   { key::kDisabledPluginsExceptions,
    121     prefs::kPluginsDisabledPluginsExceptions,
    122     base::Value::TYPE_LIST },
    123   { key::kEnabledPlugins,
    124     prefs::kPluginsEnabledPlugins,
    125     base::Value::TYPE_LIST },
    126   { key::kShowHomeButton,
    127     prefs::kShowHomeButton,
    128     base::Value::TYPE_BOOLEAN },
    129   { key::kSavingBrowserHistoryDisabled,
    130     prefs::kSavingBrowserHistoryDisabled,
    131     base::Value::TYPE_BOOLEAN },
    132   { key::kAllowDeletingBrowserHistory,
    133     prefs::kAllowDeletingBrowserHistory,
    134     base::Value::TYPE_BOOLEAN },
    135   { key::kDeveloperToolsDisabled,
    136     prefs::kDevToolsDisabled,
    137     base::Value::TYPE_BOOLEAN },
    138   { key::kBlockThirdPartyCookies,
    139     prefs::kBlockThirdPartyCookies,
    140     base::Value::TYPE_BOOLEAN },
    141   { key::kDefaultCookiesSetting,
    142     prefs::kManagedDefaultCookiesSetting,
    143     base::Value::TYPE_INTEGER },
    144   { key::kDefaultImagesSetting,
    145     prefs::kManagedDefaultImagesSetting,
    146     base::Value::TYPE_INTEGER },
    147   { key::kDefaultPluginsSetting,
    148     prefs::kManagedDefaultPluginsSetting,
    149     base::Value::TYPE_INTEGER },
    150   { key::kDefaultPopupsSetting,
    151     prefs::kManagedDefaultPopupsSetting,
    152     base::Value::TYPE_INTEGER },
    153   { key::kAutoSelectCertificateForUrls,
    154     prefs::kManagedAutoSelectCertificateForUrls,
    155     base::Value::TYPE_LIST },
    156   { key::kCookiesAllowedForUrls,
    157     prefs::kManagedCookiesAllowedForUrls,
    158     base::Value::TYPE_LIST },
    159   { key::kCookiesBlockedForUrls,
    160     prefs::kManagedCookiesBlockedForUrls,
    161     base::Value::TYPE_LIST },
    162   { key::kCookiesSessionOnlyForUrls,
    163     prefs::kManagedCookiesSessionOnlyForUrls,
    164     base::Value::TYPE_LIST },
    165   { key::kImagesAllowedForUrls,
    166     prefs::kManagedImagesAllowedForUrls,
    167     base::Value::TYPE_LIST },
    168   { key::kImagesBlockedForUrls,
    169     prefs::kManagedImagesBlockedForUrls,
    170     base::Value::TYPE_LIST },
    171   { key::kJavaScriptAllowedForUrls,
    172     prefs::kManagedJavaScriptAllowedForUrls,
    173     base::Value::TYPE_LIST },
    174   { key::kJavaScriptBlockedForUrls,
    175     prefs::kManagedJavaScriptBlockedForUrls,
    176     base::Value::TYPE_LIST },
    177   { key::kPluginsAllowedForUrls,
    178     prefs::kManagedPluginsAllowedForUrls,
    179     base::Value::TYPE_LIST },
    180   { key::kPluginsBlockedForUrls,
    181     prefs::kManagedPluginsBlockedForUrls,
    182     base::Value::TYPE_LIST },
    183   { key::kPopupsAllowedForUrls,
    184     prefs::kManagedPopupsAllowedForUrls,
    185     base::Value::TYPE_LIST },
    186   { key::kPopupsBlockedForUrls,
    187     prefs::kManagedPopupsBlockedForUrls,
    188     base::Value::TYPE_LIST },
    189   { key::kNotificationsAllowedForUrls,
    190     prefs::kManagedNotificationsAllowedForUrls,
    191     base::Value::TYPE_LIST },
    192   { key::kNotificationsBlockedForUrls,
    193     prefs::kManagedNotificationsBlockedForUrls,
    194     base::Value::TYPE_LIST },
    195   { key::kDefaultNotificationsSetting,
    196     prefs::kManagedDefaultNotificationsSetting,
    197     base::Value::TYPE_INTEGER },
    198   { key::kDefaultGeolocationSetting,
    199     prefs::kManagedDefaultGeolocationSetting,
    200     base::Value::TYPE_INTEGER },
    201   { key::kSigninAllowed,
    202     prefs::kSigninAllowed,
    203     base::Value::TYPE_BOOLEAN },
    204   { key::kDisableSSLRecordSplitting,
    205     prefs::kDisableSSLRecordSplitting,
    206     base::Value::TYPE_BOOLEAN },
    207   { key::kEnableOnlineRevocationChecks,
    208     prefs::kCertRevocationCheckingEnabled,
    209     base::Value::TYPE_BOOLEAN },
    210   { key::kRequireOnlineRevocationChecksForLocalAnchors,
    211     prefs::kCertRevocationCheckingRequiredLocalAnchors,
    212     base::Value::TYPE_BOOLEAN },
    213   { key::kAuthSchemes,
    214     prefs::kAuthSchemes,
    215     base::Value::TYPE_STRING },
    216   { key::kDisableAuthNegotiateCnameLookup,
    217     prefs::kDisableAuthNegotiateCnameLookup,
    218     base::Value::TYPE_BOOLEAN },
    219   { key::kEnableAuthNegotiatePort,
    220     prefs::kEnableAuthNegotiatePort,
    221     base::Value::TYPE_BOOLEAN },
    222   { key::kAuthServerWhitelist,
    223     prefs::kAuthServerWhitelist,
    224     base::Value::TYPE_STRING },
    225   { key::kAuthNegotiateDelegateWhitelist,
    226     prefs::kAuthNegotiateDelegateWhitelist,
    227     base::Value::TYPE_STRING },
    228   { key::kGSSAPILibraryName,
    229     prefs::kGSSAPILibraryName,
    230     base::Value::TYPE_STRING },
    231   { key::kAllowCrossOriginAuthPrompt,
    232     prefs::kAllowCrossOriginAuthPrompt,
    233     base::Value::TYPE_BOOLEAN },
    234   { key::kDisable3DAPIs,
    235     prefs::kDisable3DAPIs,
    236     base::Value::TYPE_BOOLEAN },
    237   { key::kDisablePluginFinder,
    238     prefs::kDisablePluginFinder,
    239     base::Value::TYPE_BOOLEAN },
    240   { key::kDiskCacheSize,
    241     prefs::kDiskCacheSize,
    242     base::Value::TYPE_INTEGER },
    243   { key::kMediaCacheSize,
    244     prefs::kMediaCacheSize,
    245     base::Value::TYPE_INTEGER },
    246   { key::kPolicyRefreshRate,
    247     policy_prefs::kUserPolicyRefreshRate,
    248     base::Value::TYPE_INTEGER },
    249   { key::kDevicePolicyRefreshRate,
    250     prefs::kDevicePolicyRefreshRate,
    251     base::Value::TYPE_INTEGER },
    252   { key::kDefaultBrowserSettingEnabled,
    253     prefs::kDefaultBrowserSettingEnabled,
    254     base::Value::TYPE_BOOLEAN },
    255   { key::kRemoteAccessHostFirewallTraversal,
    256     prefs::kRemoteAccessHostFirewallTraversal,
    257     base::Value::TYPE_BOOLEAN },
    258   { key::kRemoteAccessHostRequireTwoFactor,
    259     prefs::kRemoteAccessHostRequireTwoFactor,
    260     base::Value::TYPE_BOOLEAN },
    261   { key::kRemoteAccessHostDomain,
    262     prefs::kRemoteAccessHostDomain,
    263     base::Value::TYPE_STRING },
    264   { key::kRemoteAccessHostTalkGadgetPrefix,
    265     prefs::kRemoteAccessHostTalkGadgetPrefix,
    266     base::Value::TYPE_STRING },
    267   { key::kRemoteAccessHostRequireCurtain,
    268     prefs::kRemoteAccessHostRequireCurtain,
    269     base::Value::TYPE_BOOLEAN },
    270   { key::kRemoteAccessHostAllowClientPairing,
    271     prefs::kRemoteAccessHostAllowClientPairing,
    272     base::Value::TYPE_BOOLEAN },
    273   { key::kRemoteAccessHostAllowGnubbyAuth,
    274     prefs::kRemoteAccessHostAllowGnubbyAuth,
    275     base::Value::TYPE_BOOLEAN },
    276   { key::kRemoteAccessHostAllowRelayedConnection,
    277     prefs::kRemoteAccessHostAllowRelayedConnection,
    278     base::Value::TYPE_BOOLEAN },
    279   { key::kRemoteAccessHostUdpPortRange,
    280     prefs::kRemoteAccessHostUdpPortRange,
    281     base::Value::TYPE_STRING },
    282   { key::kCloudPrintProxyEnabled,
    283     prefs::kCloudPrintProxyEnabled,
    284     base::Value::TYPE_BOOLEAN },
    285   { key::kCloudPrintSubmitEnabled,
    286     prefs::kCloudPrintSubmitEnabled,
    287     base::Value::TYPE_BOOLEAN },
    288   { key::kTranslateEnabled,
    289     prefs::kEnableTranslate,
    290     base::Value::TYPE_BOOLEAN },
    291   { key::kAllowOutdatedPlugins,
    292     prefs::kPluginsAllowOutdated,
    293     base::Value::TYPE_BOOLEAN },
    294   { key::kAlwaysAuthorizePlugins,
    295     prefs::kPluginsAlwaysAuthorize,
    296     base::Value::TYPE_BOOLEAN },
    297   { key::kBookmarkBarEnabled,
    298     prefs::kShowBookmarkBar,
    299     base::Value::TYPE_BOOLEAN },
    300   { key::kEditBookmarksEnabled,
    301     prefs::kEditBookmarksEnabled,
    302     base::Value::TYPE_BOOLEAN },
    303   { key::kShowAppsShortcutInBookmarkBar,
    304     prefs::kShowAppsShortcutInBookmarkBar,
    305     base::Value::TYPE_BOOLEAN },
    306   { key::kAllowFileSelectionDialogs,
    307     prefs::kAllowFileSelectionDialogs,
    308     base::Value::TYPE_BOOLEAN },
    309   { key::kImportBookmarks,
    310     prefs::kImportBookmarks,
    311     base::Value::TYPE_BOOLEAN },
    312   { key::kImportHistory,
    313     prefs::kImportHistory,
    314     base::Value::TYPE_BOOLEAN },
    315   { key::kImportHomepage,
    316     prefs::kImportHomepage,
    317     base::Value::TYPE_BOOLEAN },
    318   { key::kImportSearchEngine,
    319     prefs::kImportSearchEngine,
    320     base::Value::TYPE_BOOLEAN },
    321   { key::kImportSavedPasswords,
    322     prefs::kImportSavedPasswords,
    323     base::Value::TYPE_BOOLEAN },
    324   { key::kMaxConnectionsPerProxy,
    325     prefs::kMaxConnectionsPerProxy,
    326     base::Value::TYPE_INTEGER },
    327   { key::kURLWhitelist,
    328     policy_prefs::kUrlWhitelist,
    329     base::Value::TYPE_LIST },
    330   { key::kRestrictSigninToPattern,
    331     prefs::kGoogleServicesUsernamePattern,
    332     base::Value::TYPE_STRING },
    333   { key::kDefaultMediaStreamSetting,
    334     prefs::kManagedDefaultMediaStreamSetting,
    335     base::Value::TYPE_INTEGER },
    336   { key::kDisableSafeBrowsingProceedAnyway,
    337     prefs::kSafeBrowsingProceedAnywayDisabled,
    338     base::Value::TYPE_BOOLEAN },
    339   { key::kSpellCheckServiceEnabled,
    340     prefs::kSpellCheckUseSpellingService,
    341     base::Value::TYPE_BOOLEAN },
    342   { key::kDisableScreenshots,
    343     prefs::kDisableScreenshots,
    344     base::Value::TYPE_BOOLEAN },
    345   { key::kAudioCaptureAllowed,
    346     prefs::kAudioCaptureAllowed,
    347     base::Value::TYPE_BOOLEAN },
    348   { key::kVideoCaptureAllowed,
    349     prefs::kVideoCaptureAllowed,
    350     base::Value::TYPE_BOOLEAN },
    351   { key::kAudioCaptureAllowedUrls,
    352     prefs::kAudioCaptureAllowedUrls,
    353     base::Value::TYPE_LIST },
    354   { key::kVideoCaptureAllowedUrls,
    355     prefs::kVideoCaptureAllowedUrls,
    356     base::Value::TYPE_LIST },
    357   { key::kHideWebStoreIcon,
    358     prefs::kHideWebStoreIcon,
    359     base::Value::TYPE_BOOLEAN },
    360   { key::kVariationsRestrictParameter,
    361     prefs::kVariationsRestrictParameter,
    362     base::Value::TYPE_STRING },
    363   { key::kSupervisedUserCreationEnabled,
    364     prefs::kSupervisedUserCreationAllowed,
    365     base::Value::TYPE_BOOLEAN },
    366   { key::kForceEphemeralProfiles,
    367     prefs::kForceEphemeralProfiles,
    368     base::Value::TYPE_BOOLEAN },
    369 
    370 #if !defined(OS_MACOSX) && !defined(OS_IOS)
    371   { key::kFullscreenAllowed,
    372     prefs::kFullscreenAllowed,
    373     base::Value::TYPE_BOOLEAN },
    374 #if defined(ENABLE_EXTENSIONS)
    375   { key::kFullscreenAllowed,
    376     apps::prefs::kAppFullscreenAllowed,
    377     base::Value::TYPE_BOOLEAN },
    378 #endif  // defined(ENABLE_EXTENSIONS)
    379 #endif  // !defined(OS_MACOSX) && !defined(OS_IOS)
    380 
    381 #if defined(OS_CHROMEOS)
    382   { key::kChromeOsLockOnIdleSuspend,
    383     prefs::kEnableAutoScreenLock,
    384     base::Value::TYPE_BOOLEAN },
    385   { key::kChromeOsReleaseChannel,
    386     prefs::kChromeOsReleaseChannel,
    387     base::Value::TYPE_STRING },
    388   { key::kDriveDisabled,
    389     prefs::kDisableDrive,
    390     base::Value::TYPE_BOOLEAN },
    391   { key::kDriveDisabledOverCellular,
    392     prefs::kDisableDriveOverCellular,
    393     base::Value::TYPE_BOOLEAN },
    394   { key::kExternalStorageDisabled,
    395     prefs::kExternalStorageDisabled,
    396     base::Value::TYPE_BOOLEAN },
    397   { key::kAudioOutputAllowed,
    398     prefs::kAudioOutputAllowed,
    399     base::Value::TYPE_BOOLEAN },
    400   { key::kShowLogoutButtonInTray,
    401     prefs::kShowLogoutButtonInTray,
    402     base::Value::TYPE_BOOLEAN },
    403   { key::kShelfAutoHideBehavior,
    404     prefs::kShelfAutoHideBehaviorLocal,
    405     base::Value::TYPE_STRING },
    406   { key::kSessionLengthLimit,
    407     prefs::kSessionLengthLimit,
    408     base::Value::TYPE_INTEGER },
    409   { key::kWaitForInitialUserActivity,
    410     prefs::kSessionWaitForInitialUserActivity,
    411     base::Value::TYPE_BOOLEAN },
    412   { key::kPowerManagementUsesAudioActivity,
    413     prefs::kPowerUseAudioActivity,
    414     base::Value::TYPE_BOOLEAN },
    415   { key::kPowerManagementUsesVideoActivity,
    416     prefs::kPowerUseVideoActivity,
    417     base::Value::TYPE_BOOLEAN },
    418   { key::kAllowScreenWakeLocks,
    419     prefs::kPowerAllowScreenWakeLocks,
    420     base::Value::TYPE_BOOLEAN },
    421   { key::kWaitForInitialUserActivity,
    422     prefs::kPowerWaitForInitialUserActivity,
    423     base::Value::TYPE_BOOLEAN },
    424   { key::kTermsOfServiceURL,
    425     prefs::kTermsOfServiceURL,
    426     base::Value::TYPE_STRING },
    427   { key::kShowAccessibilityOptionsInSystemTrayMenu,
    428     prefs::kShouldAlwaysShowAccessibilityMenu,
    429     base::Value::TYPE_BOOLEAN },
    430   { key::kLargeCursorEnabled,
    431     prefs::kAccessibilityLargeCursorEnabled,
    432     base::Value::TYPE_BOOLEAN },
    433   { key::kSpokenFeedbackEnabled,
    434     prefs::kAccessibilitySpokenFeedbackEnabled,
    435     base::Value::TYPE_BOOLEAN },
    436   { key::kHighContrastEnabled,
    437     prefs::kAccessibilityHighContrastEnabled,
    438     base::Value::TYPE_BOOLEAN },
    439   { key::kVirtualKeyboardEnabled,
    440     prefs::kAccessibilityVirtualKeyboardEnabled,
    441     base::Value::TYPE_BOOLEAN },
    442   { key::kDeviceLoginScreenDefaultLargeCursorEnabled,
    443     NULL,
    444     base::Value::TYPE_BOOLEAN },
    445   { key::kDeviceLoginScreenDefaultSpokenFeedbackEnabled,
    446     NULL,
    447     base::Value::TYPE_BOOLEAN },
    448   { key::kDeviceLoginScreenDefaultHighContrastEnabled,
    449     NULL,
    450     base::Value::TYPE_BOOLEAN },
    451   { key::kDeviceLoginScreenDefaultVirtualKeyboardEnabled,
    452     NULL,
    453     base::Value::TYPE_BOOLEAN },
    454   { key::kRebootAfterUpdate,
    455     prefs::kRebootAfterUpdate,
    456     base::Value::TYPE_BOOLEAN },
    457   { key::kAttestationEnabledForUser,
    458     prefs::kAttestationEnabled,
    459     base::Value::TYPE_BOOLEAN },
    460   { key::kChromeOsMultiProfileUserBehavior,
    461     prefs::kMultiProfileUserBehavior,
    462     base::Value::TYPE_STRING },
    463   { key::kKeyboardDefaultToFunctionKeys,
    464     prefs::kLanguageSendFunctionKeys,
    465     base::Value::TYPE_BOOLEAN },
    466   { key::kTouchVirtualKeyboardEnabled,
    467     prefs::kTouchVirtualKeyboardEnabled,
    468     base::Value::TYPE_BOOLEAN },
    469 #endif  // defined(OS_CHROMEOS)
    470 
    471 #if !defined(OS_MACOSX) && !defined(OS_CHROMEOS)
    472   { key::kBackgroundModeEnabled,
    473     prefs::kBackgroundModeEnabled,
    474     base::Value::TYPE_BOOLEAN },
    475 #endif  // !defined(OS_MACOSX) && !defined(OS_CHROMEOS)
    476 
    477 #if defined(OS_ANDROID)
    478   { key::kDataCompressionProxyEnabled,
    479     data_reduction_proxy::prefs::kDataReductionProxyEnabled,
    480     base::Value::TYPE_BOOLEAN },
    481 #endif  // defined(OS_ANDROID)
    482 
    483 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
    484   { key::kNativeMessagingUserLevelHosts,
    485     extensions::pref_names::kNativeMessagingUserLevelHosts,
    486     base::Value::TYPE_BOOLEAN },
    487 #endif  // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
    488 };
    489 
    490 #if !defined(OS_IOS)
    491 void GetExtensionAllowedTypesMap(
    492     ScopedVector<StringMappingListPolicyHandler::MappingEntry>* result) {
    493   // Mapping from extension type names to Manifest::Type.
    494   result->push_back(new StringMappingListPolicyHandler::MappingEntry(
    495       "extension", scoped_ptr<base::Value>(new base::FundamentalValue(
    496           extensions::Manifest::TYPE_EXTENSION))));
    497   result->push_back(new StringMappingListPolicyHandler::MappingEntry(
    498       "theme", scoped_ptr<base::Value>(new base::FundamentalValue(
    499           extensions::Manifest::TYPE_THEME))));
    500   result->push_back(new StringMappingListPolicyHandler::MappingEntry(
    501       "user_script", scoped_ptr<base::Value>(new base::FundamentalValue(
    502           extensions::Manifest::TYPE_USER_SCRIPT))));
    503   result->push_back(new StringMappingListPolicyHandler::MappingEntry(
    504       "hosted_app", scoped_ptr<base::Value>(new base::FundamentalValue(
    505           extensions::Manifest::TYPE_HOSTED_APP))));
    506   result->push_back(new StringMappingListPolicyHandler::MappingEntry(
    507       "legacy_packaged_app", scoped_ptr<base::Value>(new base::FundamentalValue(
    508           extensions::Manifest::TYPE_LEGACY_PACKAGED_APP))));
    509   result->push_back(new StringMappingListPolicyHandler::MappingEntry(
    510       "platform_app", scoped_ptr<base::Value>(new base::FundamentalValue(
    511           extensions::Manifest::TYPE_PLATFORM_APP))));
    512 }
    513 
    514 void GetDeprecatedFeaturesMap(
    515     ScopedVector<StringMappingListPolicyHandler::MappingEntry>* result) {
    516   // Maps feature tags as specified in policy to the corresponding switch to
    517   // re-enable them.
    518   // TODO: Remove after 2015-04-30 per http://crbug.com/374782.
    519   result->push_back(new StringMappingListPolicyHandler::MappingEntry(
    520       "ShowModalDialog_EffectiveUntil20150430",
    521       scoped_ptr<base::Value>(new base::StringValue(
    522           switches::kEnableShowModalDialog))));
    523 }
    524 #endif  // !defined(OS_IOS)
    525 
    526 }  // namespace
    527 
    528 void PopulatePolicyHandlerParameters(PolicyHandlerParameters* parameters) {
    529 #if defined(OS_CHROMEOS)
    530   if (chromeos::UserManager::IsInitialized()) {
    531     const chromeos::User* user = chromeos::UserManager::Get()->GetActiveUser();
    532     if (user)
    533       parameters->user_id_hash = user->username_hash();
    534   }
    535 #endif
    536 }
    537 
    538 scoped_ptr<ConfigurationPolicyHandlerList> BuildHandlerList(
    539     const Schema& chrome_schema) {
    540   scoped_ptr<ConfigurationPolicyHandlerList> handlers(
    541       new ConfigurationPolicyHandlerList(
    542           base::Bind(&PopulatePolicyHandlerParameters),
    543           base::Bind(&GetChromePolicyDetails)));
    544   for (size_t i = 0; i < arraysize(kSimplePolicyMap); ++i) {
    545     handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    546         new SimplePolicyHandler(kSimplePolicyMap[i].policy_name,
    547                                 kSimplePolicyMap[i].preference_path,
    548                                 kSimplePolicyMap[i].value_type)));
    549   }
    550 
    551   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    552       new AutofillPolicyHandler()));
    553   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    554       new DefaultSearchPolicyHandler()));
    555   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    556       new IncognitoModePolicyHandler()));
    557   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    558       new ManagedBookmarksPolicyHandler(chrome_schema)));
    559   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    560       new ProxyPolicyHandler()));
    561   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    562       new URLBlacklistPolicyHandler()));
    563 
    564 #if !defined(OS_IOS)
    565   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    566       new FileSelectionDialogsPolicyHandler()));
    567   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    568       new JavascriptPolicyHandler()));
    569   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    570       new RestoreOnStartupPolicyHandler()));
    571   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    572       new browser_sync::SyncPolicyHandler()));
    573 
    574   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    575       new extensions::ExtensionListPolicyHandler(
    576           key::kExtensionInstallWhitelist,
    577           extensions::pref_names::kInstallAllowList,
    578           false)));
    579   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    580       new extensions::ExtensionListPolicyHandler(
    581           key::kExtensionInstallBlacklist,
    582           extensions::pref_names::kInstallDenyList,
    583           true)));
    584   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    585       new extensions::ExtensionInstallForcelistPolicyHandler()));
    586   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    587       new extensions::ExtensionURLPatternListPolicyHandler(
    588           key::kExtensionInstallSources,
    589           extensions::pref_names::kAllowedInstallSites)));
    590   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    591       new StringMappingListPolicyHandler(
    592           key::kExtensionAllowedTypes,
    593           extensions::pref_names::kAllowedTypes,
    594           base::Bind(GetExtensionAllowedTypesMap))));
    595   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    596       new StringMappingListPolicyHandler(
    597           key::kEnableDeprecatedWebPlatformFeatures,
    598           prefs::kEnableDeprecatedWebPlatformFeatures,
    599           base::Bind(GetDeprecatedFeaturesMap))));
    600 #endif  // !defined(OS_IOS)
    601 
    602 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
    603   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    604       new DiskCacheDirPolicyHandler()));
    605 
    606   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    607       new extensions::NativeMessagingHostListPolicyHandler(
    608           key::kNativeMessagingWhitelist,
    609           extensions::pref_names::kNativeMessagingWhitelist,
    610           false)));
    611   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    612       new extensions::NativeMessagingHostListPolicyHandler(
    613           key::kNativeMessagingBlacklist,
    614           extensions::pref_names::kNativeMessagingBlacklist,
    615           true)));
    616 #endif  // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS)
    617 
    618 #if !defined(OS_ANDROID) && !defined(OS_IOS)
    619   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    620       new DownloadDirPolicyHandler));
    621 
    622   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    623       new SimpleSchemaValidatingPolicyHandler(
    624           key::kRegisteredProtocolHandlers,
    625           prefs::kPolicyRegisteredProtocolHandlers,
    626           chrome_schema,
    627           SCHEMA_STRICT,
    628           SimpleSchemaValidatingPolicyHandler::RECOMMENDED_ALLOWED,
    629           SimpleSchemaValidatingPolicyHandler::MANDATORY_PROHIBITED)));
    630 #endif
    631 
    632 #if defined(OS_CHROMEOS)
    633   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    634       new extensions::ExtensionListPolicyHandler(
    635           key::kAttestationExtensionWhitelist,
    636           prefs::kAttestationExtensionWhitelist,
    637           false)));
    638   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    639       NetworkConfigurationPolicyHandler::CreateForDevicePolicy()));
    640   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    641       NetworkConfigurationPolicyHandler::CreateForUserPolicy()));
    642   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    643       new PinnedLauncherAppsPolicyHandler()));
    644   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    645       new ScreenMagnifierPolicyHandler()));
    646   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    647       new LoginScreenPowerManagementPolicyHandler(chrome_schema)));
    648 
    649   ScopedVector<ConfigurationPolicyHandler>
    650       power_management_idle_legacy_policies;
    651   power_management_idle_legacy_policies.push_back(
    652       new IntRangePolicyHandler(key::kScreenDimDelayAC,
    653                                 prefs::kPowerAcScreenDimDelayMs,
    654                                 0,
    655                                 INT_MAX,
    656                                 true));
    657   power_management_idle_legacy_policies.push_back(
    658       new IntRangePolicyHandler(key::kScreenOffDelayAC,
    659                                 prefs::kPowerAcScreenOffDelayMs,
    660                                 0,
    661                                 INT_MAX,
    662                                 true));
    663   power_management_idle_legacy_policies.push_back(
    664       new IntRangePolicyHandler(key::kIdleWarningDelayAC,
    665                                 prefs::kPowerAcIdleWarningDelayMs,
    666                                 0,
    667                                 INT_MAX,
    668                                 true));
    669   power_management_idle_legacy_policies.push_back(new IntRangePolicyHandler(
    670       key::kIdleDelayAC, prefs::kPowerAcIdleDelayMs, 0, INT_MAX, true));
    671   power_management_idle_legacy_policies.push_back(
    672       new IntRangePolicyHandler(key::kScreenDimDelayBattery,
    673                                 prefs::kPowerBatteryScreenDimDelayMs,
    674                                 0,
    675                                 INT_MAX,
    676                                 true));
    677   power_management_idle_legacy_policies.push_back(
    678       new IntRangePolicyHandler(key::kScreenOffDelayBattery,
    679                                 prefs::kPowerBatteryScreenOffDelayMs,
    680                                 0,
    681                                 INT_MAX,
    682                                 true));
    683   power_management_idle_legacy_policies.push_back(
    684       new IntRangePolicyHandler(key::kIdleWarningDelayBattery,
    685                                 prefs::kPowerBatteryIdleWarningDelayMs,
    686                                 0,
    687                                 INT_MAX,
    688                                 true));
    689   power_management_idle_legacy_policies.push_back(
    690       new IntRangePolicyHandler(key::kIdleDelayBattery,
    691                                 prefs::kPowerBatteryIdleDelayMs,
    692                                 0,
    693                                 INT_MAX,
    694                                 true));
    695   power_management_idle_legacy_policies.push_back(new IntRangePolicyHandler(
    696       key::kIdleActionAC,
    697       prefs::kPowerAcIdleAction,
    698       chromeos::PowerPolicyController::ACTION_SUSPEND,
    699       chromeos::PowerPolicyController::ACTION_DO_NOTHING,
    700       false));
    701   power_management_idle_legacy_policies.push_back(new IntRangePolicyHandler(
    702       key::kIdleActionBattery,
    703       prefs::kPowerBatteryIdleAction,
    704       chromeos::PowerPolicyController::ACTION_SUSPEND,
    705       chromeos::PowerPolicyController::ACTION_DO_NOTHING,
    706       false));
    707   power_management_idle_legacy_policies.push_back(
    708       new DeprecatedIdleActionHandler());
    709 
    710   ScopedVector<ConfigurationPolicyHandler> screen_lock_legacy_policies;
    711   screen_lock_legacy_policies.push_back(
    712       new IntRangePolicyHandler(key::kScreenLockDelayAC,
    713                                 prefs::kPowerAcScreenLockDelayMs,
    714                                 0,
    715                                 INT_MAX,
    716                                 true));
    717   screen_lock_legacy_policies.push_back(
    718       new IntRangePolicyHandler(key::kScreenLockDelayBattery,
    719                                 prefs::kPowerBatteryScreenLockDelayMs,
    720                                 0,
    721                                 INT_MAX,
    722                                 true));
    723 
    724   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    725       new IntRangePolicyHandler(key::kSAMLOfflineSigninTimeLimit,
    726                                 prefs::kSAMLOfflineSigninTimeLimit,
    727                                 -1,
    728                                 INT_MAX,
    729                                 true)));
    730   handlers->AddHandler(
    731       make_scoped_ptr<ConfigurationPolicyHandler>(new IntRangePolicyHandler(
    732           key::kLidCloseAction,
    733           prefs::kPowerLidClosedAction,
    734           chromeos::PowerPolicyController::ACTION_SUSPEND,
    735           chromeos::PowerPolicyController::ACTION_DO_NOTHING,
    736           false)));
    737   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    738       new IntPercentageToDoublePolicyHandler(
    739           key::kPresentationScreenDimDelayScale,
    740           prefs::kPowerPresentationScreenDimDelayFactor,
    741           100,
    742           INT_MAX,
    743           true)));
    744   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    745       new IntPercentageToDoublePolicyHandler(
    746           key::kUserActivityScreenDimDelayScale,
    747           prefs::kPowerUserActivityScreenDimDelayFactor,
    748           100,
    749           INT_MAX,
    750           true)));
    751   handlers->AddHandler(
    752       make_scoped_ptr<ConfigurationPolicyHandler>(new IntRangePolicyHandler(
    753           key::kUptimeLimit, prefs::kUptimeLimit, 3600, INT_MAX, true)));
    754   handlers->AddHandler(
    755       make_scoped_ptr<ConfigurationPolicyHandler>(new IntRangePolicyHandler(
    756           key::kDeviceLoginScreenDefaultScreenMagnifierType,
    757           NULL,
    758           0,
    759           ash::MAGNIFIER_FULL,
    760           false)));
    761   // TODO(binjin): Remove LegacyPoliciesDeprecatingPolicyHandler for these two
    762   // policies once deprecation of legacy power management policies is done.
    763   // http://crbug.com/346229
    764   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    765       new LegacyPoliciesDeprecatingPolicyHandler(
    766           power_management_idle_legacy_policies.Pass(),
    767           make_scoped_ptr<SchemaValidatingPolicyHandler>(
    768               new PowerManagementIdleSettingsPolicyHandler(chrome_schema)))));
    769   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    770       new LegacyPoliciesDeprecatingPolicyHandler(
    771           screen_lock_legacy_policies.Pass(),
    772           make_scoped_ptr<SchemaValidatingPolicyHandler>(
    773               new ScreenLockDelayPolicyHandler(chrome_schema)))));
    774   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    775       new ExternalDataPolicyHandler(key::kUserAvatarImage)));
    776   handlers->AddHandler(make_scoped_ptr<ConfigurationPolicyHandler>(
    777       new ExternalDataPolicyHandler(key::kWallpaperImage)));
    778 #endif  // defined(OS_CHROMEOS)
    779 
    780   return handlers.Pass();
    781 }
    782 
    783 }  // namespace policy
    784