1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_LANGUAGE_IOS_BROWSER_IOS_LANGUAGE_DETECTION_TAB_HELPER_H_
#define COMPONENTS_LANGUAGE_IOS_BROWSER_IOS_LANGUAGE_DETECTION_TAB_HELPER_H_
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "components/prefs/pref_member.h"
#import "ios/web/public/js_messaging/web_frames_manager.h"
#import "ios/web/public/web_state_observer.h"
#import "ios/web/public/web_state_user_data.h"
namespace net {
class HttpResponseHeaders;
}
namespace translate {
struct LanguageDetectionDetails;
class LanguageDetectionModel;
} // namespace translate
namespace language {
// Maximum length of the extracted text returned by |-extractTextContent|.
// Matches desktop implementation.
extern const size_t kMaxIndexChars;
class UrlLanguageHistogram;
// Dispatches language detection messages to language and translate components.
class IOSLanguageDetectionTabHelper
: public web::WebFramesManager::Observer,
public web::WebStateObserver,
public web::WebStateUserData<IOSLanguageDetectionTabHelper> {
public:
class Observer {
public:
// Called when language detection details become available.
virtual void OnLanguageDetermined(
const translate::LanguageDetectionDetails& details) = 0;
// Called when the observed instance is being destroyed so that observers
// can call RemoveObserver on the instance.
virtual void IOSLanguageDetectionTabHelperWasDestroyed(
IOSLanguageDetectionTabHelper* tab_helper) = 0;
virtual ~Observer() = default;
};
IOSLanguageDetectionTabHelper(const IOSLanguageDetectionTabHelper&) = delete;
IOSLanguageDetectionTabHelper& operator=(
const IOSLanguageDetectionTabHelper&) = delete;
~IOSLanguageDetectionTabHelper() override;
// Adds or Removes observers.
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
base::WeakPtr<IOSLanguageDetectionTabHelper> GetWeakPtr();
// Completion handler used to retrieve the buffered text from the language
// detection JavaScript in LanguageDetectionJavaScriptFeature.
void OnTextRetrieved(const bool has_notranslate,
const std::string& http_content_language,
const std::string& html_lang,
const GURL& url,
const base::Value* text_content);
// Starts the page language detection and initiates the translation process.
void StartLanguageDetection();
private:
friend class web::WebStateUserData<IOSLanguageDetectionTabHelper>;
FRIEND_TEST_ALL_PREFIXES(IOSLanguageDetectionTabHelperTest,
TFLiteLanguageDetectionDurationRecorded);
IOSLanguageDetectionTabHelper(
web::WebState* web_state,
UrlLanguageHistogram* url_language_histogram,
translate::LanguageDetectionModel* language_detection_model,
PrefService* prefs);
// web::WebFramesManager::Observer
void WebFrameBecameAvailable(web::WebFramesManager* web_frames_manager,
web::WebFrame* web_frame) override;
// web::WebStateObserver implementation:
void PageLoaded(
web::WebState* web_state,
web::PageLoadCompletionStatus load_completion_status) override;
void DidStartNavigation(web::WebState* web_state,
web::NavigationContext* navigation_context) override;
void DidFinishNavigation(web::WebState* web_state,
web::NavigationContext* navigation_context) override;
void WebStateDestroyed(web::WebState* web_state) override;
// Called on page language detection.
void OnLanguageDetermined(const translate::LanguageDetectionDetails& details);
// Extracts "content-language" header into content_language_header_ variable.
void ExtractContentLanguageHeader(net::HttpResponseHeaders* headers);
// Selects and calls the correct DeterminePageLanguage based on the flags.
std::string DeterminePageLanguage(const std::string& code,
const std::string& html_lang,
const std::u16string& contents,
std::string* model_detected_language,
bool* is_model_reliable,
float& model_reliability_score,
std::string* detection_model_version);
// The WebState this instance is observing. Will be null after
// WebStateDestroyed has been called.
raw_ptr<web::WebState> web_state_ = nullptr;
const raw_ptr<UrlLanguageHistogram> url_language_histogram_;
raw_ptr<translate::LanguageDetectionModel> language_detection_model_ =
nullptr;
BooleanPrefMember translate_enabled_;
std::string content_language_header_;
base::ObserverList<Observer, true>::Unchecked observer_list_;
bool waiting_for_main_frame_ = false;
base::WeakPtrFactory<IOSLanguageDetectionTabHelper> weak_method_factory_;
};
} // namespace language
#endif // COMPONENTS_LANGUAGE_IOS_BROWSER_IOS_LANGUAGE_DETECTION_TAB_HELPER_H_
|