1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MANAGEMENT_FLOW_CONTROLLER_IMPL_H_
#define CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MANAGEMENT_FLOW_CONTROLLER_IMPL_H_
#include <memory>
#include "base/containers/queue.h"
#include "chrome/browser/ui/views/profiles/profile_management_flow_controller.h"
#include "chrome/browser/ui/views/profiles/profile_management_types.h"
#include "components/signin/public/base/signin_metrics.h"
struct CoreAccountInfo;
class Profile;
class ProfilePickerWebContentsHost;
class ProfileManagementStepController;
class ProfilePickerSignedInFlowController;
namespace content {
class WebContents;
}
// Allows sharing the logic for registering and connecting together
// identity-related profile management steps.
class ProfileManagementFlowControllerImpl
: public ProfileManagementFlowController {
public:
ProfileManagementFlowControllerImpl(ProfilePickerWebContentsHost* host,
ClearHostClosure clear_host_callback,
std::string_view flow_type_string);
~ProfileManagementFlowControllerImpl() override;
protected:
virtual std::unique_ptr<ProfilePickerSignedInFlowController>
CreateSignedInFlowController(
Profile* signed_in_profile,
const CoreAccountInfo& account_info,
std::unique_ptr<content::WebContents> contents) = 0;
// To be called when the sign-in and/or sync steps of the flow are completed
// (or skipped), to proceed with additional steps or finish the flow.
//
// When `is_continue_callback` is true, the flow should finishing up
// immediately so that `post_host_cleared_callback` can be executed, without
// showing other steps.
// Otherwise, the flow can display post-identity steps, passing
// `post_host_cleared_callback` along so they can be executed at the right
// time.
void HandleIdentityStepsCompleted(
Profile* profile,
PostHostClearedCallback post_host_cleared_callback,
bool is_continue_callback);
// Register the steps that will be shown after the identity step. The steps
// should be registered and pushed to the queue in the order in which they
// should be displayed.
virtual base::queue<ProfileManagementFlowController::Step>
RegisterPostIdentitySteps(
PostHostClearedCallback post_host_cleared_callback) = 0;
// Switches to the step at the front of the `post_identity_steps_` queue if it
// is not empty.
void AdvanceToNextPostIdentityStep();
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
// Creates, registers and switches to steps to implement the identity flow
// (signing in then doing the post sign in, which are driven by `Delegate`).
// Uses an existing profile if the `profile_path` is not empty.
void SwitchToIdentityStepsFromAccountSelection(
StepSwitchFinishedCallback step_switch_finished_callback,
signin_metrics::AccessPoint access_point,
base::FilePath profile_path);
#endif
private:
// Move to the steps that come after the identity step.
void SwitchToPostIdentitySteps(
PostHostClearedCallback post_host_cleared_callback);
std::unique_ptr<ProfileManagementStepController> CreatePostSignInStep(
Profile* signed_in_profile,
const CoreAccountInfo& account_info,
std::unique_ptr<content::WebContents> contents);
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
std::unique_ptr<ProfileManagementStepController> CreateSamlStep(
Profile* signed_in_profile,
std::unique_ptr<content::WebContents> contents);
// `account_id` is empty if the signin could not complete and must continue
// in a browser (e.g. for SAML).
void HandleSignInCompleted(
Profile* signed_in_profile,
const CoreAccountInfo& account_info,
std::unique_ptr<content::WebContents> contents,
StepSwitchFinishedCallback step_switch_finished_callback);
#endif
// The list of steps that are added to the flow.
// It is populated by the return value of `RegisterPostIdentitySteps` that
// should be overridden by the derived class.
// `post_identity_steps` being empty would mean that we either don't have any
// steps in the flow or that the flow is done.
base::queue<ProfileManagementFlowController::Step> post_identity_steps_;
};
#endif // CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_MANAGEMENT_FLOW_CONTROLLER_IMPL_H_
|