Skip to content

Commit

Permalink
Privacy Sandbox Settings: Add PS4 HaTS triggers
Browse files Browse the repository at this point in the history
- Add Privacy Sandbox 4 feature areas
- Add corresponding hats probabilities and triggers for hats v1 and v2
- Add tests for checking feature areas and HaTS versions

Bug: 1378703, b/265792045
Change-Id: I54035c42471ed9ea020d160aebe68665f9ed8945
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4191815
Commit-Queue: Ehimare Okoyomon <eokoyomon@chromium.org>
Reviewed-by: Theodore Olsauskas-Warren <sauski@google.com>
Cr-Commit-Position: refs/heads/main@{#1096677}
  • Loading branch information
Ehimare Okoyomon authored and Chromium LUCI CQ committed Jan 25, 2023
1 parent 4ab4845 commit 8757240
Show file tree
Hide file tree
Showing 7 changed files with 411 additions and 89 deletions.
61 changes: 61 additions & 0 deletions chrome/browser/ui/hats/hats_service.cc
Expand Up @@ -77,6 +77,14 @@ constexpr char kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeSettings[] =
"ts-ps3-notice-settings";
constexpr char kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeLearnMore[] =
"ts-ps3-notice-learn-more";
constexpr char kHatsSurveyTriggerTrustSafetyPrivacySandbox4ConsentAccept[] =
"ts-ps4-consent-accept";
constexpr char kHatsSurveyTriggerTrustSafetyPrivacySandbox4ConsentDecline[] =
"ts-ps4-consent-decline";
constexpr char kHatsSurveyTriggerTrustSafetyPrivacySandbox4NoticeOk[] =
"ts-ps4-notice-ok";
constexpr char kHatsSurveyTriggerTrustSafetyPrivacySandbox4NoticeSettings[] =
"ts-ps4-notice-settings";
constexpr char kHatsSurveyTriggerTrustSafetyPrivacySettings[] =
"ts-privacy-settings";
constexpr char kHatsSurveyTriggerTrustSafetyTrustedSurface[] =
Expand All @@ -95,6 +103,14 @@ constexpr char kHatsSurveyTriggerTrustSafetyV2TrustedSurface[] =
"ts-v2-trusted-surface";
constexpr char kHatsSurveyTriggerTrustSafetyV2PrivacyGuide[] =
"ts-v2-privacy-guide";
constexpr char kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4ConsentAccept[] =
"ts-v2-ps4-consent-accept";
constexpr char kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4ConsentDecline[] =
"ts-v2-ps4-consent-decline";
constexpr char kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4NoticeOk[] =
"ts-v2-ps4-notice-ok";
constexpr char kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4NoticeSettings[] =
"ts-v2-ps4-notice-settings";

constexpr char kHatsNextSurveyTriggerIDTesting[] =
"HLpeYy5Av0ugnJ3q1cK0XzzA8UHv";
Expand Down Expand Up @@ -270,6 +286,28 @@ std::vector<HatsService::SurveyConfig> GetSurveyConfigs() {
.Get(),
std::vector<std::string>{"Stable channel", "3P cookies blocked",
"Privacy Sandbox enabled"});
survey_configs.emplace_back(
&features::kTrustSafetySentimentSurvey,
kHatsSurveyTriggerTrustSafetyPrivacySandbox4ConsentAccept,
features::kTrustSafetySentimentSurveyPrivacySandbox4ConsentAcceptTriggerId
.Get());
survey_configs.emplace_back(
&features::kTrustSafetySentimentSurvey,
kHatsSurveyTriggerTrustSafetyPrivacySandbox4ConsentDecline,
features::
kTrustSafetySentimentSurveyPrivacySandbox4ConsentDeclineTriggerId
.Get());
survey_configs.emplace_back(
&features::kTrustSafetySentimentSurvey,
kHatsSurveyTriggerTrustSafetyPrivacySandbox4NoticeOk,
features::kTrustSafetySentimentSurveyPrivacySandbox4NoticeOkTriggerId
.Get());
survey_configs.emplace_back(
&features::kTrustSafetySentimentSurvey,
kHatsSurveyTriggerTrustSafetyPrivacySandbox4NoticeSettings,
features::
kTrustSafetySentimentSurveyPrivacySandbox4NoticeSettingsTriggerId
.Get());

// Trust & Safety Sentiment surveys - Version 2.
survey_configs.emplace_back(
Expand Down Expand Up @@ -299,6 +337,29 @@ std::vector<HatsService::SurveyConfig> GetSurveyConfigs() {
&features::kTrustSafetySentimentSurveyV2,
kHatsSurveyTriggerTrustSafetyV2PrivacyGuide,
features::kTrustSafetySentimentSurveyV2PrivacyGuideTriggerId.Get());
survey_configs.emplace_back(
&features::kTrustSafetySentimentSurveyV2,
kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4ConsentAccept,
features::
kTrustSafetySentimentSurveyV2PrivacySandbox4ConsentAcceptTriggerId
.Get());
survey_configs.emplace_back(
&features::kTrustSafetySentimentSurveyV2,
kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4ConsentDecline,
features::
kTrustSafetySentimentSurveyV2PrivacySandbox4ConsentDeclineTriggerId
.Get());
survey_configs.emplace_back(
&features::kTrustSafetySentimentSurveyV2,
kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4NoticeOk,
features::kTrustSafetySentimentSurveyV2PrivacySandbox4NoticeOkTriggerId
.Get());
survey_configs.emplace_back(
&features::kTrustSafetySentimentSurveyV2,
kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4NoticeSettings,
features::
kTrustSafetySentimentSurveyV2PrivacySandbox4NoticeSettingsTriggerId
.Get());

// Autofill surveys.
survey_configs.emplace_back(&features::kAutofillAddressSurvey,
Expand Down
10 changes: 10 additions & 0 deletions chrome/browser/ui/hats/hats_service.h
Expand Up @@ -61,6 +61,10 @@ extern const char kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeDismiss[];
extern const char kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeOk[];
extern const char kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeSettings[];
extern const char kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeLearnMore[];
extern const char kHatsSurveyTriggerTrustSafetyPrivacySandbox4ConsentAccept[];
extern const char kHatsSurveyTriggerTrustSafetyPrivacySandbox4ConsentDecline[];
extern const char kHatsSurveyTriggerTrustSafetyPrivacySandbox4NoticeOk[];
extern const char kHatsSurveyTriggerTrustSafetyPrivacySandbox4NoticeSettings[];
extern const char kHatsSurveyTriggerTrustSafetyPrivacySettings[];
extern const char kHatsSurveyTriggerTrustSafetyTrustedSurface[];
extern const char kHatsSurveyTriggerTrustSafetyTransactions[];
Expand All @@ -70,6 +74,12 @@ extern const char kHatsSurveyTriggerTrustSafetyV2PasswordCheck[];
extern const char kHatsSurveyTriggerTrustSafetyV2SafetyCheck[];
extern const char kHatsSurveyTriggerTrustSafetyV2TrustedSurface[];
extern const char kHatsSurveyTriggerTrustSafetyV2PrivacyGuide[];
extern const char kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4ConsentAccept[];
extern const char
kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4ConsentDecline[];
extern const char kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4NoticeOk[];
extern const char
kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4NoticeSettings[];
extern const char kHatsSurveyTriggerWhatsNew[];

// The Trigger ID for a test HaTS Next survey which is available for testing
Expand Down
213 changes: 125 additions & 88 deletions chrome/browser/ui/hats/trust_safety_sentiment_service.cc
Expand Up @@ -66,95 +66,8 @@ int GetMaxRequiredNtpCount() {
: features::kTrustSafetySentimentSurveyNtpVisitsMaxRange.Get();
}

std::string GetHatsTriggerForFeatureArea(
TrustSafetySentimentService::FeatureArea feature_area) {
if (base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurveyV2)) {
switch (feature_area) {
case (TrustSafetySentimentService::FeatureArea::kTrustedSurface):
return kHatsSurveyTriggerTrustSafetyV2TrustedSurface;
case (TrustSafetySentimentService::FeatureArea::kSafetyCheck):
return kHatsSurveyTriggerTrustSafetyV2SafetyCheck;
case (TrustSafetySentimentService::FeatureArea::kPasswordCheck):
return kHatsSurveyTriggerTrustSafetyV2PasswordCheck;
case (TrustSafetySentimentService::FeatureArea::kBrowsingData):
return kHatsSurveyTriggerTrustSafetyV2BrowsingData;
case (TrustSafetySentimentService::FeatureArea::kPrivacyGuide):
return kHatsSurveyTriggerTrustSafetyV2PrivacyGuide;
case (TrustSafetySentimentService::FeatureArea::kControlGroup):
return kHatsSurveyTriggerTrustSafetyV2ControlGroup;
default:
NOTREACHED();
return "";
}
}
switch (feature_area) {
case (TrustSafetySentimentService::FeatureArea::kPrivacySettings):
return kHatsSurveyTriggerTrustSafetyPrivacySettings;
case (TrustSafetySentimentService::FeatureArea::kTrustedSurface):
return kHatsSurveyTriggerTrustSafetyTrustedSurface;
case (TrustSafetySentimentService::FeatureArea::kTransactions):
return kHatsSurveyTriggerTrustSafetyTransactions;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3ConsentAccept):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3ConsentAccept;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3ConsentDecline):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3ConsentDecline;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeDismiss):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeDismiss;
case (TrustSafetySentimentService::FeatureArea::kPrivacySandbox3NoticeOk):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeOk;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeSettings):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeSettings;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeLearnMore):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeLearnMore;
default:
NOTREACHED();
return "";
}
}

// Checks that this feature is valid for the current version.
bool VersionCheck(TrustSafetySentimentService::FeatureArea feature_area) {
bool isV2 =
base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurveyV2);
switch (feature_area) {
// Version 1 only
case (TrustSafetySentimentService::FeatureArea::kPrivacySettings):
case (TrustSafetySentimentService::FeatureArea::kTransactions):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3ConsentAccept):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3ConsentDecline):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeDismiss):
case (TrustSafetySentimentService::FeatureArea::kPrivacySandbox3NoticeOk):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeSettings):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeLearnMore):
return isV2 == false;
// Version 2 only
case (TrustSafetySentimentService::FeatureArea::kSafetyCheck):
case (TrustSafetySentimentService::FeatureArea::kPasswordCheck):
case (TrustSafetySentimentService::FeatureArea::kBrowsingData):
case (TrustSafetySentimentService::FeatureArea::kPrivacyGuide):
case (TrustSafetySentimentService::FeatureArea::kControlGroup):
return isV2 == true;
// Both Versions
case (TrustSafetySentimentService::FeatureArea::kTrustedSurface):
return true;
default:
NOTREACHED();
return false;
}
}

bool ProbabilityCheck(TrustSafetySentimentService::FeatureArea feature_area) {
if (!VersionCheck(feature_area)) {
if (!TrustSafetySentimentService::VersionCheck(feature_area)) {
return false;
}

Expand Down Expand Up @@ -560,6 +473,9 @@ void TrustSafetySentimentService::InteractedWithPrivacySandbox3(
TriggerOccurred(feature_area, product_specific_data);
}

void TrustSafetySentimentService::InteractedWithPrivacySandbox4(
FeatureArea feature_area) {}

void TrustSafetySentimentService::OnOffTheRecordProfileCreated(
Profile* off_the_record) {
// Only interested in the primary OTR profile i.e. the one used for incognito
Expand Down Expand Up @@ -677,3 +593,124 @@ void TrustSafetySentimentService::PerformedIneligibleAction() {
return base::Time::Now() - trigger.occurred_time < GetMinTimeToPrompt() ||
trigger.remaining_ntps_to_open > 0;
}

// static
bool TrustSafetySentimentService::VersionCheck(
TrustSafetySentimentService::FeatureArea feature_area) {
bool isV2 =
base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurveyV2);
switch (feature_area) {
// Version 1 only
case (TrustSafetySentimentService::FeatureArea::kPrivacySettings):
case (TrustSafetySentimentService::FeatureArea::kTransactions):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3ConsentAccept):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3ConsentDecline):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeDismiss):
case (TrustSafetySentimentService::FeatureArea::kPrivacySandbox3NoticeOk):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeSettings):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeLearnMore):
return isV2 == false;
// Version 2 only
case (TrustSafetySentimentService::FeatureArea::kSafetyCheck):
case (TrustSafetySentimentService::FeatureArea::kPasswordCheck):
case (TrustSafetySentimentService::FeatureArea::kBrowsingData):
case (TrustSafetySentimentService::FeatureArea::kPrivacyGuide):
case (TrustSafetySentimentService::FeatureArea::kControlGroup):
return isV2 == true;
// Both Versions
case (TrustSafetySentimentService::FeatureArea::kTrustedSurface):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4ConsentAccept):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4ConsentDecline):
case (TrustSafetySentimentService::FeatureArea::kPrivacySandbox4NoticeOk):
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4NoticeSettings):
return true;
// None
case (TrustSafetySentimentService::FeatureArea::kIneligible):
return false;
default:
NOTREACHED();
return false;
}
}

// static
std::string TrustSafetySentimentService::GetHatsTriggerForFeatureArea(
TrustSafetySentimentService::FeatureArea feature_area) {
if (base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurveyV2)) {
switch (feature_area) {
case (TrustSafetySentimentService::FeatureArea::kTrustedSurface):
return kHatsSurveyTriggerTrustSafetyV2TrustedSurface;
case (TrustSafetySentimentService::FeatureArea::kSafetyCheck):
return kHatsSurveyTriggerTrustSafetyV2SafetyCheck;
case (TrustSafetySentimentService::FeatureArea::kPasswordCheck):
return kHatsSurveyTriggerTrustSafetyV2PasswordCheck;
case (TrustSafetySentimentService::FeatureArea::kBrowsingData):
return kHatsSurveyTriggerTrustSafetyV2BrowsingData;
case (TrustSafetySentimentService::FeatureArea::kPrivacyGuide):
return kHatsSurveyTriggerTrustSafetyV2PrivacyGuide;
case (TrustSafetySentimentService::FeatureArea::kControlGroup):
return kHatsSurveyTriggerTrustSafetyV2ControlGroup;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4ConsentAccept):
return kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4ConsentAccept;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4ConsentDecline):
return kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4ConsentDecline;
case (TrustSafetySentimentService::FeatureArea::kPrivacySandbox4NoticeOk):
return kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4NoticeOk;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4NoticeSettings):
return kHatsSurveyTriggerTrustSafetyV2PrivacySandbox4NoticeSettings;
default:
NOTREACHED();
return "";
}
}
switch (feature_area) {
case (TrustSafetySentimentService::FeatureArea::kPrivacySettings):
return kHatsSurveyTriggerTrustSafetyPrivacySettings;
case (TrustSafetySentimentService::FeatureArea::kTrustedSurface):
return kHatsSurveyTriggerTrustSafetyTrustedSurface;
case (TrustSafetySentimentService::FeatureArea::kTransactions):
return kHatsSurveyTriggerTrustSafetyTransactions;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3ConsentAccept):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3ConsentAccept;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3ConsentDecline):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3ConsentDecline;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeDismiss):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeDismiss;
case (TrustSafetySentimentService::FeatureArea::kPrivacySandbox3NoticeOk):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeOk;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeSettings):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeSettings;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox3NoticeLearnMore):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox3NoticeLearnMore;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4ConsentAccept):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox4ConsentAccept;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4ConsentDecline):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox4ConsentDecline;
case (TrustSafetySentimentService::FeatureArea::kPrivacySandbox4NoticeOk):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox4NoticeOk;
case (TrustSafetySentimentService::FeatureArea::
kPrivacySandbox4NoticeSettings):
return kHatsSurveyTriggerTrustSafetyPrivacySandbox4NoticeSettings;
default:
NOTREACHED();
return "";
}
}
16 changes: 15 additions & 1 deletion chrome/browser/ui/hats/trust_safety_sentiment_service.h
Expand Up @@ -116,13 +116,27 @@ class TrustSafetySentimentService
kBrowsingData = 12,
kPrivacyGuide = 13,
kControlGroup = 14,
kMaxValue = kControlGroup,
kPrivacySandbox4ConsentAccept = 15,
kPrivacySandbox4ConsentDecline = 16,
kPrivacySandbox4NoticeOk = 17,
kPrivacySandbox4NoticeSettings = 18,
kMaxValue = kPrivacySandbox4NoticeSettings,
};

// Called when the user interacts with Privacy Sandbox 3, |feature_area|
// specifies what type of interaction occurred.
virtual void InteractedWithPrivacySandbox3(FeatureArea feature_area);

virtual void InteractedWithPrivacySandbox4(FeatureArea feature_area);

// Checks that this feature area is valid for the current version.
static bool VersionCheck(
TrustSafetySentimentService::FeatureArea feature_area);

// Gets the HaTS trigger for a feature area.
static std::string GetHatsTriggerForFeatureArea(
TrustSafetySentimentService::FeatureArea feature_area);

private:
friend class TrustSafetySentimentServiceTest;
FRIEND_TEST_ALL_PREFIXES(TrustSafetySentimentServiceTest,
Expand Down

0 comments on commit 8757240

Please sign in to comment.