summaryrefslogtreecommitdiffstats
path: root/chrome/browser/policy/asynchronous_policy_loader.cc
diff options
context:
space:
mode:
authordanno@chromium.org <danno@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-23 09:34:35 +0000
committerdanno@chromium.org <danno@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-23 09:34:35 +0000
commit88616f47602e8a2a16c65ca0a59444e0ce550772 (patch)
tree285cad010b0aee7f2001fe419191cd1ee41a00ee /chrome/browser/policy/asynchronous_policy_loader.cc
parent5e0750503a3c9743e1245f1b4c540124a9722ea0 (diff)
downloadchromium_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.cc84
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