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
|
// 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_ENTERPRISE_IDLE_ACTION_H_
#define CHROME_BROWSER_ENTERPRISE_IDLE_ACTION_H_
#include <memory>
#include <queue>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/containers/span.h"
#include "base/functional/callback.h"
#include "base/no_destructor.h"
#include "build/build_config.h"
#include "chrome/browser/ui/idle_dialog.h"
#include "components/enterprise/idle/action_type.h"
#include "content/public/browser/browsing_data_remover.h"
class Profile;
namespace enterprise_idle {
// An action that should Run() when a given event happens. See *Actions
// policies, e.g. IdleTimeoutActions.
class Action {
public:
using Continuation = base::OnceCallback<void(bool succeeded)>;
explicit Action(int priority);
virtual ~Action();
Action(const Action&) = delete;
Action& operator=(const Action&) = delete;
Action(Action&&) = delete;
Action& operator=(Action&&) = delete;
// Runs this action on `profile`, which may be asynchronous. When it's done,
// runs `continuation` with the result.
virtual void Run(Profile* profile, Continuation continuation) = 0;
// Returns true if running this action on `profile` is destructive. If it is,
// a warning dialog will be shown to inform the user.
virtual bool ShouldNotifyUserOfPendingDestructiveAction(Profile* profile) = 0;
int priority() const { return priority_; }
private:
const int priority_;
};
// A singleton factory that takes a list of `ActionType` and converts it to a
// `priority_queue<Action>`. See Build().
class ActionFactory {
public:
struct CompareActionsByPriority {
bool operator()(const std::unique_ptr<Action>& a,
const std::unique_ptr<Action>& b) const;
};
using ActionQueue = std::priority_queue<std::unique_ptr<Action>,
std::vector<std::unique_ptr<Action>>,
CompareActionsByPriority>;
static ActionFactory* GetInstance();
ActionFactory(const ActionFactory&) = delete;
ActionFactory& operator=(const ActionFactory&) = delete;
ActionFactory(ActionFactory&&) = delete;
ActionFactory& operator=(ActionFactory&&) = delete;
~ActionFactory();
// Converts the pref/policy value to a priority_queue<> of actions.
virtual ActionQueue Build(Profile* profile,
const std::vector<ActionType>& action_names);
void SetBrowsingDataRemoverForTesting(content::BrowsingDataRemover* remover);
protected:
friend class base::NoDestructor<ActionFactory>;
ActionFactory();
raw_ptr<content::BrowsingDataRemover, DanglingUntriaged>
browsing_data_remover_for_testing_;
};
IdleDialog::ActionSet ActionsToActionSet(
const base::flat_set<ActionType>& action_types);
} // namespace enterprise_idle
#endif // CHROME_BROWSER_ENTERPRISE_IDLE_ACTION_H_
|