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

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: 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" 14 #include "base/strings/string_number_conversions.h"
15 #include "base/utf_string_conversions.h" 15 #include "base/utf_string_conversions.h"
16 #include "base/win/registry.h" 16 #include "base/win/registry.h"
17 17
18 namespace { 18 namespace {
19 19
20 // The key to which a random subkey will be appended. This key itself will never 20 // The key to which a random subkey will be appended. This key itself will never
21 // be deleted. 21 // be deleted.
22 const wchar_t kTestHKCUOverrideKey[] = L"SOFTWARE\\Chromium Unit Tests"; 22 const wchar_t kTestHKCUOverrideKeyPrefix[] = L"SOFTWARE\\Chromium Unit Tests\\";
23 const char kTestHKCUOverrideEnvironmentVariable[] = 23 const char kTestHKCUOverrideEnvironmentVariable[] =
24 "IE_IMPORTER_TEST_OVERRIDE_HKCU"; 24 "IE_IMPORTER_TEST_OVERRIDE_HKCU";
25 25
26 base::string16 GetTestKeyFromSubKey(const base::string16& subkey) { 26 // Reads the environment variable set by a previous call to
27 base::string16 key(kTestHKCUOverrideKey); 27 // SetTestRegistryOverride() into |key| if it exists and |key| is not NULL.
28 key.push_back(L'\\'); 28 // Returns true if the variable was successfully read.
29 key.append(subkey); 29 bool GetTestKeyFromEnvironment(base::string16* key) {
30 return key; 30 scoped_ptr<base::Environment> env(base::Environment::Create());
31 std::string value;
32 bool result = env->GetVar(kTestHKCUOverrideEnvironmentVariable, &value);
33 if (result)
34 *key = UTF8ToUTF16(value);
35 return result;
31 } 36 }
32 37
33 } // namespace 38 } // namespace
34 39
35 //////////////////////////////////////////////////////////////////////////////// 40 ////////////////////////////////////////////////////////////////////////////////
36 // IEImporterTestRegistryOverrider, public: 41 // IEImporterTestRegistryOverrider, public:
37 42
38 IEImporterTestRegistryOverrider::IEImporterTestRegistryOverrider() 43 IEImporterTestRegistryOverrider::IEImporterTestRegistryOverrider()
39 : override_performed_(false), override_initiated_(false) { 44 : override_initiated_(false) {
40 } 45 }
41 46
42 IEImporterTestRegistryOverrider::~IEImporterTestRegistryOverrider() { 47 IEImporterTestRegistryOverrider::~IEImporterTestRegistryOverrider() {
43 base::AutoLock auto_lock(lock_.Get()); 48 if (override_initiated_) {
44 if (override_performed_) { 49 base::string16 key;
45 override_active_in_process_ = false; 50 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.
51 NOTREACHED();
52 } else {
53 base::win::RegKey reg_key(HKEY_CURRENT_USER, key.c_str(), KEY_ALL_ACCESS);
54 DCHECK(reg_key.Valid());
55 reg_key.DeleteKey(L"");
56 }
46 57
47 DWORD result = RegOverridePredefKey(HKEY_CURRENT_USER, NULL); 58 scoped_ptr<base::Environment> env(base::Environment::Create());
48 DLOG_IF(ERROR, result != ERROR_SUCCESS) 59 env->UnSetVar(kTestHKCUOverrideEnvironmentVariable);
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 } 60 }
67 } 61 }
68 62
69 bool IEImporterTestRegistryOverrider::SetRegistryOverride() { 63 bool IEImporterTestRegistryOverrider::SetTestRegistryOverride() {
70 base::AutoLock auto_lock(lock_.Get()); 64 DCHECK(!GetTestKeyFromEnvironment(NULL));
71 DCHECK(!GetSubKeyFromEnvironment(NULL)); 65
72 override_initiated_ = true; 66 override_initiated_ = true;
67
73 scoped_ptr<base::Environment> env(base::Environment::Create()); 68 scoped_ptr<base::Environment> env(base::Environment::Create());
74 const base::string16 random_subkey(UTF8ToUTF16(base::GenerateGUID())); 69
75 return StartRegistryOverride(random_subkey) && 70 base::string16 random_key(kTestHKCUOverrideKeyPrefix);
76 env->SetVar(kTestHKCUOverrideEnvironmentVariable, 71 random_key.append(UTF8ToUTF16(base::GenerateGUID()));
77 UTF16ToUTF8(random_subkey)); 72
73 return env->SetVar(kTestHKCUOverrideEnvironmentVariable,
74 UTF16ToUTF8(random_key));
78 } 75 }
79 76
80 bool IEImporterTestRegistryOverrider::StartRegistryOverrideIfNeeded() { 77 base::string16 IEImporterTestRegistryOverrider::GetTestRegistryOverride() {
robertshield 2013/05/22 19:31:35 // static
gab 2013/05/22 20:07:40 Done.
81 base::AutoLock auto_lock(lock_.Get()); 78 base::string16 key;
82 base::string16 subkey; 79 if (!GetTestKeyFromEnvironment(&key))
83 if (!GetSubKeyFromEnvironment(&subkey)) 80 return string16();
84 return true; 81 return key;
85 return StartRegistryOverride(subkey);
86 } 82 }
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 }
131
132 // static
133 bool IEImporterTestRegistryOverrider::override_active_in_process_ = false;
134
135 // static
136 base::LazyInstance<base::Lock>::Leaky IEImporterTestRegistryOverrider::lock_ =
137 LAZY_INSTANCE_INITIALIZER;
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