chromium/chrome/browser/ash/crosapi/dlp_ash.h

// Copyright 2021 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_BROWSER_ASH_CROSAPI_DLP_ASH_H_
#define CHROME_BROWSER_ASH_CROSAPI_DLP_ASH_H_

#include "base/files/file_path.h"
#include "chromeos/crosapi/mojom/dlp.mojom.h"
#include "content/public/browser/desktop_media_id.h"
#include "content/public/browser/media_stream_request.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"

namespace crosapi {

// Implements the crosapi DLP (Data Leak Prevention) interface. Lives in
// ash-chrome on the UI thread.
class DlpAsh : public mojom::Dlp {
 public:
  DlpAsh();
  DlpAsh(const DlpAsh&) = delete;
  DlpAsh& operator=(const DlpAsh&) = delete;
  ~DlpAsh() override;

  void BindReceiver(mojo::PendingReceiver<mojom::Dlp> receiver);

  // crosapi::mojom::Dlp:
  void DlpRestrictionsUpdated(
      const std::string& window_id,
      mojom::DlpRestrictionSetPtr restrictions) override;
  void CheckScreenShareRestriction(
      mojom::ScreenShareAreaPtr area,
      const std::u16string& application_title,
      CheckScreenShareRestrictionCallback callback) override;
  void OnScreenShareStarted(
      const std::string& label,
      mojom::ScreenShareAreaPtr area,
      const ::std::u16string& application_title,
      ::mojo::PendingRemote<mojom::StateChangeDelegate> delegate) override;
  void OnScreenShareStopped(const std::string& label,
                            mojom::ScreenShareAreaPtr area) override;
  void ShowBlockedFiles(std::optional<uint64_t> task_id,
                        const std::vector<base::FilePath>& blocked_files,
                        mojom::FileAction action) override;

 private:
  // Callback to pass request to change screen share state to remote.
  void ChangeScreenShareState(mojo::RemoteSetElementId id,
                              const content::DesktopMediaID& media_id,
                              blink::mojom::MediaStreamStateChange new_state);

  // Callback to pass request to stop screen share to remote.
  void StopScreenShare(mojo::RemoteSetElementId id);

  void OnDisconnect();

  mojo::ReceiverSet<mojom::Dlp> receivers_;
  mojo::RemoteSet<mojom::StateChangeDelegate> screen_share_remote_delegates_;

  SEQUENCE_CHECKER(sequence_checker_);

  base::WeakPtrFactory<DlpAsh> weak_ptr_factory_{this};
};

}  // namespace crosapi

#endif  // CHROME_BROWSER_ASH_CROSAPI_DLP_ASH_H_