#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "chrome/browser/ash/app_mode/app_launch_utils.h"
#include <cstddef>
#include <iterator>
#include <optional>
#include <string>
#include <vector>
#include "ash/constants/ash_switches.h"
#include "base/check.h"
#include "base/command_line.h"
#include "base/notimplemented.h"
#include "base/notreached.h"
#include "base/values.h"
#include "chrome/browser/ash/app_mode/kiosk_app_launch_error.h"
#include "chrome/browser/ash/app_mode/kiosk_app_types.h"
#include "chrome/browser/ash/app_mode/kiosk_chrome_app_manager.h"
#include "chrome/browser/ash/app_mode/kiosk_controller.h"
#include "chrome/browser/ash/login/startup_utils.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "components/account_id/account_id.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "components/user_manager/user_manager.h"
namespace ash {
namespace {
const char* const kPrefsToReset[] = {"settings.accessibility",
"settings.a11y", "ash.docked_magnifier",
"settings.tts"};
std::vector<std::string>* test_prefs_to_reset = nullptr;
bool ShouldAutoLaunchAfterAppLaunchError(KioskAppLaunchError::Error error) {
return error == KioskAppLaunchError::Error::kNone ||
error == KioskAppLaunchError::Error::kChromeAppDeprecated ||
error == KioskAppLaunchError::Error::kIsolatedAppNotAllowed;
}
}
void ResetEphemeralKioskPreferences(PrefService* prefs) {
CHECK(prefs);
CHECK(user_manager::UserManager::IsInitialized() &&
user_manager::UserManager::Get()->IsLoggedInAsAnyKioskApp());
for (size_t pref_id = 0;
pref_id < (test_prefs_to_reset ? test_prefs_to_reset->size()
: std::size(kPrefsToReset));
pref_id++) {
const std::string branch_path = test_prefs_to_reset
? (*test_prefs_to_reset)[pref_id]
: kPrefsToReset[pref_id];
prefs->ClearPrefsWithPrefixSilently(branch_path);
}
}
void SetEphemeralKioskPreferencesListForTesting(
std::vector<std::string>* prefs) {
test_prefs_to_reset = prefs;
}
bool ShouldAutoLaunchKioskApp(const base::CommandLine& command_line,
const PrefService& local_state) {
if (command_line.HasSwitch(switches::kPreventKioskAutolaunchForTesting)) {
return false;
}
if (local_state.GetBoolean(prefs::kFactoryResetRequested)) {
return false;
}
return command_line.HasSwitch(switches::kLoginManager) &&
KioskController::Get().GetAutoLaunchApp().has_value() &&
ShouldAutoLaunchAfterAppLaunchError(
KioskAppLaunchError::Get(local_state)) &&
StartupUtils::IsOobeCompleted();
}
}