#ifndef PDF_PDF_ANNOTATION_AGENT_H_
#define PDF_PDF_ANNOTATION_AGENT_H_
#include <ostream>
#include "base/containers/span.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/types/cxx23_to_underlying.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/mojom/annotation/annotation.mojom.h"
namespace chrome_pdf {
class PdfAnnotationAgent : public blink::mojom::AnnotationAgent {
public:
class Container {
public:
virtual bool FindAndHighlightTextFragments(
base::span<const std::string> text_fragments) = 0;
virtual void ScrollTextFragmentIntoView() = 0;
virtual void RemoveTextFragments() = 0;
protected:
~Container() = default;
};
PdfAnnotationAgent(
Container* container,
blink::mojom::AnnotationType type,
blink::mojom::SelectorPtr selector,
mojo::PendingRemote<blink::mojom::AnnotationAgentHost> host_remote,
mojo::PendingReceiver<blink::mojom::AnnotationAgent> agent_receiver);
~PdfAnnotationAgent() override;
void ScrollIntoView(bool applies_focus) override;
void RemoveTextFragments();
private:
enum class State {
kInitial = 0,
kActive,
kFailure,
kHighlightDropped,
};
friend std::ostream& operator<<(std::ostream& o, State state) {
o << base::to_underlying(state);
return o;
}
void SetState(State new_state);
const raw_ptr<Container> container_;
State state_ = State::kInitial;
mojo::Remote<blink::mojom::AnnotationAgentHost> agent_host_;
mojo::Receiver<blink::mojom::AnnotationAgent> receiver_{this};
base::WeakPtrFactory<PdfAnnotationAgent> weak_factory_{this};
};
}
#endif