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

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

Issue 14143010: Introduce IEImporterTestRegistryOverrider to be able to override the registry for a test and flag t… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/importer/ie_importer_test_registry_overrider_win.h"
6
7 #include <windows.h>
8
9 #include <string>
10
11 #include "base/environment.h"
12 #include "base/guid.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/utf_string_conversions.h"
16 #include "base/win/registry.h"
17
18 namespace {
19
20 // The key to which a random subkey will be appended. This key itself will never
21 // be deleted.
22 const wchar_t kTestHKCUOverrideKey[] = L"SOFTWARE\\Chromium Unit Tests";
23 const char kTestHKCUOverrideEnvironmentVariable[] =
24 "IE_IMPORTER_TEST_OVERRIDE_HKCU";
25
26 base::string16 GetTestKeyFromSubKey(const base::string16& subkey) {
27 base::string16 key(kTestHKCUOverrideKey);
28 key.push_back(L'\\');
29 key.append(subkey);
30 return key;
31 }
32
33 } // namespace
34
35 ////////////////////////////////////////////////////////////////////////////////
36 // IEImporterTestRegistryOverrider, public:
37
38 IEImporterTestRegistryOverrider::IEImporterTestRegistryOverrider()
39 : override_performed_(false), override_initiated_(false) {
40 }
41
42 IEImporterTestRegistryOverrider::~IEImporterTestRegistryOverrider() {
43 base::AutoLock auto_lock(lock_.Get());
44 if (override_performed_) {
45 override_active_in_process_ = false;
46
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());
74 const base::string16 random_subkey(UTF8ToUTF16(base::GenerateGUID()));
75 return StartRegistryOverride(random_subkey) &&
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 }
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/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698