blob: 62df1d0049d7e67656a362615310528f82bc4bbe [file] [log] [blame]
// 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_SPEECH_ON_DEVICE_SPEECH_RECOGNITION_IMPL_H_
#define CHROME_BROWSER_SPEECH_ON_DEVICE_SPEECH_RECOGNITION_IMPL_H_
#include <string>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "content/public/browser/document_user_data.h"
#include "media/mojo/mojom/speech_recognizer.mojom.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#if !BUILDFLAG(IS_ANDROID)
#include <list>
#include "base/containers/flat_map.h"
#include "components/soda/soda_installer.h"
#endif // !BUILDFLAG(IS_ANDROID)
namespace content {
class RenderFrameHost;
} // namespace content
namespace speech {
class OnDeviceSpeechRecognitionImpl
: public content::DocumentUserData<OnDeviceSpeechRecognitionImpl>,
#if !BUILDFLAG(IS_ANDROID)
public speech::SodaInstaller::Observer,
#endif // !BUILDFLAG(IS_ANDROID)
public media::mojom::OnDeviceSpeechRecognition {
public:
OnDeviceSpeechRecognitionImpl(const OnDeviceSpeechRecognitionImpl&) = delete;
OnDeviceSpeechRecognitionImpl& operator=(
const OnDeviceSpeechRecognitionImpl&) = delete;
~OnDeviceSpeechRecognitionImpl() override;
void Bind(
mojo::PendingReceiver<media::mojom::OnDeviceSpeechRecognition> receiver);
// speech::mojom::OnDeviceSpeechRecognition methods:
void Available(
const std::vector<std::string>& languages,
OnDeviceSpeechRecognitionImpl::AvailableCallback callback) override;
void Install(
const std::vector<std::string>& languages,
OnDeviceSpeechRecognitionImpl::InstallCallback callback) override;
#if !BUILDFLAG(IS_ANDROID)
// SodaInstaller::Observer:
void OnSodaInstalled(speech::LanguageCode language_code) override;
void OnSodaInstallError(speech::LanguageCode language_code,
speech::SodaInstaller::ErrorCode error_code) override;
void OnSodaProgress(speech::LanguageCode language_code,
int combined_progress) override {}
#endif // !BUILDFLAG(IS_ANDROID)
private:
friend class content::DocumentUserData<OnDeviceSpeechRecognitionImpl>;
explicit OnDeviceSpeechRecognitionImpl(content::RenderFrameHost* frame_host);
// Returns whether the render frame host can use on-device speech recognition.
// HTTP(s) origins not scoped to the default storage partition may not use
// on-device speech recognition.
bool CanRenderFrameHostUseOnDeviceSpeechRecognition();
#if !BUILDFLAG(IS_ANDROID)
void InstallLanguageInternal(
const std::vector<std::string>& languages,
OnDeviceSpeechRecognitionImpl::InstallCallback callback);
void ProcessLanguageInstallationUpdate(const std::string& language,
bool installation_success);
base::Value GetOnDeviceLanguagesDownloadedValue();
void SetOnDeviceLanguagesDownloadedContentSetting(
base::Value on_device_languages_downloaded);
bool HasOnDeviceLanguageDownloaded(const std::string& language);
void SetOnDeviceLanguageDownloaded(const std::string&);
// Mask on-device speech recognition availability by requiring a call to
// installOnDevice() for a language before the language is available to the
// origin.
media::mojom::AvailabilityStatus GetMaskedAvailabilityStatus(
const std::string& language);
// Returns a delay when installing on-device speech recognition language packs
// to safeguard against fingerprinting resulting from timing the installation.
base::TimeDelta GetDownloadDelay(const std::vector<std::string>& languages);
// A set of languages that have been downloaded for the current document. This
// is used for origins that cannot persist content settings, e.g. opaque
// origins or file schemes.
std::set<std::string> transient_on_device_languages_downloaded_;
base::flat_map<std::set<std::string>, std::list<InstallCallback>>
language_installation_callbacks_;
#endif // !BUILDFLAG(IS_ANDROID)
mojo::Receiver<media::mojom::OnDeviceSpeechRecognition> receiver_{this};
base::WeakPtrFactory<OnDeviceSpeechRecognitionImpl> weak_ptr_factory_{this};
DOCUMENT_USER_DATA_KEY_DECL();
};
} // namespace speech
#endif // CHROME_BROWSER_SPEECH_ON_DEVICE_SPEECH_RECOGNITION_IMPL_H_