Chromium Code Reviews| Index: chrome/browser/importer/ie_importer_test_registry_overrider_win.cc |
| diff --git a/chrome/browser/importer/ie_importer_test_registry_overrider_win.cc b/chrome/browser/importer/ie_importer_test_registry_overrider_win.cc |
| index 09933fa7cb663442e48c517a682ab5c9d7c91ae6..dff796b84f9351c07c4d2bca04c4b2017914c0f8 100644 |
| --- a/chrome/browser/importer/ie_importer_test_registry_overrider_win.cc |
| +++ b/chrome/browser/importer/ie_importer_test_registry_overrider_win.cc |
| @@ -19,15 +19,20 @@ namespace { |
| // The key to which a random subkey will be appended. This key itself will never |
| // be deleted. |
| -const wchar_t kTestHKCUOverrideKey[] = L"SOFTWARE\\Chromium Unit Tests"; |
| +const wchar_t kTestHKCUOverrideKeyPrefix[] = L"SOFTWARE\\Chromium Unit Tests\\"; |
| const char kTestHKCUOverrideEnvironmentVariable[] = |
| "IE_IMPORTER_TEST_OVERRIDE_HKCU"; |
| -base::string16 GetTestKeyFromSubKey(const base::string16& subkey) { |
| - base::string16 key(kTestHKCUOverrideKey); |
| - key.push_back(L'\\'); |
| - key.append(subkey); |
| - return key; |
| +// Reads the environment variable set by a previous call to |
| +// SetTestRegistryOverride() into |key| if it exists and |key| is not NULL. |
| +// Returns true if the variable was successfully read. |
| +bool GetTestKeyFromEnvironment(base::string16* key) { |
| + scoped_ptr<base::Environment> env(base::Environment::Create()); |
| + std::string value; |
| + bool result = env->GetVar(kTestHKCUOverrideEnvironmentVariable, &value); |
| + if (result) |
| + *key = UTF8ToUTF16(value); |
| + return result; |
| } |
| } // namespace |
| @@ -36,102 +41,42 @@ base::string16 GetTestKeyFromSubKey(const base::string16& subkey) { |
| // IEImporterTestRegistryOverrider, public: |
| IEImporterTestRegistryOverrider::IEImporterTestRegistryOverrider() |
| - : override_performed_(false), override_initiated_(false) { |
| + : override_initiated_(false) { |
| } |
| IEImporterTestRegistryOverrider::~IEImporterTestRegistryOverrider() { |
| - base::AutoLock auto_lock(lock_.Get()); |
| - if (override_performed_) { |
| - override_active_in_process_ = false; |
| - |
| - DWORD result = RegOverridePredefKey(HKEY_CURRENT_USER, NULL); |
| - DLOG_IF(ERROR, result != ERROR_SUCCESS) |
| - << "Failed to unset current override"; |
| - |
| - if (override_initiated_) { |
| - base::string16 subkey; |
| - if (!GetSubKeyFromEnvironment(&subkey)) { |
| - NOTREACHED(); |
| - } else { |
| - base::string16 key(GetTestKeyFromSubKey(subkey)); |
| - base::win::RegKey reg_key(HKEY_CURRENT_USER, key.c_str(), |
| - KEY_ALL_ACCESS); |
| - DCHECK(reg_key.Valid()); |
| - reg_key.DeleteKey(L""); |
| - } |
| - |
| - scoped_ptr<base::Environment> env(base::Environment::Create()); |
| - env->UnSetVar(kTestHKCUOverrideEnvironmentVariable); |
| + if (override_initiated_) { |
| + base::string16 key; |
| + if (!GetTestKeyFromEnvironment(&key)) { |
|
robertshield
2013/05/22 19:31:35
The environment is process-global, but override_in
gab
2013/05/22 20:07:40
Changed as discussed.
|
| + NOTREACHED(); |
| + } else { |
| + base::win::RegKey reg_key(HKEY_CURRENT_USER, key.c_str(), KEY_ALL_ACCESS); |
| + DCHECK(reg_key.Valid()); |
| + reg_key.DeleteKey(L""); |
| } |
| + |
| + scoped_ptr<base::Environment> env(base::Environment::Create()); |
| + env->UnSetVar(kTestHKCUOverrideEnvironmentVariable); |
| } |
| } |
| -bool IEImporterTestRegistryOverrider::SetRegistryOverride() { |
| - base::AutoLock auto_lock(lock_.Get()); |
| - DCHECK(!GetSubKeyFromEnvironment(NULL)); |
| +bool IEImporterTestRegistryOverrider::SetTestRegistryOverride() { |
| + DCHECK(!GetTestKeyFromEnvironment(NULL)); |
| + |
| override_initiated_ = true; |
| + |
| scoped_ptr<base::Environment> env(base::Environment::Create()); |
| - const base::string16 random_subkey(UTF8ToUTF16(base::GenerateGUID())); |
| - return StartRegistryOverride(random_subkey) && |
| - env->SetVar(kTestHKCUOverrideEnvironmentVariable, |
| - UTF16ToUTF8(random_subkey)); |
| -} |
| -bool IEImporterTestRegistryOverrider::StartRegistryOverrideIfNeeded() { |
| - base::AutoLock auto_lock(lock_.Get()); |
| - base::string16 subkey; |
| - if (!GetSubKeyFromEnvironment(&subkey)) |
| - return true; |
| - return StartRegistryOverride(subkey); |
| -} |
| + base::string16 random_key(kTestHKCUOverrideKeyPrefix); |
| + random_key.append(UTF8ToUTF16(base::GenerateGUID())); |
| -//////////////////////////////////////////////////////////////////////////////// |
| -// IEImporterTestRegistryOverrider, private: |
| - |
| -bool IEImporterTestRegistryOverrider::StartRegistryOverride( |
| - const base::string16& subkey) { |
| - lock_.Get().AssertAcquired(); |
| - // Override the registry whether |override_active_in_process_| or not as some |
| - // Windows API calls seem to reset the override (IUrlHistoryStg2::AddUrl is |
| - // suspected on Win7-). However, make sure to first undo any existing override |
| - // as this method will otherwise generate a fake key within the current fake |
| - // key. |
| - DWORD result = RegOverridePredefKey(HKEY_CURRENT_USER, NULL); |
| - DLOG_IF(ERROR, result != ERROR_SUCCESS) << "Failed to unset current override"; |
| - |
| - const base::string16 key(GetTestKeyFromSubKey(subkey)); |
| - base::win::RegKey temp_hkcu_hive_key; |
| - result = temp_hkcu_hive_key.Create(HKEY_CURRENT_USER, key.c_str(), |
| - KEY_ALL_ACCESS); |
| - if (result != ERROR_SUCCESS || !temp_hkcu_hive_key.Valid()) { |
| - DPLOG(ERROR) << result; |
| - return false; |
| - } |
| - |
| - if (!override_active_in_process_) { |
| - // Only take ownership of the override if it wasn't already set in this |
| - // process. |
| - override_performed_ = true; |
| - override_active_in_process_ = true; |
| - } |
| - return RegOverridePredefKey(HKEY_CURRENT_USER, |
| - temp_hkcu_hive_key.Handle()) == ERROR_SUCCESS; |
| + return env->SetVar(kTestHKCUOverrideEnvironmentVariable, |
| + UTF16ToUTF8(random_key)); |
| } |
| -bool IEImporterTestRegistryOverrider::GetSubKeyFromEnvironment( |
| - base::string16* subkey) { |
| - lock_.Get().AssertAcquired(); |
| - scoped_ptr<base::Environment> env(base::Environment::Create()); |
| - std::string value; |
| - bool result = env->GetVar(kTestHKCUOverrideEnvironmentVariable, &value); |
| - if (result && subkey) |
| - *subkey = UTF8ToUTF16(value); |
| - return result; |
| +base::string16 IEImporterTestRegistryOverrider::GetTestRegistryOverride() { |
|
robertshield
2013/05/22 19:31:35
// static
gab
2013/05/22 20:07:40
Done.
|
| + base::string16 key; |
| + if (!GetTestKeyFromEnvironment(&key)) |
| + return string16(); |
| + return key; |
| } |
| - |
| -// static |
| -bool IEImporterTestRegistryOverrider::override_active_in_process_ = false; |
| - |
| -// static |
| -base::LazyInstance<base::Lock>::Leaky IEImporterTestRegistryOverrider::lock_ = |
| - LAZY_INSTANCE_INITIALIZER; |