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