Commit 2dfa8cd8 authored by RJ Ascani's avatar RJ Ascani Committed by Commit Bot

[Fuchsia] Provide cdm_data_directory to FuchsiaCdmManager

The FuchsiaCdmManager needs a FilePath to write CDM user data to. The
Fuchsia ContextProvider receives the persistent directory via the
CreateContextParams::cdm_data_directory field. This CL takes the
cdm_data_directory and mounts it to /cdm_data. This path is provided to
the FuchsiaCdmManager, which does not use it yet.

Bug: 991723, b/162078899
Change-Id: I8c6ba6236deb936f743fb70a7f22779e0d3802c1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2330811
Commit-Queue: RJ Ascani <rjascani@google.com>
Reviewed-by: default avatarWez <wez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#801467}
parent 3644f5ab
......@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/fuchsia/process_context.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/frame_service_base.h"
......@@ -169,7 +170,12 @@ std::unique_ptr<media::FuchsiaCdmManager> CreateCdmManager() {
std::make_unique<PlayreadyHandler>());
}
return std::make_unique<media::FuchsiaCdmManager>(std::move(handlers));
std::string cdm_data_directory =
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kCdmDataDirectory);
return std::make_unique<media::FuchsiaCdmManager>(
std::move(handlers), base::FilePath(cdm_data_directory));
}
} // namespace
......
......@@ -272,10 +272,11 @@ void ContextProviderImpl::Create(
{kContextRequestHandleId, context_request.channel().get()});
// Bind |data_directory| to /data directory, if provided.
zx::channel data_directory_channel;
if (params.has_data_directory()) {
zx::channel data_directory_channel = ValidateDirectoryAndTakeChannel(
data_directory_channel = ValidateDirectoryAndTakeChannel(
std::move(*params.mutable_data_directory()));
if (data_directory_channel.get() == ZX_HANDLE_INVALID) {
if (!data_directory_channel) {
DLOG(ERROR)
<< "Invalid argument |data_directory| in CreateContextParams.";
context_request.Close(ZX_ERR_INVALID_ARGS);
......@@ -361,6 +362,13 @@ void ContextProviderImpl::Create(
context_request.Close(ZX_ERR_NOT_SUPPORTED);
return;
}
if ((enable_widevine || enable_playready) &&
!params.has_cdm_data_directory()) {
LOG(ERROR) << "WIDEVINE_CDM and PLAYREADY_CDM features require a "
"|cdm_data_directory|.";
context_request.Close(ZX_ERR_NOT_SUPPORTED);
return;
}
// If the system doesn't actually support DRM then disable it. This may result
// in the Context being able to run without using protected buffers.
......@@ -439,6 +447,26 @@ void ContextProviderImpl::Create(
key_system);
}
zx::channel cdm_data_directory_channel;
if (enable_widevine || enable_playready) {
DCHECK(params.has_cdm_data_directory());
const char kCdmDataPath[] = "/cdm_data";
cdm_data_directory_channel = ValidateDirectoryAndTakeChannel(
std::move(*params.mutable_cdm_data_directory()));
if (!cdm_data_directory_channel) {
LOG(ERROR)
<< "Invalid argument |cdm_data_directory| in CreateContextParams.";
context_request.Close(ZX_ERR_INVALID_ARGS);
return;
}
launch_command.AppendSwitchNative(switches::kCdmDataDirectory,
kCdmDataPath);
launch_options.paths_to_transfer.push_back(base::PathToTransfer{
base::FilePath(kCdmDataPath), cdm_data_directory_channel.get()});
}
bool disable_software_video_decoder =
(features &
fuchsia::web::ContextFeatureFlags::HARDWARE_VIDEO_DECODER_ONLY) ==
......@@ -531,11 +559,13 @@ void ContextProviderImpl::Create(
ZX_CHECK(ZX_OK == result, result) << "zx_job_set_critical";
}
// |context_request| and any DevTools channels were transferred (not copied)
// to the Context process.
// |context_request|, any DevTools channels and data directory channels were
// transferred (not copied) to the Context process.
ignore_result(context_request.TakeChannel().release());
for (auto& channel : devtools_listener_channels)
ignore_result(channel.release());
ignore_result(data_directory_channel.release());
ignore_result(cdm_data_directory_channel.release());
}
void ContextProviderImpl::SetLaunchCallbackForTest(
......
......@@ -110,6 +110,15 @@ fuchsia::web::CreateContextParams BuildCreateContextParams() {
return output;
}
fidl::InterfaceHandle<fuchsia::io::Directory> OpenCacheDirectory() {
fidl::InterfaceHandle<fuchsia::io::Directory> cache_handle;
zx_status_t result =
fdio_service_connect(base::fuchsia::kPersistedCacheDirectoryPath,
cache_handle.NewRequest().TakeChannel().release());
ZX_CHECK(result == ZX_OK, result) << "Failed to open /cache";
return cache_handle;
}
} // namespace
class ContextProviderImplTest : public base::MultiProcessTest {
......@@ -254,6 +263,7 @@ TEST_F(ContextProviderImplTest, CreateValidatesDrmFlags) {
BuildCreateContextParams();
*create_params.mutable_features() =
fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM;
*create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
provider_ptr_->Create(std::move(create_params), context.NewRequest());
base::RunLoop run_loop;
context.set_error_handler([&run_loop](zx_status_t status) {
......@@ -269,6 +279,7 @@ TEST_F(ContextProviderImplTest, CreateValidatesDrmFlags) {
fuchsia::web::CreateContextParams create_params =
BuildCreateContextParams();
create_params.set_playready_key_system("foo");
*create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
provider_ptr_->Create(std::move(create_params), context.NewRequest());
base::RunLoop run_loop;
context.set_error_handler([&run_loop](zx_status_t status) {
......@@ -286,6 +297,7 @@ TEST_F(ContextProviderImplTest, CreateValidatesDrmFlags) {
*create_params.mutable_features() =
fuchsia::web::ContextFeatureFlags::WIDEVINE_CDM |
fuchsia::web::ContextFeatureFlags::HEADLESS;
*create_params.mutable_cdm_data_directory() = OpenCacheDirectory();
provider_ptr_->Create(std::move(create_params), context.NewRequest());
base::RunLoop run_loop;
context.set_error_handler([&run_loop](zx_status_t status) {
......
......@@ -17,5 +17,6 @@ const char kAllowRunningInsecureContent[] = "allow-running-insecure-content";
const char kUseLegacyMetricsService[] = "use-legacy-metrics-service";
const char kCorsExemptHeaders[] = "cors-exempt-headers";
const char kEnableCastStreamingReceiver[] = "enable-cast-streaming-receiver";
const char kCdmDataDirectory[] = "cdm-data-directory";
} // namespace switches
......@@ -50,6 +50,9 @@ extern const char kCorsExemptHeaders[];
// way of enabling this feature.
extern const char kEnableCastStreamingReceiver[];
// Data directory to be used for CDM user data.
extern const char kCdmDataDirectory[];
} // namespace switches
#endif // FUCHSIA_ENGINE_SWITCHES_H_
......@@ -13,6 +13,7 @@
#include "base/base_paths_fuchsia.h"
#include "base/command_line.h"
#include "base/files/file_util.h"
#include "base/fuchsia/file_utils.h"
#include "base/fuchsia/fuchsia_logging.h"
#include "base/fuchsia/process_context.h"
......@@ -184,6 +185,17 @@ int main(int argc, char** argv) {
if (remote_debugging_port)
create_context_params.set_remote_debugging_port(*remote_debugging_port);
// DRM services require cdm_data_directory to be populated, so create a
// directory under /data and use that as the cdm_data_directory.
base::FilePath cdm_data_path =
base::FilePath(base::fuchsia::kPersistedDataDirectoryPath)
.Append("cdm_data");
base::File::Error error;
CHECK(base::CreateDirectoryAndGetError(cdm_data_path, &error)) << error;
create_context_params.set_cdm_data_directory(
base::fuchsia::OpenDirectory(cdm_data_path));
CHECK(create_context_params.cdm_data_directory());
base::RunLoop run_loop;
// Create the browser |context|.
......
......@@ -5,6 +5,7 @@
#include <lib/sys/cpp/component_context.h>
#include "base/command_line.h"
#include "base/files/file_util.h"
#include "base/fuchsia/file_utils.h"
#include "base/fuchsia/process_context.h"
#include "base/fuchsia/scoped_service_binding.h"
......@@ -36,6 +37,17 @@ fuchsia::web::CreateContextParams GetContextParams() {
base::FilePath(base::fuchsia::kPersistedDataDirectoryPath)));
CHECK(create_context_params.data_directory());
// DRM services require cdm_data_directory to be populated, so create a
// directory under /data and use that as the cdm_data_directory.
base::FilePath cdm_data_path =
base::FilePath(base::fuchsia::kPersistedDataDirectoryPath)
.Append("cdm_data");
base::File::Error error;
CHECK(base::CreateDirectoryAndGetError(cdm_data_path, &error)) << error;
create_context_params.set_cdm_data_directory(
base::fuchsia::OpenDirectory(cdm_data_path));
CHECK(create_context_params.cdm_data_directory());
#if BUILDFLAG(WEB_RUNNER_REMOTE_DEBUGGING_PORT) != 0
create_context_params.set_remote_debugging_port(
BUILDFLAG(WEB_RUNNER_REMOTE_DEBUGGING_PORT));
......
......@@ -216,10 +216,10 @@ void FuchsiaCdmManager::OriginProvisioner::OnProvisionFail() {
ProcessPendingCallbacks();
}
FuchsiaCdmManager::FuchsiaCdmManager(KeySystemHandlerMap handlers)
: handlers_(std::move(handlers)) {
DETACH_FROM_THREAD(thread_checker_);
}
FuchsiaCdmManager::FuchsiaCdmManager(KeySystemHandlerMap handlers,
base::FilePath cdm_data_path)
: handlers_(std::move(handlers)),
cdm_data_path_(std::move(cdm_data_path)) {}
FuchsiaCdmManager::~FuchsiaCdmManager() = default;
......
......@@ -9,6 +9,7 @@
#include <string>
#include "base/containers/flat_map.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/threading/thread_checker.h"
#include "media/base/provision_fetcher.h"
......@@ -48,7 +49,7 @@ class FuchsiaCdmManager {
using KeySystemHandlerMap =
base::flat_map<std::string, std::unique_ptr<KeySystemHandler>>;
explicit FuchsiaCdmManager(KeySystemHandlerMap handlers);
FuchsiaCdmManager(KeySystemHandlerMap handlers, base::FilePath cdm_data_path);
~FuchsiaCdmManager();
void CreateAndProvision(
......@@ -72,6 +73,7 @@ class FuchsiaCdmManager {
bool success);
const KeySystemHandlerMap handlers_;
const base::FilePath cdm_data_path_;
// key system -> OriginProvisioner
base::flat_map<std::string, std::unique_ptr<OriginProvisioner>>
......
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