Add parental control child web filter in feedback source
The web filter that applies to supervised users is added on
the FamilyInfoFeedbackSource.
This information is already available through the supervised
user service.
The reporting of this information is guarded behind a new
feature flag (disabled by default)
Change-Id: Ida40adfa093e490bf778f3e1751bccd46525cdfa
Bug: b/260093095
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4080566
Reviewed-by: Nohemi Fernandez <fernandex@chromium.org>
Reviewed-by: Alex Ilin <alexilin@chromium.org>
Commit-Queue: Anthi Orfanou <anthie@google.com>
Cr-Commit-Position: refs/heads/main@{#1083735}
diff --git a/chrome/browser/feedback/android/BUILD.gn b/chrome/browser/feedback/android/BUILD.gn
index 4a1055c..e24c8f8 100644
--- a/chrome/browser/feedback/android/BUILD.gn
+++ b/chrome/browser/feedback/android/BUILD.gn
@@ -55,6 +55,7 @@
"//base:base_java",
"//base:jni_java",
"//build/android:build_java",
+ "//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/signin/services/android:java",
"//components/browser_ui/util/android:java",
diff --git a/chrome/browser/feedback/android/family_info_feedback_source.cc b/chrome/browser/feedback/android/family_info_feedback_source.cc
index cf8ef5d7..af0ddb8 100644
--- a/chrome/browser/feedback/android/family_info_feedback_source.cc
+++ b/chrome/browser/feedback/android/family_info_feedback_source.cc
@@ -8,11 +8,13 @@
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "chrome/browser/feedback/android/jni_headers/FamilyInfoFeedbackSource_jni.h"
+#include "chrome/browser/flags/android/chrome_feature_list.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/supervised_user/child_accounts/child_account_service.h"
#include "chrome/browser/supervised_user/child_accounts/child_account_service_factory.h"
+#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "content/public/browser/storage_partition.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -43,7 +45,9 @@
FamilyInfoFeedbackSource::FamilyInfoFeedbackSource(
const JavaParamRef<jobject>& obj,
Profile* profile)
- : identity_manager_(IdentityManagerFactory::GetForProfile(profile)),
+ : supervised_user_service_(
+ SupervisedUserServiceFactory::GetForProfile(profile)),
+ identity_manager_(IdentityManagerFactory::GetForProfile(profile)),
url_loader_factory_(profile->GetDefaultStoragePartition()
->GetURLLoaderFactoryForBrowserProcess()),
java_ref_(obj) {}
@@ -69,8 +73,20 @@
std::string role = member.role == FamilyMemberRole::HEAD_OF_HOUSEHOLD
? kFamilyManagerRole
: FamilyInfoFetcher::RoleToString(member.role);
- Java_FamilyInfoFeedbackSource_processFamilyMemberRole(
- env, java_ref_, ConvertUTF8ToJavaString(env, role));
+
+ // If a child is signed-in, report the parental control web filter.
+ ScopedJavaLocalRef<jstring> child_web_filter_type = nullptr;
+ if (base::FeatureList::IsEnabled(kReportParentalControlSitesChild) &&
+ member.role == FamilyMemberRole::CHILD) {
+ SupervisedUserURLFilter::WebFilterType web_filter_type =
+ supervised_user_service_->GetURLFilter()->GetWebFilterType();
+ child_web_filter_type = ConvertUTF8ToJavaString(
+ env, SupervisedUserURLFilter::WebFilterTypeToDisplayString(
+ web_filter_type));
+ }
+ Java_FamilyInfoFeedbackSource_processPrimaryAccountFamilyInfo(
+ env, java_ref_, ConvertUTF8ToJavaString(env, role),
+ child_web_filter_type);
}
}
OnGetFamilyMembersCompletion();
diff --git a/chrome/browser/feedback/android/family_info_feedback_source.h b/chrome/browser/feedback/android/family_info_feedback_source.h
index 5dc9fc3f..ecc8c77 100644
--- a/chrome/browser/feedback/android/family_info_feedback_source.h
+++ b/chrome/browser/feedback/android/family_info_feedback_source.h
@@ -13,6 +13,7 @@
#include "base/memory/raw_ptr.h"
#include "base/process/process_handle.h"
#include "chrome/browser/supervised_user/child_accounts/family_info_fetcher.h"
+#include "chrome/browser/supervised_user/supervised_user_service.h"
class Profile;
@@ -47,6 +48,7 @@
// Performs completion following call to GetFamilyMembers.
void OnGetFamilyMembersCompletion();
+ raw_ptr<SupervisedUserService> supervised_user_service_;
std::unique_ptr<FamilyInfoFetcher> family_fetcher_;
raw_ptr<signin::IdentityManager> identity_manager_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java
index aa018a1f..d13881b 100644
--- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java
+++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java
@@ -4,6 +4,8 @@
package org.chromium.chrome.browser.feedback;
+import androidx.annotation.Nullable;
+
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
@@ -16,6 +18,7 @@
@JNINamespace("chrome::android")
public class FamilyInfoFeedbackSource implements AsyncFeedbackSource {
private static final String FAMILY_MEMBER_ROLE = "Family_Member_Role";
+ private static final String PARENTAL_CONTROL_SITES_CHILD = "Parental_Control_Sites_Child";
private final Profile mProfile;
private Map<String, String> mFeedbackMap = new HashMap<>();
@@ -33,12 +36,29 @@
FamilyInfoFeedbackSourceJni.get().start(this, mProfile);
}
- @CalledByNative
private void processFamilyMemberRole(String familyRole) {
// Adds a family role only if the user is enrolled in a Family group.
if (!familyRole.isEmpty()) {
mFeedbackMap.put(FAMILY_MEMBER_ROLE, familyRole);
}
+ }
+
+ private void processParentalControlSitesChild(String webFilterType) {
+ // Adds the parental control sites web filter for child users.
+ assert mProfile.isChild();
+ assert !webFilterType.isEmpty();
+ mFeedbackMap.put(PARENTAL_CONTROL_SITES_CHILD, webFilterType);
+ }
+
+ @CalledByNative
+ private void processPrimaryAccountFamilyInfo(
+ String familyRole, @Nullable String webFilterType) {
+ processFamilyMemberRole(familyRole);
+
+ if (webFilterType != null) {
+ processParentalControlSitesChild(webFilterType);
+ }
+
mIsReady = true;
if (mCallback != null) {
mCallback.run();
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 451a8e2..b3aedd7 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -274,6 +274,7 @@
&kRelatedSearches,
&kRelatedSearchesInBar,
&kRelatedSearchesUi,
+ &kReportParentalControlSitesChild,
&kRequestDesktopSiteDefaults,
&kRequestDesktopSiteDefaultsControl,
&kRequestDesktopSiteDefaultsControlSynthetic,
@@ -883,6 +884,10 @@
"RelatedSearchesUi",
base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kReportParentalControlSitesChild,
+ "ReportParentalControlSitesChild",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
BASE_FEATURE(kRequestDesktopSiteDefaults,
"RequestDesktopSiteDefaults",
base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 8e91bda..f5ff5df 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -126,6 +126,7 @@
BASE_DECLARE_FEATURE(kRelatedSearches);
BASE_DECLARE_FEATURE(kRelatedSearchesInBar);
BASE_DECLARE_FEATURE(kRelatedSearchesUi);
+BASE_DECLARE_FEATURE(kReportParentalControlSitesChild);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaults);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsControl);
BASE_DECLARE_FEATURE(kRequestDesktopSiteDefaultsControlSynthetic);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 1fb210b6..25be175 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -467,6 +467,8 @@
public static final String RELATED_SEARCHES = "RelatedSearches";
public static final String RELATED_SEARCHES_IN_BAR = "RelatedSearchesInBar";
public static final String RELATED_SEARCHES_UI = "RelatedSearchesUi";
+ public static final String REPORT_PARENTAL_CONTROL_SITES_CHILD =
+ "ReportParentalControlSitesChild";
public static final String REQUEST_DESKTOP_SITE_DEFAULTS = "RequestDesktopSiteDefaults";
public static final String REQUEST_DESKTOP_SITE_DEFAULTS_CONTROL =
"RequestDesktopSiteDefaultsControl";
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter.cc b/chrome/browser/supervised_user/supervised_user_url_filter.cc
index 6810c8b..bf0f31c 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter.cc
+++ b/chrome/browser/supervised_user/supervised_user_url_filter.cc
@@ -316,6 +316,19 @@
return trimmed_host == trimmed_pattern;
}
+// Static.
+std::string SupervisedUserURLFilter::WebFilterTypeToDisplayString(
+ WebFilterType web_filter_type) {
+ switch (web_filter_type) {
+ case WebFilterType::kAllowAllSites:
+ return "allow_all_sites";
+ case WebFilterType::kCertainSites:
+ return "allow_certain_sites";
+ case WebFilterType::kTryToBlockMatureSites:
+ return "block_mature_sites";
+ }
+}
+
SupervisedUserURLFilter::FilteringBehavior
SupervisedUserURLFilter::GetFilteringBehaviorForURL(const GURL& url) const {
supervised_user_error_page::FilteringBehaviorReason reason;
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter.h b/chrome/browser/supervised_user/supervised_user_url_filter.h
index eda4d02..749b2be 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter.h
+++ b/chrome/browser/supervised_user/supervised_user_url_filter.h
@@ -156,6 +156,11 @@
static bool HostMatchesPattern(const std::string& canonical_host,
const std::string& pattern);
+ // Returns the string equivalent of a Web Filter type. This is a user-visible
+ // string included in the user feedback log.
+ static std::string WebFilterTypeToDisplayString(
+ WebFilterType web_filter_type);
+
// Returns the filtering behavior for a given URL, based on the default
// behavior and whether it is on a site list.
FilteringBehavior GetFilteringBehaviorForURL(const GURL& url) const;