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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_test_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_frontend.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system_factory.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace settings_test_util { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Intended as a StorageCallback from GetStorage. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AssignStorage(ValueStore** dst, ValueStore* src) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dst = src; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueStore* GetStorage( 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_namespace::Namespace settings_namespace, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SettingsFrontend* frontend) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueStore* storage = NULL; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frontend->RunWithStorage( 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_namespace, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&AssignStorage, &storage)); 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return storage; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueStore* GetStorage( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, SettingsFrontend* frontend) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStorage(extension_id, settings_namespace::SYNC, frontend); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockExtensionService 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockExtensionService::MockExtensionService() {} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockExtensionService::~MockExtensionService() {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* MockExtensionService::GetExtensionById( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, bool include_disabled) const { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, scoped_refptr<Extension> >::const_iterator 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) maybe_extension = extensions_.find(id); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return maybe_extension == extensions_.end() ? 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL : maybe_extension->second.get(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockExtensionService::AddExtensionWithId( 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, Manifest::Type type) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> empty_permissions; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddExtensionWithIdAndPermissions(id, type, empty_permissions); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockExtensionService::AddExtensionWithIdAndPermissions( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Type type, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<std::string>& permissions_set) { 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue manifest; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString("name", std::string("Test extension ") + id); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.SetString("version", "1.0"); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::ListValue> permissions(new base::ListValue()); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::const_iterator it = permissions_set.begin(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != permissions_set.end(); ++it) { 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) permissions->Append(new base::StringValue(*it)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.Set("permissions", permissions.release()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Manifest::TYPE_EXTENSION: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case Manifest::TYPE_LEGACY_PACKAGED_APP: { 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* app = new base::DictionaryValue(); 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* app_launch = new base::DictionaryValue(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_launch->SetString("local_path", "fake.html"); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app->Set("launch", app_launch); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.Set("app", app); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Extension> extension(Extension::Create( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(), 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::INTERNAL, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Extension::NO_FLAGS, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(extension.get()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(error.empty()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions_[id] = extension; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<std::string>::const_iterator it = permissions_set.begin(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != permissions_set.end(); ++it) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(extension->HasAPIPermission(*it)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockExtensionSystem 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockExtensionSystem::MockExtensionSystem(Profile* profile) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TestExtensionSystem(profile) {} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockExtensionSystem::~MockExtensionSystem() {} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventRouter* MockExtensionSystem::event_router() { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!event_router_.get()) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_router_.reset(new EventRouter(profile_, NULL)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event_router_.get(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionService* MockExtensionSystem::extension_service() { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionServiceInterface* as_interface = 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<ExtensionServiceInterface*>(&extension_service_); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<ExtensionService*>(as_interface); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserContextKeyedService* BuildMockExtensionSystem( 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* profile) { 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new MockExtensionSystem(static_cast<Profile*>(profile)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockProfile 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockProfile::MockProfile(const base::FilePath& file_path) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TestingProfile(file_path) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionSystemFactory::GetInstance()->SetTestingFactoryAndUse(this, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BuildMockExtensionSystem); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockProfile::~MockProfile() {} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScopedSettingsFactory 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedSettingsStorageFactory::ScopedSettingsStorageFactory() {} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedSettingsStorageFactory::ScopedSettingsStorageFactory( 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<SettingsStorageFactory>& delegate) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(delegate) {} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedSettingsStorageFactory::~ScopedSettingsStorageFactory() {} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScopedSettingsStorageFactory::Reset( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<SettingsStorageFactory>& delegate) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueStore* ScopedSettingsStorageFactory::Create( 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& base_path, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(delegate_.get()); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_->Create(base_path, extension_id); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace settings_test_util 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 168