blob: b11758ce1c41958428f0e8ff670438cfc5f91dba [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_ON_DEVICE_TRANSLATION_TRANSLATOR_H_
#define CHROME_BROWSER_ON_DEVICE_TRANSLATION_TRANSLATOR_H_
#include "base/containers/flat_map.h"
#include "base/memory/weak_ptr.h"
#include "components/services/on_device_translation/public/mojom/translator.mojom.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/remote_set.h"
#include "third_party/blink/public/mojom/ai/model_streaming_responder.mojom-forward.h"
#include "third_party/blink/public/mojom/on_device_translation/translator.mojom.h"
namespace content {
class BrowserContext;
} // namespace content
namespace on_device_translation {
// The browser-side implementation of `blink::mojom::Translator`, which
// exposes the `Translate()` method to do translation.
class Translator : public blink::mojom::Translator {
public:
Translator(
base::WeakPtr<content::BrowserContext> browser_context,
const std::string& source_lang,
const std::string& target_lang,
mojo::PendingRemote<on_device_translation::mojom::Translator> remote);
Translator(const Translator&) = delete;
Translator& operator=(const Translator&) = delete;
~Translator() override;
// `blink::mojom::Translator` implementation.
void Translate(const std::string& input,
mojo::PendingRemote<blink::mojom::ModelStreamingResponder>
pending_responder) override;
void TranslateStreaming(
const std::string& input,
mojo::PendingRemote<blink::mojom::ModelStreamingResponder>
pending_responder) override;
private:
// Callback for on_device_translation chunks requested by TranslateStreaming.
void TranslateStreamingCallback(mojo::RemoteSetElementId responder_id,
int total_translations,
const std::optional<std::string>& output);
// Check shared prerequisites for Translate and TranslateStreaming;
// return true if all were satisfied, false otherwise.
bool VerifyPrerequisites(
const std::string& input,
mojo::Remote<blink::mojom::ModelStreamingResponder>& responder);
base::WeakPtr<content::BrowserContext> browser_context_;
const std::string source_lang_;
const std::string target_lang_;
mojo::Remote<on_device_translation::mojom::Translator> translator_remote_;
mojo::RemoteSet<blink::mojom::ModelStreamingResponder> responder_set_;
// The number of remaining Translate callbacks expected for each responder.
base::flat_map<mojo::RemoteSetElementId, int> pending_translations_;
base::WeakPtrFactory<Translator> weak_ptr_factory_{this};
};
} // namespace on_device_translation
#endif // CHROME_BROWSER_ON_DEVICE_TRANSLATION_TRANSLATOR_H_