Break circular dependency between InitializeDeviceDisablingManager and DeviceDisabledScreen

crrev.com/2714493002 uncovered a circular dependency between BrowserProcessPlatformPart::InitializeDeviceDisablingManager and DeviceDisabledScreen::DeviceDisabledScreen. Previously there was a part in the call stack that forked off into an asynchronous call, DeviceDisablingManager::UpdateFromCrosSettings, which would queue up a callback in case the CrosSettings wasn't ready yet (and it wasn't). The referenced CL fixed a bug by immediately loading the settings, but it unfortunately broke the assumption here.

The suggested fix breaks the dependency by moving Init() outside of the constructor (so the object exists at the time further code called from Init() tries to access it).

This bug was causing a crash for disabled devices (ui wouldn't start).

The circle starts on the "device_disabling_manager_.reset" line.

TEST=manual
BUG=709518

Review-Url: https://codereview.chromium.org/2815893002
Cr-Commit-Position: refs/heads/master@{#464708}
diff --git a/chrome/browser/browser_process_platform_part_chromeos.cc b/chrome/browser/browser_process_platform_part_chromeos.cc
index 568ab75..4b63b33 100644
--- a/chrome/browser/browser_process_platform_part_chromeos.cc
+++ b/chrome/browser/browser_process_platform_part_chromeos.cc
@@ -66,6 +66,7 @@
       device_disabling_manager_delegate_.get(),
       chromeos::CrosSettings::Get(),
       user_manager::UserManager::Get()));
+  device_disabling_manager_->Init();
 }
 
 void BrowserProcessPlatformPart::ShutdownDeviceDisablingManager() {
diff --git a/chrome/browser/chromeos/login/screens/device_disabled_screen.cc b/chrome/browser/chromeos/login/screens/device_disabled_screen.cc
index 66d644c..d8d8c25 100644
--- a/chrome/browser/chromeos/login/screens/device_disabled_screen.cc
+++ b/chrome/browser/chromeos/login/screens/device_disabled_screen.cc
@@ -21,9 +21,7 @@
       device_disabling_manager_(
           g_browser_process->platform_part()->device_disabling_manager()),
       showing_(false) {
-  DCHECK(view_);
-  if (view_)
-    view_->SetDelegate(this);
+  view_->SetDelegate(this);
   device_disabling_manager_->AddObserver(this);
 }
 
diff --git a/chrome/browser/chromeos/system/device_disabling_manager.cc b/chrome/browser/chromeos/system/device_disabling_manager.cc
index dce9e67..e3b335c 100644
--- a/chrome/browser/chromeos/system/device_disabling_manager.cc
+++ b/chrome/browser/chromeos/system/device_disabling_manager.cc
@@ -43,7 +43,6 @@
       device_disabled_(false),
       weak_factory_(this) {
   CHECK(delegate_);
-  Init();
 }
 
 DeviceDisablingManager::~DeviceDisablingManager() {
diff --git a/chrome/browser/chromeos/system/device_disabling_manager.h b/chrome/browser/chromeos/system/device_disabling_manager.h
index c8e7eba..3a7f2f6 100644
--- a/chrome/browser/chromeos/system/device_disabling_manager.h
+++ b/chrome/browser/chromeos/system/device_disabling_manager.h
@@ -85,6 +85,9 @@
                          user_manager::UserManager* user_manager);
   ~DeviceDisablingManager();
 
+  // Must be called after construction.
+  void Init();
+
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
@@ -107,8 +110,6 @@
   static bool HonorDeviceDisablingDuringNormalOperation();
 
  private:
-  void Init();
-
   // Cache the disabled message and inform observers if it changed.
   void CacheDisabledMessageAndNotify(const std::string& disabled_message);
 
diff --git a/chrome/browser/chromeos/system/device_disabling_manager_unittest.cc b/chrome/browser/chromeos/system/device_disabling_manager_unittest.cc
index 78ecf89..f224bb3 100644
--- a/chrome/browser/chromeos/system/device_disabling_manager_unittest.cc
+++ b/chrome/browser/chromeos/system/device_disabling_manager_unittest.cc
@@ -95,6 +95,7 @@
       this,
       CrosSettings::Get(),
       &fake_user_manager_));
+  device_disabling_manager_->Init();
 }
 
 void DeviceDisablingManagerTestBase::DestroyDeviceDisablingManager() {