Commit ae7a4d46 authored by Becca Hughes's avatar Becca Hughes Committed by Commit Bot

[Media Feeds] Add a pref for safesearch

Add a pref that is default off to enable
safe search checking. There is no UI for this
yet.

BUG=1066643

Change-Id: I80fad2da4b3ab45790f94e5c7a5fb269815851f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2134650
Commit-Queue: Becca Hughes <beccahughes@chromium.org>
Reviewed-by: default avatarDominic Battré <battre@chromium.org>
Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#759314}
parent 06e8c208
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
#include "chrome/browser/media/history/media_history_keyed_service.h" #include "chrome/browser/media/history/media_history_keyed_service.h"
#include "chrome/browser/media/history/media_history_keyed_service_factory.h" #include "chrome/browser/media/history/media_history_keyed_service_factory.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h"
#include "components/safe_search_api/safe_search/safe_search_url_checker_client.h" #include "components/safe_search_api/safe_search/safe_search_url_checker_client.h"
#include "components/safe_search_api/url_checker.h" #include "components/safe_search_api/url_checker.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
...@@ -48,8 +51,19 @@ bool MediaFeedsService::IsEnabled() { ...@@ -48,8 +51,19 @@ bool MediaFeedsService::IsEnabled() {
return base::FeatureList::IsEnabled(media::kMediaFeeds); return base::FeatureList::IsEnabled(media::kMediaFeeds);
} }
// static
void MediaFeedsService::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) {
registry->RegisterBooleanPref(prefs::kMediaFeedsSafeSearchEnabled, false);
}
void MediaFeedsService::CheckItemsAgainstSafeSearch( void MediaFeedsService::CheckItemsAgainstSafeSearch(
media_history::MediaHistoryKeyedService::PendingSafeSearchCheckList list) { media_history::MediaHistoryKeyedService::PendingSafeSearchCheckList list) {
if (!IsSafeSearchCheckingEnabled()) {
MaybeCallCompletionCallback();
return;
}
for (auto& check : list) { for (auto& check : list) {
if (!AddInflightSafeSearchCheck(check->id, check->urls)) if (!AddInflightSafeSearchCheck(check->id, check->urls))
continue; continue;
...@@ -81,6 +95,8 @@ bool MediaFeedsService::AddInflightSafeSearchCheck(const int64_t id, ...@@ -81,6 +95,8 @@ bool MediaFeedsService::AddInflightSafeSearchCheck(const int64_t id,
} }
void MediaFeedsService::CheckForSafeSearch(const int64_t id, const GURL& url) { void MediaFeedsService::CheckForSafeSearch(const int64_t id, const GURL& url) {
DCHECK(IsSafeSearchCheckingEnabled());
if (!safe_search_url_checker_) { if (!safe_search_url_checker_) {
// TODO(https://crbug.com/1066643): Add a UI toggle to turn this feature on. // TODO(https://crbug.com/1066643): Add a UI toggle to turn this feature on.
net::NetworkTrafficAnnotationTag traffic_annotation = net::NetworkTrafficAnnotationTag traffic_annotation =
...@@ -135,6 +151,8 @@ void MediaFeedsService::OnCheckURLDone( ...@@ -135,6 +151,8 @@ void MediaFeedsService::OnCheckURLDone(
const GURL& url, const GURL& url,
safe_search_api::Classification classification, safe_search_api::Classification classification,
bool uncertain) { bool uncertain) {
DCHECK(IsSafeSearchCheckingEnabled());
// Get the inflight safe search check data. // Get the inflight safe search check data.
auto it = inflight_safe_search_checks_.find(id); auto it = inflight_safe_search_checks_.find(id);
if (it == inflight_safe_search_checks_.end()) if (it == inflight_safe_search_checks_.end())
...@@ -184,6 +202,10 @@ void MediaFeedsService::MaybeCallCompletionCallback() { ...@@ -184,6 +202,10 @@ void MediaFeedsService::MaybeCallCompletionCallback() {
} }
} }
bool MediaFeedsService::IsSafeSearchCheckingEnabled() const {
return profile_->GetPrefs()->GetBoolean(prefs::kMediaFeedsSafeSearchEnabled);
}
MediaFeedsService::InflightSafeSearchCheck::InflightSafeSearchCheck( MediaFeedsService::InflightSafeSearchCheck::InflightSafeSearchCheck(
const std::set<GURL>& urls) const std::set<GURL>& urls)
: pending(urls) {} : pending(urls) {}
......
...@@ -20,6 +20,10 @@ enum class Classification; ...@@ -20,6 +20,10 @@ enum class Classification;
class URLChecker; class URLChecker;
} // namespace safe_search_api } // namespace safe_search_api
namespace user_prefs {
class PrefRegistrySyncable;
} // namespace user_prefs
namespace media_feeds { namespace media_feeds {
class MediaFeedsService : public KeyedService { class MediaFeedsService : public KeyedService {
...@@ -34,6 +38,9 @@ class MediaFeedsService : public KeyedService { ...@@ -34,6 +38,9 @@ class MediaFeedsService : public KeyedService {
// Returns the instance attached to the given |profile|. // Returns the instance attached to the given |profile|.
static MediaFeedsService* Get(Profile* profile); static MediaFeedsService* Get(Profile* profile);
// Register profile prefs in the pref registry.
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
// Checks the list of pending items against the Safe Search API and stores // Checks the list of pending items against the Safe Search API and stores
// the result. // the result.
void CheckItemsAgainstSafeSearch( void CheckItemsAgainstSafeSearch(
...@@ -61,6 +68,8 @@ class MediaFeedsService : public KeyedService { ...@@ -61,6 +68,8 @@ class MediaFeedsService : public KeyedService {
void MaybeCallCompletionCallback(); void MaybeCallCompletionCallback();
bool IsSafeSearchCheckingEnabled() const;
struct InflightSafeSearchCheck { struct InflightSafeSearchCheck {
explicit InflightSafeSearchCheck(const std::set<GURL>& urls); explicit InflightSafeSearchCheck(const std::set<GURL>& urls);
~InflightSafeSearchCheck(); ~InflightSafeSearchCheck();
......
...@@ -9,8 +9,10 @@ ...@@ -9,8 +9,10 @@
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "chrome/browser/media/feeds/media_feeds_service_factory.h" #include "chrome/browser/media/feeds/media_feeds_service_factory.h"
#include "chrome/browser/media/history/media_history_keyed_service.h" #include "chrome/browser/media/history/media_history_keyed_service.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
#include "components/prefs/pref_service.h"
#include "components/safe_search_api/stub_url_checker.h" #include "components/safe_search_api/stub_url_checker.h"
#include "components/safe_search_api/url_checker.h" #include "components/safe_search_api/url_checker.h"
#include "media/base/media_switches.h" #include "media/base/media_switches.h"
...@@ -94,6 +96,11 @@ class MediaFeedsServiceTest : public ChromeRenderViewHostTestHarness { ...@@ -94,6 +96,11 @@ class MediaFeedsServiceTest : public ChromeRenderViewHostTestHarness {
return out; return out;
} }
void SetSafeSearchEnabled(bool enabled) {
profile()->GetPrefs()->SetBoolean(prefs::kMediaFeedsSafeSearchEnabled,
enabled);
}
safe_search_api::StubURLChecker* safe_search_checker() { safe_search_api::StubURLChecker* safe_search_checker() {
return stub_url_checker_.get(); return stub_url_checker_.get();
} }
...@@ -169,6 +176,7 @@ TEST_F(MediaFeedsServiceTest, GetForProfile) { ...@@ -169,6 +176,7 @@ TEST_F(MediaFeedsServiceTest, GetForProfile) {
} }
TEST_F(MediaFeedsServiceTest, SafeSearch_AllSafe) { TEST_F(MediaFeedsServiceTest, SafeSearch_AllSafe) {
SetSafeSearchEnabled(true);
safe_search_checker()->SetUpValidResponse(/* is_porn= */ false); safe_search_checker()->SetUpValidResponse(/* is_porn= */ false);
// Store a Media Feed. // Store a Media Feed.
...@@ -216,6 +224,7 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_AllSafe) { ...@@ -216,6 +224,7 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_AllSafe) {
} }
TEST_F(MediaFeedsServiceTest, SafeSearch_AllUnsafe) { TEST_F(MediaFeedsServiceTest, SafeSearch_AllUnsafe) {
SetSafeSearchEnabled(true);
safe_search_checker()->SetUpValidResponse(/* is_porn= */ true); safe_search_checker()->SetUpValidResponse(/* is_porn= */ true);
// Store a Media Feed. // Store a Media Feed.
...@@ -262,7 +271,8 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_AllUnsafe) { ...@@ -262,7 +271,8 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_AllUnsafe) {
items[2]->safe_search_result); items[2]->safe_search_result);
} }
TEST_F(MediaFeedsServiceTest, SafeSearch_Failed) { TEST_F(MediaFeedsServiceTest, SafeSearch_Failed_Request) {
SetSafeSearchEnabled(true);
safe_search_checker()->SetUpFailedResponse(); safe_search_checker()->SetUpFailedResponse();
// Store a Media Feed. // Store a Media Feed.
...@@ -309,7 +319,53 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_Failed) { ...@@ -309,7 +319,53 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_Failed) {
items[2]->safe_search_result); items[2]->safe_search_result);
} }
TEST_F(MediaFeedsServiceTest, SafeSearch_Failed_Pref) {
// Store a Media Feed.
GetMediaHistoryService()->DiscoverMediaFeed(
GURL("https://www.google.com/feed"));
WaitForDB();
// Store some media feed items.
GetMediaHistoryService()->StoreMediaFeedFetchResult(
1, GetExpectedItems(), media_feeds::mojom::FetchResult::kSuccess, false,
std::vector<media_session::MediaImage>(), "test", base::DoNothing());
WaitForDB();
base::RunLoop run_loop;
GetMediaFeedsService()->SetSafeSearchCompletionCallbackForTest(
run_loop.QuitClosure());
{
// Get the pending items and check them against Safe Search.
auto pending_items = GetPendingSafeSearchCheckMediaFeedItemsSync();
EXPECT_EQ(3u, pending_items.size());
GetMediaFeedsService()->CheckItemsAgainstSafeSearch(
std::move(pending_items));
}
// Wait for the service and DB to finish.
run_loop.Run();
WaitForDB();
{
// The pending items should still be 3.
auto pending_items = GetPendingSafeSearchCheckMediaFeedItemsSync();
EXPECT_EQ(3u, pending_items.size());
}
// Check the items were updated.
auto items = GetItemsForMediaFeedSync(1);
EXPECT_EQ(3u, items.size());
EXPECT_EQ(media_feeds::mojom::SafeSearchResult::kUnknown,
items[0]->safe_search_result);
EXPECT_EQ(media_feeds::mojom::SafeSearchResult::kUnknown,
items[1]->safe_search_result);
EXPECT_EQ(media_feeds::mojom::SafeSearchResult::kUnknown,
items[2]->safe_search_result);
}
TEST_F(MediaFeedsServiceTest, SafeSearch_CheckTwice_Inflight) { TEST_F(MediaFeedsServiceTest, SafeSearch_CheckTwice_Inflight) {
SetSafeSearchEnabled(true);
safe_search_checker()->SetUpValidResponse(/* is_porn= */ false); safe_search_checker()->SetUpValidResponse(/* is_porn= */ false);
// Store a Media Feed. // Store a Media Feed.
...@@ -355,6 +411,7 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_CheckTwice_Inflight) { ...@@ -355,6 +411,7 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_CheckTwice_Inflight) {
} }
TEST_F(MediaFeedsServiceTest, SafeSearch_CheckTwice_Committed) { TEST_F(MediaFeedsServiceTest, SafeSearch_CheckTwice_Committed) {
SetSafeSearchEnabled(true);
safe_search_checker()->SetUpValidResponse(/* is_porn= */ false); safe_search_checker()->SetUpValidResponse(/* is_porn= */ false);
// Store a Media Feed. // Store a Media Feed.
...@@ -406,6 +463,8 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_CheckTwice_Committed) { ...@@ -406,6 +463,8 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_CheckTwice_Committed) {
} }
TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_SafeUnsafe) { TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_SafeUnsafe) {
SetSafeSearchEnabled(true);
// Store a Media Feed. // Store a Media Feed.
GetMediaHistoryService()->DiscoverMediaFeed( GetMediaHistoryService()->DiscoverMediaFeed(
GURL("https://www.google.com/feed")); GURL("https://www.google.com/feed"));
...@@ -446,6 +505,8 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_SafeUnsafe) { ...@@ -446,6 +505,8 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_SafeUnsafe) {
} }
TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_SafeUncertain) { TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_SafeUncertain) {
SetSafeSearchEnabled(true);
// Store a Media Feed. // Store a Media Feed.
GetMediaHistoryService()->DiscoverMediaFeed( GetMediaHistoryService()->DiscoverMediaFeed(
GURL("https://www.google.com/feed")); GURL("https://www.google.com/feed"));
...@@ -486,6 +547,8 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_SafeUncertain) { ...@@ -486,6 +547,8 @@ TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_SafeUncertain) {
} }
TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_UnsafeUncertain) { TEST_F(MediaFeedsServiceTest, SafeSearch_Mixed_UnsafeUncertain) {
SetSafeSearchEnabled(true);
// Store a Media Feed. // Store a Media Feed.
GetMediaHistoryService()->DiscoverMediaFeed( GetMediaHistoryService()->DiscoverMediaFeed(
GURL("https://www.google.com/feed")); GURL("https://www.google.com/feed"));
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "chrome/browser/gpu/gpu_mode_manager.h" #include "chrome/browser/gpu/gpu_mode_manager.h"
#include "chrome/browser/intranet_redirect_detector.h" #include "chrome/browser/intranet_redirect_detector.h"
#include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/lifetime/browser_shutdown.h"
#include "chrome/browser/media/feeds/media_feeds_service.h"
#include "chrome/browser/media/media_device_id_salt.h" #include "chrome/browser/media/media_device_id_salt.h"
#include "chrome/browser/media/media_engagement_service.h" #include "chrome/browser/media/media_engagement_service.h"
#include "chrome/browser/media/media_storage_id_salt.h" #include "chrome/browser/media/media_storage_id_salt.h"
...@@ -1044,6 +1045,8 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, ...@@ -1044,6 +1045,8 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
RegisterBrowserViewProfilePrefs(registry); RegisterBrowserViewProfilePrefs(registry);
#endif #endif
media_feeds::MediaFeedsService::RegisterProfilePrefs(registry);
RegisterProfilePrefsForMigration(registry); RegisterProfilePrefsForMigration(registry);
} }
......
...@@ -2986,4 +2986,7 @@ extern const char kRequiredClientCertificateForDevice[] = ...@@ -2986,4 +2986,7 @@ extern const char kRequiredClientCertificateForDevice[] =
"required_client_certificate_for_device"; "required_client_certificate_for_device";
#endif #endif
// This pref enables checking of Media Feed items against the Safe Search API.
const char kMediaFeedsSafeSearchEnabled[] = "media_feeds_safe_search_enabled";
} // namespace prefs } // namespace prefs
...@@ -1051,6 +1051,8 @@ extern const char kRequiredClientCertificateForUser[]; ...@@ -1051,6 +1051,8 @@ extern const char kRequiredClientCertificateForUser[];
extern const char kRequiredClientCertificateForDevice[]; extern const char kRequiredClientCertificateForDevice[];
#endif #endif
extern const char kMediaFeedsSafeSearchEnabled[];
} // namespace prefs } // namespace prefs
#endif // CHROME_COMMON_PREF_NAMES_H_ #endif // CHROME_COMMON_PREF_NAMES_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment