diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc index bfcdab00c84c8..b664c08893bab 100644 --- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc +++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc @@ -5,11 +5,13 @@ #include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h" #include "base/bind.h" +#include "base/location.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" #include "base/strings/utf_string_conversions.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/policy/cloud/user_policy_signin_service.h" #include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h" @@ -71,7 +73,10 @@ DiceTurnSyncOnHelper::DiceTurnSyncOnHelper( DCHECK(!signin_util::IsForceSigninEnabled()); if (HasCanOfferSigninError()) { - AbortAndDelete(); + // Do not self-destruct synchronously in the constructor. + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&DiceTurnSyncOnHelper::AbortAndDelete, + base::Unretained(this))); return; } diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc index 5e964de9b4753..d3925d28f8602 100644 --- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc +++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc @@ -428,6 +428,7 @@ TEST_F(DiceTurnSyncOnHelperTest, CanOfferSigninErrorKeepAccount) { // Signin flow. CreateDiceTurnOnSyncHelper( DiceTurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT); + base::RunLoop().RunUntilIdle(); // Check expectations. EXPECT_FALSE(signin_manager()->IsAuthenticated()); EXPECT_TRUE(token_service()->RefreshTokenIsAvailable(account_id())); @@ -443,6 +444,7 @@ TEST_F(DiceTurnSyncOnHelperTest, CanOfferSigninErrorRemoveAccount) { // Signin flow. CreateDiceTurnOnSyncHelper( DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT); + base::RunLoop().RunUntilIdle(); // Check expectations. EXPECT_FALSE(signin_manager()->IsAuthenticated()); EXPECT_FALSE(token_service()->RefreshTokenIsAvailable(account_id()));