diff --git chrome/common/media/component_widevine_cdm_hint_file_linux.cc chrome/common/media/component_widevine_cdm_hint_file_linux.cc index 44a89a2e7f6e4..447c1a635eadd 100644 --- chrome/common/media/component_widevine_cdm_hint_file_linux.cc +++ chrome/common/media/component_widevine_cdm_hint_file_linux.cc @@ -16,6 +16,7 @@ #include "base/path_service.h" #include "base/values.h" #include "chrome/common/chrome_paths.h" +#include "third_party/widevine/cdm/widevine_cdm_common.h" namespace { @@ -37,14 +38,33 @@ base::FilePath GetPath(const base::Value& dict) { return path; } +// On Linux the Widevine CDM is loaded into the zygote at startup. When the +// component updater runs sometime later and finds a newer version of the +// Widevine CDM, don't register it as the newer version can't be used. Instead, +// save the path to the new Widevine CDM in this file. Next time at startup this +// file will be checked, and if it references a usable Widevine CDM, use this +// version instead of the old (potentially bundled) CDM. +// Add this method instead of using chrome::FILE_COMPONENT_WIDEVINE_CDM_HINT +// because only directories (not files) can be configured via +// base::PathService::Override. +bool GetHintFilePath(base::FilePath* hint_file_path) { + base::FilePath user_data_dir; + if (!base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) + return false; + // Match the file name in chrome/common/chrome_paths.cc + *hint_file_path = user_data_dir + .AppendASCII(kWidevineCdmBaseDirectory) + .Append(FILE_PATH_LITERAL("latest-component-updated-widevine-cdm")); + return true; +} + } // namespace bool UpdateWidevineCdmHintFile(const base::FilePath& cdm_base_path) { DCHECK(!cdm_base_path.empty()); base::FilePath hint_file_path; - CHECK(base::PathService::Get(chrome::FILE_COMPONENT_WIDEVINE_CDM_HINT, - &hint_file_path)); + CHECK(GetHintFilePath(&hint_file_path)); base::Value dict(base::Value::Type::DICTIONARY); dict.SetStringPath(kPath, cdm_base_path.value()); @@ -62,8 +82,7 @@ bool UpdateWidevineCdmHintFile(const base::FilePath& cdm_base_path) { base::FilePath GetLatestComponentUpdatedWidevineCdmDirectory() { base::FilePath hint_file_path; - CHECK(base::PathService::Get(chrome::FILE_COMPONENT_WIDEVINE_CDM_HINT, - &hint_file_path)); + CHECK(GetHintFilePath(&hint_file_path)); if (!base::PathExists(hint_file_path)) { DVLOG(2) << "CDM hint file at " << hint_file_path << " does not exist.";