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_extension_helper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/pending_extension_info.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/pending_extension_manager.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_datatype_helper.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_test.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_manifest_constants.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/id_util.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionHelper::ExtensionState::ExtensionState() 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : enabled_state(ENABLED), incognito_enabled(false) {} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionHelper::ExtensionState::~ExtensionState() {} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncExtensionHelper::ExtensionState::Equals( 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncExtensionHelper::ExtensionState &other) const { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((enabled_state == other.enabled_state) && 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (incognito_enabled == other.incognito_enabled)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionHelper* SyncExtensionHelper::GetInstance() { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncExtensionHelper* instance = Singleton<SyncExtensionHelper>::get(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetupIfNecessary(sync_datatype_helper::test()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionHelper::SyncExtensionHelper() : setup_completed_(false) {} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionHelper::~SyncExtensionHelper() {} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncExtensionHelper::SetupIfNecessary(SyncTest* test) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (setup_completed_) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < test->num_clients(); ++i) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupProfile(test->GetProfile(i)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupProfile(test->verifier()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setup_completed_ = true; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SyncExtensionHelper::InstallExtension( 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, const std::string& name, Manifest::Type type) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = GetExtension(profile, name, type); 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!extension.get()) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not install extension " << name; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile->GetExtensionService() 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ->OnExtensionInstalled(extension.get(), 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::StringOrdinal(), 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) false /* no requirement errors */, 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extensions::Blacklist::NOT_BLACKLISTED, 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) false /* don't wait for idle to install */); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension->id(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncExtensionHelper::UninstallExtension( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& name) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService::UninstallExtensionHelper( 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetExtensionService(), 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::id_util::GenerateId(name)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<std::string> SyncExtensionHelper::GetInstalledExtensionNames( 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) const { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> names; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* extension_service = profile->GetExtensionService(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<const ExtensionSet> extensions( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service->GenerateInstalledExtensionsSet()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ExtensionSet::const_iterator it = extensions->begin(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != extensions->end(); ++it) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back((*it)->name()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return names; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncExtensionHelper::EnableExtension(Profile* profile, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetExtensionService()->EnableExtension( 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::id_util::GenerateId(name)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncExtensionHelper::DisableExtension(Profile* profile, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetExtensionService()->DisableExtension( 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::id_util::GenerateId(name), Extension::DISABLE_USER_ACTION); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncExtensionHelper::IsExtensionEnabled( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& name) const { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile->GetExtensionService()->IsExtensionEnabled( 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::id_util::GenerateId(name)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncExtensionHelper::IncognitoEnableExtension( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& name) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetExtensionService()->SetIsIncognitoEnabled( 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::id_util::GenerateId(name), true); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncExtensionHelper::IncognitoDisableExtension( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& name) { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetExtensionService()->SetIsIncognitoEnabled( 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::id_util::GenerateId(name), false); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncExtensionHelper::IsIncognitoEnabled( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& name) const { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile->GetExtensionService()->IsIncognitoEnabled( 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::id_util::GenerateId(name)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncExtensionHelper::IsExtensionPendingInstallForSync( 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, const std::string& id) const { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionManager* pending_extension_manager = 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetExtensionService()->pending_extension_manager(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionInfo* info = 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_extension_manager->GetById(id); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!info) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return info->is_from_sync(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncExtensionHelper::InstallExtensionsPendingForSync(Profile* profile) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Mock out the servers that the extensions auto-update 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mechanism talk to so as to more closely match what actually happens. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Background networking will need to be re-enabled for extensions tests. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We make a copy here since InstallExtension() removes the 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension from the extensions service's copy. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionManager* pending_extension_manager = 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetExtensionService()->pending_extension_manager(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<std::string> pending_crx_ids; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_extension_manager->GetPendingIdsForUpdateCheck(&pending_crx_ids); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<std::string>::const_iterator iter; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionInfo* info = NULL; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (iter = pending_crx_ids.begin(); iter != pending_crx_ids.end(); ++iter) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE((info = pending_extension_manager->GetById(*iter))); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!info->is_from_sync()) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringMap::const_iterator iter2 = id_to_name_.find(*iter); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter2 == id_to_name_.end()) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Could not get name for id " << *iter 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " (profile = " << profile->GetDebugName() << ")"; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TypeMap::const_iterator iter3 = id_to_type_.find(*iter); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter3 == id_to_type_.end()) { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ADD_FAILURE() << "Could not get type for id " << *iter 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " (profile = " << profile->GetDebugName() << ")"; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallExtension(profile, iter2->second, iter3->second); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncExtensionHelper::ExtensionStateMap 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncExtensionHelper::GetExtensionStates(Profile* profile) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& profile_debug_name = profile->GetDebugName(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionStateMap extension_state_map; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* extension_service = profile->GetExtensionService(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<const ExtensionSet> extensions( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service->GenerateInstalledExtensionsSet()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ExtensionSet::const_iterator it = extensions->begin(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != extensions->end(); ++it) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id = (*it)->id(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_state_map[id].enabled_state = 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service->IsExtensionEnabled(id) ? 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionState::ENABLED : 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionState::DISABLED; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_state_map[id].incognito_enabled = 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service->IsIncognitoEnabled(id); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "Extension " << (*it)->id() << " in profile " 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << profile_debug_name << " is " 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << (extension_service->IsExtensionEnabled(id) ? 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "enabled" : "disabled"); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::PendingExtensionManager* pending_extension_manager = 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service->pending_extension_manager(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<std::string> pending_crx_ids; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_extension_manager->GetPendingIdsForUpdateCheck(&pending_crx_ids); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<std::string>::const_iterator id; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (id = pending_crx_ids.begin(); id != pending_crx_ids.end(); ++id) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_state_map[*id].enabled_state = ExtensionState::PENDING; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_state_map[*id].incognito_enabled = 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service->IsIncognitoEnabled(*id); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "Extension " << *id << " in profile " 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << profile_debug_name << " is pending"; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_state_map; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncExtensionHelper::ExtensionStatesMatch( 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile1, Profile* profile2) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtensionStateMap& state_map1 = GetExtensionStates(profile1); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ExtensionStateMap& state_map2 = GetExtensionStates(profile2); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state_map1.size() != state_map2.size()) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Number of extensions for profile " << profile1->GetDebugName() 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " does not match profile " << profile2->GetDebugName(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionStateMap::const_iterator it1 = state_map1.begin(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionStateMap::const_iterator it2 = state_map2.begin(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (it1 != state_map1.end()) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it1->first != it2->first) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Extensions for profile " << profile1->GetDebugName() 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " do not match profile " << profile2->GetDebugName(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!it1->second.Equals(it2->second)) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Extension states for profile " << profile1->GetDebugName() 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " do not match profile " << profile2->GetDebugName(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it1; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it2; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncExtensionHelper::SetupProfile(Profile* profile) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(profile)->InitForRegularProfile(true); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_extensions_.insert(make_pair(profile, ExtensionNameMap())); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string NameToPublicKey(const std::string& name) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string public_key; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string pem; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Extension::ProducePEM(name, &pem) && 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::FormatPEMForFileOutput(pem, &public_key, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* is_public */)); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return public_key; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Somehow unify this with MakeExtension() in 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension_util_unittest.cc. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<Extension> CreateExtension(const base::FilePath& base_dir, 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Type type) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue source; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.SetString(extension_manifest_keys::kName, name); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& public_key = NameToPublicKey(name); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.SetString(extension_manifest_keys::kPublicKey, public_key); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.SetString(extension_manifest_keys::kVersion, "0.0.0.0"); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Manifest::TYPE_EXTENSION: 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Manifest::TYPE_THEME: 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Set(extension_manifest_keys::kTheme, new DictionaryValue()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Manifest::TYPE_HOSTED_APP: 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Manifest::TYPE_LEGACY_PACKAGED_APP: 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.Set(extension_manifest_keys::kApp, new DictionaryValue()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source.SetString(extension_manifest_keys::kLaunchWebURL, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.example.com"); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Manifest::TYPE_PLATFORM_APP: { 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Set(extension_manifest_keys::kApp, new DictionaryValue()); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Set(extension_manifest_keys::kPlatformAppBackground, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new DictionaryValue()); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListValue* scripts = new ListValue(); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scripts->AppendString("main.js"); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source.Set(extension_manifest_keys::kPlatformAppBackgroundScripts, 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scripts); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath sub_dir = base::FilePath().AppendASCII(name); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extension_dir; 3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(base_dir) && 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !file_util::CreateDirectory(base_dir)) { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ADD_FAILURE(); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!file_util::CreateTemporaryDirInDir( 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base_dir, sub_dir.value(), &extension_dir)) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Extension::Create(extension_dir, Manifest::INTERNAL, source, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::NO_FLAGS, &error); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!error.empty()) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << error; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!extension.get()) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension->name() != name) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(name, extension->name()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension->GetType() != type) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(type, extension->GetType()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> SyncExtensionHelper::GetExtension( 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile, const std::string& name, Manifest::Type type) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name.empty()) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileExtensionNameMap::iterator it = profile_extensions_.find(profile); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it == profile_extensions_.end()) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionNameMap::const_iterator it2 = it->second.find(name); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it2 != it->second.end()) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it2->second; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension = 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateExtension(profile->GetExtensionService()->install_directory(), 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, type); 363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!extension.get()) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& expected_id = extensions::id_util::GenerateId(name); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension->id() != expected_id) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_id, extension->id()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(2) << "created extension with name = " 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << name << ", id = " << expected_id; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (it->second)[name] = extension; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_to_name_[expected_id] = name; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id_to_type_[expected_id] = type; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 379