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

Unified Diff: chrome/browser/chromeos/settings/device_settings_service.cc

Issue 23532034: Postpone loading about:flags ui until the certificates have been loaded (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/settings/device_settings_service.cc
diff --git a/chrome/browser/chromeos/settings/device_settings_service.cc b/chrome/browser/chromeos/settings/device_settings_service.cc
index bbb4339b94b6169c5919792e7999809116e309a6..17887a3740de66b5fe39751d792d70f97972fe03 100644
--- a/chrome/browser/chromeos/settings/device_settings_service.cc
+++ b/chrome/browser/chromeos/settings/device_settings_service.cc
@@ -74,9 +74,13 @@ DeviceSettingsService::DeviceSettingsService()
: session_manager_client_(NULL),
weak_factory_(this),
store_status_(STORE_SUCCESS),
+ certificates_loaded_(false),
+ owner_key_loaded_with_certificates_(false),
load_retries_left_(kMaxLoadRetries) {
- if (CertLoader::IsInitialized())
+ if (CertLoader::IsInitialized()) {
+ certificates_loaded_ = CertLoader::Get()->certificates_loaded();
CertLoader::Get()->AddObserver(this);
+ }
}
DeviceSettingsService::~DeviceSettingsService() {
@@ -156,9 +160,9 @@ void DeviceSettingsService::GetOwnershipStatusAsync(
// If there is a key, report status immediately.
base::MessageLoop::current()->PostTask(
FROM_HERE,
- base::Bind(callback,
- owner_key_->public_key() ? OWNERSHIP_TAKEN : OWNERSHIP_NONE,
- owner_key_->private_key() != NULL));
+ base::Bind(
+ callback,
+ owner_key_->public_key() ? OWNERSHIP_TAKEN : OWNERSHIP_NONE));
} else {
// If the key hasn't been loaded yet, enqueue the callback to be fired when
// the next SessionManagerOperation completes. If no operation is pending,
@@ -173,6 +177,25 @@ bool DeviceSettingsService::HasPrivateOwnerKey() {
return owner_key_.get() && owner_key_->private_key();
}
+void DeviceSettingsService::IsCurrentUserOwnerAsync(
+ const IsCurrentUserOwnerCallback& callback) {
+ if (owner_key_loaded_with_certificates_) {
+ // If the current owner key was loaded while the certificates were loaded,
+ // or the certificate loader is not initialized, in which case the private
+ // key cannot be set, report status immediately.
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(callback, HasPrivateOwnerKey()));
+ } else {
+ // If the key hasn't been loaded with the known certificates, enqueue the
+ // callback to be fired when the next SessionManagerOperation completes in
+ // an environment where the certificates are loaded. There is no need to
+ // start a new operation, as the reload operation will be started when the
+ // certificates are loaded.
+ pending_is_current_user_owner_callbacks_.push_back(callback);
+ }
+}
+
void DeviceSettingsService::SetUsername(const std::string& username) {
username_ = username;
@@ -215,6 +238,7 @@ void DeviceSettingsService::PropertyChangeComplete(bool success) {
void DeviceSettingsService::OnCertificatesLoaded(
const net::CertificateList& cert_list,
bool initial_load) {
+ certificates_loaded_ = true;
// CertLoader initializes the TPM and NSS database which is necessary to
// determine ownership. Force a reload once we know these are initialized.
EnsureReload(true);
@@ -311,7 +335,18 @@ void DeviceSettingsService::HandleCompletedOperation(
callbacks.swap(pending_ownership_status_callbacks_);
for (std::vector<OwnershipStatusCallback>::iterator iter(callbacks.begin());
iter != callbacks.end(); ++iter) {
- iter->Run(ownership_status, is_owner);
+ iter->Run(ownership_status);
+ }
+
+ if (certificates_loaded_) {
+ owner_key_loaded_with_certificates_ = true;
+ std::vector<IsCurrentUserOwnerCallback> is_owner_callbacks;
+ is_owner_callbacks.swap(pending_is_current_user_owner_callbacks_);
+ for (std::vector<IsCurrentUserOwnerCallback>::iterator iter(
+ is_owner_callbacks.begin());
+ iter != is_owner_callbacks.end(); ++iter) {
+ iter->Run(is_owner);
+ }
}
// The completion callback happens after the notification so clients can

Powered by Google App Engine
This is Rietveld 408576698