blob: 9cbf84655fc66d58abbec854da5002da352fb6b0 [file] [log] [blame] [edit]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_OUTPUT_PROTECTION_IMPL_H_
#define CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_OUTPUT_PROTECTION_IMPL_H_
#include <memory>
#include <vector>
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chromeos/components/cdm_factory_daemon/mojom/output_protection.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/display/display_observer.h"
#include "ui/display/manager/content_protection_manager.h"
#include "ui/display/types/display_snapshot.h"
namespace chromeos {
// Provides a Mojo implementation of the OutputProtection interface which then
// calls into the ContentProtectionManger singleton owned by the ash shell.
class COMPONENT_EXPORT(CDM_FACTORY_DAEMON) OutputProtectionImpl
: public cdm::mojom::OutputProtection,
public display::DisplayObserver {
public:
// Mainly to enable testing, this abstracts out calls that would normally
// be made into display::ContentProtectionManager, ash::Screen and
// display::DisplayConfigurator.
class DisplaySystemDelegate {
public:
virtual ~DisplaySystemDelegate() = default;
// Delegate to display::ContentProtectionManager.
virtual void ApplyContentProtection(
display::ContentProtectionManager::ClientId client_id,
int64_t display_id,
uint32_t protection_mask,
display::ContentProtectionManager::ApplyContentProtectionCallback
callback) = 0;
virtual void QueryContentProtection(
display::ContentProtectionManager::ClientId client_id,
int64_t display_id,
display::ContentProtectionManager::QueryContentProtectionCallback
callback) = 0;
virtual display::ContentProtectionManager::ClientId RegisterClient() = 0;
virtual void UnregisterClient(
display::ContentProtectionManager::ClientId client_id) = 0;
// Delegate to display::DisplayConfigurator.
virtual const std::vector<
raw_ptr<display::DisplaySnapshot, VectorExperimental>>&
cached_displays() const = 0;
};
static void Create(
mojo::PendingReceiver<cdm::mojom::OutputProtection> receiver,
std::unique_ptr<DisplaySystemDelegate> delegate = nullptr);
explicit OutputProtectionImpl(
std::unique_ptr<DisplaySystemDelegate> delegate);
OutputProtectionImpl(const OutputProtectionImpl&) = delete;
OutputProtectionImpl& operator=(const OutputProtectionImpl&) = delete;
~OutputProtectionImpl() override;
// chromeos::cdm::mojom::OutputProtection:
void QueryStatus(QueryStatusCallback callback) override;
void EnableProtection(
cdm::mojom::OutputProtection::ProtectionType desired_protection,
EnableProtectionCallback callback) override;
private:
void Initialize();
// This is used to successively enable protection on all the displays and
// aggregate the overall result and fire the callback when complete.
void EnableProtectionCallbackAggregator(
std::vector<int64_t> remaining_displays,
EnableProtectionCallback callback,
bool aggregate_success,
bool success);
// This is used to query multiple displays for the status and then aggregate
// that into one before we invoke the callback.
void QueryStatusCallbackAggregator(std::vector<int64_t> remaining_displays,
QueryStatusCallback callback,
bool aggregate_success,
uint32_t aggregate_link_mask,
uint32_t aggregate_protection_mask,
uint32_t aggregate_no_protection_mask,
bool success,
uint32_t link_mask,
uint32_t protection_mask);
void HandleDisplayChange();
// display::DisplayObserver:
void OnDisplayAdded(const display::Display& display) override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override;
void OnDisplaysRemoved(const display::Displays& removed_displays) override;
// Helper methods to report output protection UMAs.
void ReportOutputProtectionQuery();
void ReportOutputProtectionQueryResult(uint32_t link_mask,
uint32_t protection_mask);
std::unique_ptr<DisplaySystemDelegate> delegate_;
display::ContentProtectionManager::ClientId client_id_;
std::optional<display::ScopedOptionalDisplayObserver> display_observer_;
std::vector<int64_t> display_id_list_;
uint32_t desired_protection_mask_{0};
// Tracks whether an output protection query and a positive query result (no
// unprotected external link) have been reported to UMA.
bool uma_for_output_protection_query_reported_ = false;
bool uma_for_output_protection_positive_result_reported_ = false;
// WeakPtrFactory to use for callbacks.
base::WeakPtrFactory<OutputProtectionImpl> weak_factory_{this};
};
} // namespace chromeos
#endif // CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_OUTPUT_PROTECTION_IMPL_H_