blob: 2c960c1fcc134c709fc37e286b5192c5f87258a2 [file]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_ANNOTATION_TEXT_ANNOTATION_SELECTOR_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_ANNOTATION_TEXT_ANNOTATION_SELECTOR_H_
#include <optional>
#include "third_party/blink/renderer/core/annotation/annotation_selector.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/fragment_directive/text_fragment_finder.h"
#include "third_party/blink/renderer/core/fragment_directive/text_fragment_selector.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/wtf/casting.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
// AnnotationSelector based on TextFragmentFinder. This selector allows
// attaching to DOM based on exact or a range of text with provided prefix or
// suffix.
class CORE_EXPORT TextAnnotationSelector : public AnnotationSelector,
public TextFragmentFinder::Client {
public:
explicit TextAnnotationSelector(const TextFragmentSelector& params);
~TextAnnotationSelector() override = default;
void Trace(Visitor* visitor) const override;
// AnnotationSelector Interface
String Serialize() const override;
void FindRange(Range& search_range,
SearchType type,
FinishedCallback finished_cb) override;
bool IsTextSelector() const override { return true; }
// TextFragmentFinder::Client Interface
void DidFindMatch(const RangeInFlatTree& range, bool is_unique) override;
void NoMatchFound() override;
// This is specific to a metric for TextFragmentAnchor so it isn't part of
// the selector API. If there's other use cases for metrics gathering it may
// make sense to make FindRange return a more general Metrics object into
// which this bit could be added.
bool WasMatchUnique() const;
private:
TextFragmentSelector params_;
std::optional<bool> was_unique_;
FinishedCallback finished_callback_;
Member<TextFragmentFinder> finder_;
};
template <>
struct DowncastTraits<TextAnnotationSelector> {
static bool AllowFrom(const AnnotationSelector& selector) {
return selector.IsTextSelector();
}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_ANNOTATION_TEXT_ANNOTATION_SELECTOR_H_