#include "chrome/browser/ui/hats/hats_service_desktop.h"
#include <memory>
#include <utility>
#include "base/containers/contains.h"
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/json/values_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/not_fatal_until.h"
#include "base/rand_util.h"
#include "base/ranges/algorithm.h"
#include "base/task/sequenced_task_runner.h"
#include "base/values.h"
#include "base/version.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profiles_state.h"
#include "chrome/browser/sessions/exit_type_service.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/hats/hats_service.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "components/metrics_services_manager/metrics_services_manager.h"
#include "components/policy/core/common/policy_pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "components/version_info/version_info.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
#include "net/base/network_change_notifier.h"
constexpr char kHatsShouldShowSurveyReasonHistogram[] = …;
namespace {
constexpr base::TimeDelta kMinimumTimeBetweenSurveyStarts = …;
constexpr base::TimeDelta kMinimumTimeBetweenAnySurveyStarts = …;
constexpr base::TimeDelta kMinimumTimeBetweenSurveyChecks = …;
constexpr base::TimeDelta kMinimumProfileAge = …;
std::string GetMajorVersionPath(const std::string& trigger) { … }
std::string GetLastSurveyStartedTime(const std::string& trigger) { … }
std::string GetIsSurveyFull(const std::string& trigger) { … }
std::string GetLastSurveyCheckTime(const std::string& trigger) { … }
constexpr char kAnyLastSurveyStartedTimePath[] = …;
}
HatsServiceDesktop::DelayedSurveyTask::DelayedSurveyTask(
HatsServiceDesktop* hats_service,
std::string trigger,
content::WebContents* web_contents,
const SurveyBitsData& product_specific_bits_data,
const SurveyStringData& product_specific_string_data,
NavigationBehaviour navigation_behaviour,
base::OnceClosure success_callback,
base::OnceClosure failure_callback,
std::optional<std::string_view> supplied_trigger_id)
: … { … }
HatsServiceDesktop::DelayedSurveyTask::~DelayedSurveyTask() = default;
base::WeakPtr<HatsServiceDesktop::DelayedSurveyTask>
HatsServiceDesktop::DelayedSurveyTask::GetWeakPtr() { … }
void HatsServiceDesktop::DelayedSurveyTask::Launch() { … }
void HatsServiceDesktop::DelayedSurveyTask::DidFinishNavigation(
content::NavigationHandle* navigation_handle) { … }
void HatsServiceDesktop::DelayedSurveyTask::WebContentsDestroyed() { … }
HatsServiceDesktop::HatsServiceDesktop(Profile* profile)
: … { … }
HatsServiceDesktop::~HatsServiceDesktop() = default;
void HatsServiceDesktop::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) { … }
void HatsServiceDesktop::LaunchSurvey(
const std::string& trigger,
base::OnceClosure success_callback,
base::OnceClosure failure_callback,
const SurveyBitsData& product_specific_bits_data,
const SurveyStringData& product_specific_string_data) { … }
void HatsServiceDesktop::LaunchSurveyForWebContents(
const std::string& trigger,
content::WebContents* web_contents,
const SurveyBitsData& product_specific_bits_data,
const SurveyStringData& product_specific_string_data,
base::OnceClosure success_callback,
base::OnceClosure failure_callback,
const std::optional<std::string>& supplied_trigger_id,
const SurveyOptions& survey_options) { … }
bool HatsServiceDesktop::LaunchDelayedSurvey(
const std::string& trigger,
int timeout_ms,
const SurveyBitsData& product_specific_bits_data,
const SurveyStringData& product_specific_string_data) { … }
bool HatsServiceDesktop::LaunchDelayedSurveyForWebContents(
const std::string& trigger,
content::WebContents* web_contents,
int timeout_ms,
const SurveyBitsData& product_specific_bits_data,
const SurveyStringData& product_specific_string_data,
NavigationBehaviour navigation_behaviour,
base::OnceClosure success_callback,
base::OnceClosure failure_callback,
const std::optional<std::string>& supplied_trigger_id,
const SurveyOptions& survey_options) { … }
void HatsServiceDesktop::SetSurveyMetadataForTesting(
const HatsService::SurveyMetadata& metadata) { … }
void HatsServiceDesktop::GetSurveyMetadataForTesting(
HatsService::SurveyMetadata* metadata) const { … }
bool HatsServiceDesktop::HasPendingTasks() { … }
bool HatsServiceDesktop::CanShowSurvey(const std::string& trigger) const { … }
bool HatsServiceDesktop::CanShowAnySurvey(bool user_prompted) const { … }
void HatsServiceDesktop::RecordSurveyAsShown(std::string trigger_id) { … }
void HatsServiceDesktop::HatsNextDialogClosed() { … }
void HatsServiceDesktop::RemoveTask(const DelayedSurveyTask& task) { … }
bool HatsServiceDesktop::ShouldShowSurvey(const std::string& trigger) const { … }
void HatsServiceDesktop::LaunchSurveyForBrowser(
Browser* browser,
const std::string& trigger,
base::OnceClosure success_callback,
base::OnceClosure failure_callback,
const SurveyBitsData& product_specific_bits_data,
const SurveyStringData& product_specific_string_data,
const std::optional<std::string_view>& supplied_trigger_id) { … }
void HatsServiceDesktop::CheckSurveyStatusAndMaybeShow(
Browser* browser,
const std::string& trigger,
base::OnceClosure success_callback,
base::OnceClosure failure_callback,
const SurveyBitsData& product_specific_bits_data,
const SurveyStringData& product_specific_string_data,
const std::optional<std::string_view>& supplied_trigger_id) { … }