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