[policy] Migrate MachineLevelUserCloudPolicyFetcher to use scoped observation
This is a tentative fix for the crash when the CloudPolicyService is
being observed upon destruction.
Scoped observation will ensure that the observer is removed when needed.
Bug: b:40915114
Change-Id: I73e6cb37f75bc2070de4adf12a4aaf2d3deceed5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6180123
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Reviewed-by: Yann Dago <ydago@chromium.org>
Auto-Submit: Artem Sumaneev <asumaneev@google.com>
Commit-Queue: Artem Sumaneev <asumaneev@google.com>
Reviewed-by: Igor <igorcov@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1408922}
diff --git a/components/enterprise/browser/controller/chrome_browser_cloud_management_helper.cc b/components/enterprise/browser/controller/chrome_browser_cloud_management_helper.cc
index db474a6..736eecbe 100644
--- a/components/enterprise/browser/controller/chrome_browser_cloud_management_helper.cc
+++ b/components/enterprise/browser/controller/chrome_browser_cloud_management_helper.cc
@@ -115,12 +115,8 @@
InitializeManager(std::move(client));
}
-MachineLevelUserCloudPolicyFetcher::~MachineLevelUserCloudPolicyFetcher() {
- // The pointers need to be checked since they might be invalidated from a
- // |Disconnect| call.
- if (policy_manager_->core() && policy_manager_->core()->service())
- policy_manager_->core()->service()->RemoveObserver(this);
-}
+MachineLevelUserCloudPolicyFetcher::~MachineLevelUserCloudPolicyFetcher() =
+ default;
void MachineLevelUserCloudPolicyFetcher::SetupRegistrationAndFetchPolicy(
const DMToken& dm_token,
@@ -148,9 +144,8 @@
}
void MachineLevelUserCloudPolicyFetcher::Disconnect() {
+ cloud_policy_service_observation_.Reset();
if (policy_manager_) {
- if (policy_manager_->core() && policy_manager_->core()->service())
- policy_manager_->core()->service()->RemoveObserver(this);
policy_manager_->DisconnectAndRemovePolicy();
}
}
@@ -175,7 +170,7 @@
void MachineLevelUserCloudPolicyFetcher::InitializeManager(
std::unique_ptr<CloudPolicyClient> client) {
policy_manager_->Connect(local_state_, std::move(client));
- policy_manager_->core()->service()->AddObserver(this);
+ cloud_policy_service_observation_.Observe(policy_manager_->core()->service());
// If CloudPolicyStore is already initialized then
// |OnCloudPolicyServiceInitializationCompleted| has already fired. Fetch
diff --git a/components/enterprise/browser/controller/chrome_browser_cloud_management_helper.h b/components/enterprise/browser/controller/chrome_browser_cloud_management_helper.h
index 0021e45..6b7296229 100644
--- a/components/enterprise/browser/controller/chrome_browser_cloud_management_helper.h
+++ b/components/enterprise/browser/controller/chrome_browser_cloud_management_helper.h
@@ -11,6 +11,7 @@
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
+#include "base/scoped_observation.h"
#include "components/enterprise/browser/controller/browser_dm_token_storage.h"
#include "components/policy/core/common/cloud/cloud_policy_client.h"
#include "components/policy/core/common/cloud/cloud_policy_service.h"
@@ -110,6 +111,9 @@
raw_ptr<PrefService> local_state_;
raw_ptr<DeviceManagementService> device_management_service_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
+
+ base::ScopedObservation<CloudPolicyService, CloudPolicyService::Observer>
+ cloud_policy_service_observation_{this};
};
} // namespace policy