// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_WEBUI_PROJECTOR_APP_UNTRUSTED_PROJECTOR_PAGE_HANDLER_IMPL_H_
#define ASH_WEBUI_PROJECTOR_APP_UNTRUSTED_PROJECTOR_PAGE_HANDLER_IMPL_H_
#include "ash/webui/projector_app/mojom/untrusted_projector.mojom.h"
#include "ash/webui/projector_app/projector_app_client.h"
#include "ash/webui/projector_app/projector_xhr_sender.h"
#include "ash/webui/projector_app/public/mojom/projector_types.mojom-forward.h"
#include "base/files/safe_base_name.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "components/prefs/pref_service.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "url/gurl.h"
namespace ash {
// Handles messages from the Projector WebUIs (i.e.
// chrome-untrusted://projector).
class UntrustedProjectorPageHandlerImpl
: public ProjectorAppClient::Observer,
public projector::mojom::UntrustedProjectorPageHandler {
public:
UntrustedProjectorPageHandlerImpl(
mojo::PendingReceiver<projector::mojom::UntrustedProjectorPageHandler>
receiver,
mojo::PendingRemote<projector::mojom::UntrustedProjectorPage>
projector_remote,
PrefService* pref_service);
UntrustedProjectorPageHandlerImpl(const UntrustedProjectorPageHandlerImpl&) =
delete;
UntrustedProjectorPageHandlerImpl& operator=(
const UntrustedProjectorPageHandlerImpl&) = delete;
~UntrustedProjectorPageHandlerImpl() override;
// ProjectorAppClient:Observer:
void OnNewScreencastPreconditionChanged(
const NewScreencastPrecondition& precondition) override;
void OnSodaProgress(int percentage) override;
void OnSodaError() override;
void OnSodaInstalled() override;
void OnScreencastsPendingStatusChanged(
const PendingScreencastContainerSet& pending_screencast) override;
// projector::mojom::UntrustedProjectorPageHandler:
void GetNewScreencastPrecondition(
GetNewScreencastPreconditionCallback callback) override;
void ShouldDownloadSoda(ShouldDownloadSodaCallback callback) override;
void InstallSoda(InstallSodaCallback callback) override;
void GetPendingScreencasts(GetPendingScreencastsCallback callback) override;
void GetUserPref(projector::mojom::PrefsThatProjectorCanAskFor pref,
GetUserPrefCallback callback) override;
void SetUserPref(projector::mojom::PrefsThatProjectorCanAskFor pref,
base::Value value,
SetUserPrefCallback callback) override;
void OpenFeedbackDialog(OpenFeedbackDialogCallback callback) override;
void StartProjectorSession(const base::SafeBaseName& storage_dir_name,
StartProjectorSessionCallback callback) override;
void SendXhr(
const GURL& url,
projector::mojom::RequestType method,
const std::optional<std::string>& request_body,
bool use_credentials,
bool use_api_key,
const std::optional<base::flat_map<std::string, std::string>>& headers,
const std::optional<std::string>& account_email,
SendXhrCallback callback) override;
void GetAccounts(GetAccountsCallback callback) override;
void GetVideo(const std::string& video_file_id,
const std::optional<std::string>& resource_key,
GetVideoCallback callback) override;
protected:
void OnVideoLocated(GetVideoCallback callback,
projector::mojom::GetVideoResultPtr result);
base::WeakPtr<UntrustedProjectorPageHandlerImpl> GetWeakPtr();
// Called when the XHR request is completed. Runs the callback with the
// results.
virtual void OnXhrRequestCompleted(
SendXhrCallback callback,
projector::mojom::XhrResponsePtr xhr_response);
private:
mojo::Receiver<projector::mojom::UntrustedProjectorPageHandler> receiver_;
mojo::Remote<projector::mojom::UntrustedProjectorPage> projector_remote_;
// Primary user pref service.
const raw_ptr<PrefService> pref_service_;
ProjectorXhrSender xhr_sender_;
base::WeakPtrFactory<UntrustedProjectorPageHandlerImpl> weak_ptr_factory_{
this};
};
} // namespace ash
#endif // ASH_WEBUI_PROJECTOR_APP_UNTRUSTED_PROJECTOR_PAGE_HANDLER_IMPL_H_