summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordcheng <dcheng@chromium.org>2014-10-15 20:09:26 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-16 03:09:45 +0000
commit4fe6ccadfda8e661ef22a5ab1ce4702f4d363d36 (patch)
tree8d67c05042986322ce763258d4fe52da7a49c711
parent5b154b85bfd98f1d657821c3404c2e563fd31d85 (diff)
downloadchromium_src-4fe6ccadfda8e661ef22a5ab1ce4702f4d363d36.zip
chromium_src-4fe6ccadfda8e661ef22a5ab1ce4702f4d363d36.tar.gz
chromium_src-4fe6ccadfda8e661ef22a5ab1ce4702f4d363d36.tar.bz2
Revert of Remove raw handles from base::win::RegKey (patchset #6 id:330001 of https://codereview.chromium.org/632833002/)
Reason for revert: Causing base_unittests failures on XP Tests (1) Original issue's description: > Remove raw handles from base::win::RegKey > > BUG=419210, 423634 > R=cpu@chromium.org, eroman@chromium.org, sky@chromium.org > > Committed: https://crrev.com/1aa0fa75b65f403e08ae0f3f2fcb053c02cd9ef2 > Cr-Commit-Position: refs/heads/master@{#299737} TBR=cpu@chromium.org,eroman@chromium.org,jam@chromium.org,rvargas@chromium.org NOTREECHECKS=true NOTRY=true BUG=419210, 423634 Review URL: https://codereview.chromium.org/652903005 Cr-Commit-Position: refs/heads/master@{#299828}
-rw-r--r--base/win/registry.cc113
-rw-r--r--base/win/registry.h26
-rw-r--r--base/win/registry_unittest.cc65
-rw-r--r--content/browser/plugin_service_impl.cc47
-rw-r--r--content/browser/plugin_service_impl.h8
-rw-r--r--net/dns/dns_config_service_win.cc34
-rw-r--r--net/proxy/proxy_config_service_win.cc60
-rw-r--r--net/proxy/proxy_config_service_win.h22
8 files changed, 171 insertions, 204 deletions
diff --git a/base/win/registry.cc b/base/win/registry.cc
index 8e7083f..e8fb892 100644
--- a/base/win/registry.cc
+++ b/base/win/registry.cc
@@ -34,74 +34,23 @@ const REGSAM kWow64AccessMask = KEY_WOW64_32KEY | KEY_WOW64_64KEY;
} // namespace
-// Watches for modifications to a key.
-class RegKey::Watcher : public ObjectWatcher::Delegate {
- public:
- explicit Watcher(RegKey* owner) : owner_(owner) {}
- ~Watcher() {}
-
- bool StartWatching(HKEY key, const ChangeCallback& callback);
-
- // Implementation of ObjectWatcher::Delegate.
- void OnObjectSignaled(HANDLE object) override {
- DCHECK(watch_event_.IsValid() && watch_event_.Get() == object);
- ChangeCallback callback = callback_;
- callback_.Reset();
- callback.Run();
- }
-
- private:
- RegKey* owner_;
- ScopedHandle watch_event_;
- ObjectWatcher object_watcher_;
- ChangeCallback callback_;
- DISALLOW_COPY_AND_ASSIGN(Watcher);
-};
-
-bool RegKey::Watcher::StartWatching(HKEY key, const ChangeCallback& callback) {
- DCHECK(key);
- DCHECK(callback_.is_null());
- if (GetVersion() < VERSION_VISTA) {
- // It is an error to register multiple times before Vista.
- if (watch_event_.IsValid()) {
- callback_ = callback;
- return true;
- }
- }
-
- if (!watch_event_.IsValid())
- watch_event_.Set(CreateEvent(NULL, TRUE, FALSE, NULL));
-
- if (!watch_event_.IsValid())
- return false;
-
- DWORD filter = REG_NOTIFY_CHANGE_NAME |
- REG_NOTIFY_CHANGE_ATTRIBUTES |
- REG_NOTIFY_CHANGE_LAST_SET |
- REG_NOTIFY_CHANGE_SECURITY;
-
- // Watch the registry key for a change of value.
- LONG result = RegNotifyChangeKeyValue(key, TRUE, filter, watch_event_.Get(),
- TRUE);
- if (result != ERROR_SUCCESS) {
- watch_event_.Close();
- return false;
- }
-
- callback_ = callback;
- return object_watcher_.StartWatching(watch_event_.Get(), this);
-}
-
// RegKey ----------------------------------------------------------------------
-RegKey::RegKey() : key_(NULL), wow64access_(0) {
+RegKey::RegKey()
+ : key_(NULL),
+ watch_event_(0),
+ wow64access_(0) {
}
-RegKey::RegKey(HKEY key) : key_(key), wow64access_(0) {
+RegKey::RegKey(HKEY key)
+ : key_(key),
+ watch_event_(0),
+ wow64access_(0) {
}
RegKey::RegKey(HKEY rootkey, const wchar_t* subkey, REGSAM access)
: key_(NULL),
+ watch_event_(0),
wow64access_(0) {
if (rootkey) {
if (access & (KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_CREATE_LINK))
@@ -201,6 +150,7 @@ LONG RegKey::OpenKey(const wchar_t* relative_key_name, REGSAM access) {
}
void RegKey::Close() {
+ StopWatching();
if (key_) {
::RegCloseKey(key_);
key_ = NULL;
@@ -218,6 +168,7 @@ void RegKey::Set(HKEY key) {
HKEY RegKey::Take() {
DCHECK(wow64access_ == 0);
+ StopWatching();
HKEY key = key_;
key_ = NULL;
return key;
@@ -416,14 +367,44 @@ LONG RegKey::WriteValue(const wchar_t* name,
return result;
}
-bool RegKey::StartWatching(const ChangeCallback& callback) {
- if (!key_watcher_)
- key_watcher_.reset(new Watcher(this));
+LONG RegKey::StartWatching() {
+ DCHECK(key_);
+ if (!watch_event_)
+ watch_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
- if (!key_watcher_.get()->StartWatching(key_, callback))
- return false;
+ DWORD filter = REG_NOTIFY_CHANGE_NAME |
+ REG_NOTIFY_CHANGE_ATTRIBUTES |
+ REG_NOTIFY_CHANGE_LAST_SET |
+ REG_NOTIFY_CHANGE_SECURITY;
- return true;
+ // Watch the registry key for a change of value.
+ LONG result = RegNotifyChangeKeyValue(key_, TRUE, filter, watch_event_, TRUE);
+ if (result != ERROR_SUCCESS) {
+ CloseHandle(watch_event_);
+ watch_event_ = 0;
+ }
+
+ return result;
+}
+
+bool RegKey::HasChanged() {
+ if (watch_event_) {
+ if (WaitForSingleObject(watch_event_, 0) == WAIT_OBJECT_0) {
+ StartWatching();
+ return true;
+ }
+ }
+ return false;
+}
+
+LONG RegKey::StopWatching() {
+ LONG result = ERROR_INVALID_HANDLE;
+ if (watch_event_) {
+ CloseHandle(watch_event_);
+ watch_event_ = 0;
+ result = ERROR_SUCCESS;
+ }
+ return result;
}
// static
diff --git a/base/win/registry.h b/base/win/registry.h
index c3e015b..e5524b8 100644
--- a/base/win/registry.h
+++ b/base/win/registry.h
@@ -12,8 +12,6 @@
#include "base/base_export.h"
#include "base/basictypes.h"
#include "base/stl_util.h"
-#include "base/win/object_watcher.h"
-#include "base/win/scoped_handle.h"
namespace base {
namespace win {
@@ -27,9 +25,6 @@ namespace win {
// are not touched in case of failure.
class BASE_EXPORT RegKey {
public:
- // Called from the MessageLoop when the key changes.
- typedef base::Callback<void()> ChangeCallback;
-
RegKey();
explicit RegKey(HKEY key);
RegKey(HKEY rootkey, const wchar_t* subkey, REGSAM access);
@@ -125,16 +120,22 @@ class BASE_EXPORT RegKey {
// Starts watching the key to see if any of its values have changed.
// The key must have been opened with the KEY_NOTIFY access privilege.
- // Returns true on success.
- // To stop watching, delete this RegKey object. To continue watching the
- // object after the callback is invoked, call StartWatching again.
- bool StartWatching(const ChangeCallback& callback);
+ LONG StartWatching();
+
+ // If StartWatching hasn't been called, always returns false.
+ // Otherwise, returns true if anything under the key has changed.
+ // This can't be const because the |watch_event_| may be refreshed.
+ bool HasChanged();
+
+ // Will automatically be called by destructor if not manually called
+ // beforehand. Returns true if it was watching, false otherwise.
+ LONG StopWatching();
+ inline bool IsWatching() const { return watch_event_ != 0; }
+ HANDLE watch_event() const { return watch_event_; }
HKEY Handle() const { return key_; }
private:
- class Watcher;
-
// Calls RegDeleteKeyEx on supported platforms, alternatively falls back to
// RegDeleteKey.
static LONG RegDeleteKeyExWrapper(HKEY hKey,
@@ -146,10 +147,9 @@ class BASE_EXPORT RegKey {
static LONG RegDelRecurse(HKEY root_key,
const std::wstring& name,
REGSAM access);
-
HKEY key_; // The registry key being iterated.
+ HANDLE watch_event_;
REGSAM wow64access_;
- scoped_ptr<Watcher> key_watcher_;
DISALLOW_COPY_AND_ASSIGN(RegKey);
};
diff --git a/base/win/registry_unittest.cc b/base/win/registry_unittest.cc
index 6548474..d2610ef 100644
--- a/base/win/registry_unittest.cc
+++ b/base/win/registry_unittest.cc
@@ -7,10 +7,7 @@
#include <cstring>
#include <vector>
-#include "base/bind.h"
#include "base/compiler_specific.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/win/windows_version.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -352,68 +349,6 @@ TEST_F(RegistryTest, OpenSubKey) {
ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(L"foo"));
}
-class TestChangeDelegate {
- public:
- TestChangeDelegate() : called_(false) {}
- ~TestChangeDelegate() {}
-
- void OnKeyChanged() {
- MessageLoop::current()->QuitWhenIdle();
- called_ = true;
- }
-
- bool WasCalled() {
- bool was_called = called_;
- called_ = false;
- return was_called;
- }
-
- private:
- bool called_;
-};
-
-TEST_F(RegistryTest, ChangeCallback) {
- RegKey key;
- TestChangeDelegate delegate;
- MessageLoop message_loop;
-
- std::wstring foo_key(kRootKey);
- foo_key += L"\\Foo";
- ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
- KEY_READ));
-
- ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
- Unretained(&delegate))));
- EXPECT_FALSE(delegate.WasCalled());
-
- // Make some change.
- RegKey key2;
- ASSERT_EQ(ERROR_SUCCESS, key2.Open(HKEY_CURRENT_USER, foo_key.c_str(),
- KEY_READ | KEY_SET_VALUE));
- ASSERT_TRUE(key2.Valid());
- EXPECT_EQ(ERROR_SUCCESS, key2.WriteValue(L"name", L"data"));
-
- // Allow delivery of the notification.
- EXPECT_FALSE(delegate.WasCalled());
- base::RunLoop().Run();
-
- ASSERT_TRUE(delegate.WasCalled());
- EXPECT_FALSE(delegate.WasCalled());
-
- ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
- Unretained(&delegate))));
-
- // Change something else.
- EXPECT_EQ(ERROR_SUCCESS, key2.WriteValue(L"name2", L"data2"));
- base::RunLoop().Run();
- ASSERT_TRUE(delegate.WasCalled());
-
- ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
- Unretained(&delegate))));
- base::RunLoop().RunUntilIdle();
- EXPECT_FALSE(delegate.WasCalled());
-}
-
} // namespace
} // namespace win
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc
index d19f686..1b7ad76 100644
--- a/content/browser/plugin_service_impl.cc
+++ b/content/browser/plugin_service_impl.cc
@@ -157,6 +157,15 @@ PluginServiceImpl::PluginServiceImpl()
}
PluginServiceImpl::~PluginServiceImpl() {
+#if defined(OS_WIN)
+ // Release the events since they're owned by RegKey, not WaitableEvent.
+ hkcu_watcher_.StopWatching();
+ hklm_watcher_.StopWatching();
+ if (hkcu_event_)
+ hkcu_event_->Release();
+ if (hklm_event_)
+ hklm_event_->Release();
+#endif
// Make sure no plugin channel requests have been leaked.
DCHECK(pending_plugin_clients_.empty());
}
@@ -191,18 +200,24 @@ void PluginServiceImpl::StartWatchingPlugins() {
if (hkcu_key_.Create(HKEY_CURRENT_USER,
kRegistryMozillaPlugins,
KEY_NOTIFY) == ERROR_SUCCESS) {
- base::win::RegKey::ChangeCallback callback =
- base::Bind(&PluginServiceImpl::OnKeyChanged, base::Unretained(this),
- base::Unretained(&hkcu_key_));
- hkcu_key_.StartWatching(callback);
+ if (hkcu_key_.StartWatching() == ERROR_SUCCESS) {
+ hkcu_event_.reset(new base::WaitableEvent(hkcu_key_.watch_event()));
+ base::WaitableEventWatcher::EventCallback callback =
+ base::Bind(&PluginServiceImpl::OnWaitableEventSignaled,
+ base::Unretained(this));
+ hkcu_watcher_.StartWatching(hkcu_event_.get(), callback);
+ }
}
if (hklm_key_.Create(HKEY_LOCAL_MACHINE,
kRegistryMozillaPlugins,
KEY_NOTIFY) == ERROR_SUCCESS) {
- base::win::RegKey::ChangeCallback callback =
- base::Bind(&PluginServiceImpl::OnKeyChanged, base::Unretained(this),
- base::Unretained(&hkcu_key_));
- hklm_key_.StartWatching(callback);
+ if (hklm_key_.StartWatching() == ERROR_SUCCESS) {
+ hklm_event_.reset(new base::WaitableEvent(hklm_key_.watch_event()));
+ base::WaitableEventWatcher::EventCallback callback =
+ base::Bind(&PluginServiceImpl::OnWaitableEventSignaled,
+ base::Unretained(this));
+ hklm_watcher_.StartWatching(hklm_event_.get(), callback);
+ }
}
#endif
#if defined(OS_POSIX) && !defined(OS_OPENBSD) && !defined(OS_ANDROID)
@@ -627,16 +642,22 @@ void PluginServiceImpl::GetPluginsOnIOThread(
}
#endif
+void PluginServiceImpl::OnWaitableEventSignaled(
+ base::WaitableEvent* waitable_event) {
#if defined(OS_WIN)
-void PluginServiceImpl::OnKeyChanged(base::win::RegKey* key) {
- key->StartWatching(base::Bind(&PluginServiceImpl::OnKeyChanged,
- base::Unretained(this),
- base::Unretained(&hkcu_key_)));
+ if (waitable_event == hkcu_event_) {
+ hkcu_key_.StartWatching();
+ } else {
+ hklm_key_.StartWatching();
+ }
PluginList::Singleton()->RefreshPlugins();
PurgePluginListCache(NULL, false);
-}
+#else
+ // This event should only get signaled on a Windows machine.
+ NOTREACHED();
#endif // defined(OS_WIN)
+}
void PluginServiceImpl::RegisterPepperPlugins() {
ComputePepperPluginList(&ppapi_plugins_);
diff --git a/content/browser/plugin_service_impl.h b/content/browser/plugin_service_impl.h
index 0b5cc5f..a0353e5 100644
--- a/content/browser/plugin_service_impl.h
+++ b/content/browser/plugin_service_impl.h
@@ -166,9 +166,7 @@ class CONTENT_EXPORT PluginServiceImpl
PluginServiceImpl();
virtual ~PluginServiceImpl();
-#if defined(OS_WIN)
- void OnKeyChanged(base::win::RegKey* key);
-#endif
+ void OnWaitableEventSignaled(base::WaitableEvent* waitable_event);
// Returns the plugin process host corresponding to the plugin process that
// has been started by this service. Returns NULL if no process has been
@@ -226,6 +224,10 @@ class CONTENT_EXPORT PluginServiceImpl
// Registry keys for getting notifications when new plugins are installed.
base::win::RegKey hkcu_key_;
base::win::RegKey hklm_key_;
+ scoped_ptr<base::WaitableEvent> hkcu_event_;
+ scoped_ptr<base::WaitableEvent> hklm_event_;
+ base::WaitableEventWatcher hkcu_watcher_;
+ base::WaitableEventWatcher hklm_watcher_;
#endif
#if defined(OS_POSIX) && !defined(OS_OPENBSD) && !defined(OS_ANDROID)
diff --git a/net/dns/dns_config_service_win.cc b/net/dns/dns_config_service_win.cc
index ddb8a4c..dd3ee3d 100644
--- a/net/dns/dns_config_service_win.cc
+++ b/net/dns/dns_config_service_win.cc
@@ -23,8 +23,8 @@
#include "base/threading/non_thread_safe.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/time.h"
+#include "base/win/object_watcher.h"
#include "base/win/registry.h"
-#include "base/win/scoped_handle.h"
#include "base/win/windows_version.h"
#include "net/base/net_util.h"
#include "net/base/network_change_notifier.h"
@@ -292,7 +292,8 @@ HostsParseWinResult AddLocalhostEntries(DnsHosts* hosts) {
}
// Watches a single registry key for changes.
-class RegistryWatcher : public base::NonThreadSafe {
+class RegistryWatcher : public base::win::ObjectWatcher::Delegate,
+ public base::NonThreadSafe {
public:
typedef base::Callback<void(bool succeeded)> CallbackType;
RegistryWatcher() {}
@@ -304,31 +305,35 @@ class RegistryWatcher : public base::NonThreadSafe {
callback_ = callback;
if (key_.Open(HKEY_LOCAL_MACHINE, key, KEY_NOTIFY) != ERROR_SUCCESS)
return false;
-
- return key_.StartWatching(base::Bind(&RegistryWatcher::OnObjectSignaled,
- base::Unretained(this)));
+ if (key_.StartWatching() != ERROR_SUCCESS)
+ return false;
+ if (!watcher_.StartWatching(key_.watch_event(), this))
+ return false;
+ return true;
}
- void OnObjectSignaled() {
+ virtual void OnObjectSignaled(HANDLE object) override {
// TODO(vadimt): Remove ScopedProfile below once crbug.com/418183 is fixed.
tracked_objects::ScopedProfile tracking_profile(
FROM_HERE_WITH_EXPLICIT_FUNCTION(
"RegistryWatcher_OnObjectSignaled"));
DCHECK(CalledOnValidThread());
- DCHECK(!callback_.is_null());
- if (key_.StartWatching(base::Bind(&RegistryWatcher::OnObjectSignaled,
- base::Unretained(this)))) {
- callback_.Run(true);
- } else {
+ bool succeeded = (key_.StartWatching() == ERROR_SUCCESS) &&
+ watcher_.StartWatching(key_.watch_event(), this);
+ if (!succeeded && key_.Valid()) {
+ watcher_.StopWatching();
+ key_.StopWatching();
key_.Close();
- callback_.Run(false);
}
+ if (!callback_.is_null())
+ callback_.Run(succeeded);
}
private:
CallbackType callback_;
base::win::RegKey key_;
+ base::win::ObjectWatcher watcher_;
DISALLOW_COPY_AND_ASSIGN(RegistryWatcher);
};
@@ -735,8 +740,9 @@ bool DnsConfigServiceWin::StartWatching() {
void DnsConfigServiceWin::OnConfigChanged(bool succeeded) {
InvalidateConfig();
- config_reader_->WorkNow();
- if (!succeeded) {
+ if (succeeded) {
+ config_reader_->WorkNow();
+ } else {
LOG(ERROR) << "DNS config watch failed.";
set_watch_failed(true);
UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus",
diff --git a/net/proxy/proxy_config_service_win.cc b/net/proxy/proxy_config_service_win.cc
index dba1d9b..32553db 100644
--- a/net/proxy/proxy_config_service_win.cc
+++ b/net/proxy/proxy_config_service_win.cc
@@ -7,8 +7,6 @@
#include <windows.h>
#include <winhttp.h>
-#include "base/bind.h"
-#include "base/bind_helpers.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/profiler/scoped_profile.h"
@@ -18,7 +16,6 @@
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_restrictions.h"
#include "base/win/registry.h"
-#include "base/win/scoped_handle.h"
#include "net/base/net_errors.h"
#include "net/proxy/proxy_config.h"
@@ -41,6 +38,36 @@ void FreeIEConfig(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG* ie_config) {
} // namespace
+// RegKey and ObjectWatcher pair.
+class ProxyConfigServiceWin::KeyEntry {
+ public:
+ bool StartWatching(base::win::ObjectWatcher::Delegate* delegate) {
+ // Try to create a watch event for the registry key (which watches the
+ // sibling tree as well).
+ if (key_.StartWatching() != ERROR_SUCCESS)
+ return false;
+
+ // Now setup an ObjectWatcher for this event, so we get OnObjectSignaled()
+ // invoked on this message loop once it is signalled.
+ if (!watcher_.StartWatching(key_.watch_event(), delegate))
+ return false;
+
+ return true;
+ }
+
+ bool CreateRegKey(HKEY rootkey, const wchar_t* subkey) {
+ return key_.Create(rootkey, subkey, KEY_NOTIFY) == ERROR_SUCCESS;
+ }
+
+ HANDLE watch_event() const {
+ return key_.watch_event();
+ }
+
+ private:
+ base::win::RegKey key_;
+ base::win::ObjectWatcher watcher_;
+};
+
ProxyConfigServiceWin::ProxyConfigServiceWin()
: PollingProxyConfigService(
base::TimeDelta::FromSeconds(kPollIntervalSec),
@@ -98,38 +125,35 @@ void ProxyConfigServiceWin::StartWatchingRegistryForChanges() {
bool ProxyConfigServiceWin::AddKeyToWatchList(HKEY rootkey,
const wchar_t* subkey) {
- scoped_ptr<base::win::RegKey> key(new base::win::RegKey);
- if (key->Create(rootkey, subkey, KEY_NOTIFY) != ERROR_SUCCESS)
+ scoped_ptr<KeyEntry> entry(new KeyEntry);
+ if (!entry->CreateRegKey(rootkey, subkey))
return false;
- if (!key->StartWatching(base::Bind(&ProxyConfigServiceWin::OnObjectSignaled,
- base::Unretained(this),
- base::Unretained(key.get())))) {
+ if (!entry->StartWatching(this))
return false;
- }
- keys_to_watch_.push_back(key.release());
+ keys_to_watch_.push_back(entry.release());
return true;
}
-void ProxyConfigServiceWin::OnObjectSignaled(base::win::RegKey* key) {
+void ProxyConfigServiceWin::OnObjectSignaled(HANDLE object) {
// TODO(vadimt): Remove ScopedProfile below once crbug.com/418183 is fixed.
tracked_objects::ScopedProfile tracking_profile(
FROM_HERE_WITH_EXPLICIT_FUNCTION(
"ProxyConfigServiceWin_OnObjectSignaled"));
// Figure out which registry key signalled this change.
- RegKeyList::iterator it =
- std::find(keys_to_watch_.begin(), keys_to_watch_.end(), key);
+ KeyEntryList::iterator it;
+ for (it = keys_to_watch_.begin(); it != keys_to_watch_.end(); ++it) {
+ if ((*it)->watch_event() == object)
+ break;
+ }
+
DCHECK(it != keys_to_watch_.end());
// Keep watching the registry key.
- if (!key->StartWatching(base::Bind(&ProxyConfigServiceWin::OnObjectSignaled,
- base::Unretained(this),
- base::Unretained(key)))) {
- delete *it;
+ if (!(*it)->StartWatching(this))
keys_to_watch_.erase(it);
- }
// Have the PollingProxyConfigService test for changes.
CheckForChangesNow();
diff --git a/net/proxy/proxy_config_service_win.h b/net/proxy/proxy_config_service_win.h
index 52c3895..62f1f12 100644
--- a/net/proxy/proxy_config_service_win.h
+++ b/net/proxy/proxy_config_service_win.h
@@ -12,14 +12,9 @@
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
+#include "base/win/object_watcher.h"
#include "net/proxy/polling_proxy_config_service.h"
-namespace base {
-namespace win {
-class RegKey;
-}
-} // namespace base.
-
namespace net {
// Implementation of ProxyConfigService that retrieves the system proxy
@@ -45,7 +40,8 @@ namespace net {
// change, or in case we got it wrong (and are not checking all possible
// registry dependencies).
class NET_EXPORT_PRIVATE ProxyConfigServiceWin
- : public PollingProxyConfigService {
+ : public PollingProxyConfigService,
+ public base::win::ObjectWatcher::Delegate {
public:
ProxyConfigServiceWin();
virtual ~ProxyConfigServiceWin();
@@ -55,17 +51,19 @@ class NET_EXPORT_PRIVATE ProxyConfigServiceWin
private:
FRIEND_TEST_ALL_PREFIXES(ProxyConfigServiceWinTest, SetFromIEConfig);
- typedef std::vector<base::win::RegKey*> RegKeyList;
+ class KeyEntry;
+ typedef std::vector<KeyEntry*> KeyEntryList;
// Registers change observers on the registry keys relating to proxy settings.
void StartWatchingRegistryForChanges();
- // Creates a new key and appends it to |keys_to_watch_|. If the key fails to
- // be created, it is not appended to the list and we return false.
+ // Creates a new KeyEntry and appends it to |keys_to_watch_|. If the key
+ // fails to be created, it is not appended to the list and we return false.
bool AddKeyToWatchList(HKEY rootkey, const wchar_t* subkey);
+ // ObjectWatcher::Delegate methods:
// This is called whenever one of the registry keys we are watching change.
- void OnObjectSignaled(base::win::RegKey* key);
+ virtual void OnObjectSignaled(HANDLE object) override;
static void GetCurrentProxyConfig(ProxyConfig* config);
@@ -74,7 +72,7 @@ class NET_EXPORT_PRIVATE ProxyConfigServiceWin
ProxyConfig* config,
const WINHTTP_CURRENT_USER_IE_PROXY_CONFIG& ie_config);
- RegKeyList keys_to_watch_;
+ KeyEntryList keys_to_watch_;
};
} // namespace net