diff options
author | danno@chromium.org <danno@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-23 09:34:35 +0000 |
---|---|---|
committer | danno@chromium.org <danno@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-23 09:34:35 +0000 |
commit | 88616f47602e8a2a16c65ca0a59444e0ce550772 (patch) | |
tree | 285cad010b0aee7f2001fe419191cd1ee41a00ee /chrome/browser/policy/asynchronous_policy_loader.cc | |
parent | 5e0750503a3c9743e1245f1b4c540124a9722ea0 (diff) | |
download | chromium_src-88616f47602e8a2a16c65ca0a59444e0ce550772.zip chromium_src-88616f47602e8a2a16c65ca0a59444e0ce550772.tar.gz chromium_src-88616f47602e8a2a16c65ca0a59444e0ce550772.tar.bz2 |
Refactor the windows policy provider to use AsynchronousPolicyProvider.
BUG=66453,65094
TEST=*Policy.*
Review URL: http://codereview.chromium.org/6091002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@70040 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/policy/asynchronous_policy_loader.cc')
-rw-r--r-- | chrome/browser/policy/asynchronous_policy_loader.cc | 84 |
1 files changed, 81 insertions, 3 deletions
diff --git a/chrome/browser/policy/asynchronous_policy_loader.cc b/chrome/browser/policy/asynchronous_policy_loader.cc index e78c9aa..cf67066 100644 --- a/chrome/browser/policy/asynchronous_policy_loader.cc +++ b/chrome/browser/policy/asynchronous_policy_loader.cc @@ -6,21 +6,43 @@ #include "base/message_loop.h" #include "base/task.h" +#include "chrome/browser/browser_thread.h" namespace policy { AsynchronousPolicyLoader::AsynchronousPolicyLoader( - AsynchronousPolicyProvider::Delegate* delegate) + AsynchronousPolicyProvider::Delegate* delegate, + int reload_interval_minutes) : delegate_(delegate), provider_(NULL), - origin_loop_(MessageLoop::current()) {} + reload_task_(NULL), + reload_interval_(base::TimeDelta::FromMinutes(reload_interval_minutes)), + origin_loop_(MessageLoop::current()), + stopped_(false) {} void AsynchronousPolicyLoader::Init() { policy_.reset(delegate_->Load()); + // Initialization can happen early when the file thread is not yet available, + // but the subclass of the loader must do some of their initialization on the + // file thread. Posting to the file thread directly before it is initialized + // will cause the task to be forgotten. Instead, post a task to the ui thread + // to delay the remainder of initialization until threading is fully + // initialized. + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + NewRunnableMethod( + this, + &AsynchronousPolicyLoader::InitAfterFileThreadAvailable)); } void AsynchronousPolicyLoader::Stop() { - delegate_.reset(); + if (!stopped_) { + stopped_ = true; + delegate_.reset(); + BrowserThread::PostTask( + BrowserThread::FILE, FROM_HERE, + NewRunnableMethod(this, &AsynchronousPolicyLoader::StopOnFileThread)); + } } void AsynchronousPolicyLoader::SetProvider( @@ -57,6 +79,54 @@ void AsynchronousPolicyLoader::Reload() { } } +void AsynchronousPolicyLoader::CancelReloadTask() { + if (reload_task_) { + // Only check the thread if there's still a reload task. During + // destruction of unit tests, the message loop destruction can + // call this method when the file thread is no longer around, + // but in that case reload_task_ is NULL. + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); + reload_task_->Cancel(); + reload_task_ = NULL; + } +} + +void AsynchronousPolicyLoader::ScheduleReloadTask( + const base::TimeDelta& delay) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); + + CancelReloadTask(); + + reload_task_ = + NewRunnableMethod(this, &AsynchronousPolicyLoader::ReloadFromTask); + BrowserThread::PostDelayedTask(BrowserThread::FILE, FROM_HERE, reload_task_, + delay.InMilliseconds()); +} + +void AsynchronousPolicyLoader::ScheduleFallbackReloadTask() { + // As a safeguard in case that the load delegate failed to timely notice a + // change in policy, schedule a reload task that'll make us recheck after a + // reasonable interval. + ScheduleReloadTask(reload_interval_); +} + +void AsynchronousPolicyLoader::ReloadFromTask() { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); + + // Drop the reference to the reload task, since the task might be the only + // referrer that keeps us alive, so we should not Cancel() it. + reload_task_ = NULL; + + Reload(); +} + +void AsynchronousPolicyLoader::InitOnFileThread() { +} + +void AsynchronousPolicyLoader::StopOnFileThread() { + CancelReloadTask(); +} + void AsynchronousPolicyLoader::PostUpdatePolicyTask( DictionaryValue* new_policy) { origin_loop_->PostTask(FROM_HERE, new UpdatePolicyTask(this, new_policy)); @@ -75,4 +145,12 @@ void AsynchronousPolicyLoader::UpdatePolicy(DictionaryValue* new_policy_raw) { } } +void AsynchronousPolicyLoader::InitAfterFileThreadAvailable() { + if (!stopped_) { + BrowserThread::PostTask( + BrowserThread::FILE, FROM_HERE, + NewRunnableMethod(this, &AsynchronousPolicyLoader::InitOnFileThread)); + } +} + } // namespace policy |