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