| Index: chrome/browser/ui/ash/chrome_launcher_prefs.cc
 | 
| diff --git a/chrome/browser/ui/ash/chrome_launcher_prefs.cc b/chrome/browser/ui/ash/chrome_launcher_prefs.cc
 | 
| index facb328e12daa59fda92df2a3d6b02a13e3b3764..53a4f3a7348122247be30a2ef2c13b92225d416b 100644
 | 
| --- a/chrome/browser/ui/ash/chrome_launcher_prefs.cc
 | 
| +++ b/chrome/browser/ui/ash/chrome_launcher_prefs.cc
 | 
| @@ -12,6 +12,7 @@
 | 
|  #include "base/strings/string_number_conversions.h"
 | 
|  #include "base/values.h"
 | 
|  #include "chrome/browser/app_mode/app_mode_utils.h"
 | 
| +#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
 | 
|  #include "chrome/common/extensions/extension_constants.h"
 | 
|  #include "chrome/common/pref_names.h"
 | 
|  #include "components/pref_registry/pref_registry_syncable.h"
 | 
| @@ -171,6 +172,7 @@ const char* AutoHideBehaviorToPref(ShelfAutoHideBehavior behavior) {
 | 
|  
 | 
|  const char kPinnedAppsPrefAppIDPath[] = "id";
 | 
|  const char kPinnedAppsPrefPinnedByPolicy[] = "pinned_by_policy";
 | 
| +const char kPinnedAppsPlaceholder[] = "AppShelfIDPlaceholder--------";
 | 
|  
 | 
|  const char kShelfAutoHideBehaviorAlways[] = "Always";
 | 
|  const char kShelfAutoHideBehaviorNever[] = "Never";
 | 
| @@ -268,4 +270,70 @@ void SetShelfAlignmentPref(PrefService* prefs,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +std::vector<std::string> GetPinnedAppsFromPrefs(
 | 
| +    PrefService* prefs,
 | 
| +    LauncherControllerHelper* helper) {
 | 
| +  // Adding the app list item to the list of items requires that the ID is not
 | 
| +  // a valid and known ID for the extension system. The ID was constructed that
 | 
| +  // way - but just to make sure...
 | 
| +  DCHECK(!helper->IsValidIDForCurrentUser(kPinnedAppsPlaceholder));
 | 
| +
 | 
| +  std::vector<std::string> apps;
 | 
| +  const auto* pinned = prefs->GetList(prefs::kPinnedLauncherApps);
 | 
| +  const auto* policy = prefs->GetList(prefs::kPolicyPinnedLauncherApps);
 | 
| +
 | 
| +  // Get the sanitized preference value for the index of the Chrome app icon.
 | 
| +  const size_t chrome_icon_index = std::max<size_t>(
 | 
| +      0, std::min<size_t>(pinned->GetSize(),
 | 
| +                          prefs->GetInteger(prefs::kShelfChromeIconIndex)));
 | 
| +
 | 
| +  // Check if Chrome is in either of the the preferences lists.
 | 
| +  std::unique_ptr<base::Value> chrome_app(
 | 
| +      ash::CreateAppDict(extension_misc::kChromeAppId));
 | 
| +  bool chrome_listed =
 | 
| +      (pinned->Find(*chrome_app.get()) != pinned->end() ||
 | 
| +       (policy && policy->Find(*chrome_app.get()) != policy->end()));
 | 
| +
 | 
| +  std::string app_id;
 | 
| +  for (size_t i = 0; policy && (i < policy->GetSize()); ++i) {
 | 
| +    const base::DictionaryValue* dictionary = nullptr;
 | 
| +    if (policy->GetDictionary(i, &dictionary) &&
 | 
| +        dictionary->GetString(kPinnedAppsPrefAppIDPath, &app_id) &&
 | 
| +        helper->IsValidIDForCurrentUser(app_id) &&
 | 
| +        std::find(apps.begin(), apps.end(), app_id) == apps.end()) {
 | 
| +      apps.push_back(app_id);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  for (size_t i = 0; i < pinned->GetSize(); ++i) {
 | 
| +    // We need to position the chrome icon relative to its place in the pinned
 | 
| +    // preference list - even if an item of that list isn't shown yet.
 | 
| +    if (i == chrome_icon_index && !chrome_listed) {
 | 
| +      apps.push_back(extension_misc::kChromeAppId);
 | 
| +      chrome_listed = true;
 | 
| +    }
 | 
| +    bool pinned_by_policy = false;
 | 
| +    const base::DictionaryValue* dictionary = nullptr;
 | 
| +    if (pinned->GetDictionary(i, &dictionary) &&
 | 
| +        dictionary->GetString(kPinnedAppsPrefAppIDPath, &app_id) &&
 | 
| +        helper->IsValidIDForCurrentUser(app_id) &&
 | 
| +        std::find(apps.begin(), apps.end(), app_id) == apps.end() &&
 | 
| +        (!dictionary->GetBoolean(kPinnedAppsPrefPinnedByPolicy,
 | 
| +                                 &pinned_by_policy) ||
 | 
| +         !pinned_by_policy)) {
 | 
| +      apps.push_back(app_id);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  // If not added yet, the chrome item will be the last item in the list.
 | 
| +  if (!chrome_listed)
 | 
| +    apps.push_back(extension_misc::kChromeAppId);
 | 
| +
 | 
| +  // If not added yet, place the app list item at the beginning of the list.
 | 
| +  if (std::find(apps.begin(), apps.end(), kPinnedAppsPlaceholder) == apps.end())
 | 
| +    apps.insert(apps.begin(), kPinnedAppsPlaceholder);
 | 
| +
 | 
| +  return apps;
 | 
| +}
 | 
| +
 | 
|  }  // namespace ash
 | 
| 
 |