| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_COMMON_MEDIA_COMPONENT_WIDEVINE_CDM_HINT_FILE_LINUX_H_ |
| #define CHROME_COMMON_MEDIA_COMPONENT_WIDEVINE_CDM_HINT_FILE_LINUX_H_ |
| |
| #include <optional> |
| |
| #include "build/build_config.h" |
| #include "third_party/widevine/cdm/buildflags.h" |
| |
| #if !BUILDFLAG(ENABLE_WIDEVINE) |
| #error "This file only applies when Widevine used." |
| #endif |
| |
| #if !(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) |
| #error "This file only applies to desktop Linux and ChromeOS." |
| #endif |
| |
| namespace base { |
| class FilePath; |
| class Version; |
| } // namespace base |
| |
| // The APIs here wrap the component updated Widevine hint file, which lives |
| // inside the WidevineCdm folder of the user-data-dir, so that the Linux zygote |
| // process can preload the latest version of Widevine. This file is updated |
| // whenever Component Update for the Widevine CDM runs and selects a different |
| // Widevine CDM that should be used. As the Widevine CDM on Linux can only be |
| // loaded at Chrome startup, the CDM can't be changed immediately. This file is |
| // used to help decide which version of the CDM should be loaded the next time |
| // Chrome starts. |
| // |
| // The hint file will be a dictionary with two keys: |
| // { |
| // "Path": $path_to_WidevineCdm_directory |
| // "LastBundledVersion": version of the bundled Widevine CDM |
| // } |
| // |
| // $path_to_WidevineCdm_directory will be a directory containing the Widevine |
| // CDM. It could refer to the bundled CDM or a CDM downloaded by Component |
| // Update, depending on what version Component Update determines is current. |
| // It will point to a directory structure containing: |
| // LICENSE |
| // manifest.json |
| // _platform_specific/ |
| // linux_x64/ |
| // libwidevinecdm.so |
| // The actual executable (and directory containing it) will be platform |
| // specific. There may be additional files as well as the ones listed above. |
| // |
| // "LastBundledVersion" will only be set if there was a bundled Widevine CDM |
| // available when the hint file is updated (by Component Update selecting a new |
| // Widevine CDM version). It is used to determine if the bundled Widevine CDM |
| // changed due to a Chrome update next time Chrome starts. |
| |
| // Records a new Widevine path into the hint file, replacing the current |
| // contents if any. |cdm_base_path| is the directory containing the new |
| // instance. |bundled_version| is the version of the current bundled CDM, if |
| // any. Returns true if the hint file has been successfully updated, otherwise |
| // false. |
| [[nodiscard]] bool UpdateWidevineCdmHintFile( |
| const base::FilePath& cdm_base_path, |
| std::optional<base::Version> bundled_version); |
| |
| // Returns the directory containing a Widevine CDM selected by Component |
| // Update the last time it ran. If there are no CDM updates, it may be the |
| // bundled CDM directory (if it exists). If the hint file exists and is valid, |
| // returns the CDM base_path with the value loaded from the file. Otherwise |
| // returns empty base::FilePath(). This function does not verify that the path |
| // returned exists or not. |
| [[nodiscard]] base::FilePath GetHintedWidevineCdmDirectory(); |
| |
| // Returns the version of the bundled Widevine CDM that existed when the hint |
| // file was last updated (by Component Update the last time it ran). May return |
| // nullopt if there was no bundled Widevine CDM at the time when the hint file |
| // was updated or is otherwise not set. |
| std::optional<base::Version> GetBundledVersionDuringLastComponentUpdate(); |
| |
| #endif // CHROME_COMMON_MEDIA_COMPONENT_WIDEVINE_CDM_HINT_FILE_LINUX_H_ |