0

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:
Mounir Lamouri
2019-04-26 22:35:37 +00:00
committed by Commit Bot
parent e32c706c7c
commit 32f95a095d
20 changed files with 507 additions and 481 deletions

@ -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" />