Commit 749aad41 authored by John Rummell's avatar John Rummell Committed by Commit Bot

Enable MediaDrmOriginIdManager to run at profile creation

Changes MediaDrmOriginIdManager so that if option kMediaDrmPreprovisioningAtStartup
is enabled, it will attempt to pre-provision origin IDs after a 1 minute delay.

This also registers MediaDrmOriginIdManagerFactory properly so that
it is called during profile creation.

BUG=942731
TEST=MediaDrmOriginIdManagerTest unit_tests pass

Change-Id: Iad162b69a2bffecc52c02a352a55e1865eb2fd89
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1529854
Commit-Queue: John Rummell <jrummell@chromium.org>
Reviewed-by: default avatarXiaohan Wang <xhwang@chromium.org>
Reviewed-by: default avatarDavid Roger <droger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#644427}
parent 11761c9c
......@@ -57,6 +57,9 @@ constexpr int kMaxPreProvisionedOriginIds = 2;
// "expirable_token" is only good for 24 hours.
constexpr base::TimeDelta kExpirationDelta = base::TimeDelta::FromHours(24);
// Time to wait before attempting pre-provisioning at startup (if enabled).
constexpr base::TimeDelta kStartupDelay = base::TimeDelta::FromMinutes(1);
// When unable to get an origin ID, only attempt to pre-provision more if
// pre-provision is called within |kExpirationDelta| of the time of this
// failure.
......@@ -327,8 +330,15 @@ MediaDrmOriginIdManager::MediaDrmOriginIdManager(PrefService* pref_service)
// is most likely going to call GetOriginId(), so let it pre-provision origin
// IDs if necessary. This flag is also used by testing so that it can check
// pre-provisioning directly.
if (base::FeatureList::IsEnabled(media::kMediaDrmPreprovisioningAtStartup))
PreProvisionIfNecessary();
if (base::FeatureList::IsEnabled(media::kMediaDrmPreprovisioningAtStartup)) {
// Running this after a delay of |kStartupDelay| in order to not do too much
// extra work when the profile is loaded.
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE,
base::BindOnce(&MediaDrmOriginIdManager::PreProvisionIfNecessary,
weak_factory_.GetWeakPtr()),
kStartupDelay);
}
}
MediaDrmOriginIdManager::~MediaDrmOriginIdManager() {
......@@ -359,8 +369,11 @@ void MediaDrmOriginIdManager::PreProvisionIfNecessary() {
// No need to pre-provision if there are already enough existing
// pre-provisioned origin IDs.
if (CountAvailableOriginIds(update.Get()) >= kMaxPreProvisionedOriginIds)
if (CountAvailableOriginIds(update.Get()) >= kMaxPreProvisionedOriginIds) {
// Disable any network monitoring, if it exists.
network_observer_.reset();
return;
}
// Attempt to pre-provision more origin IDs in the near future.
is_provisioning_ = true;
......
......@@ -42,6 +42,7 @@ const char kAvailableOriginIds[] = "origin_ids";
constexpr size_t kExpectedPreferenceListSize = 2;
constexpr base::TimeDelta kExpirationDelta = base::TimeDelta::FromHours(24);
constexpr size_t kConnectionAttempts = 5;
constexpr base::TimeDelta kStartupDelay = base::TimeDelta::FromMinutes(1);
} // namespace
......@@ -196,8 +197,59 @@ TEST_F(MediaDrmOriginIdManagerTest, PreProvisionAtStartup) {
// that support it).
EXPECT_CALL(*this, GetProvisioningResult()).WillRepeatedly(Return(true));
Initialize(true);
DVLOG(1) << "Advancing Time";
test_browser_thread_bundle_.FastForwardBy(kStartupDelay);
test_browser_thread_bundle_.RunUntilIdle();
CheckPreferenceForPreProvisioning();
}
TEST_F(MediaDrmOriginIdManagerTest, PreProvisionFailAtStartup) {
// Initialize without disabling kMediaDrmPreprovisioningAtStartup. Have
// provisioning fail at startup, if it is attempted.
if (media::MediaDrmBridge::IsPerApplicationProvisioningSupported()) {
EXPECT_CALL(*this, GetProvisioningResult()).WillOnce(Return(false));
} else {
// If per-application provisioning is NOT supported, no attempt will be made
// to pre-provision any origin IDs at startup.
EXPECT_CALL(*this, GetProvisioningResult()).Times(0);
}
Initialize(true);
DVLOG(1) << "Advancing Time";
test_browser_thread_bundle_.FastForwardBy(kStartupDelay);
test_browser_thread_bundle_.RunUntilIdle();
// Pre-provisioning should have failed.
DVLOG(1) << "Checking preference " << kMediaDrmOriginIds;
auto* dict = GetDictionary(kMediaDrmOriginIds);
DVLOG(1) << DisplayPref(dict);
// After failure the preference should not contain |kExpireableToken| as that
// should only be set if the user requested an origin ID on devices that
// support per-application provisioning.
EXPECT_FALSE(dict->FindKey(kExpirableToken));
// There should be no pre-provisioned origin IDs.
EXPECT_FALSE(dict->FindKey(kAvailableOriginIds));
// Now let provisioning succeed.
if (media::MediaDrmBridge::IsPerApplicationProvisioningSupported()) {
// If per-application provisioning is NOT supported, no attempt will be made
// to pre-provision any origin IDs. So only expect calls if per-application
// provisioning is supported.
EXPECT_CALL(*this, GetProvisioningResult()).WillRepeatedly(Return(true));
}
// Trigger a network connection to force pre-provisioning to run again.
network::TestNetworkConnectionTracker::GetInstance()->SetConnectionType(
network::mojom::ConnectionType::CONNECTION_ETHERNET);
test_browser_thread_bundle_.RunUntilIdle();
// Pre-provisioning should have run again. Should return the same result as if
// pre-provisioning had succeeded at startup.
CheckPreferenceForPreProvisioning();
}
......
......@@ -99,6 +99,7 @@
#if defined(OS_ANDROID)
#include "chrome/browser/android/explore_sites/explore_sites_service_factory.h"
#include "chrome/browser/android/search_permissions/search_permissions_service.h"
#include "chrome/browser/media/android/cdm/media_drm_origin_id_manager_factory.h"
#else
#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
#include "chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service_factory.h"
......@@ -324,6 +325,9 @@ void ChromeBrowserMainExtraPartsProfiles::
#if !defined(OS_ANDROID)
media_router::MediaRouterUIServiceFactory::GetInstance();
#endif
#if defined(OS_ANDROID)
MediaDrmOriginIdManagerFactory::GetInstance();
#endif
#if !defined(OS_ANDROID)
MediaGalleriesPreferencesFactory::GetInstance();
#endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment