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

// 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.

#include "chrome/browser/ash/mahi/mahi_browser_delegate_ash.h"

#include <optional>

#include "base/check.h"
#include "base/functional/bind.h"
#include "chrome/browser/ash/mahi/mahi_browser_client_wrapper.h"
#include "chromeos/components/mahi/public/cpp/mahi_manager.h"
#include "chromeos/constants/chromeos_features.h"
#include "chromeos/crosapi/mojom/mahi.mojom.h"

namespace ash {

MahiBrowserDelegateAsh::MahiBrowserDelegateAsh() = default;

MahiBrowserDelegateAsh::~MahiBrowserDelegateAsh() = default;

void MahiBrowserDelegateAsh::BindReceiver(
    mojo::PendingReceiver<crosapi::mojom::MahiBrowserDelegate> receiver) {
  // The receiver is only from lacros chrome as present, but more mojo clients
  // may be added in the future.
  receivers_.Add(this, std::move(receiver));
}

void MahiBrowserDelegateAsh::RegisterCppClient(
    crosapi::mojom::MahiBrowserClient* client,
    const base::UnguessableToken& client_id) {
  client_id_to_wrapper_.try_emplace(client_id, client, this);
}

void MahiBrowserDelegateAsh::RegisterMojoClient(
    mojo::PendingRemote<crosapi::mojom::MahiBrowserClient> client,
    const base::UnguessableToken& client_id,
    RegisterMojoClientCallback callback) {
  client_id_to_wrapper_.try_emplace(client_id, std::move(client), client_id,
                                    this);
  std::move(callback).Run(true);
}

void MahiBrowserDelegateAsh::OnFocusedPageChanged(
    crosapi::mojom::MahiPageInfoPtr page_info,
    OnFocusedPageChangedCallback callback) {
  if (!chromeos::features::IsMahiEnabled()) {
    std::move(callback).Run(true);
    return;
  }

  auto* manager = chromeos::MahiManager::Get();
  if (manager) {
    manager->SetCurrentFocusedPageInfo(std::move(page_info));
    std::move(callback).Run(true);
  } else {
    std::move(callback).Run(false);
  }
}

void MahiBrowserDelegateAsh::OnContextMenuClicked(
    crosapi::mojom::MahiContextMenuRequestPtr context_menu_request,
    OnContextMenuClickedCallback callback) {
  if (!chromeos::features::IsMahiEnabled()) {
    std::move(callback).Run(true);
    return;
  }

  auto* manager = chromeos::MahiManager::Get();
  if (manager) {
    manager->OnContextMenuClicked(std::move(context_menu_request));
    std::move(callback).Run(true);
  } else {
    std::move(callback).Run(false);
  }
}

void MahiBrowserDelegateAsh::UnregisterClient(
    const base::UnguessableToken& client_id) {
  client_id_to_wrapper_.erase(client_id);
}

void MahiBrowserDelegateAsh::GetContentFromClient(
    const base::UnguessableToken& client_id,
    const base::UnguessableToken& page_id,
    crosapi::mojom::MahiBrowserClient::GetContentCallback callback) {
  // Return `nullptr` if the client is not found.
  if (!client_id_to_wrapper_.contains(client_id)) {
    std::move(callback).Run(nullptr);
    return;
  }
  client_id_to_wrapper_.at(client_id).GetContent(page_id, std::move(callback));
}

}  // namespace ash