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..de63cbb75dd489b42972fdfaabae17907481a149 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:(NSString*)languageCode; |
|
Hiroshi Ichikawa
2017/05/25 06:44:22
Optional: Maybe this method should take const std:
jzw1
2017/05/25 06:55:37
Done.
|
| @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,33 @@ 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> language_codes; |
| + translate::TranslateDownloadManager::GetSupportedLanguages(&language_codes); |
| + std::string locale = |
| + translate::TranslateDownloadManager::GetInstance()->application_locale(); |
| + for (std::vector<std::string>::const_iterator iter = language_codes.begin(); |
|
Hiroshi Ichikawa
2017/05/25 06:44:22
for (const std::string languageCode : language_cod
jzw1
2017/05/25 06:55:37
Done.
Hiroshi Ichikawa
2017/05/25 07:42:30
Oops sorry it's better to add "&":
for (const std
|
| + iter != language_codes.end(); ++iter) { |
| + std::string languageCode = *iter; |
|
Hiroshi Ichikawa
2017/05/25 06:44:22
Be consistent with the variable name style between
jzw1
2017/05/25 06:55:36
Done.
|
| + 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]; |
|
Hiroshi Ichikawa
2017/05/25 06:44:22
Why do you copy here?
jzw1
2017/05/25 06:55:37
the local var is a NSMutableArray so I usually cop
Hiroshi Ichikawa
2017/05/25 07:42:30
Oh I see, good to know. I didn't know -[NSMutableA
|
| } |
| - (void)updateTranslateStep:(translate::TranslateStep)step |
| @@ -78,14 +105,10 @@ 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()]; |
| + [self languageWithCode:base::SysUTF8ToNSString(sourceLanguage)]; |
| CWVTranslationLanguage* target = |
| - [self languageAtIndex:_translateUIDelegate->GetTargetLanguageIndex()]; |
| + [self languageWithCode:base::SysUTF8ToNSString(targetLanguage)]; |
| NSError* error; |
| if (errorType != translate::TranslateErrors::NONE) { |
| @@ -100,7 +123,7 @@ const NSInteger CWVTranslationErrorScriptLoadError = |
| [[CWVLanguageDetectionResult alloc] |
| initWithPageLanguage:source |
| suggestedTargetLanguage:target |
| - supportedLanguages:[self supportedLanguages]]; |
| + supportedLanguages:_supportedLanguages]; |
| if ([_delegate respondsToSelector:@selector |
| (translationController:didFinishLanguageDetectionWithResult |
| :error:)]) { |
| @@ -140,31 +163,103 @@ 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]; |
| } |
| - return [supportedLanguages copy]; |
| + std::string autoTargetLanguageCode; |
| + if (!_translatePrefs->ShouldAutoTranslate(languageCode, |
| + &autoTargetLanguageCode)) { |
| + autoTargetLanguageCode = std::string(); |
|
Hiroshi Ichikawa
2017/05/25 06:44:22
How about returning [CWVTranslationPolicy translat
jzw1
2017/05/25 06:55:37
Done.
|
| + } |
| + if (autoTargetLanguageCode.empty()) { |
| + return [CWVTranslationPolicy translationPolicyAsk]; |
| + } |
| + |
| + CWVTranslationLanguage* targetLanguage = |
| + [self languageWithCode:base::SysUTF8ToNSString(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); |
| + 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. |
| + 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:(NSString*)languageCode { |
| + for (CWVTranslationLanguage* language in _supportedLanguages) { |
| + if ([language.languageCode isEqualToString:languageCode]) { |
| + return language; |
| + } |
| + } |
| + return nil; |
| } |
| @end |