Chromium Code Reviews| Index: ios/web_view/internal/translate/cwv_translation_controller.mm |
| diff --git a/ios/web_view/internal/translate/cwv_translation_controller.mm b/ios/web_view/internal/translate/cwv_translation_controller.mm |
| index f38e1ee039feaaa02209a22f33ead50864e00da1..17c842cebf1dc364733234435e53599bf073361e 100644 |
| --- a/ios/web_view/internal/translate/cwv_translation_controller.mm |
| +++ b/ios/web_view/internal/translate/cwv_translation_controller.mm |
| @@ -8,12 +8,15 @@ |
| #include "base/memory/ptr_util.h" |
| #include "base/strings/string16.h" |
| +#include "base/strings/sys_string_conversions.h" |
| +#include "components/translate/core/browser/translate_download_manager.h" |
| #include "components/translate/core/browser/translate_manager.h" |
| -#include "components/translate/core/browser/translate_ui_delegate.h" |
| #import "ios/web_view/internal/translate/cwv_language_detection_result_internal.h" |
| #import "ios/web_view/internal/translate/cwv_translation_language_internal.h" |
| #import "ios/web_view/internal/translate/web_view_translate_client.h" |
| #import "ios/web_view/public/cwv_translation_controller_delegate.h" |
| +#import "ios/web_view/public/cwv_translation_policy.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| @@ -45,18 +48,15 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
| @interface CWVTranslationController () |
| -// Convenience method to generate all supported languages from |
| -// |translateUIDelegate|. |
| -- (NSArray<CWVTranslationLanguage*>*)supportedLanguages; |
| - |
| -// Convenience method to get a language at |index| from |translateUIDelegate|. |
| -- (CWVTranslationLanguage*)languageAtIndex:(size_t)index; |
| +// Convenience method to get the language with |languageCode|. |
| +- (CWVTranslationLanguage*)languageWithCode:(const std::string&)languageCode; |
| @end |
| @implementation CWVTranslationController { |
| ios_web_view::WebViewTranslateClient* _translateClient; |
| - std::unique_ptr<translate::TranslateUIDelegate> _translateUIDelegate; |
| + std::unique_ptr<translate::TranslatePrefs> _translatePrefs; |
| + NSArray<CWVTranslationLanguage*>* _supportedLanguages; |
| } |
| @synthesize delegate = _delegate; |
| @@ -71,6 +71,31 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
| _translateClient = |
| ios_web_view::WebViewTranslateClient::FromWebState(_webState); |
| _translateClient->set_translation_controller(self); |
| + _translatePrefs = _translateClient->translate_manager() |
| + ->translate_client() |
| + ->GetTranslatePrefs(); |
| + |
| + NSMutableArray<CWVTranslationLanguage*>* supportedLanguages = |
| + [NSMutableArray array]; |
| + std::vector<std::string> languageCodes; |
| + translate::TranslateDownloadManager::GetSupportedLanguages(&languageCodes); |
| + std::string locale = |
| + translate::TranslateDownloadManager::GetInstance()->application_locale(); |
| + for (const std::string& languageCode : languageCodes) { |
| + base::string16 languageName = |
| + l10n_util::GetDisplayNameForLocale(languageCode, locale, true); |
| + CWVTranslationLanguage* language = |
| + [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode |
| + languageName:languageName]; |
| + [supportedLanguages addObject:language]; |
| + } |
| + |
| + [supportedLanguages sortUsingComparator:^NSComparisonResult( |
| + CWVTranslationLanguage* languageA, |
| + CWVTranslationLanguage* languageB) { |
| + return [languageA.languageName compare:languageB.languageName]; |
| + }]; |
| + _supportedLanguages = [supportedLanguages copy]; |
|
michaeldo
2017/05/25 16:18:58
|_supportedLanguages| won't change and isn't depen
jzw1
2017/05/26 02:19:27
ill lazy load this
|
| } |
| - (void)updateTranslateStep:(translate::TranslateStep)step |
| @@ -78,14 +103,8 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
| targetLanguage:(const std::string&)targetLanguage |
| errorType:(translate::TranslateErrors::Type)errorType |
| triggeredFromMenu:(bool)triggeredFromMenu { |
| - translate::TranslateManager* manager = _translateClient->translate_manager(); |
| - _translateUIDelegate = base::MakeUnique<translate::TranslateUIDelegate>( |
| - manager->GetWeakPtr(), sourceLanguage, targetLanguage); |
| - |
| - CWVTranslationLanguage* source = |
| - [self languageAtIndex:_translateUIDelegate->GetOriginalLanguageIndex()]; |
| - CWVTranslationLanguage* target = |
| - [self languageAtIndex:_translateUIDelegate->GetTargetLanguageIndex()]; |
| + CWVTranslationLanguage* source = [self languageWithCode:sourceLanguage]; |
| + CWVTranslationLanguage* target = [self languageWithCode:targetLanguage]; |
| NSError* error; |
| if (errorType != translate::TranslateErrors::NONE) { |
| @@ -100,7 +119,7 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
| [[CWVLanguageDetectionResult alloc] |
| initWithPageLanguage:source |
| suggestedTargetLanguage:target |
| - supportedLanguages:[self supportedLanguages]]; |
| + supportedLanguages:_supportedLanguages]; |
| if ([_delegate respondsToSelector:@selector |
| (translationController:didFinishLanguageDetectionWithResult |
| :error:)]) { |
| @@ -140,31 +159,101 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
| - (void)translatePageFromLanguage:(CWVTranslationLanguage*)sourceLanguage |
| toLanguage:(CWVTranslationLanguage*)targetLanguage { |
| - // TODO(706289): Use the passed parameters. |
| - _translateUIDelegate->Translate(); |
| + std::string sourceLanguageCode = |
| + base::SysNSStringToUTF8(sourceLanguage.languageCode); |
| + std::string targetLanguageCode = |
| + base::SysNSStringToUTF8(targetLanguage.languageCode); |
| + _translateClient->translate_manager()->TranslatePage( |
| + sourceLanguageCode, targetLanguageCode, false); |
| } |
| - (void)revertTranslation { |
| - _translateUIDelegate->RevertTranslation(); |
| + _translateClient->translate_manager()->RevertTranslation(); |
| } |
| -#pragma mark - Private Methods |
| +- (void)setTranslationPolicy:(CWVTranslationPolicy*)policy |
| + forPageLanguage:(CWVTranslationLanguage*)pageLanguage { |
| + std::string languageCode = base::SysNSStringToUTF8(pageLanguage.languageCode); |
| + switch (policy.type) { |
| + case CWVTranslationPolicyAsk: { |
| + _translatePrefs->UnblockLanguage(languageCode); |
| + _translatePrefs->RemoveLanguagePairFromWhitelist(languageCode, |
| + std::string()); |
| + break; |
| + } |
| + case CWVTranslationPolicyNever: { |
| + _translatePrefs->BlockLanguage(languageCode); |
| + break; |
| + } |
| + case CWVTranslationPolicyAuto: { |
| + _translatePrefs->UnblockLanguage(languageCode); |
| + _translatePrefs->WhitelistLanguagePair( |
| + languageCode, base::SysNSStringToUTF8(policy.language.languageCode)); |
| + break; |
| + } |
| + } |
| +} |
| -- (NSArray<CWVTranslationLanguage*>*)supportedLanguages { |
| - NSMutableArray* supportedLanguages = [NSMutableArray array]; |
| - for (size_t i = 0; i < _translateUIDelegate->GetNumberOfLanguages(); i++) { |
| - CWVTranslationLanguage* language = [self languageAtIndex:i]; |
| - [supportedLanguages addObject:language]; |
| +- (CWVTranslationPolicy*)translationPolicyForPageLanguage: |
| + (CWVTranslationLanguage*)pageLanguage { |
| + std::string languageCode = base::SysNSStringToUTF8(pageLanguage.languageCode); |
| + bool isLanguageBlocked = _translatePrefs->IsBlockedLanguage(languageCode); |
| + if (isLanguageBlocked) { |
| + return [CWVTranslationPolicy translationPolicyNever]; |
| + } |
| + |
| + std::string autoTargetLanguageCode; |
| + if (!_translatePrefs->ShouldAutoTranslate(languageCode, |
| + &autoTargetLanguageCode)) { |
| + return [CWVTranslationPolicy translationPolicyAsk]; |
| } |
| - return [supportedLanguages copy]; |
| + CWVTranslationLanguage* targetLanguage = |
| + [self languageWithCode:autoTargetLanguageCode]; |
| + return [CWVTranslationPolicy |
| + translationPolicyAutoTranslateToLanguage:targetLanguage]; |
| } |
| -- (CWVTranslationLanguage*)languageAtIndex:(size_t)index { |
| - std::string languageCode = _translateUIDelegate->GetLanguageCodeAt(index); |
| - base::string16 languageName = _translateUIDelegate->GetLanguageNameAt(index); |
| - return [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode |
| - languageName:languageName]; |
| +- (void)setTranslationPolicy:(CWVTranslationPolicy*)policy |
| + forPageHost:(NSString*)pageHost { |
| + DCHECK(pageHost.length > 0); |
|
michaeldo
2017/05/25 16:18:58
Per style convention, no need for "> 0".
jzw1
2017/05/26 02:19:27
Done.
|
| + switch (policy.type) { |
| + case CWVTranslationPolicyAsk: { |
| + _translatePrefs->RemoveSiteFromBlacklist( |
| + base::SysNSStringToUTF8(pageHost)); |
| + break; |
| + } |
| + case CWVTranslationPolicyNever: { |
| + _translatePrefs->BlacklistSite(base::SysNSStringToUTF8(pageHost)); |
| + break; |
| + } |
| + case CWVTranslationPolicyAuto: { |
| + // TODO(crbug.com/706289): Support auto translation policies for websites. |
|
michaeldo
2017/05/25 16:18:58
nit: Maybe add this TODO into translationPolicyFor
jzw1
2017/05/26 02:19:27
Done.
|
| + NOTREACHED(); |
| + break; |
| + } |
| + } |
| +} |
| + |
| +- (CWVTranslationPolicy*)translationPolicyForPageHost:(NSString*)pageHost { |
| + bool isSiteBlackListed = |
| + _translatePrefs->IsSiteBlacklisted(base::SysNSStringToUTF8(pageHost)); |
| + if (isSiteBlackListed) { |
| + return [CWVTranslationPolicy translationPolicyNever]; |
| + } |
| + return [CWVTranslationPolicy translationPolicyAsk]; |
| +} |
| + |
| +#pragma mark - Private Methods |
| + |
| +- (CWVTranslationLanguage*)languageWithCode:(const std::string&)languageCode { |
| + NSString* languageCodeString = base::SysUTF8ToNSString(languageCode); |
| + for (CWVTranslationLanguage* language in _supportedLanguages) { |
| + if ([language.languageCode isEqualToString:languageCodeString]) { |
|
michaeldo
2017/05/25 16:18:58
We call this method a lot and this isn't very effi
jzw1
2017/05/26 02:19:27
This is great advice. Done :)
|
| + return language; |
| + } |
| + } |
| + return nil; |
| } |
| @end |