Plumbing for login apps device policy to extensions.

Device policy kDeviceLoginScreenAppInstallList is parsed and stored as the pref kInstallLoginScreenAppList.

ExtensionManagement:
* Factor out common code into GetInstallListByMode from
GetForceInstallList and GetRecommendedInstallList.
* Common function UpdateForcedExtensions.
* is_signin_profile so kInstallLoginScreenAppList is only set in the chromeos signin profile.

ExtensionInstallListPolicyHandler:
* Common base class to parse login screen app and force extension install lists.

ExtensionPref:
* extensions.install.login_screen_app_list.

BUG=576464

Review-Url: https://codereview.chromium.org/2144313002
Cr-Commit-Position: refs/heads/master@{#455434}
diff --git a/chrome/browser/extensions/policy_handlers.cc b/chrome/browser/extensions/policy_handlers.cc
index fa80158..8ee0bee3 100644
--- a/chrome/browser/extensions/policy_handlers.cc
+++ b/chrome/browser/extensions/policy_handlers.cc
@@ -99,43 +99,41 @@
   return true;
 }
 
-// ExtensionInstallForcelistPolicyHandler implementation -----------------------
+// ExtensionInstallListPolicyHandler implementation ----------------------------
 
-ExtensionInstallForcelistPolicyHandler::ExtensionInstallForcelistPolicyHandler()
-    : policy::TypeCheckingPolicyHandler(policy::key::kExtensionInstallForcelist,
-                                        base::Value::Type::LIST) {}
+ExtensionInstallListPolicyHandler::ExtensionInstallListPolicyHandler(
+    const char* policy_name,
+    const char* pref_name)
+    : policy::TypeCheckingPolicyHandler(policy_name, base::Value::Type::LIST),
+      pref_name_(pref_name) {}
 
-ExtensionInstallForcelistPolicyHandler::
-    ~ExtensionInstallForcelistPolicyHandler() {}
-
-bool ExtensionInstallForcelistPolicyHandler::CheckPolicySettings(
+bool ExtensionInstallListPolicyHandler::CheckPolicySettings(
     const policy::PolicyMap& policies,
     policy::PolicyErrorMap* errors) {
   const base::Value* value;
   return CheckAndGetValue(policies, errors, &value) &&
-      ParseList(value, NULL, errors);
+         ParseList(value, nullptr, errors);
 }
 
-void ExtensionInstallForcelistPolicyHandler::ApplyPolicySettings(
+void ExtensionInstallListPolicyHandler::ApplyPolicySettings(
     const policy::PolicyMap& policies,
     PrefValueMap* prefs) {
-  const base::Value* value = NULL;
+  const base::Value* value = nullptr;
   std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
-  if (CheckAndGetValue(policies, NULL, &value) &&
-      value &&
-      ParseList(value, dict.get(), NULL)) {
-    prefs->SetValue(pref_names::kInstallForceList, std::move(dict));
+  if (CheckAndGetValue(policies, nullptr, &value) && value &&
+      ParseList(value, dict.get(), nullptr)) {
+    prefs->SetValue(pref_name_, std::move(dict));
   }
 }
 
-bool ExtensionInstallForcelistPolicyHandler::ParseList(
+bool ExtensionInstallListPolicyHandler::ParseList(
     const base::Value* policy_value,
     base::DictionaryValue* extension_dict,
     policy::PolicyErrorMap* errors) {
   if (!policy_value)
     return true;
 
-  const base::ListValue* policy_list_value = NULL;
+  const base::ListValue* policy_list_value = nullptr;
   if (!policy_value->GetAsList(&policy_list_value)) {
     // This should have been caught in CheckPolicySettings.
     NOTREACHED();
@@ -167,8 +165,8 @@
       continue;
     }
 
-    std::string extension_id = entry_string.substr(0, pos);
-    std::string update_url = entry_string.substr(pos+1);
+    const std::string extension_id = entry_string.substr(0, pos);
+    const std::string update_url = entry_string.substr(pos + 1);
     if (!crx_file::id_util::IdIsValid(extension_id) ||
         !GURL(update_url).is_valid()) {
       if (errors) {
@@ -180,14 +178,28 @@
     }
 
     if (extension_dict) {
-      extensions::ExternalPolicyLoader::AddExtension(
-          extension_dict, extension_id, update_url);
+      ExternalPolicyLoader::AddExtension(extension_dict, extension_id,
+                                         update_url);
     }
   }
 
   return true;
 }
 
+// ExtensionInstallForcelistPolicyHandler implementation -----------------------
+
+ExtensionInstallForcelistPolicyHandler::ExtensionInstallForcelistPolicyHandler()
+    : ExtensionInstallListPolicyHandler(policy::key::kExtensionInstallForcelist,
+                                        pref_names::kInstallForceList) {}
+
+// ExtensionInstallLoginScreenAppListPolicyHandler implementation --------------
+
+ExtensionInstallLoginScreenAppListPolicyHandler::
+    ExtensionInstallLoginScreenAppListPolicyHandler()
+    : ExtensionInstallListPolicyHandler(
+          policy::key::kDeviceLoginScreenAppInstallList,
+          pref_names::kInstallLoginScreenAppList) {}
+
 // ExtensionURLPatternListPolicyHandler implementation -------------------------
 
 ExtensionURLPatternListPolicyHandler::ExtensionURLPatternListPolicyHandler(