Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: chrome/browser/importer/ie_importer_test_registry_overrider_win.cc

Issue 15736014: Registry overriding doesn't seem to work across multiple processes prior to Win8, instead simply ha… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/importer/ie_importer_test_registry_overrider_win.h" 5 #include "chrome/browser/importer/ie_importer_test_registry_overrider_win.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 8
9 #include <string> 9 #include <string>
10 10
11 #include "base/environment.h" 11 #include "base/environment.h"
12 #include "base/guid.h" 12 #include "base/guid.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
16 #include "base/win/registry.h" 15 #include "base/win/registry.h"
17 16
18 namespace { 17 namespace {
19 18
20 // The key to which a random subkey will be appended. This key itself will never 19 // The key to which a random subkey will be appended. This key itself will never
21 // be deleted. 20 // be deleted.
22 const wchar_t kTestHKCUOverrideKey[] = L"SOFTWARE\\Chromium Unit Tests"; 21 const wchar_t kTestHKCUOverrideKeyPrefix[] = L"SOFTWARE\\Chromium Unit Tests\\";
23 const char kTestHKCUOverrideEnvironmentVariable[] = 22 const char kTestHKCUOverrideEnvironmentVariable[] =
24 "IE_IMPORTER_TEST_OVERRIDE_HKCU"; 23 "IE_IMPORTER_TEST_OVERRIDE_HKCU";
25 24
26 base::string16 GetTestKeyFromSubKey(const base::string16& subkey) { 25 // Reads the environment variable set by a previous call to
27 base::string16 key(kTestHKCUOverrideKey); 26 // SetTestRegistryOverride() into |key| if it exists and |key| is not NULL.
28 key.push_back(L'\\'); 27 // Returns true if the variable was successfully read.
29 key.append(subkey); 28 bool GetTestKeyFromEnvironment(base::string16* key) {
30 return key; 29 scoped_ptr<base::Environment> env(base::Environment::Create());
30 std::string value;
31 bool result = env->GetVar(kTestHKCUOverrideEnvironmentVariable, &value);
32 if (result)
33 *key = UTF8ToUTF16(value);
34 return result;
31 } 35 }
32 36
33 } // namespace 37 } // namespace
34 38
35 //////////////////////////////////////////////////////////////////////////////// 39 ////////////////////////////////////////////////////////////////////////////////
36 // IEImporterTestRegistryOverrider, public: 40 // IEImporterTestRegistryOverrider, public:
37 41
38 IEImporterTestRegistryOverrider::IEImporterTestRegistryOverrider() 42 IEImporterTestRegistryOverrider::IEImporterTestRegistryOverrider()
39 : override_performed_(false), override_initiated_(false) { 43 : temporary_key_(kTestHKCUOverrideKeyPrefix +
44 UTF8ToUTF16(base::GenerateGUID())) {
45 DCHECK(!GetTestKeyFromEnvironment(NULL));
46
47 scoped_ptr<base::Environment> env(base::Environment::Create());
48 bool success = env->SetVar(kTestHKCUOverrideEnvironmentVariable,
49 UTF16ToUTF8(temporary_key_));
50 DCHECK(success);
40 } 51 }
41 52
42 IEImporterTestRegistryOverrider::~IEImporterTestRegistryOverrider() { 53 IEImporterTestRegistryOverrider::~IEImporterTestRegistryOverrider() {
43 base::AutoLock auto_lock(lock_.Get()); 54 base::win::RegKey reg_key(HKEY_CURRENT_USER, temporary_key_.c_str(),
44 if (override_performed_) { 55 KEY_ALL_ACCESS);
45 override_active_in_process_ = false; 56 DCHECK(reg_key.Valid());
57 reg_key.DeleteKey(L"");
46 58
47 DWORD result = RegOverridePredefKey(HKEY_CURRENT_USER, NULL);
48 DLOG_IF(ERROR, result != ERROR_SUCCESS)
49 << "Failed to unset current override";
50
51 if (override_initiated_) {
52 base::string16 subkey;
53 if (!GetSubKeyFromEnvironment(&subkey)) {
54 NOTREACHED();
55 } else {
56 base::string16 key(GetTestKeyFromSubKey(subkey));
57 base::win::RegKey reg_key(HKEY_CURRENT_USER, key.c_str(),
58 KEY_ALL_ACCESS);
59 DCHECK(reg_key.Valid());
60 reg_key.DeleteKey(L"");
61 }
62
63 scoped_ptr<base::Environment> env(base::Environment::Create());
64 env->UnSetVar(kTestHKCUOverrideEnvironmentVariable);
65 }
66 }
67 }
68
69 bool IEImporterTestRegistryOverrider::SetRegistryOverride() {
70 base::AutoLock auto_lock(lock_.Get());
71 DCHECK(!GetSubKeyFromEnvironment(NULL));
72 override_initiated_ = true;
73 scoped_ptr<base::Environment> env(base::Environment::Create()); 59 scoped_ptr<base::Environment> env(base::Environment::Create());
74 const base::string16 random_subkey(UTF8ToUTF16(base::GenerateGUID())); 60 bool success = env->UnSetVar(kTestHKCUOverrideEnvironmentVariable);
75 return StartRegistryOverride(random_subkey) && 61 DCHECK(success);
76 env->SetVar(kTestHKCUOverrideEnvironmentVariable,
77 UTF16ToUTF8(random_subkey));
78 }
79
80 bool IEImporterTestRegistryOverrider::StartRegistryOverrideIfNeeded() {
81 base::AutoLock auto_lock(lock_.Get());
82 base::string16 subkey;
83 if (!GetSubKeyFromEnvironment(&subkey))
84 return true;
85 return StartRegistryOverride(subkey);
86 }
87
88 ////////////////////////////////////////////////////////////////////////////////
89 // IEImporterTestRegistryOverrider, private:
90
91 bool IEImporterTestRegistryOverrider::StartRegistryOverride(
92 const base::string16& subkey) {
93 lock_.Get().AssertAcquired();
94 // Override the registry whether |override_active_in_process_| or not as some
95 // Windows API calls seem to reset the override (IUrlHistoryStg2::AddUrl is
96 // suspected on Win7-). However, make sure to first undo any existing override
97 // as this method will otherwise generate a fake key within the current fake
98 // key.
99 DWORD result = RegOverridePredefKey(HKEY_CURRENT_USER, NULL);
100 DLOG_IF(ERROR, result != ERROR_SUCCESS) << "Failed to unset current override";
101
102 const base::string16 key(GetTestKeyFromSubKey(subkey));
103 base::win::RegKey temp_hkcu_hive_key;
104 result = temp_hkcu_hive_key.Create(HKEY_CURRENT_USER, key.c_str(),
105 KEY_ALL_ACCESS);
106 if (result != ERROR_SUCCESS || !temp_hkcu_hive_key.Valid()) {
107 DPLOG(ERROR) << result;
108 return false;
109 }
110
111 if (!override_active_in_process_) {
112 // Only take ownership of the override if it wasn't already set in this
113 // process.
114 override_performed_ = true;
115 override_active_in_process_ = true;
116 }
117 return RegOverridePredefKey(HKEY_CURRENT_USER,
118 temp_hkcu_hive_key.Handle()) == ERROR_SUCCESS;
119 }
120
121 bool IEImporterTestRegistryOverrider::GetSubKeyFromEnvironment(
122 base::string16* subkey) {
123 lock_.Get().AssertAcquired();
124 scoped_ptr<base::Environment> env(base::Environment::Create());
125 std::string value;
126 bool result = env->GetVar(kTestHKCUOverrideEnvironmentVariable, &value);
127 if (result && subkey)
128 *subkey = UTF8ToUTF16(value);
129 return result;
130 } 62 }
131 63
132 // static 64 // static
133 bool IEImporterTestRegistryOverrider::override_active_in_process_ = false; 65 base::string16 IEImporterTestRegistryOverrider::GetTestRegistryOverride() {
134 66 base::string16 key;
135 // static 67 if (!GetTestKeyFromEnvironment(&key))
136 base::LazyInstance<base::Lock>::Leaky IEImporterTestRegistryOverrider::lock_ = 68 return string16();
137 LAZY_INSTANCE_INITIALIZER; 69 return key;
70 }
OLDNEW
« no previous file with comments | « chrome/browser/importer/ie_importer_test_registry_overrider_win.h ('k') | chrome/browser/importer/ie_importer_utils_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698