15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_app_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/launch_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/extensions_helper.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_extension_helper.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/sync_helper.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/crx_file/id_util.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/app_sorting.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_registry.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using extensions::ExtensionPrefs;
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AppState {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppState();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AppState();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsValid() const;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Equals(const AppState& other) const;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::StringOrdinal app_launch_ordinal;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::StringOrdinal page_ordinal;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::LaunchType launch_type;
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GURL launch_web_url;
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string description;
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string name;
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool from_bookmark;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<std::string, AppState> AppStateMap;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AppState::AppState() : launch_type(extensions::LAUNCH_TYPE_INVALID) {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppState::~AppState() {}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppState::IsValid() const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_ordinal.IsValid() && app_launch_ordinal.IsValid();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppState::Equals(const AppState& other) const {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return app_launch_ordinal.Equals(other.app_launch_ordinal) &&
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu         page_ordinal.Equals(other.page_ordinal) &&
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu         launch_type == other.launch_type &&
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu         launch_web_url == other.launch_web_url &&
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu         description == other.description && name == other.name &&
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu         from_bookmark == other.from_bookmark;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Load all the app specific values for |id| into |app_state|.
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void LoadApp(content::BrowserContext* context,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const std::string& id,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             AppState* app_state) {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExtensionPrefs* prefs = ExtensionPrefs::Get(context);
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  app_state->app_launch_ordinal = prefs->app_sorting()->GetAppLaunchOrdinal(id);
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  app_state->page_ordinal = prefs->app_sorting()->GetPageOrdinal(id);
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  app_state->launch_type = extensions::GetLaunchTypePrefValue(prefs, id);
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExtensionService* service =
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      extensions::ExtensionSystem::Get(context)->extension_service();
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const extensions::Extension* extension = service->GetInstalledExtension(id);
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  app_state->launch_web_url =
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      extensions::AppLaunchInfo::GetLaunchWebURL(extension);
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  app_state->description = extension->description();
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  app_state->name = extension->name();
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  app_state->from_bookmark = extension->from_bookmark();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a map from |profile|'s installed extensions to their state.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppStateMap GetAppStates(Profile* profile) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppStateMap app_state_map;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<const extensions::ExtensionSet> extensions(
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      extensions::ExtensionRegistry::Get(profile)
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          ->GenerateInstalledExtensionsSet());
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (extensions::ExtensionSet::const_iterator it = extensions->begin();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != extensions->end(); ++it) {
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (extensions::sync_helper::IsSyncableApp(it->get())) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id = (*it)->id();
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      LoadApp(profile, id, &(app_state_map[id]));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::PendingExtensionManager* pending_extension_manager =
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile)
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          ->extension_service()
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          ->pending_extension_manager();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<std::string> pending_crx_ids;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_extension_manager->GetPendingIdsForUpdateCheck(&pending_crx_ids);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::list<std::string>::const_iterator id = pending_crx_ids.begin();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       id != pending_crx_ids.end(); ++id) {
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LoadApp(profile, *id, &(app_state_map[*id]));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return app_state_map;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncAppHelper* SyncAppHelper::GetInstance() {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncAppHelper* instance = Singleton<SyncAppHelper>::get();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance->SetupIfNecessary(sync_datatype_helper::test());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncAppHelper::SetupIfNecessary(SyncTest* test) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setup_completed_)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < test->num_clients(); ++i) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ExtensionSystem::Get(
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        test->GetProfile(i))->InitForRegularProfile(true);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::ExtensionSystem::Get(
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      test->verifier())->InitForRegularProfile(true);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setup_completed_ = true;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncAppHelper::AppStatesMatch(Profile* profile1, Profile* profile2) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SyncExtensionHelper::GetInstance()->ExtensionStatesMatch(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          profile1, profile2))
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AppStateMap& state_map1 = GetAppStates(profile1);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AppStateMap& state_map2 = GetAppStates(profile2);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_map1.size() != state_map2.size()) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(2) << "Number of Apps for profile " << profile1->GetDebugName()
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << " does not match profile " << profile2->GetDebugName();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppStateMap::const_iterator it1 = state_map1.begin();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppStateMap::const_iterator it2 = state_map2.begin();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (it1 != state_map1.end()) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it1->first != it2->first) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(2) << "Apps for profile " << profile1->GetDebugName()
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << " do not match profile " << profile2->GetDebugName();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (!it1->second.IsValid()) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(2) << "Apps for profile " << profile1->GetDebugName()
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << " are not valid.";
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (!it2->second.IsValid()) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(2) << "Apps for profile " << profile2->GetDebugName()
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << " are not valid.";
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (!it1->second.Equals(it2->second)) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(2) << "App states for profile " << profile1->GetDebugName()
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << " do not match profile " << profile2->GetDebugName();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++it1;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++it2;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::StringOrdinal SyncAppHelper::GetPageOrdinalForApp(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name) {
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return ExtensionPrefs::Get(profile)->app_sorting()->GetPageOrdinal(
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      crx_file::id_util::GenerateId(name));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncAppHelper::SetPageOrdinalForApp(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const syncer::StringOrdinal& page_ordinal) {
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExtensionPrefs::Get(profile)->app_sorting()->SetPageOrdinal(
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      crx_file::id_util::GenerateId(name), page_ordinal);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::StringOrdinal SyncAppHelper::GetAppLaunchOrdinalForApp(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name) {
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return ExtensionPrefs::Get(profile)->app_sorting()->GetAppLaunchOrdinal(
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      crx_file::id_util::GenerateId(name));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncAppHelper::SetAppLaunchOrdinalForApp(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const syncer::StringOrdinal& app_launch_ordinal) {
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExtensionPrefs::Get(profile)->app_sorting()->SetAppLaunchOrdinal(
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      crx_file::id_util::GenerateId(name), app_launch_ordinal);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncAppHelper::FixNTPOrdinalCollisions(Profile* profile) {
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExtensionPrefs::Get(profile)->app_sorting()->FixNTPOrdinalCollisions();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncAppHelper::SyncAppHelper() : setup_completed_(false) {}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncAppHelper::~SyncAppHelper() {}
209