[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