// 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 IOS_WEB_PUBLIC_ANNOTATIONS_ANNOTATIONS_TEXT_OBSERVER_H_
#define IOS_WEB_PUBLIC_ANNOTATIONS_ANNOTATIONS_TEXT_OBSERVER_H_
#include "base/observer_list.h"
namespace web {
class WebState;
// Allows observation of web page text extracted, for annotations or other
// purpose (like language detection). All methods are called on main thread.
// `seq_id` is needed for any calls to
// `AnnotationsTextManager::DecorateAnnotations`, to make sure the annotations
// apply to the same text extracted (which can, for example, be replaced by
// translate).
class AnnotationsTextObserver : public base::CheckedObserver {
public:
// Called on page load, after `text` has been extracted.
// 'metadata' contains the following key/pair values:
// Bool 'hasNoIntentDetection': true when web page has requested
// 'nointentdetection'.
// Bool 'hasNoTranslate': true when web page has
// requested 'notranslate'.
// String 'htmlLang': value from document.documentElement.lang or
// "".
// String 'httpContentLanguage': value of content from
// <meta http-equiv="content-language" content="en"> or "".
// String 'wkNoTelephone': true if the page header contains webkit's:
// <meta name="format-detection" content="telephone=no">
// String 'wkNoEmail': true if the page header contains webkit's:
// <meta name="format-detection" content="email=no">
// String 'wkNoAddress': true if the page header contains webkit's:
// <meta name="format-detection" content="address=no">
// String 'wkNoDate': true if the page header contains webkit's:
// <meta name="format-detection" content="date=no">
// String 'wkNoUnits': true if the page header contains webkit's:
// <meta name="format-detection" content="unit=no">
// Note all type=equal pairs can be also be comma separated in a single
// content attribute in a meta tag. The check is case insensitive but the
// metadata is guaranteed lowercase.
virtual void OnTextExtracted(WebState* web_state,
const std::string& text,
int seq_id,
const base::Value::Dict& metadata) {}
// Called when decorations have been applied. `successes` is the number of
// annotations that were successfully stylized in the page, reversely
// `failures` is the number of annotation that failed to decorate.
// `annotations` is the number of annotations that were sent for decorating.
// `cancelled` is the list of ids (`data`) of annotations that fully
// failed to decorate. There no guarantee that
// failures + successes == annotations
// failures == cancelled.length
// because an annotation can be partially decorated due to some changes in the
// web page. There is also no guarantee this will be called.
virtual void OnDecorated(WebState* web_state,
int annotations,
int successes,
int failures,
const base::Value::List& cancelled) {}
// Called when user taps an annotation. `text` is the original annotation
// text, `rect` is the position in the web page where the annotation is and
// `data` is the encoded data attached to each annotation.
virtual void OnClick(WebState* web_state,
const std::string& text,
CGRect rect,
const std::string& data) {}
};
} // namespace web
#endif // IOS_WEB_PUBLIC_ANNOTATIONS_ANNOTATIONS_TEXT_OBSERVER_H_