chromium/chrome/browser/ash/mahi/mahi_browser_delegate_ash.h

// Copyright 2024 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_MAHI_MAHI_BROWSER_DELEGATE_ASH_H_
#define CHROME_BROWSER_ASH_MAHI_MAHI_BROWSER_DELEGATE_ASH_H_

#include <map>
#include <string>

#include "base/memory/weak_ptr.h"
#include "chromeos/crosapi/mojom/mahi.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"

namespace base {
class UnguessableToken;
}  // namespace base

namespace ash {

class MahiBrowserClientWrapper;

// `MahiBrowserDelegateAsh` is the central point to deal with the ChromeOS -
// Chrome browser communication. it is responsible for:
// 1. Being the transfer station of the browser contents related logic between
// ChromeOS and chrome (Ash and Lacros).
// 2. Notify `MahiManagerAsh` any UI action from the browser.
class MahiBrowserDelegateAsh : public crosapi::mojom::MahiBrowserDelegate {
 public:
  MahiBrowserDelegateAsh();

  MahiBrowserDelegateAsh(const MahiBrowserDelegateAsh&) = delete;
  MahiBrowserDelegateAsh& operator=(const MahiBrowserDelegateAsh&) = delete;

  ~MahiBrowserDelegateAsh() override;

  // Binds a pending receiver connected to a lacros mojo client to the delegate.
  void BindReceiver(
      mojo::PendingReceiver<crosapi::mojom::MahiBrowserDelegate> receiver);

  // Registers an ash-browser client. Non-mojo client needs to manually call
  // `UnregisterClient` (e.g., inside its destructor).
  void RegisterCppClient(crosapi::mojom::MahiBrowserClient* client,
                         const base::UnguessableToken& client_id);

  // crosapi::mojom::MahiBrowser overrides
  void RegisterMojoClient(
      mojo::PendingRemote<crosapi::mojom::MahiBrowserClient> client,
      const base::UnguessableToken& client_id,
      RegisterMojoClientCallback callback) override;
  void OnFocusedPageChanged(crosapi::mojom::MahiPageInfoPtr page_info,
                            OnFocusedPageChangedCallback callback) override;
  void OnContextMenuClicked(
      crosapi::mojom::MahiContextMenuRequestPtr context_menu_request,
      OnContextMenuClickedCallback callback) override;

  // Removes entry corresponding to `client_id` from the map. Called by the
  // destructor of cpp client (ash browser), and by the disconnect handler on
  // `receiver` when the lacros mojo client disconnects.
  void UnregisterClient(const base::UnguessableToken& client_id);

  // Requests the page content from a particular client.
  // Virtual so that it can be overridden in test.
  virtual void GetContentFromClient(
      const base::UnguessableToken& client_id,
      const base::UnguessableToken& page_id,
      crosapi::mojom::MahiBrowserClient::GetContentCallback callback);

 private:
  // An entry is inserted into this map whenever a new client (cpp or mojo) is
  // registered on this delegate and deleted upon the destruction (cpp) or
  // disconnection (mojo) of this client.
  std::map<base::UnguessableToken, MahiBrowserClientWrapper>
      client_id_to_wrapper_;
  mojo::ReceiverSet<crosapi::mojom::MahiBrowserDelegate> receivers_;
};

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_MAHI_MAHI_BROWSER_DELEGATE_ASH_H_