blob: 4fffe221fb7115700725cf8677b8352dd41694f6 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_TRANSLATE_IOS_BROWSER_IOS_TRANSLATE_DRIVER_H_
#define COMPONENTS_TRANSLATE_IOS_BROWSER_IOS_TRANSLATE_DRIVER_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "components/language/ios/browser/ios_language_detection_tab_helper.h"
#include "components/translate/core/browser/translate_driver.h"
#include "components/translate/ios/browser/language_detection_controller.h"
#include "components/translate/ios/browser/translate_controller.h"
#include "ios/web/public/web_state/web_state_observer.h"
@class CRWJSInjectionReceiver;
namespace web {
class NavigationManager;
class WebState;
}
namespace translate {
class TranslateManager;
// Content implementation of TranslateDriver.
class IOSTranslateDriver : public TranslateDriver,
public TranslateController::Observer,
public web::WebStateObserver {
public:
IOSTranslateDriver(web::WebState* web_state,
web::NavigationManager* navigation_manager,
TranslateManager* translate_manager);
~IOSTranslateDriver() override;
LanguageDetectionController* language_detection_controller() {
return language_detection_controller_.get();
}
TranslateController* translate_controller() {
return translate_controller_.get();
}
// Creates a callback to be used when language detection occurs.
language::IOSLanguageDetectionTabHelper::Callback
CreateLanguageDetectionCallback();
// web::WebStateObserver methods.
void DidFinishNavigation(web::WebState* web_state,
web::NavigationContext* navigation_context) override;
void WebStateDestroyed(web::WebState* web_state) override;
// TranslateDriver methods.
void OnIsPageTranslatedChanged() override;
void OnTranslateEnabledChanged() override;
bool IsLinkNavigation() override;
void TranslatePage(int page_seq_no,
const std::string& translate_script,
const std::string& source_lang,
const std::string& target_lang) override;
void RevertTranslation(int page_seq_no) override;
bool IsIncognito() override;
const std::string& GetContentsMimeType() override;
const GURL& GetLastCommittedURL() override;
const GURL& GetVisibleURL() override;
bool HasCurrentPage() override;
void OpenUrlInNewTab(const GURL& url) override;
private:
// Called when the translation was successful.
void TranslationDidSucceed(const std::string& source_lang,
const std::string& target_lang,
int page_seq_no,
const std::string& original_page_language,
double translation_time);
// Checks if the current running page translation is finished or errored and
// notifies the browser accordingly. If the translation has not terminated,
// posts a task to check again later.
// Similar to TranslateHelper::CheckTranslateStatus on desktop.
void CheckTranslateStatus(const std::string& source_language,
const std::string& target_language,
int page_seq_no);
// Returns true if the user has not navigated away and the the page is not
// being destroyed.
bool IsPageValid(int page_seq_no) const;
// Used to kick off translation process.
void OnLanguageDetermined(const LanguageDetectionDetails& details);
// TranslateController::Observer methods.
void OnTranslateScriptReady(bool success,
double load_time,
double ready_time) override;
void OnTranslateComplete(bool success,
const std::string& original_language,
double translation_time) override;
// The WebState this instance is observing. Will be null after
// WebStateDestroyed has been called.
web::WebState* web_state_ = nullptr;
// The navigation manager of the tab we are associated with.
web::NavigationManager* navigation_manager_;
base::WeakPtr<TranslateManager> translate_manager_;
std::unique_ptr<TranslateController> translate_controller_;
std::unique_ptr<LanguageDetectionController> language_detection_controller_;
// An ever-increasing sequence number of the current page, used to match up
// translation requests with responses.
// This matches the similar field in TranslateHelper in the renderer on other
// platforms.
int page_seq_no_;
// When a translation is in progress, its page sequence number is stored in
// |pending_page_seq_no_|.
int pending_page_seq_no_;
// Parameters of the current translation.
std::string source_language_;
std::string target_language_;
base::WeakPtrFactory<IOSTranslateDriver> weak_method_factory_;
DISALLOW_COPY_AND_ASSIGN(IOSTranslateDriver);
};
} // namespace translate
#endif // COMPONENTS_TRANSLATE_IOS_BROWSER_IOS_TRANSLATE_DRIVER_H_