Media Engagement: use url::Origin in the internal API instead of GURL.
This is updating a few methods in the service and score objects to take an url::Origin and updates the callers accordingly. Bug: 951956 Change-Id: Ib7474166d08d2e3616a05ff036638023f32be62d Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1564548 Commit-Queue: Mounir Lamouri <mlamouri@chromium.org> Reviewed-by: Becca Hughes <beccahughes@chromium.org> Reviewed-by: Avi Drissman <avi@chromium.org> Cr-Commit-Position: refs/heads/master@{#654639}
This commit is contained in:

committed by
Commit Bot

parent
e32c706c7c
commit
32f95a095d
chrome
browser
media
BUILD.gnmedia_engagement_autoplay_browsertest.ccmedia_engagement_browsertest.ccmedia_engagement_contents_observer.ccmedia_engagement_contents_observer_unittest.ccmedia_engagement_score.ccmedia_engagement_score.hmedia_engagement_score_details.mojommedia_engagement_score_unittest.ccmedia_engagement_service.ccmedia_engagement_service.hmedia_engagement_service_unittest.ccmedia_engagement_session.ccmedia_engagement_session_unittest.cc
resources
test
data
webui
content
@ -11,7 +11,7 @@ mojom("mojo_bindings") {
|
||||
]
|
||||
|
||||
public_deps = [
|
||||
"//url/mojom:url_mojom_gurl",
|
||||
"//url/mojom:url_mojom_origin",
|
||||
]
|
||||
}
|
||||
|
||||
|
@ -119,16 +119,20 @@ class MediaEngagementAutoplayBrowserTest
|
||||
"\""));
|
||||
}
|
||||
|
||||
void SetScores(GURL url, int visits, int media_playbacks) {
|
||||
MediaEngagementScore score = GetService()->CreateEngagementScore(url);
|
||||
void SetScores(const url::Origin& origin, int visits, int media_playbacks) {
|
||||
MediaEngagementScore score = GetService()->CreateEngagementScore(origin);
|
||||
score.SetVisits(visits);
|
||||
score.SetMediaPlaybacks(media_playbacks);
|
||||
score.Commit();
|
||||
}
|
||||
|
||||
GURL PrimaryOrigin() { return http_server_.GetURL("/"); }
|
||||
url::Origin PrimaryOrigin() const {
|
||||
return url::Origin::Create(http_server_.GetURL("/"));
|
||||
}
|
||||
|
||||
GURL SecondaryOrigin() { return http_server_origin2_.GetURL("/"); }
|
||||
url::Origin SecondaryOrigin() const {
|
||||
return url::Origin::Create(http_server_origin2_.GetURL("/"));
|
||||
}
|
||||
|
||||
void ExpectAutoplayAllowedIfEnabled() {
|
||||
if (GetParam()) {
|
||||
@ -142,7 +146,7 @@ class MediaEngagementAutoplayBrowserTest
|
||||
|
||||
void ExpectAutoplayDenied() { EXPECT_EQ(kDeniedTitle, WaitAndGetTitle()); }
|
||||
|
||||
void ApplyPreloadedOrigin(GURL url) {
|
||||
void ApplyPreloadedOrigin(const url::Origin& origin) {
|
||||
base::ScopedAllowBlockingForTesting allow_blocking;
|
||||
|
||||
// Get two temporary files.
|
||||
@ -153,7 +157,7 @@ class MediaEngagementAutoplayBrowserTest
|
||||
|
||||
// Write JSON file with the server origin in it.
|
||||
base::ListValue list;
|
||||
list.AppendString(url::Origin::Create(url).Serialize());
|
||||
list.AppendString(origin.Serialize());
|
||||
std::string json_data;
|
||||
base::JSONWriter::Write(list, &json_data);
|
||||
EXPECT_TRUE(
|
||||
|
@ -216,7 +216,8 @@ class MediaEngagementBrowserTest : public InProcessBrowserTest {
|
||||
int media_playbacks,
|
||||
int audible_playbacks,
|
||||
int significant_playbacks) {
|
||||
MediaEngagementScore score = service->CreateEngagementScore(url);
|
||||
MediaEngagementScore score =
|
||||
service->CreateEngagementScore(url::Origin::Create(url));
|
||||
EXPECT_EQ(visits, score.visits());
|
||||
EXPECT_EQ(media_playbacks, score.media_playbacks());
|
||||
EXPECT_EQ(audible_playbacks, score.audible_playbacks());
|
||||
|
@ -234,7 +234,7 @@ void MediaEngagementContentsObserver::
|
||||
}
|
||||
|
||||
int percentage =
|
||||
round(service_->GetEngagementScore(session_->origin().GetURL()) * 100);
|
||||
round(service_->GetEngagementScore(session_->origin()) * 100);
|
||||
UMA_HISTOGRAM_PERCENTAGE(
|
||||
MediaEngagementContentsObserver::kHistogramScoreAtPlaybackName,
|
||||
percentage);
|
||||
@ -571,14 +571,14 @@ void MediaEngagementContentsObserver::SetTaskRunnerForTest(
|
||||
|
||||
void MediaEngagementContentsObserver::ReadyToCommitNavigation(
|
||||
content::NavigationHandle* handle) {
|
||||
// TODO(beccahughes): Convert MEI API to using origin.
|
||||
// If the navigation is occuring in the main frame we should use the URL
|
||||
// provided by |handle| as the navigation has not committed yet. If the
|
||||
// navigation is in a sub frame then use the URL from the main frame.
|
||||
GURL url = handle->IsInMainFrame()
|
||||
? handle->GetURL()
|
||||
: handle->GetWebContents()->GetLastCommittedURL();
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(url);
|
||||
url::Origin origin = url::Origin::Create(
|
||||
handle->IsInMainFrame()
|
||||
? handle->GetURL()
|
||||
: handle->GetWebContents()->GetLastCommittedURL());
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin);
|
||||
bool has_high_engagement = score.high_score();
|
||||
|
||||
// If the preloaded feature flag is enabled and the number of visits is less
|
||||
@ -589,7 +589,7 @@ void MediaEngagementContentsObserver::ReadyToCommitNavigation(
|
||||
base::FeatureList::IsEnabled(media::kPreloadMediaEngagementData)) {
|
||||
has_high_engagement =
|
||||
MediaEngagementPreloadedList::GetInstance()->CheckOriginIsPresent(
|
||||
url::Origin::Create(url));
|
||||
origin);
|
||||
}
|
||||
|
||||
// If we have high media engagement then we should send that to Blink.
|
||||
@ -626,11 +626,10 @@ MediaEngagementContentsObserver::GetOrCreateSession(
|
||||
const url::Origin& origin,
|
||||
content::WebContents* opener,
|
||||
bool was_restored) const {
|
||||
GURL url = origin.GetURL();
|
||||
if (!url.is_valid())
|
||||
if (origin.opaque())
|
||||
return nullptr;
|
||||
|
||||
if (!service_->ShouldRecordEngagement(url))
|
||||
if (!service_->ShouldRecordEngagement(origin))
|
||||
return nullptr;
|
||||
|
||||
MediaEngagementContentsObserver* opener_observer =
|
||||
|
@ -222,7 +222,7 @@ class MediaEngagementContentsObserverTest
|
||||
task_runner_->FastForwardBy(kMaxWaitingTime);
|
||||
}
|
||||
|
||||
void ExpectScores(GURL url,
|
||||
void ExpectScores(const url::Origin origin,
|
||||
double expected_score,
|
||||
int expected_visits,
|
||||
int expected_media_playbacks,
|
||||
@ -230,10 +230,10 @@ class MediaEngagementContentsObserverTest
|
||||
int expected_significant_playbacks,
|
||||
int expected_media_element_playbacks,
|
||||
int expected_audio_context_playbacks) {
|
||||
EXPECT_EQ(service_->GetEngagementScore(url), expected_score);
|
||||
EXPECT_EQ(service_->GetScoreMapForTesting()[url], expected_score);
|
||||
EXPECT_EQ(service_->GetEngagementScore(origin), expected_score);
|
||||
EXPECT_EQ(service_->GetScoreMapForTesting()[origin], expected_score);
|
||||
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(url);
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin);
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_media_playbacks, score.media_playbacks());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
@ -244,13 +244,13 @@ class MediaEngagementContentsObserverTest
|
||||
score.audio_context_playbacks());
|
||||
}
|
||||
|
||||
void SetScores(GURL url,
|
||||
void SetScores(const url::Origin& origin,
|
||||
int visits,
|
||||
int media_playbacks,
|
||||
int audible_playbacks,
|
||||
int significant_playbacks) {
|
||||
MediaEngagementScore score =
|
||||
contents_observer_->service_->CreateEngagementScore(url);
|
||||
contents_observer_->service_->CreateEngagementScore(origin);
|
||||
score.SetVisits(visits);
|
||||
score.SetMediaPlaybacks(media_playbacks);
|
||||
score.set_audible_playbacks(audible_playbacks);
|
||||
@ -258,11 +258,11 @@ class MediaEngagementContentsObserverTest
|
||||
score.Commit();
|
||||
}
|
||||
|
||||
void SetScores(GURL url, int visits, int media_playbacks) {
|
||||
SetScores(url, visits, media_playbacks, 0, 0);
|
||||
void SetScores(const url::Origin& origin, int visits, int media_playbacks) {
|
||||
SetScores(origin, visits, media_playbacks, 0, 0);
|
||||
}
|
||||
|
||||
void Navigate(GURL url) {
|
||||
void Navigate(const GURL& url) {
|
||||
content::MockNavigationHandle test_handle(GURL(url), main_rfh());
|
||||
contents_observer_->ReadyToCommitNavigation(&test_handle);
|
||||
|
||||
@ -291,7 +291,7 @@ class MediaEngagementContentsObserverTest
|
||||
->SetIsCurrentlyAudible(false);
|
||||
}
|
||||
|
||||
void ExpectUkmEntry(GURL url,
|
||||
void ExpectUkmEntry(const url::Origin& origin,
|
||||
int playbacks_total,
|
||||
int visits_total,
|
||||
int score,
|
||||
@ -308,7 +308,7 @@ class MediaEngagementContentsObserverTest
|
||||
ASSERT_NE(0u, ukm_entries.size());
|
||||
|
||||
auto* ukm_entry = ukm_entries.back();
|
||||
test_ukm_recorder_.ExpectEntrySourceHasUrl(ukm_entry, url);
|
||||
test_ukm_recorder_.ExpectEntrySourceHasUrl(ukm_entry, origin.GetURL());
|
||||
EXPECT_EQ(playbacks_total, *test_ukm_recorder_.GetEntryMetric(
|
||||
ukm_entry, Entry::kPlaybacks_TotalName));
|
||||
EXPECT_EQ(visits_total, *test_ukm_recorder_.GetEntryMetric(
|
||||
@ -336,19 +336,21 @@ class MediaEngagementContentsObserverTest
|
||||
ukm_entry, Entry::kPlaybacks_SecondsSinceLastName));
|
||||
}
|
||||
|
||||
void ExpectUkmIgnoredEntries(GURL url, std::vector<int64_t> entries) {
|
||||
void ExpectUkmIgnoredEntries(const url::Origin& origin,
|
||||
std::vector<int64_t> entries) {
|
||||
using Entry = ukm::builders::Media_Engagement_ShortPlaybackIgnored;
|
||||
auto ukm_entries = test_ukm_recorder_.GetEntriesByName(Entry::kEntryName);
|
||||
|
||||
EXPECT_EQ(entries.size(), ukm_entries.size());
|
||||
for (std::vector<int>::size_type i = 0; i < entries.size(); i++) {
|
||||
test_ukm_recorder_.ExpectEntrySourceHasUrl(ukm_entries[i], url);
|
||||
test_ukm_recorder_.ExpectEntrySourceHasUrl(ukm_entries[i],
|
||||
origin.GetURL());
|
||||
EXPECT_EQ(entries[i], *test_ukm_recorder_.GetEntryMetric(
|
||||
ukm_entries[i], Entry::kLengthName));
|
||||
}
|
||||
}
|
||||
|
||||
void ExpectNoUkmIgnoreEntry(GURL url) {
|
||||
void ExpectNoUkmIgnoreEntry() {
|
||||
using Entry = ukm::builders::Media_Engagement_ShortPlaybackIgnored;
|
||||
auto ukm_entries = test_ukm_recorder_.GetEntriesByName(Entry::kEntryName);
|
||||
EXPECT_EQ(0U, ukm_entries.size());
|
||||
@ -413,14 +415,15 @@ class MediaEngagementContentsObserverTest
|
||||
id, false, MediaEngagementContentsObserver::kMaxShortPlaybackTime);
|
||||
}
|
||||
|
||||
void SetLastPlaybackTime(GURL url, base::Time new_time) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(url);
|
||||
void SetLastPlaybackTime(const url::Origin& origin, base::Time new_time) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin);
|
||||
score.set_last_media_playback_time(new_time);
|
||||
score.Commit();
|
||||
}
|
||||
|
||||
void ExpectLastPlaybackTime(GURL url, const base::Time expected_time) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(url);
|
||||
void ExpectLastPlaybackTime(const url::Origin& origin,
|
||||
const base::Time expected_time) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin);
|
||||
EXPECT_EQ(expected_time, score.last_media_playback_time());
|
||||
}
|
||||
|
||||
@ -826,33 +829,33 @@ TEST_F(MediaEngagementContentsObserverTest,
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, InteractionsRecorded) {
|
||||
GURL url("https://www.example.com");
|
||||
GURL url2("https://www.example.org");
|
||||
ExpectScores(url, 0.0, 0, 0, 0, 0, 0, 0);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.example.com"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://www.example.org"));
|
||||
ExpectScores(origin, 0.0, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
Navigate(url);
|
||||
Navigate(url2);
|
||||
ExpectScores(url, 0.0, 1, 0, 0, 0, 0, 0);
|
||||
Navigate(origin.GetURL());
|
||||
Navigate(origin2.GetURL());
|
||||
ExpectScores(origin, 0.0, 1, 0, 0, 0, 0, 0);
|
||||
|
||||
Navigate(url);
|
||||
Navigate(origin.GetURL());
|
||||
SimulateAudible();
|
||||
SimulateSignificantMediaElementPlaybackTimeForPage();
|
||||
|
||||
// We need to navigate to another page to commit the scores.
|
||||
ExpectScores(url, 0.0, 1, 0, 0, 0, 0, 0);
|
||||
Navigate(url2);
|
||||
ExpectScores(url, 0.05, 2, 1, 0, 0, 1, 0);
|
||||
ExpectScores(origin, 0.0, 1, 0, 0, 0, 0, 0);
|
||||
Navigate(origin2.GetURL());
|
||||
ExpectScores(origin, 0.05, 2, 1, 0, 0, 1, 0);
|
||||
|
||||
// Simulate both audio context and media element on the same page.
|
||||
Navigate(url);
|
||||
Navigate(origin.GetURL());
|
||||
SimulateAudible();
|
||||
SimulateAudioContextStarted(0);
|
||||
SimulateAudioContextPlaybackTimerFired();
|
||||
SimulateSignificantMediaElementPlaybackTimeForPage();
|
||||
|
||||
// We need to navigate to another page to commit the scores.
|
||||
Navigate(url2);
|
||||
ExpectScores(url, 0.1, 3, 2, 0, 0, 2, 1);
|
||||
Navigate(origin2.GetURL());
|
||||
ExpectScores(origin, 0.1, 3, 2, 0, 0, 2, 1);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest,
|
||||
@ -897,30 +900,30 @@ TEST_F(MediaEngagementContentsObserverTest,
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, RecordScoreOnPlayback) {
|
||||
GURL url1("https://www.google.com");
|
||||
GURL url2("https://www.google.co.uk");
|
||||
GURL url3("https://www.example.com");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("https://www.google.com"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://www.google.co.uk"));
|
||||
url::Origin origin3 = url::Origin::Create(GURL("https://www.example.com"));
|
||||
|
||||
SetScores(url1, 24, 20);
|
||||
SetScores(url2, 24, 12);
|
||||
SetScores(url3, 8, 4);
|
||||
SetScores(origin1, 24, 20);
|
||||
SetScores(origin2, 24, 12);
|
||||
SetScores(origin3, 8, 4);
|
||||
base::HistogramTester tester;
|
||||
tester.ExpectTotalCount(
|
||||
MediaEngagementContentsObserver::kHistogramScoreAtPlaybackName, 0);
|
||||
|
||||
Navigate(url1);
|
||||
Navigate(origin1.GetURL());
|
||||
SimulateAudioVideoPlaybackStarted(0);
|
||||
tester.ExpectBucketCount(
|
||||
MediaEngagementContentsObserver::kHistogramScoreAtPlaybackName, 83, 1);
|
||||
|
||||
Navigate(url2);
|
||||
Navigate(origin2.GetURL());
|
||||
SimulateAudioVideoPlaybackStarted(0);
|
||||
SimulateAudioVideoPlaybackStarted(1);
|
||||
SimulateMutedStateChange(0, false);
|
||||
tester.ExpectBucketCount(
|
||||
MediaEngagementContentsObserver::kHistogramScoreAtPlaybackName, 50, 2);
|
||||
|
||||
Navigate(url3);
|
||||
Navigate(origin3.GetURL());
|
||||
SimulateAudioVideoPlaybackStarted(0);
|
||||
tester.ExpectBucketCount(
|
||||
MediaEngagementContentsObserver::kHistogramScoreAtPlaybackName, 20, 1);
|
||||
@ -937,11 +940,11 @@ TEST_F(MediaEngagementContentsObserverTest, RecordScoreOnPlayback) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, DoNotRecordScoreOnPlayback_Muted) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 24, 20);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 24, 20);
|
||||
|
||||
base::HistogramTester tester;
|
||||
Navigate(url);
|
||||
Navigate(origin.GetURL());
|
||||
content::WebContentsObserver::MediaPlayerInfo player_info(true, true);
|
||||
SimulatePlaybackStarted(player_info, 0, true);
|
||||
tester.ExpectTotalCount(
|
||||
@ -954,11 +957,11 @@ TEST_F(MediaEngagementContentsObserverTest, DoNotRecordScoreOnPlayback_Muted) {
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest,
|
||||
DoNotRecordScoreOnPlayback_NoAudioTrack) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 6, 5);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 6, 5);
|
||||
|
||||
base::HistogramTester tester;
|
||||
Navigate(url);
|
||||
Navigate(origin.GetURL());
|
||||
content::WebContentsObserver::MediaPlayerInfo player_info(true, false);
|
||||
SimulatePlaybackStarted(player_info, 0, false);
|
||||
tester.ExpectTotalCount(
|
||||
@ -993,9 +996,9 @@ TEST_F(MediaEngagementContentsObserverTest, VisibilityNotRequired_Media) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, RecordUkmMetricsOnDestroy) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 24, 20, 3, 1);
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 24, 20, 3, 1);
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
EXPECT_FALSE(WasSignificantPlaybackRecorded());
|
||||
SimulateSignificantVideoPlayer(0);
|
||||
@ -1005,15 +1008,15 @@ TEST_F(MediaEngagementContentsObserverTest, RecordUkmMetricsOnDestroy) {
|
||||
EXPECT_TRUE(WasSignificantPlaybackRecorded());
|
||||
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 21.0 / 25.0, 25, 21, 5, 2, 1, 0);
|
||||
ExpectUkmEntry(url, 21, 25, 84, 1, true, 2, 5, 1, 2, 0);
|
||||
ExpectScores(origin, 21.0 / 25.0, 25, 21, 5, 2, 1, 0);
|
||||
ExpectUkmEntry(origin, 21, 25, 84, 1, true, 2, 5, 1, 2, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest,
|
||||
RecordUkmMetricsOnDestroy_AudioContextOnly) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 24, 20, 2, 1);
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 24, 20, 2, 1);
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
EXPECT_FALSE(WasSignificantAudioContextPlaybackRecorded());
|
||||
SimulateAudioContextStarted(0);
|
||||
@ -1023,27 +1026,27 @@ TEST_F(MediaEngagementContentsObserverTest,
|
||||
SimulateDestroy();
|
||||
|
||||
// AudioContext playbacks should count as a significant playback.
|
||||
ExpectScores(url, 21.0 / 25.0, 25, 21, 2, 1, 0, 1);
|
||||
ExpectUkmEntry(url, 21, 25, 84, 0, true, 0, 2, 0, 1, 0);
|
||||
ExpectScores(origin, 21.0 / 25.0, 25, 21, 2, 1, 0, 1);
|
||||
ExpectUkmEntry(origin, 21, 25, 84, 0, true, 0, 2, 0, 1, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest,
|
||||
RecordUkmMetricsOnDestroy_NoPlaybacks) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 24, 20, 2, 1);
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 24, 20, 2, 1);
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
EXPECT_FALSE(WasSignificantPlaybackRecorded());
|
||||
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 20.0 / 25.0, 25, 20, 2, 1, 0, 0);
|
||||
ExpectUkmEntry(url, 20, 25, 80, 0, true, 0, 2, 0, 1, 0);
|
||||
ExpectScores(origin, 20.0 / 25.0, 25, 20, 2, 1, 0, 0);
|
||||
ExpectUkmEntry(origin, 20, 25, 80, 0, true, 0, 2, 0, 1, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, RecordUkmMetricsOnNavigate) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 24, 20, 3, 1);
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 24, 20, 3, 1);
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
EXPECT_FALSE(WasSignificantPlaybackRecorded());
|
||||
SimulateSignificantVideoPlayer(0);
|
||||
@ -1053,15 +1056,15 @@ TEST_F(MediaEngagementContentsObserverTest, RecordUkmMetricsOnNavigate) {
|
||||
EXPECT_TRUE(WasSignificantPlaybackRecorded());
|
||||
|
||||
Navigate(GURL("https://www.example.org"));
|
||||
ExpectScores(url, 21.0 / 25.0, 25, 21, 5, 2, 1, 0);
|
||||
ExpectUkmEntry(url, 21, 25, 84, 1, true, 2, 5, 1, 2, 0);
|
||||
ExpectScores(origin, 21.0 / 25.0, 25, 21, 5, 2, 1, 0);
|
||||
ExpectUkmEntry(origin, 21, 25, 84, 1, true, 2, 5, 1, 2, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest,
|
||||
RecordUkmMetricsOnNavigate_AudioContextOnly) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 24, 20, 2, 1);
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 24, 20, 2, 1);
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
EXPECT_FALSE(WasSignificantAudioContextPlaybackRecorded());
|
||||
SimulateAudioContextStarted(0);
|
||||
@ -1072,30 +1075,30 @@ TEST_F(MediaEngagementContentsObserverTest,
|
||||
Navigate(GURL("https://www.example.org"));
|
||||
|
||||
// AudioContext playbacks should count as a media playback.
|
||||
ExpectScores(url, 21.0 / 25.0, 25, 21, 2, 1, 0, 1);
|
||||
ExpectUkmEntry(url, 21, 25, 84, 0, true, 0, 2, 0, 1, 0);
|
||||
ExpectScores(origin, 21.0 / 25.0, 25, 21, 2, 1, 0, 1);
|
||||
ExpectUkmEntry(origin, 21, 25, 84, 0, true, 0, 2, 0, 1, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest,
|
||||
RecordUkmMetricsOnNavigate_NoPlaybacks) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 27, 6, 2, 1);
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 27, 6, 2, 1);
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
EXPECT_FALSE(WasSignificantPlaybackRecorded());
|
||||
|
||||
Navigate(GURL("https://www.example.org"));
|
||||
ExpectScores(url, 6 / 28.0, 28, 6, 2, 1, 0, 0);
|
||||
ExpectUkmEntry(url, 6, 28, 21, 0, false, 0, 2, 0, 1, 0);
|
||||
ExpectScores(origin, 6 / 28.0, 28, 6, 2, 1, 0, 0);
|
||||
ExpectUkmEntry(origin, 6, 28, 21, 0, false, 0, 2, 0, 1, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest,
|
||||
RecordUkmMetrics_MultiplePlaybackTime) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 24, 20, 3, 1);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 24, 20, 3, 1);
|
||||
Advance15Minutes();
|
||||
SetLastPlaybackTime(url, Now());
|
||||
Navigate(url);
|
||||
SetLastPlaybackTime(origin, Now());
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
Advance15Minutes();
|
||||
const base::Time first = Now();
|
||||
@ -1108,9 +1111,9 @@ TEST_F(MediaEngagementContentsObserverTest,
|
||||
SimulateSignificantPlaybackTimeForPlayer(1);
|
||||
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 21.0 / 25.0, 25, 21, 5, 3, 1, 0);
|
||||
ExpectLastPlaybackTime(url, first);
|
||||
ExpectUkmEntry(url, 21, 25, 84, 1, true, 2, 5, 2, 3, 900);
|
||||
ExpectScores(origin, 21.0 / 25.0, 25, 21, 5, 3, 1, 0);
|
||||
ExpectLastPlaybackTime(origin, first);
|
||||
ExpectUkmEntry(origin, 21, 25, 84, 1, true, 2, 5, 2, 3, 900);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, DoNotCreateSessionOnInternalUrl) {
|
||||
@ -1130,8 +1133,8 @@ TEST_F(MediaEngagementContentsObserverTest, DoNotCreateSessionOnInternalUrl) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, RecordAudiblePlayers_OnDestroy) {
|
||||
GURL url("https://www.google.com");
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
// Start three audible players and three in-audible players and also create
|
||||
// one twice.
|
||||
@ -1158,12 +1161,12 @@ TEST_F(MediaEngagementContentsObserverTest, RecordAudiblePlayers_OnDestroy) {
|
||||
|
||||
// Test that when we destroy the audible players the scores are recorded.
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 0.05, 1, 1, 3, 3, 1, 0);
|
||||
ExpectScores(origin, 0.05, 1, 1, 3, 3, 1, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, RecordAudiblePlayers_OnNavigate) {
|
||||
GURL url("https://www.google.com");
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
// Start three audible players and three in-audible players and also create
|
||||
// one twice.
|
||||
@ -1191,24 +1194,24 @@ TEST_F(MediaEngagementContentsObserverTest, RecordAudiblePlayers_OnNavigate) {
|
||||
Navigate(GURL("https://www.google.com/test"));
|
||||
SimulateSignificantAudioPlayer(1);
|
||||
SimulateLongMediaPlayback(1);
|
||||
ExpectScores(url, 0.0, 0, 0, 0, 0, 0, 0);
|
||||
ExpectScores(origin, 0.0, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
// Test that when we navigate to a new origin the audible players the scores
|
||||
// are recorded.
|
||||
Navigate(GURL("https://www.google.co.uk"));
|
||||
ExpectScores(url, 0.05, 1, 1, 4, 3, 1, 0);
|
||||
ExpectScores(origin, 0.05, 1, 1, 4, 3, 1, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, TimerSpecificToPlayer) {
|
||||
GURL url("https://www.google.com");
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
SimulateSignificantVideoPlayer(0);
|
||||
SimulateLongMediaPlayback(0);
|
||||
ForceUpdateTimer(1);
|
||||
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 0, 1, 0, 1, 0, 0, 0);
|
||||
ExpectScores(origin, 0, 1, 0, 1, 0, 0, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, PagePlayerTimersDifferent) {
|
||||
@ -1229,26 +1232,26 @@ TEST_F(MediaEngagementContentsObserverTest, PagePlayerTimersDifferent) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, SignificantAudibleTabMuted_On) {
|
||||
GURL url("https://www.google.com");
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
Navigate(origin.GetURL());
|
||||
SimulateSignificantVideoPlayer(0);
|
||||
|
||||
web_contents()->SetAudioMuted(true);
|
||||
SimulateSignificantPlaybackTimeForPlayer(0);
|
||||
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 0, 1, 0, 1, 0, 0, 0);
|
||||
ExpectScores(origin, 0, 1, 0, 1, 0, 0, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, SignificantAudibleTabMuted_Off) {
|
||||
GURL url("https://www.google.com");
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
Navigate(origin.GetURL());
|
||||
SimulateSignificantVideoPlayer(0);
|
||||
|
||||
SimulateSignificantPlaybackTimeForPlayer(0);
|
||||
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 0, 1, 0, 1, 1, 0, 0);
|
||||
ExpectScores(origin, 0, 1, 0, 1, 1, 0, 0);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, RecordPlaybackTime) {
|
||||
@ -1270,8 +1273,8 @@ TEST_F(MediaEngagementContentsObserverTest, RecordPlaybackTime) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, ShortMediaIgnored) {
|
||||
GURL url("https://www.google.com");
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
// Start three audible players.
|
||||
SimulateSignificantAudioPlayer(0);
|
||||
@ -1289,13 +1292,13 @@ TEST_F(MediaEngagementContentsObserverTest, ShortMediaIgnored) {
|
||||
// Test that when we navigate to a new origin the audible players the scores
|
||||
// are recorded and we log extra UKM events with the times.
|
||||
Navigate(GURL("https://www.google.co.uk"));
|
||||
ExpectScores(url, 0, 1, 0, 2, 2, 0, 0);
|
||||
ExpectUkmIgnoredEntries(url, std::vector<int64_t>{1000, 2000});
|
||||
ExpectScores(origin, 0, 1, 0, 2, 2, 0, 0);
|
||||
ExpectUkmIgnoredEntries(origin, std::vector<int64_t>{1000, 2000});
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, TotalTimeUsedInShortCalculation) {
|
||||
GURL url("https://www.google.com");
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
SimulateSignificantAudioPlayer(0);
|
||||
SimulatePlaybackStoppedWithTime(0, false, base::TimeDelta::FromSeconds(8));
|
||||
@ -1306,32 +1309,34 @@ TEST_F(MediaEngagementContentsObserverTest, TotalTimeUsedInShortCalculation) {
|
||||
ExpectPlaybackTime(0, base::TimeDelta::FromSeconds(10));
|
||||
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 0, 1, 0, 1, 1, 0, 0);
|
||||
ExpectNoUkmIgnoreEntry(url);
|
||||
ExpectScores(origin, 0, 1, 0, 1, 1, 0, 0);
|
||||
ExpectNoUkmIgnoreEntry();
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, OnlyIgnoreFinishedMedia) {
|
||||
GURL url("https://www.google.com");
|
||||
Navigate(url);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
Navigate(origin.GetURL());
|
||||
|
||||
SimulateSignificantAudioPlayer(0);
|
||||
SimulatePlaybackStoppedWithTime(0, false, base::TimeDelta::FromSeconds(2));
|
||||
|
||||
SimulateDestroy();
|
||||
ExpectScores(url, 0, 1, 0, 1, 0, 0, 0);
|
||||
ExpectNoUkmIgnoreEntry(url);
|
||||
ExpectScores(origin, 0, 1, 0, 1, 0, 0, 0);
|
||||
ExpectNoUkmIgnoreEntry();
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, GetOrCreateSession_SpecialURLs) {
|
||||
std::vector<GURL> urls = {
|
||||
std::vector<url::Origin> origins = {
|
||||
// chrome:// and about: URLs don't use MEI.
|
||||
GURL("about:blank"), GURL("chrome://settings"),
|
||||
url::Origin::Create(GURL("about:blank")),
|
||||
url::Origin::Create(GURL("chrome://settings")),
|
||||
// Only http/https URLs use MEI, ignoring other protocals.
|
||||
GURL("file:///tmp/"), GURL("foobar://"),
|
||||
url::Origin::Create(GURL("file:///tmp/")),
|
||||
url::Origin::Create(GURL("foobar://")),
|
||||
};
|
||||
|
||||
for (const GURL& url : urls)
|
||||
EXPECT_EQ(nullptr, GetOrCreateSession(url::Origin::Create(url), nullptr));
|
||||
for (const url::Origin& origin : origins)
|
||||
EXPECT_EQ(nullptr, GetOrCreateSession(origin, nullptr));
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, GetOrCreateSession_NoOpener) {
|
||||
@ -1342,8 +1347,10 @@ TEST_F(MediaEngagementContentsObserverTest, GetOrCreateSession_NoOpener) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, GetOrCreateSession_WithOpener) {
|
||||
const GURL& url = GURL("https://example.com");
|
||||
const GURL& cross_origin_url = GURL("https://second.example.com");
|
||||
const url::Origin origin =
|
||||
url::Origin::Create(GURL("https://www.example.com"));
|
||||
const url::Origin cross_origin =
|
||||
url::Origin::Create(GURL("https://second.example.com"));
|
||||
|
||||
// Regular URLs with an |opener| from a different origin have a new session.
|
||||
std::unique_ptr<content::WebContents> opener(
|
||||
@ -1352,15 +1359,17 @@ TEST_F(MediaEngagementContentsObserverTest, GetOrCreateSession_WithOpener) {
|
||||
MediaEngagementContentsObserver* other_observer =
|
||||
CreateContentsObserverFor(opener.get());
|
||||
content::WebContentsTester::For(opener.get())
|
||||
->NavigateAndCommit(cross_origin_url);
|
||||
->NavigateAndCommit(cross_origin.GetURL());
|
||||
EXPECT_NE(GetSessionFor(other_observer),
|
||||
GetOrCreateSession(url::Origin::Create(url), opener.get()));
|
||||
GetOrCreateSession(origin, opener.get()));
|
||||
|
||||
// Same origin gets the session from the opener.
|
||||
content::WebContentsTester::For(web_contents())->NavigateAndCommit(url);
|
||||
content::WebContentsTester::For(opener.get())->NavigateAndCommit(url);
|
||||
content::WebContentsTester::For(web_contents())
|
||||
->NavigateAndCommit(origin.GetURL());
|
||||
content::WebContentsTester::For(opener.get())
|
||||
->NavigateAndCommit(origin.GetURL());
|
||||
EXPECT_EQ(GetSessionFor(other_observer),
|
||||
GetOrCreateSession(url::Origin::Create(url), opener.get()));
|
||||
GetOrCreateSession(origin, opener.get()));
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementContentsObserverTest, IgnoreAudioContextIfDisabled) {
|
||||
|
@ -43,13 +43,14 @@ const double kHighScoreUpperThresholdParamDefault = 0.3;
|
||||
|
||||
std::unique_ptr<base::DictionaryValue> GetMediaEngagementScoreDictForSettings(
|
||||
const HostContentSettingsMap* settings,
|
||||
const GURL& origin_url) {
|
||||
const url::Origin& origin) {
|
||||
if (!settings)
|
||||
return std::make_unique<base::DictionaryValue>();
|
||||
|
||||
std::unique_ptr<base::DictionaryValue> value =
|
||||
base::DictionaryValue::From(settings->GetWebsiteSetting(
|
||||
origin_url, origin_url, CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), origin.GetURL(),
|
||||
CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), nullptr));
|
||||
|
||||
if (value.get())
|
||||
@ -88,7 +89,7 @@ int MediaEngagementScore::GetScoreMinVisits() {
|
||||
}
|
||||
|
||||
MediaEngagementScore::MediaEngagementScore(base::Clock* clock,
|
||||
const GURL& origin,
|
||||
const url::Origin& origin,
|
||||
HostContentSettingsMap* settings)
|
||||
: MediaEngagementScore(
|
||||
clock,
|
||||
@ -98,7 +99,7 @@ MediaEngagementScore::MediaEngagementScore(base::Clock* clock,
|
||||
|
||||
MediaEngagementScore::MediaEngagementScore(
|
||||
base::Clock* clock,
|
||||
const GURL& origin,
|
||||
const url::Origin& origin,
|
||||
std::unique_ptr<base::DictionaryValue> score_dict,
|
||||
HostContentSettingsMap* settings)
|
||||
: origin_(origin),
|
||||
@ -176,11 +177,15 @@ MediaEngagementScore& MediaEngagementScore::operator=(MediaEngagementScore&&) =
|
||||
|
||||
void MediaEngagementScore::Commit() {
|
||||
DCHECK(settings_map_);
|
||||
|
||||
if (origin_.opaque())
|
||||
return;
|
||||
|
||||
if (!UpdateScoreDict())
|
||||
return;
|
||||
|
||||
settings_map_->SetWebsiteSettingDefaultScope(
|
||||
origin_, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin_.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), std::move(score_dict_));
|
||||
}
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include "base/values.h"
|
||||
#include "chrome/browser/media/media_engagement_score_details.mojom.h"
|
||||
#include "components/content_settings/core/browser/host_content_settings_map.h"
|
||||
#include "url/gurl.h"
|
||||
#include "url/origin.h"
|
||||
|
||||
class HostContentSettingsMap;
|
||||
|
||||
@ -54,7 +54,7 @@ class MediaEngagementScore final {
|
||||
static double GetHighScoreUpperThreshold();
|
||||
|
||||
MediaEngagementScore(base::Clock* clock,
|
||||
const GURL& origin,
|
||||
const url::Origin& origin,
|
||||
HostContentSettingsMap* settings);
|
||||
~MediaEngagementScore();
|
||||
|
||||
@ -71,7 +71,7 @@ class MediaEngagementScore final {
|
||||
int high_score_changes() const { return high_score_changes_; }
|
||||
|
||||
// Returns the origin associated with this score.
|
||||
const GURL& origin() const { return origin_; }
|
||||
const url::Origin& origin() const { return origin_; }
|
||||
|
||||
// Writes the values in this score into |settings_map_|. If there are multiple
|
||||
// instances of a score object for an origin, this could result in stale data
|
||||
@ -137,7 +137,7 @@ class MediaEngagementScore final {
|
||||
|
||||
// Only used by the Media Engagement service when bulk loading data.
|
||||
MediaEngagementScore(base::Clock* clock,
|
||||
const GURL& origin,
|
||||
const url::Origin& origin,
|
||||
std::unique_ptr<base::DictionaryValue> score_dict,
|
||||
HostContentSettingsMap* settings);
|
||||
|
||||
@ -209,7 +209,7 @@ class MediaEngagementScore final {
|
||||
int audio_context_playbacks_ = 0;
|
||||
|
||||
// The origin this score represents.
|
||||
GURL origin_;
|
||||
url::Origin origin_;
|
||||
|
||||
// A clock that can be used for testing, owned by the service.
|
||||
base::Clock* clock_;
|
||||
|
@ -4,10 +4,10 @@
|
||||
|
||||
module media.mojom;
|
||||
|
||||
import "url/mojom/url.mojom";
|
||||
import "url/mojom/origin.mojom";
|
||||
|
||||
struct MediaEngagementScoreDetails {
|
||||
url.mojom.Url origin;
|
||||
url.mojom.Origin origin;
|
||||
double total_score;
|
||||
|
||||
// Details of the components which make up |score|.
|
||||
|
@ -48,7 +48,7 @@ class MediaEngagementScoreTest : public ChromeRenderViewHostTestHarness {
|
||||
void SetUp() override {
|
||||
ChromeRenderViewHostTestHarness::SetUp();
|
||||
test_clock.SetNow(GetReferenceTime());
|
||||
score_ = new MediaEngagementScore(&test_clock, GURL(), nullptr);
|
||||
score_ = new MediaEngagementScore(&test_clock, url::Origin(), nullptr);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
@ -109,8 +109,9 @@ class MediaEngagementScoreTest : public ChromeRenderViewHostTestHarness {
|
||||
int high_score_changes,
|
||||
int media_element_playbacks,
|
||||
int audio_context_playbacks) {
|
||||
MediaEngagementScore* initial_score = new MediaEngagementScore(
|
||||
&test_clock, GURL(), std::move(score_dict), nullptr /* settings */);
|
||||
MediaEngagementScore* initial_score =
|
||||
new MediaEngagementScore(&test_clock, url::Origin(),
|
||||
std::move(score_dict), nullptr /* settings */);
|
||||
VerifyScore(initial_score, expected_visits, expected_media_playbacks,
|
||||
expected_last_media_playback_time, has_high_score,
|
||||
audible_playbacks, significant_playbacks, visits_with_media_tag,
|
||||
@ -237,13 +238,13 @@ TEST_F(MediaEngagementScoreTest, PopulatedDictionary) {
|
||||
// Test getting and commiting the score works correctly with different
|
||||
// origins.
|
||||
TEST_F(MediaEngagementScoreTest, ContentSettingsMultiOrigin) {
|
||||
GURL url("https://www.google.com");
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
|
||||
// Replace |score_| with one with an actual URL, and with a settings map.
|
||||
HostContentSettingsMap* settings_map =
|
||||
HostContentSettingsMapFactory::GetForProfile(profile());
|
||||
MediaEngagementScore* score =
|
||||
new MediaEngagementScore(&test_clock, url, settings_map);
|
||||
new MediaEngagementScore(&test_clock, origin, settings_map);
|
||||
|
||||
// Verify the score is originally zero, try incrementing and storing
|
||||
// the score.
|
||||
@ -254,10 +255,11 @@ TEST_F(MediaEngagementScoreTest, ContentSettingsMultiOrigin) {
|
||||
|
||||
// Now confirm the correct score is present on the same origin,
|
||||
// but zero for a different origin.
|
||||
GURL same_origin("https://www.google.com");
|
||||
GURL different_origin("https://www.google.co.uk");
|
||||
url::Origin same_origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
url::Origin different_origin =
|
||||
url::Origin::Create(GURL("https://www.google.co.uk"));
|
||||
MediaEngagementScore* new_score =
|
||||
new MediaEngagementScore(&test_clock, url, settings_map);
|
||||
new MediaEngagementScore(&test_clock, origin, settings_map);
|
||||
MediaEngagementScore* same_origin_score =
|
||||
new MediaEngagementScore(&test_clock, same_origin, settings_map);
|
||||
MediaEngagementScore* different_origin_score =
|
||||
@ -288,7 +290,7 @@ TEST_F(MediaEngagementScoreTest, ContentSettings) {
|
||||
int example_audio_context_playbacks = 3;
|
||||
|
||||
// Store some example data in content settings.
|
||||
GURL origin("https://www.google.com");
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
std::unique_ptr<base::DictionaryValue> score_dict =
|
||||
std::make_unique<base::DictionaryValue>();
|
||||
score_dict->SetInteger(MediaEngagementScore::kVisitsKey, example_num_visits);
|
||||
@ -311,7 +313,7 @@ TEST_F(MediaEngagementScoreTest, ContentSettings) {
|
||||
MediaEngagementScore::kSignificantAudioContextPlaybacksKey,
|
||||
example_audio_context_playbacks);
|
||||
settings_map->SetWebsiteSettingDefaultScope(
|
||||
origin, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), std::move(score_dict));
|
||||
|
||||
// Make sure we read that data back correctly.
|
||||
@ -347,7 +349,7 @@ TEST_F(MediaEngagementScoreTest, ContentSettings) {
|
||||
int stored_audio_context_playbacks;
|
||||
std::unique_ptr<base::DictionaryValue> values =
|
||||
base::DictionaryValue::From(settings_map->GetWebsiteSetting(
|
||||
origin, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), nullptr));
|
||||
values->GetInteger(MediaEngagementScore::kVisitsKey, &stored_visits);
|
||||
values->GetInteger(MediaEngagementScore::kMediaPlaybacksKey,
|
||||
@ -402,7 +404,8 @@ TEST_F(MediaEngagementScoreTest, EngagementScoreCalculation) {
|
||||
|
||||
// Test that a score without the high_score bit uses the correct bounds.
|
||||
TEST_F(MediaEngagementScoreTest, HighScoreLegacy_High) {
|
||||
const GURL url("https://www.example.com");
|
||||
const url::Origin origin =
|
||||
url::Origin::Create(GURL("https://www.example.com"));
|
||||
HostContentSettingsMap* settings_map =
|
||||
HostContentSettingsMapFactory::GetForProfile(profile());
|
||||
|
||||
@ -411,20 +414,21 @@ TEST_F(MediaEngagementScoreTest, HighScoreLegacy_High) {
|
||||
dict->SetInteger(MediaEngagementScore::kVisitsKey, 20);
|
||||
dict->SetInteger(MediaEngagementScore::kMediaPlaybacksKey, 6);
|
||||
settings_map->SetWebsiteSettingDefaultScope(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), std::move(dict));
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, url, settings_map));
|
||||
new MediaEngagementScore(&test_clock, origin, settings_map));
|
||||
VerifyScore(score.get(), 20, 6, base::Time(), true, 0, 0, 0, 1, 6, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// Test that a score without the high_score bit uses the correct bounds.
|
||||
TEST_F(MediaEngagementScoreTest, HighScoreLegacy_Low) {
|
||||
const GURL url("https://www.example.com");
|
||||
const url::Origin origin =
|
||||
url::Origin::Create(GURL("https://www.example.com"));
|
||||
HostContentSettingsMap* settings_map =
|
||||
HostContentSettingsMapFactory::GetForProfile(profile());
|
||||
|
||||
@ -433,13 +437,13 @@ TEST_F(MediaEngagementScoreTest, HighScoreLegacy_Low) {
|
||||
dict->SetInteger(MediaEngagementScore::kVisitsKey, 20);
|
||||
dict->SetInteger(MediaEngagementScore::kMediaPlaybacksKey, 4);
|
||||
settings_map->SetWebsiteSettingDefaultScope(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), std::move(dict));
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, url, settings_map));
|
||||
new MediaEngagementScore(&test_clock, origin, settings_map));
|
||||
VerifyScore(score.get(), 20, 4, base::Time(), false, 0, 0, 0, 0, 4, 0);
|
||||
}
|
||||
}
|
||||
@ -447,7 +451,8 @@ TEST_F(MediaEngagementScoreTest, HighScoreLegacy_Low) {
|
||||
// Test that if we changed the boundaries the high_score bit is updated
|
||||
// when the score is loaded.
|
||||
TEST_F(MediaEngagementScoreTest, HighScoreUpdated) {
|
||||
const GURL url("https://www.example.com");
|
||||
const url::Origin origin =
|
||||
url::Origin::Create(GURL("https://www.example.com"));
|
||||
HostContentSettingsMap* settings_map =
|
||||
HostContentSettingsMapFactory::GetForProfile(profile());
|
||||
|
||||
@ -460,13 +465,13 @@ TEST_F(MediaEngagementScoreTest, HighScoreUpdated) {
|
||||
dict->SetBoolean(MediaEngagementScore::kHasHighScoreKey, true);
|
||||
|
||||
settings_map->SetWebsiteSettingDefaultScope(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), std::move(dict));
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, url, settings_map));
|
||||
new MediaEngagementScore(&test_clock, origin, settings_map));
|
||||
EXPECT_FALSE(score->high_score());
|
||||
base::RunLoop().RunUntilIdle();
|
||||
}
|
||||
@ -474,7 +479,7 @@ TEST_F(MediaEngagementScoreTest, HighScoreUpdated) {
|
||||
{
|
||||
std::unique_ptr<base::DictionaryValue> dict =
|
||||
base::DictionaryValue::From(settings_map->GetWebsiteSetting(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), nullptr));
|
||||
|
||||
bool stored_high_score = false;
|
||||
@ -538,13 +543,14 @@ TEST_F(MediaEngagementScoreTest, OverrideFieldTrial) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementScoreTest, HighScoreChanges) {
|
||||
const GURL kUrl("https://www.example.com");
|
||||
const url::Origin kOrigin =
|
||||
url::Origin::Create(GURL("https://www.example.com"));
|
||||
HostContentSettingsMap* settings_map =
|
||||
HostContentSettingsMapFactory::GetForProfile(profile());
|
||||
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, kUrl, settings_map));
|
||||
new MediaEngagementScore(&test_clock, kOrigin, settings_map));
|
||||
|
||||
EXPECT_EQ(0, score->high_score_changes());
|
||||
// Perfect score, high_score bit has changed.
|
||||
@ -555,7 +561,7 @@ TEST_F(MediaEngagementScoreTest, HighScoreChanges) {
|
||||
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, kUrl, settings_map));
|
||||
new MediaEngagementScore(&test_clock, kOrigin, settings_map));
|
||||
|
||||
// Worse score, high_score bit has changed.
|
||||
SetScore(score.get(), 20, 0);
|
||||
@ -566,7 +572,7 @@ TEST_F(MediaEngagementScoreTest, HighScoreChanges) {
|
||||
// Bad score, high_score bit has not changed.
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, kUrl, settings_map));
|
||||
new MediaEngagementScore(&test_clock, kOrigin, settings_map));
|
||||
|
||||
SetScore(score.get(), 20, 1);
|
||||
score->Commit();
|
||||
@ -576,7 +582,8 @@ TEST_F(MediaEngagementScoreTest, HighScoreChanges) {
|
||||
|
||||
// Test that we migrate the media playbacks value to media element playbacks.
|
||||
TEST_F(MediaEngagementScoreTest, MigrateMediaElementPlaybacks) {
|
||||
const GURL url("https://www.example.com");
|
||||
const url::Origin origin =
|
||||
url::Origin::Create(GURL("https://www.example.com"));
|
||||
HostContentSettingsMap* settings_map =
|
||||
HostContentSettingsMapFactory::GetForProfile(profile());
|
||||
int media_playbacks = 6;
|
||||
@ -587,13 +594,13 @@ TEST_F(MediaEngagementScoreTest, MigrateMediaElementPlaybacks) {
|
||||
dict->SetInteger(MediaEngagementScore::kMediaPlaybacksKey, media_playbacks);
|
||||
|
||||
settings_map->SetWebsiteSettingDefaultScope(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), std::move(dict));
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, url, settings_map));
|
||||
new MediaEngagementScore(&test_clock, origin, settings_map));
|
||||
EXPECT_EQ(media_playbacks, score->media_playbacks());
|
||||
EXPECT_EQ(media_playbacks, score->media_element_playbacks());
|
||||
|
||||
@ -603,7 +610,7 @@ TEST_F(MediaEngagementScoreTest, MigrateMediaElementPlaybacks) {
|
||||
{
|
||||
std::unique_ptr<base::DictionaryValue> dict =
|
||||
base::DictionaryValue::From(settings_map->GetWebsiteSetting(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), nullptr));
|
||||
|
||||
int stored_media_playbacks = 0;
|
||||
@ -623,7 +630,8 @@ TEST_F(MediaEngagementScoreTest, MigrateMediaElementPlaybacks) {
|
||||
// context playback.
|
||||
TEST_F(MediaEngagementScoreTest,
|
||||
NoMigrateMediaElementPlaybacks_AudioContextPresent) {
|
||||
const GURL url("https://www.example.com");
|
||||
const url::Origin origin =
|
||||
url::Origin::Create(GURL("https://www.example.com"));
|
||||
HostContentSettingsMap* settings_map =
|
||||
HostContentSettingsMapFactory::GetForProfile(profile());
|
||||
int media_playbacks = 6;
|
||||
@ -637,13 +645,13 @@ TEST_F(MediaEngagementScoreTest,
|
||||
audio_context_playbacks);
|
||||
|
||||
settings_map->SetWebsiteSettingDefaultScope(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), std::move(dict));
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, url, settings_map));
|
||||
new MediaEngagementScore(&test_clock, origin, settings_map));
|
||||
EXPECT_EQ(media_playbacks, score->media_playbacks());
|
||||
EXPECT_EQ(0, score->media_element_playbacks());
|
||||
EXPECT_EQ(audio_context_playbacks, score->audio_context_playbacks());
|
||||
@ -654,7 +662,7 @@ TEST_F(MediaEngagementScoreTest,
|
||||
{
|
||||
std::unique_ptr<base::DictionaryValue> dict =
|
||||
base::DictionaryValue::From(settings_map->GetWebsiteSetting(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), nullptr));
|
||||
|
||||
EXPECT_NE(nullptr, dict->FindKey(MediaEngagementScore::kMediaPlaybacksKey));
|
||||
@ -668,7 +676,8 @@ TEST_F(MediaEngagementScoreTest,
|
||||
// element playback.
|
||||
TEST_F(MediaEngagementScoreTest,
|
||||
NoMigrateMediaElementPlaybacks_MediaElementPresent) {
|
||||
const GURL url("https://www.example.com");
|
||||
const url::Origin origin =
|
||||
url::Origin::Create(GURL("https://www.example.com"));
|
||||
HostContentSettingsMap* settings_map =
|
||||
HostContentSettingsMapFactory::GetForProfile(profile());
|
||||
int media_playbacks = 6;
|
||||
@ -682,13 +691,13 @@ TEST_F(MediaEngagementScoreTest,
|
||||
media_element_playbacks);
|
||||
|
||||
settings_map->SetWebsiteSettingDefaultScope(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), std::move(dict));
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<MediaEngagementScore> score(
|
||||
new MediaEngagementScore(&test_clock, url, settings_map));
|
||||
new MediaEngagementScore(&test_clock, origin, settings_map));
|
||||
EXPECT_EQ(media_playbacks, score->media_playbacks());
|
||||
EXPECT_EQ(media_element_playbacks, score->media_element_playbacks());
|
||||
|
||||
@ -698,7 +707,7 @@ TEST_F(MediaEngagementScoreTest,
|
||||
{
|
||||
std::unique_ptr<base::DictionaryValue> dict =
|
||||
base::DictionaryValue::From(settings_map->GetWebsiteSetting(
|
||||
url, GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
origin.GetURL(), GURL(), CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT,
|
||||
content_settings::ResourceIdentifier(), nullptr));
|
||||
|
||||
int stored_media_playbacks = 0;
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "components/prefs/pref_service.h"
|
||||
#include "content/public/browser/web_contents.h"
|
||||
#include "media/base/media_switches.h"
|
||||
#include "url/origin.h"
|
||||
|
||||
const char MediaEngagementService::kHistogramURLsDeletedScoreReductionName[] =
|
||||
"Media.Engagement.URLsDeletedScoreReduction";
|
||||
@ -49,12 +50,12 @@ enum class MediaEngagementClearReason {
|
||||
};
|
||||
|
||||
bool MediaEngagementFilterAdapter(
|
||||
const GURL& predicate,
|
||||
const url::Origin& predicate,
|
||||
const ContentSettingsPattern& primary_pattern,
|
||||
const ContentSettingsPattern& secondary_pattern) {
|
||||
GURL url(primary_pattern.ToString());
|
||||
DCHECK(url.is_valid());
|
||||
return predicate == url;
|
||||
url::Origin origin = url::Origin::Create(GURL(primary_pattern.ToString()));
|
||||
DCHECK(!origin.opaque());
|
||||
return predicate == origin;
|
||||
}
|
||||
|
||||
bool MediaEngagementTimeFilterAdapter(
|
||||
@ -63,9 +64,9 @@ bool MediaEngagementTimeFilterAdapter(
|
||||
base::Time delete_end,
|
||||
const ContentSettingsPattern& primary_pattern,
|
||||
const ContentSettingsPattern& secondary_pattern) {
|
||||
GURL url(primary_pattern.ToString());
|
||||
DCHECK(url.is_valid());
|
||||
MediaEngagementScore score = service->CreateEngagementScore(url);
|
||||
url::Origin origin = url::Origin::Create(GURL(primary_pattern.ToString()));
|
||||
DCHECK(!origin.opaque());
|
||||
MediaEngagementScore score = service->CreateEngagementScore(origin);
|
||||
base::Time playback_time = score.last_media_playback_time();
|
||||
return playback_time >= delete_begin && playback_time <= delete_end;
|
||||
}
|
||||
@ -195,9 +196,9 @@ void MediaEngagementService::OnURLsDeleted(
|
||||
DCHECK(history_service);
|
||||
|
||||
// Build a set of all origins in |deleted_rows|.
|
||||
std::set<GURL> origins;
|
||||
std::set<url::Origin> origins;
|
||||
for (const history::URLRow& row : deletion_info.deleted_rows()) {
|
||||
origins.insert(row.url().GetOrigin());
|
||||
origins.insert(url::Origin::Create(row.url()));
|
||||
}
|
||||
|
||||
// Check if any origins no longer have any visits.
|
||||
@ -205,9 +206,9 @@ void MediaEngagementService::OnURLsDeleted(
|
||||
return;
|
||||
}
|
||||
|
||||
std::map<GURL, int> origins;
|
||||
std::map<url::Origin, int> origins;
|
||||
for (const history::URLRow& row : deletion_info.deleted_rows()) {
|
||||
GURL origin = row.url().GetOrigin();
|
||||
url::Origin origin = url::Origin::Create(row.url());
|
||||
if (origins.find(origin) == origins.end()) {
|
||||
origins[origin] = 0;
|
||||
}
|
||||
@ -242,13 +243,13 @@ void MediaEngagementService::OnURLsDeleted(
|
||||
}
|
||||
|
||||
void MediaEngagementService::RemoveOriginsWithNoVisits(
|
||||
const std::set<GURL>& deleted_origins,
|
||||
const std::set<url::Origin>& deleted_origins,
|
||||
const history::OriginCountAndLastVisitMap& origin_data) {
|
||||
// Find all origins that are in |deleted_origins| and not in
|
||||
// |remaining_origins| and clear MEI data on them.
|
||||
bool has_deleted_origins = false;
|
||||
for (const GURL& origin : deleted_origins) {
|
||||
const auto& origin_count = origin_data.find(origin);
|
||||
for (const url::Origin& origin : deleted_origins) {
|
||||
const auto& origin_count = origin_data.find(origin.GetURL());
|
||||
if (origin_count == origin_data.end() || origin_count->second.first > 0)
|
||||
continue;
|
||||
|
||||
@ -260,34 +261,38 @@ void MediaEngagementService::RemoveOriginsWithNoVisits(
|
||||
RecordClear(MediaEngagementClearReason::kHistoryExpired);
|
||||
}
|
||||
|
||||
void MediaEngagementService::Clear(const GURL& url) {
|
||||
void MediaEngagementService::Clear(const url::Origin& origin) {
|
||||
HostContentSettingsMapFactory::GetForProfile(profile_)
|
||||
->ClearSettingsForOneTypeWithPredicate(
|
||||
CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT, base::Time(),
|
||||
base::Time::Max(),
|
||||
base::Bind(&MediaEngagementFilterAdapter, std::cref(url)));
|
||||
base::BindRepeating(&MediaEngagementFilterAdapter,
|
||||
std::cref(origin)));
|
||||
}
|
||||
|
||||
double MediaEngagementService::GetEngagementScore(const GURL& url) const {
|
||||
return CreateEngagementScore(url).actual_score();
|
||||
double MediaEngagementService::GetEngagementScore(
|
||||
const url::Origin& origin) const {
|
||||
return CreateEngagementScore(origin).actual_score();
|
||||
}
|
||||
|
||||
bool MediaEngagementService::HasHighEngagement(const GURL& url) const {
|
||||
return CreateEngagementScore(url).high_score();
|
||||
bool MediaEngagementService::HasHighEngagement(
|
||||
const url::Origin& origin) const {
|
||||
return CreateEngagementScore(origin).high_score();
|
||||
}
|
||||
|
||||
std::map<GURL, double> MediaEngagementService::GetScoreMapForTesting() const {
|
||||
std::map<GURL, double> score_map;
|
||||
std::map<url::Origin, double> MediaEngagementService::GetScoreMapForTesting()
|
||||
const {
|
||||
std::map<url::Origin, double> score_map;
|
||||
for (MediaEngagementScore& score : GetAllStoredScores())
|
||||
score_map[score.origin()] = score.actual_score();
|
||||
return score_map;
|
||||
}
|
||||
|
||||
void MediaEngagementService::RecordVisit(const GURL& url) {
|
||||
if (!ShouldRecordEngagement(url))
|
||||
void MediaEngagementService::RecordVisit(const url::Origin& origin) {
|
||||
if (!ShouldRecordEngagement(origin))
|
||||
return;
|
||||
|
||||
MediaEngagementScore score = CreateEngagementScore(url);
|
||||
MediaEngagementScore score = CreateEngagementScore(origin);
|
||||
score.IncrementVisits();
|
||||
score.Commit();
|
||||
}
|
||||
@ -305,12 +310,12 @@ MediaEngagementService::GetAllScoreDetails() const {
|
||||
}
|
||||
|
||||
MediaEngagementScore MediaEngagementService::CreateEngagementScore(
|
||||
const GURL& url) const {
|
||||
const url::Origin& origin) const {
|
||||
// If we are in incognito, |settings| will automatically have the data from
|
||||
// the original profile migrated in, so all engagement scores in incognito
|
||||
// will be initialised to the values from the original profile.
|
||||
return MediaEngagementScore(
|
||||
clock_, url, HostContentSettingsMapFactory::GetForProfile(profile_));
|
||||
clock_, origin, HostContentSettingsMapFactory::GetForProfile(profile_));
|
||||
}
|
||||
|
||||
MediaEngagementContentsObserver* MediaEngagementService::GetContentsObserverFor(
|
||||
@ -323,8 +328,10 @@ Profile* MediaEngagementService::profile() const {
|
||||
return profile_;
|
||||
}
|
||||
|
||||
bool MediaEngagementService::ShouldRecordEngagement(const GURL& url) const {
|
||||
return url.SchemeIsHTTPOrHTTPS();
|
||||
bool MediaEngagementService::ShouldRecordEngagement(
|
||||
const url::Origin& origin) const {
|
||||
return (origin.scheme() == url::kHttpsScheme ||
|
||||
origin.scheme() == url::kHttpScheme);
|
||||
}
|
||||
|
||||
std::vector<MediaEngagementScore> MediaEngagementService::GetAllStoredScores()
|
||||
@ -341,11 +348,12 @@ std::vector<MediaEngagementScore> MediaEngagementService::GetAllStoredScores()
|
||||
// `GetSettingsForOneType` mixes incognito and non-incognito results in
|
||||
// incognito profiles creating duplicates. The incognito results are first so
|
||||
// we should discard the results following.
|
||||
std::map<GURL, const ContentSettingPatternSource*> filtered_results;
|
||||
std::map<url::Origin, const ContentSettingPatternSource*> filtered_results;
|
||||
|
||||
for (const auto& site : content_settings) {
|
||||
GURL origin(site.primary_pattern.ToString());
|
||||
if (!origin.is_valid()) {
|
||||
url::Origin origin =
|
||||
url::Origin::Create(GURL(site.primary_pattern.ToString()));
|
||||
if (origin.opaque()) {
|
||||
NOTREACHED();
|
||||
continue;
|
||||
}
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include "components/keyed_service/core/keyed_service.h"
|
||||
#include "components/pref_registry/pref_registry_syncable.h"
|
||||
|
||||
class GURL;
|
||||
class MediaEngagementContentsObserver;
|
||||
class MediaEngagementScore;
|
||||
class Profile;
|
||||
@ -34,6 +33,10 @@ namespace history {
|
||||
class HistoryService;
|
||||
}
|
||||
|
||||
namespace url {
|
||||
class Origin;
|
||||
} // namespace url
|
||||
|
||||
class MediaEngagementService : public KeyedService,
|
||||
public history::HistoryServiceObserver {
|
||||
public:
|
||||
@ -53,17 +56,17 @@ class MediaEngagementService : public KeyedService,
|
||||
explicit MediaEngagementService(Profile* profile);
|
||||
~MediaEngagementService() override;
|
||||
|
||||
// Returns the engagement score of |url|.
|
||||
double GetEngagementScore(const GURL& url) const;
|
||||
// Returns the engagement score of |origin|.
|
||||
double GetEngagementScore(const url::Origin& origin) const;
|
||||
|
||||
// Returns true if |url| has an engagement score considered high.
|
||||
bool HasHighEngagement(const GURL& url) const;
|
||||
// Returns true if |origin| has an engagement score considered high.
|
||||
bool HasHighEngagement(const url::Origin& origin) const;
|
||||
|
||||
// Returns a map of all stored origins and their engagement levels.
|
||||
std::map<GURL, double> GetScoreMapForTesting() const;
|
||||
std::map<url::Origin, double> GetScoreMapForTesting() const;
|
||||
|
||||
// Record a visit of a |url|.
|
||||
void RecordVisit(const GURL& url);
|
||||
// Record a visit of a |origin|.
|
||||
void RecordVisit(const url::Origin& origin);
|
||||
|
||||
// Returns an array of engagement score details for all origins which
|
||||
// have a score.
|
||||
@ -81,8 +84,8 @@ class MediaEngagementService : public KeyedService,
|
||||
void ClearDataBetweenTime(const base::Time& delete_begin,
|
||||
const base::Time& delete_end);
|
||||
|
||||
// Retrieves the MediaEngagementScore for |url|.
|
||||
MediaEngagementScore CreateEngagementScore(const GURL& url) const;
|
||||
// Retrieves the MediaEngagementScore for |origin|.
|
||||
MediaEngagementScore CreateEngagementScore(const url::Origin& origin) const;
|
||||
|
||||
MediaEngagementContentsObserver* GetContentsObserverFor(
|
||||
content::WebContents* web_contents) const;
|
||||
@ -110,7 +113,7 @@ class MediaEngagementService : public KeyedService,
|
||||
|
||||
// Returns true if we should record engagement for this url. Currently,
|
||||
// engagement is only earned for HTTP and HTTPS.
|
||||
bool ShouldRecordEngagement(const GURL& url) const;
|
||||
bool ShouldRecordEngagement(const url::Origin& origin) const;
|
||||
|
||||
base::flat_map<content::WebContents*, MediaEngagementContentsObserver*>
|
||||
contents_observers_;
|
||||
@ -118,7 +121,7 @@ class MediaEngagementService : public KeyedService,
|
||||
Profile* profile_;
|
||||
|
||||
// Clear any data for a specific origin.
|
||||
void Clear(const GURL& url);
|
||||
void Clear(const url::Origin& origin);
|
||||
|
||||
// An internal clock for testing.
|
||||
base::Clock* clock_;
|
||||
@ -132,7 +135,7 @@ class MediaEngagementService : public KeyedService,
|
||||
// history service, represented as `origin_data`. This is meant to be used
|
||||
// when the service receives a notification of history expiration.
|
||||
void RemoveOriginsWithNoVisits(
|
||||
const std::set<GURL>& deleted_origins,
|
||||
const std::set<url::Origin>& deleted_origins,
|
||||
const history::OriginCountAndLastVisitMap& origin_data);
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(MediaEngagementService);
|
||||
|
@ -159,10 +159,10 @@ class MediaEngagementServiceTest : public ChromeRenderViewHostTestHarness {
|
||||
history->AddObserver(service());
|
||||
}
|
||||
|
||||
void RecordVisitAndPlaybackAndAdvanceClock(GURL url) {
|
||||
RecordVisit(url);
|
||||
void RecordVisitAndPlaybackAndAdvanceClock(const url::Origin& origin) {
|
||||
RecordVisit(origin);
|
||||
AdvanceClock();
|
||||
RecordPlayback(url);
|
||||
RecordPlayback(origin);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
@ -175,63 +175,64 @@ class MediaEngagementServiceTest : public ChromeRenderViewHostTestHarness {
|
||||
test_clock_.SetNow(Now() + base::TimeDelta::FromHours(1));
|
||||
}
|
||||
|
||||
void RecordVisit(GURL url) { service_->RecordVisit(url); }
|
||||
void RecordVisit(const url::Origin& origin) { service_->RecordVisit(origin); }
|
||||
|
||||
void RecordPlayback(GURL url) {
|
||||
RecordPlaybackForService(service_.get(), url);
|
||||
void RecordPlayback(const url::Origin& origin) {
|
||||
RecordPlaybackForService(service_.get(), origin);
|
||||
}
|
||||
|
||||
void RecordPlaybackForService(MediaEngagementService* service, GURL url) {
|
||||
MediaEngagementScore score = service->CreateEngagementScore(url);
|
||||
void RecordPlaybackForService(MediaEngagementService* service,
|
||||
const url::Origin& origin) {
|
||||
MediaEngagementScore score = service->CreateEngagementScore(origin);
|
||||
score.IncrementMediaPlaybacks();
|
||||
score.set_last_media_playback_time(service->clock()->Now());
|
||||
score.Commit();
|
||||
}
|
||||
|
||||
void ExpectScores(MediaEngagementService* service,
|
||||
GURL url,
|
||||
const url::Origin& origin,
|
||||
double expected_score,
|
||||
int expected_visits,
|
||||
int expected_media_playbacks,
|
||||
base::Time expected_last_media_playback_time) {
|
||||
EXPECT_EQ(service->GetEngagementScore(url), expected_score);
|
||||
EXPECT_EQ(service->GetScoreMapForTesting()[url], expected_score);
|
||||
EXPECT_EQ(service->GetEngagementScore(origin), expected_score);
|
||||
EXPECT_EQ(service->GetScoreMapForTesting()[origin], expected_score);
|
||||
|
||||
MediaEngagementScore score = service->CreateEngagementScore(url);
|
||||
MediaEngagementScore score = service->CreateEngagementScore(origin);
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_media_playbacks, score.media_playbacks());
|
||||
EXPECT_EQ(expected_last_media_playback_time,
|
||||
score.last_media_playback_time());
|
||||
}
|
||||
|
||||
void ExpectScores(GURL url,
|
||||
void ExpectScores(const url::Origin& origin,
|
||||
double expected_score,
|
||||
int expected_visits,
|
||||
int expected_media_playbacks,
|
||||
base::Time expected_last_media_playback_time) {
|
||||
ExpectScores(service_.get(), url, expected_score, expected_visits,
|
||||
ExpectScores(service_.get(), origin, expected_score, expected_visits,
|
||||
expected_media_playbacks, expected_last_media_playback_time);
|
||||
}
|
||||
|
||||
void SetScores(GURL url, int visits, int media_playbacks) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(url);
|
||||
void SetScores(const url::Origin& origin, int visits, int media_playbacks) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin);
|
||||
score.SetVisits(visits);
|
||||
score.SetMediaPlaybacks(media_playbacks);
|
||||
score.Commit();
|
||||
}
|
||||
|
||||
void SetLastMediaPlaybackTime(const GURL& url,
|
||||
void SetLastMediaPlaybackTime(const url::Origin& origin,
|
||||
base::Time last_media_playback_time) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(url);
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin);
|
||||
score.last_media_playback_time_ = last_media_playback_time;
|
||||
score.Commit();
|
||||
}
|
||||
|
||||
double GetActualScore(GURL url) {
|
||||
return service_->CreateEngagementScore(url).actual_score();
|
||||
double GetActualScore(const url::Origin& origin) {
|
||||
return service_->CreateEngagementScore(origin).actual_score();
|
||||
}
|
||||
|
||||
std::map<GURL, double> GetScoreMapForTesting() const {
|
||||
std::map<url::Origin, double> GetScoreMapForTesting() const {
|
||||
return service_->GetScoreMapForTesting();
|
||||
}
|
||||
|
||||
@ -250,8 +251,8 @@ class MediaEngagementServiceTest : public ChromeRenderViewHostTestHarness {
|
||||
return service_->GetAllScoreDetails();
|
||||
}
|
||||
|
||||
bool HasHighEngagement(const GURL& url) const {
|
||||
return service_->HasHighEngagement(url);
|
||||
bool HasHighEngagement(const url::Origin& origin) const {
|
||||
return service_->HasHighEngagement(origin);
|
||||
}
|
||||
|
||||
void SetSchemaVersion(int version) { service_->SetSchemaVersion(version); }
|
||||
@ -281,104 +282,106 @@ class MediaEngagementServiceTest : public ChromeRenderViewHostTestHarness {
|
||||
TEST_F(MediaEngagementServiceTest, MojoSerialization) {
|
||||
EXPECT_EQ(0u, GetAllScoreDetails().size());
|
||||
|
||||
RecordVisitAndPlaybackAndAdvanceClock(GURL("https://www.google.com"));
|
||||
RecordVisitAndPlaybackAndAdvanceClock(
|
||||
url::Origin::Create(GURL("https://www.google.com")));
|
||||
EXPECT_EQ(1u, GetAllScoreDetails().size());
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, RestrictedToHTTPAndHTTPS) {
|
||||
GURL url1("ftp://www.google.com/");
|
||||
GURL url2("file://blah");
|
||||
GURL url3("chrome://");
|
||||
GURL url4("about://config");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("ftp://www.google.com/"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("file://blah"));
|
||||
url::Origin origin3 = url::Origin::Create(GURL("chrome://"));
|
||||
url::Origin origin4 = url::Origin::Create(GURL("about://config"));
|
||||
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url1);
|
||||
ExpectScores(url1, 0.0, 0, 0, TimeNotSet());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin1);
|
||||
ExpectScores(origin1, 0.0, 0, 0, TimeNotSet());
|
||||
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url2);
|
||||
ExpectScores(url2, 0.0, 0, 0, TimeNotSet());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin2);
|
||||
ExpectScores(origin2, 0.0, 0, 0, TimeNotSet());
|
||||
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url3);
|
||||
ExpectScores(url3, 0.0, 0, 0, TimeNotSet());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin4);
|
||||
ExpectScores(origin4, 0.0, 0, 0, TimeNotSet());
|
||||
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url4);
|
||||
ExpectScores(url4, 0.0, 0, 0, TimeNotSet());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin4);
|
||||
ExpectScores(origin4, 0.0, 0, 0, TimeNotSet());
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest,
|
||||
HandleRecordVisitAndPlaybackAndAdvanceClockion) {
|
||||
GURL url1("https://www.google.com");
|
||||
ExpectScores(url1, 0.0, 0, 0, TimeNotSet());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url1);
|
||||
ExpectScores(url1, 0.05, 1, 1, Now());
|
||||
url::Origin origin1 = url::Origin::Create(GURL("https://www.google.com"));
|
||||
ExpectScores(origin1, 0.0, 0, 0, TimeNotSet());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin1);
|
||||
ExpectScores(origin1, 0.05, 1, 1, Now());
|
||||
|
||||
RecordVisit(url1);
|
||||
ExpectScores(url1, 0.05, 2, 1, Now());
|
||||
RecordVisit(origin1);
|
||||
ExpectScores(origin1, 0.05, 2, 1, Now());
|
||||
|
||||
RecordPlayback(url1);
|
||||
ExpectScores(url1, 0.1, 2, 2, Now());
|
||||
base::Time url1_time = Now();
|
||||
RecordPlayback(origin1);
|
||||
ExpectScores(origin1, 0.1, 2, 2, Now());
|
||||
base::Time origin1_time = Now();
|
||||
|
||||
GURL url2("https://www.google.co.uk");
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url2);
|
||||
ExpectScores(url2, 0.05, 1, 1, Now());
|
||||
ExpectScores(url1, 0.1, 2, 2, url1_time);
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://www.google.co.uk"));
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin2);
|
||||
ExpectScores(origin2, 0.05, 1, 1, Now());
|
||||
ExpectScores(origin1, 0.1, 2, 2, origin1_time);
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, IncognitoEngagementService) {
|
||||
GURL url1("http://www.google.com/");
|
||||
GURL url2("https://www.google.com/");
|
||||
GURL url3("https://drive.google.com/");
|
||||
GURL url4("https://maps.google.com/");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("http://www.google.com/"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://www.google.com/"));
|
||||
url::Origin origin3 = url::Origin::Create(GURL("https://drive.google.com/"));
|
||||
url::Origin origin4 = url::Origin::Create(GURL("https://maps.google.com/"));
|
||||
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url1);
|
||||
base::Time url1_time = Now();
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url2);
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin1);
|
||||
base::Time origin1_time = Now();
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin2);
|
||||
|
||||
MediaEngagementService* incognito_service =
|
||||
MediaEngagementService::Get(profile()->GetOffTheRecordProfile());
|
||||
ExpectScores(incognito_service, url1, 0.05, 1, 1, url1_time);
|
||||
ExpectScores(incognito_service, url2, 0.05, 1, 1, Now());
|
||||
ExpectScores(incognito_service, url3, 0.0, 0, 0, TimeNotSet());
|
||||
ExpectScores(incognito_service, origin1, 0.05, 1, 1, origin1_time);
|
||||
ExpectScores(incognito_service, origin2, 0.05, 1, 1, Now());
|
||||
ExpectScores(incognito_service, origin3, 0.0, 0, 0, TimeNotSet());
|
||||
|
||||
incognito_service->RecordVisit(url3);
|
||||
ExpectScores(incognito_service, url3, 0.0, 1, 0, TimeNotSet());
|
||||
ExpectScores(url3, 0.0, 0, 0, TimeNotSet());
|
||||
incognito_service->RecordVisit(origin3);
|
||||
ExpectScores(incognito_service, origin3, 0.0, 1, 0, TimeNotSet());
|
||||
ExpectScores(origin3, 0.0, 0, 0, TimeNotSet());
|
||||
|
||||
incognito_service->RecordVisit(url2);
|
||||
ExpectScores(incognito_service, url2, 0.05, 2, 1, Now());
|
||||
ExpectScores(url2, 0.05, 1, 1, Now());
|
||||
incognito_service->RecordVisit(origin2);
|
||||
ExpectScores(incognito_service, origin2, 0.05, 2, 1, Now());
|
||||
ExpectScores(origin2, 0.05, 1, 1, Now());
|
||||
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url3);
|
||||
ExpectScores(incognito_service, url3, 0.0, 1, 0, TimeNotSet());
|
||||
ExpectScores(url3, 0.05, 1, 1, Now());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin3);
|
||||
ExpectScores(incognito_service, origin3, 0.0, 1, 0, TimeNotSet());
|
||||
ExpectScores(origin3, 0.05, 1, 1, Now());
|
||||
|
||||
ExpectScores(incognito_service, url4, 0.0, 0, 0, TimeNotSet());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(url4);
|
||||
ExpectScores(incognito_service, url4, 0.05, 1, 1, Now());
|
||||
ExpectScores(url4, 0.05, 1, 1, Now());
|
||||
ExpectScores(incognito_service, origin4, 0.0, 0, 0, TimeNotSet());
|
||||
RecordVisitAndPlaybackAndAdvanceClock(origin4);
|
||||
ExpectScores(incognito_service, origin4, 0.05, 1, 1, Now());
|
||||
ExpectScores(origin4, 0.05, 1, 1, Now());
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, IncognitoOverrideRegularProfile) {
|
||||
const GURL kUrl1("https://example.org");
|
||||
const GURL kUrl2("https://example.com");
|
||||
const url::Origin kOrigin1 = url::Origin::Create(GURL("https://example.org"));
|
||||
const url::Origin kOrigin2 = url::Origin::Create(GURL("https://example.com"));
|
||||
|
||||
SetScores(kUrl1, MediaEngagementScore::GetScoreMinVisits(), 1);
|
||||
SetScores(kUrl2, 1, 0);
|
||||
SetScores(kOrigin1, MediaEngagementScore::GetScoreMinVisits(), 1);
|
||||
SetScores(kOrigin2, 1, 0);
|
||||
|
||||
ExpectScores(kUrl1, 0.05, MediaEngagementScore::GetScoreMinVisits(), 1,
|
||||
ExpectScores(kOrigin1, 0.05, MediaEngagementScore::GetScoreMinVisits(), 1,
|
||||
TimeNotSet());
|
||||
ExpectScores(kUrl2, 0.0, 1, 0, TimeNotSet());
|
||||
ExpectScores(kOrigin2, 0.0, 1, 0, TimeNotSet());
|
||||
|
||||
MediaEngagementService* incognito_service =
|
||||
MediaEngagementService::Get(profile()->GetOffTheRecordProfile());
|
||||
ExpectScores(incognito_service, kUrl1, 0.05,
|
||||
ExpectScores(incognito_service, kOrigin1, 0.05,
|
||||
MediaEngagementScore::GetScoreMinVisits(), 1, TimeNotSet());
|
||||
ExpectScores(incognito_service, kUrl2, 0.0, 1, 0, TimeNotSet());
|
||||
ExpectScores(incognito_service, kOrigin2, 0.0, 1, 0, TimeNotSet());
|
||||
|
||||
// Scores should be the same in incognito and regular profile.
|
||||
{
|
||||
std::vector<std::pair<GURL, double>> kExpectedResults = {
|
||||
{kUrl2, 0.0}, {kUrl1, 0.05},
|
||||
std::vector<std::pair<url::Origin, double>> kExpectedResults = {
|
||||
{kOrigin2, 0.0},
|
||||
{kOrigin1, 0.05},
|
||||
};
|
||||
|
||||
const auto& scores = GetAllStoredScores();
|
||||
@ -396,13 +399,14 @@ TEST_F(MediaEngagementServiceTest, IncognitoOverrideRegularProfile) {
|
||||
}
|
||||
}
|
||||
|
||||
incognito_service->RecordVisit(kUrl1);
|
||||
RecordPlaybackForService(incognito_service, kUrl2);
|
||||
incognito_service->RecordVisit(kOrigin1);
|
||||
RecordPlaybackForService(incognito_service, kOrigin2);
|
||||
|
||||
// Score shouldn't have changed in regular profile.
|
||||
{
|
||||
std::vector<std::pair<GURL, double>> kExpectedResults = {
|
||||
{kUrl2, 0.0}, {kUrl1, 0.05},
|
||||
std::vector<std::pair<url::Origin, double>> kExpectedResults = {
|
||||
{kOrigin2, 0.0},
|
||||
{kOrigin1, 0.05},
|
||||
};
|
||||
|
||||
const auto& scores = GetAllStoredScores();
|
||||
@ -417,8 +421,9 @@ TEST_F(MediaEngagementServiceTest, IncognitoOverrideRegularProfile) {
|
||||
// Incognito scores should have the same number of entries but have new
|
||||
// values.
|
||||
{
|
||||
std::vector<std::pair<GURL, double>> kExpectedResults = {
|
||||
{kUrl2, 0.05}, {kUrl1, 1.0 / 21.0},
|
||||
std::vector<std::pair<url::Origin, double>> kExpectedResults = {
|
||||
{kOrigin2, 0.05},
|
||||
{kOrigin1, 1.0 / 21.0},
|
||||
};
|
||||
|
||||
const auto& scores = GetAllStoredScores(incognito_service);
|
||||
@ -432,13 +437,14 @@ TEST_F(MediaEngagementServiceTest, IncognitoOverrideRegularProfile) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, CleanupOriginsOnHistoryDeletion) {
|
||||
GURL origin1("http://www.google.com/");
|
||||
GURL origin1a("http://www.google.com/search?q=asdf");
|
||||
GURL origin1b("http://www.google.com/maps/search?q=asdf");
|
||||
GURL origin2("https://drive.google.com/");
|
||||
GURL origin3("http://deleted.com/");
|
||||
GURL origin3a("http://deleted.com/test");
|
||||
GURL origin4("http://notdeleted.com");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("http://www.google.com/"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://drive.google.com/"));
|
||||
url::Origin origin3 = url::Origin::Create(GURL("http://deleted.com/"));
|
||||
url::Origin origin4 = url::Origin::Create(GURL("http://notdeleted.com"));
|
||||
|
||||
GURL url1a = GURL("http://www.google.com/search?q=asdf");
|
||||
GURL url1b = GURL("http://www.google.com/maps/search?q=asdf");
|
||||
GURL url3a = GURL("http://deleted.com/test");
|
||||
|
||||
// origin1 will have a score that is high enough to not return zero
|
||||
// and we will ensure it has the same score. origin2 will have a score
|
||||
@ -460,12 +466,14 @@ TEST_F(MediaEngagementServiceTest, CleanupOriginsOnHistoryDeletion) {
|
||||
history::HistoryService* history = HistoryServiceFactory::GetForProfile(
|
||||
profile(), ServiceAccessType::IMPLICIT_ACCESS);
|
||||
|
||||
history->AddPage(origin1, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin1a, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin1b, yesterday_week, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin2, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin3, yesterday_week, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin3a, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin1.GetURL(), yesterday_afternoon,
|
||||
history::SOURCE_BROWSED);
|
||||
history->AddPage(url1a, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(url1b, yesterday_week, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin2.GetURL(), yesterday_afternoon,
|
||||
history::SOURCE_BROWSED);
|
||||
history->AddPage(origin3.GetURL(), yesterday_week, history::SOURCE_BROWSED);
|
||||
history->AddPage(url3a, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
|
||||
// Check that the scores are valid at the beginning.
|
||||
ExpectScores(origin1, 7.0 / 11.0,
|
||||
@ -484,7 +492,7 @@ TEST_F(MediaEngagementServiceTest, CleanupOriginsOnHistoryDeletion) {
|
||||
MediaEngagementChangeWaiter waiter(profile());
|
||||
|
||||
base::CancelableTaskTracker task_tracker;
|
||||
// Expire origin1, origin1a, origin2, and origin3a's most recent visit.
|
||||
// Expire origin1, url1a, origin2, and url3a's most recent visit.
|
||||
history->ExpireHistoryBetween(std::set<GURL>(), yesterday, today,
|
||||
/*user_initiated*/ true, base::DoNothing(),
|
||||
&task_tracker);
|
||||
@ -521,10 +529,10 @@ TEST_F(MediaEngagementServiceTest, CleanupOriginsOnHistoryDeletion) {
|
||||
base::HistogramTester histogram_tester;
|
||||
MediaEngagementChangeWaiter waiter(profile());
|
||||
|
||||
// Expire origin1b.
|
||||
// Expire url1b.
|
||||
std::vector<history::ExpireHistoryArgs> expire_list;
|
||||
history::ExpireHistoryArgs args;
|
||||
args.urls.insert(origin1b);
|
||||
args.urls.insert(url1b);
|
||||
args.SetTimeRangeForOneDay(yesterday_week);
|
||||
expire_list.push_back(args);
|
||||
|
||||
@ -558,7 +566,7 @@ TEST_F(MediaEngagementServiceTest, CleanupOriginsOnHistoryDeletion) {
|
||||
// Expire origin3.
|
||||
std::vector<history::ExpireHistoryArgs> expire_list;
|
||||
history::ExpireHistoryArgs args;
|
||||
args.urls.insert(origin3);
|
||||
args.urls.insert(origin3.GetURL());
|
||||
args.SetTimeRangeForOneDay(yesterday_week);
|
||||
expire_list.push_back(args);
|
||||
|
||||
@ -567,7 +575,7 @@ TEST_F(MediaEngagementServiceTest, CleanupOriginsOnHistoryDeletion) {
|
||||
waiter.Wait();
|
||||
|
||||
// origin3's score should be removed but the rest should remain the same.
|
||||
std::map<GURL, double> scores = GetScoreMapForTesting();
|
||||
std::map<url::Origin, double> scores = GetScoreMapForTesting();
|
||||
EXPECT_TRUE(scores.find(origin3) == scores.end());
|
||||
ExpectScores(origin1, 0.55, MediaEngagementScore::GetScoreMinVisits() - 1,
|
||||
11, TimeNotSet());
|
||||
@ -595,9 +603,9 @@ TEST_F(MediaEngagementServiceTest, CleanUpDatabaseWhenHistoryIsExpired) {
|
||||
// not be deleted. |origin2| will have history either side of the threshold
|
||||
// and should also not be deleted. |origin3| will have history before the
|
||||
// threshold and should be deleted.
|
||||
GURL origin1("http://www.google.com/");
|
||||
GURL origin2("https://drive.google.com/");
|
||||
GURL origin3("http://deleted.com/");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("https://www.google.com"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://drive.google.com"));
|
||||
url::Origin origin3 = url::Origin::Create(GURL("http://deleted.com"));
|
||||
|
||||
// Populate test MEI data.
|
||||
SetScores(origin1, 20, 20);
|
||||
@ -612,10 +620,10 @@ TEST_F(MediaEngagementServiceTest, CleanUpDatabaseWhenHistoryIsExpired) {
|
||||
history::HistoryService* history = HistoryServiceFactory::GetForProfile(
|
||||
profile(), ServiceAccessType::IMPLICIT_ACCESS);
|
||||
|
||||
history->AddPage(origin1, today, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin2, today, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin2, before_threshold, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin3, before_threshold, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin1.GetURL(), today, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin2.GetURL(), today, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin2.GetURL(), before_threshold, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin3.GetURL(), before_threshold, history::SOURCE_BROWSED);
|
||||
|
||||
// Expire history older than |threshold|.
|
||||
MediaEngagementChangeWaiter waiter(profile());
|
||||
@ -640,13 +648,14 @@ TEST_F(MediaEngagementServiceTest, CleanUpDatabaseWhenHistoryIsExpired) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, CleanUpDatabaseWhenHistoryIsDeleted) {
|
||||
GURL origin1("http://www.google.com/");
|
||||
GURL origin1a("http://www.google.com/search?q=asdf");
|
||||
GURL origin1b("http://www.google.com/maps/search?q=asdf");
|
||||
GURL origin2("https://drive.google.com/");
|
||||
GURL origin3("http://deleted.com/");
|
||||
GURL origin3a("http://deleted.com/test");
|
||||
GURL origin4("http://notdeleted.com");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("http://www.google.com/"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://drive.google.com/"));
|
||||
url::Origin origin3 = url::Origin::Create(GURL("http://deleted.com/"));
|
||||
url::Origin origin4 = url::Origin::Create(GURL("http://notdeleted.com"));
|
||||
|
||||
GURL url1a = GURL("http://www.google.com/search?q=asdf");
|
||||
GURL url1b = GURL("http://www.google.com/maps/search?q=asdf");
|
||||
GURL url3a = GURL("http://deleted.com/test");
|
||||
|
||||
// origin1 will have a score that is high enough to not return zero
|
||||
// and we will ensure it has the same score. origin2 will have a score
|
||||
@ -667,12 +676,14 @@ TEST_F(MediaEngagementServiceTest, CleanUpDatabaseWhenHistoryIsDeleted) {
|
||||
history::HistoryService* history = HistoryServiceFactory::GetForProfile(
|
||||
profile(), ServiceAccessType::IMPLICIT_ACCESS);
|
||||
|
||||
history->AddPage(origin1, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin1a, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin1b, yesterday_week, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin2, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin3, yesterday_week, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin3a, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin1.GetURL(), yesterday_afternoon,
|
||||
history::SOURCE_BROWSED);
|
||||
history->AddPage(url1a, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
history->AddPage(url1b, yesterday_week, history::SOURCE_BROWSED);
|
||||
history->AddPage(origin2.GetURL(), yesterday_afternoon,
|
||||
history::SOURCE_BROWSED);
|
||||
history->AddPage(origin3.GetURL(), yesterday_week, history::SOURCE_BROWSED);
|
||||
history->AddPage(url3a, yesterday_afternoon, history::SOURCE_BROWSED);
|
||||
|
||||
// Check that the scores are valid at the beginning.
|
||||
ExpectScores(origin1, 7.0 / 11.0,
|
||||
@ -720,13 +731,14 @@ TEST_F(MediaEngagementServiceTest, CleanUpDatabaseWhenHistoryIsDeleted) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, HistoryExpirationIsNoOp) {
|
||||
GURL origin1("http://www.google.com/");
|
||||
GURL origin1a("http://www.google.com/search?q=asdf");
|
||||
GURL origin1b("http://www.google.com/maps/search?q=asdf");
|
||||
GURL origin2("https://drive.google.com/");
|
||||
GURL origin3("http://deleted.com/");
|
||||
GURL origin3a("http://deleted.com/test");
|
||||
GURL origin4("http://notdeleted.com");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("http://www.google.com/"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://drive.google.com/"));
|
||||
url::Origin origin3 = url::Origin::Create(GURL("http://deleted.com/"));
|
||||
url::Origin origin4 = url::Origin::Create(GURL("http://notdeleted.com"));
|
||||
|
||||
GURL url1a = GURL("http://www.google.com/search?q=asdf");
|
||||
GURL url1b = GURL("http://www.google.com/maps/search?q=asdf");
|
||||
GURL url3a = GURL("http://deleted.com/test");
|
||||
|
||||
SetScores(origin1, MediaEngagementScore::GetScoreMinVisits() + 2, 14);
|
||||
SetScores(origin2, 2, 1);
|
||||
@ -777,7 +789,7 @@ TEST_F(MediaEngagementServiceTest, HistoryExpirationIsNoOp) {
|
||||
|
||||
TEST_F(MediaEngagementServiceTest,
|
||||
CleanupDataOnSiteDataCleanup_OutsideBoundary) {
|
||||
GURL origin("https://www.google.com");
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
base::HistogramTester histogram_tester;
|
||||
|
||||
base::Time today = GetReferenceTime();
|
||||
@ -798,8 +810,8 @@ TEST_F(MediaEngagementServiceTest,
|
||||
|
||||
TEST_F(MediaEngagementServiceTest,
|
||||
CleanupDataOnSiteDataCleanup_WithinBoundary) {
|
||||
GURL origin1("https://www.google.com");
|
||||
GURL origin2("https://www.google.co.uk");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("https://www.google.com"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://www.google.co.uk"));
|
||||
base::HistogramTester histogram_tester;
|
||||
|
||||
base::Time today = GetReferenceTime();
|
||||
@ -823,7 +835,7 @@ TEST_F(MediaEngagementServiceTest,
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, CleanupDataOnSiteDataCleanup_NoTimeSet) {
|
||||
GURL origin("https://www.google.com");
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
base::HistogramTester histogram_tester;
|
||||
|
||||
base::Time today = GetReferenceTime();
|
||||
@ -842,8 +854,8 @@ TEST_F(MediaEngagementServiceTest, CleanupDataOnSiteDataCleanup_NoTimeSet) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, CleanupDataOnSiteDataCleanup_All) {
|
||||
GURL origin1("https://www.google.com");
|
||||
GURL origin2("https://www.google.co.uk");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("https://www.google.com"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://www.google.co.uk"));
|
||||
base::HistogramTester histogram_tester;
|
||||
|
||||
base::Time today = GetReferenceTime();
|
||||
@ -867,40 +879,40 @@ TEST_F(MediaEngagementServiceTest, CleanupDataOnSiteDataCleanup_All) {
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, HasHighEngagement) {
|
||||
GURL url1("https://www.google.com");
|
||||
GURL url2("https://www.google.co.uk");
|
||||
GURL url3("https://www.example.com");
|
||||
url::Origin origin1 = url::Origin::Create(GURL("https://www.google.com"));
|
||||
url::Origin origin2 = url::Origin::Create(GURL("https://www.google.co.uk"));
|
||||
url::Origin origin3 = url::Origin::Create(GURL("https://www.example.com"));
|
||||
|
||||
SetScores(url1, 20, 15);
|
||||
SetScores(url2, 20, 4);
|
||||
SetScores(origin1, 20, 15);
|
||||
SetScores(origin2, 20, 4);
|
||||
|
||||
EXPECT_TRUE(HasHighEngagement(url1));
|
||||
EXPECT_FALSE(HasHighEngagement(url2));
|
||||
EXPECT_FALSE(HasHighEngagement(url3));
|
||||
EXPECT_TRUE(HasHighEngagement(origin1));
|
||||
EXPECT_FALSE(HasHighEngagement(origin2));
|
||||
EXPECT_FALSE(HasHighEngagement(origin3));
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, SchemaVersion_Changed) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 1, 2);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 1, 2);
|
||||
|
||||
SetSchemaVersion(0);
|
||||
std::unique_ptr<MediaEngagementService> new_service =
|
||||
base::WrapUnique<MediaEngagementService>(
|
||||
StartNewMediaEngagementService());
|
||||
|
||||
ExpectScores(new_service.get(), url, 0.0, 0, 0, TimeNotSet());
|
||||
ExpectScores(new_service.get(), origin, 0.0, 0, 0, TimeNotSet());
|
||||
new_service->Shutdown();
|
||||
}
|
||||
|
||||
TEST_F(MediaEngagementServiceTest, SchemaVersion_Same) {
|
||||
GURL url("https://www.google.com");
|
||||
SetScores(url, 1, 2);
|
||||
url::Origin origin = url::Origin::Create(GURL("https://www.google.com"));
|
||||
SetScores(origin, 1, 2);
|
||||
|
||||
std::unique_ptr<MediaEngagementService> new_service =
|
||||
base::WrapUnique<MediaEngagementService>(
|
||||
StartNewMediaEngagementService());
|
||||
|
||||
ExpectScores(new_service.get(), url, 0.1, 1, 2, TimeNotSet());
|
||||
ExpectScores(new_service.get(), origin, 0.1, 1, 2, TimeNotSet());
|
||||
new_service->Shutdown();
|
||||
}
|
||||
|
||||
|
@ -163,8 +163,7 @@ void MediaEngagementSession::RecordUkmMetrics() {
|
||||
origin_);
|
||||
}
|
||||
|
||||
MediaEngagementScore score =
|
||||
service_->CreateEngagementScore(origin_.GetURL());
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin_);
|
||||
ukm::builders::Media_Engagement_SessionFinished(ukm_source_id_)
|
||||
.SetPlaybacks_AudioContextTotal(score.audio_context_playbacks())
|
||||
.SetPlaybacks_MediaElementTotal(score.media_element_playbacks())
|
||||
@ -214,8 +213,7 @@ void MediaEngagementSession::CommitPendingData() {
|
||||
|
||||
RecordStatusHistograms();
|
||||
|
||||
MediaEngagementScore score =
|
||||
service_->CreateEngagementScore(origin_.GetURL());
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin_);
|
||||
bool previous_high_value = score.high_score();
|
||||
|
||||
if (pending_data_to_commit_.visit)
|
||||
|
@ -131,19 +131,16 @@ class MediaEngagementSessionTest : public testing::Test {
|
||||
base::SimpleTestClock* test_clock() { return &test_clock_; }
|
||||
|
||||
void SetVisitsAndPlaybacks(int visits, int media_playbacks) {
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
score.SetVisits(visits);
|
||||
score.SetMediaPlaybacks(media_playbacks);
|
||||
score.Commit();
|
||||
}
|
||||
|
||||
bool ScoreIsHigh() const {
|
||||
return service()->HasHighEngagement(origin().GetURL());
|
||||
}
|
||||
bool ScoreIsHigh() const { return service()->HasHighEngagement(origin()); }
|
||||
|
||||
void RecordPlayback(GURL url) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(url);
|
||||
void RecordPlayback(const url::Origin& origin) {
|
||||
MediaEngagementScore score = service_->CreateEngagementScore(origin);
|
||||
score.IncrementMediaPlaybacks();
|
||||
score.set_last_media_playback_time(service_->clock()->Now());
|
||||
score.Commit();
|
||||
@ -337,8 +334,7 @@ TEST_F(MediaEngagementSessionTest,
|
||||
int expected_playbacks = 0;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
expected_visits = score.visits() + 1;
|
||||
expected_playbacks = score.media_playbacks() + 1;
|
||||
}
|
||||
@ -353,8 +349,7 @@ TEST_F(MediaEngagementSessionTest,
|
||||
EXPECT_FALSE(HasPendingDataToCommitForSession(session.get()));
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
@ -372,8 +367,7 @@ TEST_F(MediaEngagementSessionTest,
|
||||
int expected_playbacks = 0;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
expected_visits = score.visits() + 1;
|
||||
expected_playbacks = score.media_playbacks() + 1;
|
||||
}
|
||||
@ -388,8 +382,7 @@ TEST_F(MediaEngagementSessionTest,
|
||||
EXPECT_FALSE(HasPendingDataToCommitForSession(session.get()));
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
@ -408,8 +401,7 @@ TEST_F(MediaEngagementSessionTest,
|
||||
int expected_playbacks = 0;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
expected_visits = score.visits() + 1;
|
||||
expected_playbacks = score.media_playbacks() + 1;
|
||||
}
|
||||
@ -426,8 +418,7 @@ TEST_F(MediaEngagementSessionTest,
|
||||
EXPECT_FALSE(HasPendingDataToCommitForSession(session.get()));
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
@ -462,8 +453,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdateVisitsAsNeeded) {
|
||||
int expected_visits = 0;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
expected_visits = score.visits();
|
||||
}
|
||||
|
||||
@ -472,8 +462,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdateVisitsAsNeeded) {
|
||||
|
||||
++expected_visits;
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
}
|
||||
|
||||
@ -483,8 +472,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdateVisitsAsNeeded) {
|
||||
|
||||
++expected_visits;
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
}
|
||||
|
||||
@ -494,8 +482,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdateVisitsAsNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
}
|
||||
}
|
||||
@ -507,8 +494,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlaybackWhenNeeded) {
|
||||
int expected_playbacks = 0;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
expected_playbacks = score.media_playbacks();
|
||||
}
|
||||
|
||||
@ -516,8 +502,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlaybackWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
}
|
||||
|
||||
@ -528,8 +513,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlaybackWhenNeeded) {
|
||||
|
||||
++expected_playbacks;
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
}
|
||||
|
||||
@ -542,8 +526,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlaybackWhenNeeded) {
|
||||
|
||||
++expected_playbacks;
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
}
|
||||
|
||||
@ -555,8 +538,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlaybackWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
}
|
||||
|
||||
@ -568,8 +550,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlaybackWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
}
|
||||
|
||||
@ -579,8 +560,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlaybackWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
}
|
||||
|
||||
@ -590,8 +570,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlaybackWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
}
|
||||
}
|
||||
@ -604,8 +583,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlayersWhenNeeded) {
|
||||
int expected_significant_playbacks = 0;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
expected_audible_playbacks = score.audible_playbacks();
|
||||
expected_significant_playbacks = score.significant_playbacks();
|
||||
}
|
||||
@ -614,8 +592,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlayersWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
EXPECT_EQ(expected_significant_playbacks, score.significant_playbacks());
|
||||
}
|
||||
@ -626,8 +603,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlayersWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
EXPECT_EQ(expected_significant_playbacks, score.significant_playbacks());
|
||||
}
|
||||
@ -638,8 +614,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlayersWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
EXPECT_EQ(expected_significant_playbacks, score.significant_playbacks());
|
||||
}
|
||||
@ -650,8 +625,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlayersWhenNeeded) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
EXPECT_EQ(expected_significant_playbacks, score.significant_playbacks());
|
||||
}
|
||||
@ -664,8 +638,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlayersWhenNeeded) {
|
||||
++expected_audible_playbacks;
|
||||
++expected_significant_playbacks;
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
EXPECT_EQ(expected_significant_playbacks, score.significant_playbacks());
|
||||
}
|
||||
@ -678,8 +651,7 @@ TEST_F(MediaEngagementSessionTest, CommitPendingData_UpdatePlayersWhenNeeded) {
|
||||
++expected_audible_playbacks;
|
||||
++expected_significant_playbacks;
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
EXPECT_EQ(expected_significant_playbacks, score.significant_playbacks());
|
||||
}
|
||||
@ -888,8 +860,7 @@ TEST_F(MediaEngagementSessionTest, DestructorCommitDataIfNeeded) {
|
||||
int expected_significant_playbacks = 0;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
|
||||
expected_visits = score.visits();
|
||||
expected_playbacks = score.media_playbacks();
|
||||
@ -907,8 +878,7 @@ TEST_F(MediaEngagementSessionTest, DestructorCommitDataIfNeeded) {
|
||||
++expected_visits;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
@ -928,8 +898,7 @@ TEST_F(MediaEngagementSessionTest, DestructorCommitDataIfNeeded) {
|
||||
++expected_playbacks;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
@ -950,8 +919,7 @@ TEST_F(MediaEngagementSessionTest, DestructorCommitDataIfNeeded) {
|
||||
expected_significant_playbacks += 2;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
@ -969,8 +937,7 @@ TEST_F(MediaEngagementSessionTest, DestructorCommitDataIfNeeded) {
|
||||
}
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
EXPECT_EQ(expected_audible_playbacks, score.audible_playbacks());
|
||||
@ -1003,7 +970,7 @@ TEST_F(MediaEngagementSessionTest, TimeSinceLastPlayback_PreviousRecord) {
|
||||
|
||||
// Advance in time and play.
|
||||
test_clock()->Advance(base::TimeDelta::FromSeconds(42));
|
||||
RecordPlayback(origin().GetURL());
|
||||
RecordPlayback(origin());
|
||||
|
||||
test_clock()->Advance(base::TimeDelta::FromSeconds(42));
|
||||
session->RecordSignificantMediaElementPlayback();
|
||||
@ -1028,8 +995,7 @@ TEST_F(MediaEngagementSessionTest, RestoredSession_PlaybackRecordsVisits) {
|
||||
int expected_playbacks = 0;
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
expected_visits = score.visits() + 1;
|
||||
expected_playbacks = score.media_playbacks() + 1;
|
||||
}
|
||||
@ -1038,8 +1004,7 @@ TEST_F(MediaEngagementSessionTest, RestoredSession_PlaybackRecordsVisits) {
|
||||
CommitPendingDataForSession(session.get());
|
||||
|
||||
{
|
||||
MediaEngagementScore score =
|
||||
service()->CreateEngagementScore(origin().GetURL());
|
||||
MediaEngagementScore score = service()->CreateEngagementScore(origin());
|
||||
EXPECT_EQ(expected_visits, score.visits());
|
||||
EXPECT_EQ(expected_playbacks, score.media_playbacks());
|
||||
}
|
||||
|
@ -6,7 +6,8 @@
|
||||
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
|
||||
<script src="chrome://resources/js/mojo_bindings_lite.js"></script>
|
||||
<script src="chrome://resources/js/promise_resolver.js"></script>
|
||||
<script src="chrome://resources/js/url.mojom-lite.js"></script>
|
||||
<script src="chrome://resources/js/unguessable_token.mojom-lite.js"></script>
|
||||
<script src="chrome://resources/js/origin.mojom-lite.js"></script>
|
||||
<script src="chrome://resources/js/util.js"></script>
|
||||
|
||||
<script src="chrome/browser/media/media_engagement_score_details.mojom-lite.js">
|
||||
@ -31,15 +32,15 @@
|
||||
table td,
|
||||
table th {
|
||||
border: 1px solid #777;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
padding-inline-end: 4px;
|
||||
padding-inline-start: 4px;
|
||||
}
|
||||
|
||||
table th {
|
||||
background: rgb(224, 236, 255);
|
||||
cursor: pointer;
|
||||
padding-bottom: 4px;
|
||||
padding-right: 4px;
|
||||
padding-inline-end: 4px;
|
||||
padding-top: 4px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
@ -63,14 +64,14 @@
|
||||
.audible-playbacks-count-cell,
|
||||
.significant-playbacks-count-cell {
|
||||
background-color: rgba(230, 230, 230, 0.5);
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.base-score-input {
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 2px;
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
width: 70px;
|
||||
}
|
||||
|
||||
@ -89,7 +90,7 @@
|
||||
}
|
||||
|
||||
th.sort-column {
|
||||
padding-right: 16px;
|
||||
padding-inline-end: 16px;
|
||||
}
|
||||
|
||||
th.sort-column::after {
|
||||
|
@ -29,7 +29,14 @@ let showNoPlaybacks = false;
|
||||
function createRow(rowInfo) {
|
||||
const template = $('datarow');
|
||||
const td = template.content.querySelectorAll('td');
|
||||
td[0].textContent = rowInfo.origin.url;
|
||||
|
||||
td[0].textContent = rowInfo.origin.scheme + '://' + rowInfo.origin.host;
|
||||
if (rowInfo.origin.scheme == 'http' && rowInfo.origin.port != '80') {
|
||||
td[0].textContent += ':' + rowInfo.origin.port;
|
||||
} else if (rowInfo.origin.scheme == 'https' && rowInfo.origin.port != '443') {
|
||||
td[0].textContent += ':' + rowInfo.origin.port;
|
||||
}
|
||||
|
||||
td[1].textContent = rowInfo.visits;
|
||||
td[2].textContent = rowInfo.mediaPlaybacks;
|
||||
td[3].textContent = rowInfo.audioContextPlaybacks;
|
||||
@ -66,8 +73,8 @@ function sortInfo() {
|
||||
/**
|
||||
* Compares two MediaEngagementScoreDetails objects based on |sortKey|.
|
||||
* @param {string} sortKey The name of the property to sort by.
|
||||
* @param {number|url.mojom.Url} The first object to compare.
|
||||
* @param {number|url.mojom.Url} The second object to compare.
|
||||
* @param {number|url.mojom.Origin} The first object to compare.
|
||||
* @param {number|url.mojom.Origin} The second object to compare.
|
||||
* @return {number} A negative number if |a| should be ordered before
|
||||
* |b|, a positive number otherwise.
|
||||
*/
|
||||
@ -77,7 +84,7 @@ function compareTableItem(sortKey, a, b) {
|
||||
|
||||
// Compare the hosts of the origin ignoring schemes.
|
||||
if (sortKey == 'origin') {
|
||||
return new URL(val1.url).host > new URL(val2.url).host ? 1 : -1;
|
||||
return val1.host > val2.host ? 1 : -1;
|
||||
}
|
||||
|
||||
if (sortKey == 'visits' || sortKey == 'mediaPlaybacks' ||
|
||||
|
@ -5,8 +5,8 @@
|
||||
/**
|
||||
* @fileoverview Test suite for the Media Engagement WebUI.
|
||||
*/
|
||||
var EXAMPLE_URL_1 = 'http://example.com/';
|
||||
var EXAMPLE_URL_2 = 'http://shmlexample.com/';
|
||||
var EXAMPLE_URL_1 = 'http://example.com';
|
||||
var EXAMPLE_URL_2 = 'http://shmlexample.com';
|
||||
|
||||
GEN('#include "chrome/browser/media/media_engagement_service.h"');
|
||||
GEN('#include "chrome/browser/media/media_engagement_service_factory.h"');
|
||||
@ -30,13 +30,13 @@ MediaEngagementWebUIBrowserTest.prototype = {
|
||||
GEN('MediaEngagementService* service =');
|
||||
GEN(' MediaEngagementServiceFactory::GetForProfile(');
|
||||
GEN(' browser()->profile());');
|
||||
GEN('MediaEngagementScore score1 =');
|
||||
GEN(' service->CreateEngagementScore(GURL("' + EXAMPLE_URL_1 + '"));');
|
||||
GEN('MediaEngagementScore score1 = service->CreateEngagementScore(');
|
||||
GEN(' url::Origin::Create(GURL("' + EXAMPLE_URL_1 + '")));');
|
||||
GEN('score1.IncrementVisits();');
|
||||
GEN('score1.IncrementMediaPlaybacks();');
|
||||
GEN('score1.Commit();');
|
||||
GEN('MediaEngagementScore score2 =');
|
||||
GEN(' service->CreateEngagementScore(GURL("' + EXAMPLE_URL_2 + '"));');
|
||||
GEN('MediaEngagementScore score2 = service->CreateEngagementScore(');
|
||||
GEN(' url::Origin::Create(GURL("' + EXAMPLE_URL_2 + '")));');
|
||||
GEN('score2.IncrementVisits();');
|
||||
GEN('score2.IncrementMediaPlaybacks();');
|
||||
GEN('score2.Commit();');
|
||||
|
@ -126,6 +126,7 @@ grit("resources") {
|
||||
]
|
||||
deps = [
|
||||
"//content/browser/process_internals:mojo_bindings_js",
|
||||
"//url/mojom:url_mojom_origin_js",
|
||||
]
|
||||
}
|
||||
|
||||
|
@ -93,6 +93,8 @@ const std::map<std::string, std::string> CreatePathPrefixAliasesMap() {
|
||||
const std::map<int, std::string> CreateContentResourceIdToAliasMap() {
|
||||
return std::map<int, std::string>{
|
||||
{IDR_URL_MOJO_JS, "js/url.mojom-lite.js"},
|
||||
{IDR_ORIGIN_MOJO_JS, "js/origin.mojom-lite.js"},
|
||||
{IDR_UNGUESSABLE_TOKEN_MOJO_JS, "js/unguessable_token.mojom-lite.js"},
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
<include name="IDR_NETWORK_ERROR_LISTING_HTML" file="browser/resources/net/network_errors_listing.html" flattenhtml="true" allowexternalscript="true" compress="gzip" type="BINDATA" />
|
||||
<include name="IDR_NETWORK_ERROR_LISTING_JS" file="browser/resources/net/network_errors_listing.js" flattenhtml="true" type="BINDATA" />
|
||||
<include name="IDR_NETWORK_ERROR_LISTING_CSS" file="browser/resources/net/network_errors_listing.css" flattenhtml="true" type="BINDATA" />
|
||||
<include name="IDR_ORIGIN_MOJO_JS" file="${root_gen_dir}/url/mojom/origin.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
|
||||
<include name="IDR_PROCESS_INTERNALS_HTML" file="browser/resources/process/process_internals.html" flattenhtml="true" allowexternalscript="true" compress="gzip" type="BINDATA" />
|
||||
<include name="IDR_PROCESS_INTERNALS_MOJO_JS" file="${root_gen_dir}/content/browser/process_internals/process_internals.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
|
||||
<include name="IDR_PROCESS_INTERNALS_CSS" file="browser/resources/process/process_internals.css" flattenhtml="true" compress="gzip" type="BINDATA" />
|
||||
@ -40,6 +41,7 @@
|
||||
<include name="IDR_SERVICE_WORKER_INTERNALS_HTML" file="browser/resources/service_worker/serviceworker_internals.html" flattenhtml="true" allowexternalscript="true" compress="gzip" type="BINDATA" />
|
||||
<include name="IDR_SERVICE_WORKER_INTERNALS_JS" file="browser/resources/service_worker/serviceworker_internals.js" flattenhtml="true" compress="gzip" type="BINDATA" />
|
||||
<include name="IDR_SERVICE_WORKER_INTERNALS_CSS" file="browser/resources/service_worker/serviceworker_internals.css" flattenhtml="true" compress="gzip" type="BINDATA" />
|
||||
<include name="IDR_UNGUESSABLE_TOKEN_MOJO_JS" file="${root_gen_dir}/mojo/public/mojom/base/unguessable_token.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
|
||||
<include name="IDR_URL_MOJO_JS" file="${root_gen_dir}/url/mojom/url.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
|
||||
<include name="IDR_WEBRTC_INTERNALS_HTML" file="browser/resources/media/webrtc_internals.html" flattenhtml="true" allowexternalscript="true" compress="gzip" type="BINDATA" />
|
||||
<include name="IDR_WEBRTC_INTERNALS_JS" file="browser/resources/media/webrtc_internals.js" flattenhtml="true" compress="gzip" type="BINDATA" />
|
||||
|
Reference in New Issue
Block a user