Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(322)

Side by Side Diff: ios/web_view/internal/translate/cwv_translation_controller.mm

Issue 2872083003: Added translation policy API. (Closed)
Patch Set: addressed eugene's comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ios/web_view/BUILD.gn ('k') | ios/web_view/internal/translate/cwv_translation_language.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "ios/web_view/internal/translate/cwv_translation_controller_internal.h" 5 #import "ios/web_view/internal/translate/cwv_translation_controller_internal.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/strings/string16.h" 10 #include "base/strings/string16.h"
11 #include "base/strings/sys_string_conversions.h"
12 #include "components/translate/core/browser/translate_download_manager.h"
11 #include "components/translate/core/browser/translate_manager.h" 13 #include "components/translate/core/browser/translate_manager.h"
12 #include "components/translate/core/browser/translate_ui_delegate.h"
13 #import "ios/web_view/internal/translate/cwv_language_detection_result_internal. h" 14 #import "ios/web_view/internal/translate/cwv_language_detection_result_internal. h"
14 #import "ios/web_view/internal/translate/cwv_translation_language_internal.h" 15 #import "ios/web_view/internal/translate/cwv_translation_language_internal.h"
15 #import "ios/web_view/internal/translate/web_view_translate_client.h" 16 #import "ios/web_view/internal/translate/web_view_translate_client.h"
16 #import "ios/web_view/public/cwv_translation_controller_delegate.h" 17 #import "ios/web_view/public/cwv_translation_controller_delegate.h"
18 #import "ios/web_view/public/cwv_translation_policy.h"
19 #include "ui/base/l10n/l10n_util.h"
17 20
18 #if !defined(__has_feature) || !__has_feature(objc_arc) 21 #if !defined(__has_feature) || !__has_feature(objc_arc)
19 #error "This file requires ARC support." 22 #error "This file requires ARC support."
20 #endif 23 #endif
21 24
22 NSErrorDomain const CWVTranslationErrorDomain = 25 NSErrorDomain const CWVTranslationErrorDomain =
23 @"org.chromium.chromewebview.TranslationErrorDomain"; 26 @"org.chromium.chromewebview.TranslationErrorDomain";
24 27
25 const NSInteger CWVTranslationErrorNetwork = 28 const NSInteger CWVTranslationErrorNetwork =
26 translate::TranslateErrors::NETWORK; 29 translate::TranslateErrors::NETWORK;
(...skipping 11 matching lines...) Expand all
38 translate::TranslateErrors::TRANSLATION_TIMEOUT; 41 translate::TranslateErrors::TRANSLATION_TIMEOUT;
39 const NSInteger CWVTranslationErrorUnexpectedScriptError = 42 const NSInteger CWVTranslationErrorUnexpectedScriptError =
40 translate::TranslateErrors::UNEXPECTED_SCRIPT_ERROR; 43 translate::TranslateErrors::UNEXPECTED_SCRIPT_ERROR;
41 const NSInteger CWVTranslationErrorBadOrigin = 44 const NSInteger CWVTranslationErrorBadOrigin =
42 translate::TranslateErrors::BAD_ORIGIN; 45 translate::TranslateErrors::BAD_ORIGIN;
43 const NSInteger CWVTranslationErrorScriptLoadError = 46 const NSInteger CWVTranslationErrorScriptLoadError =
44 translate::TranslateErrors::SCRIPT_LOAD_ERROR; 47 translate::TranslateErrors::SCRIPT_LOAD_ERROR;
45 48
46 @interface CWVTranslationController () 49 @interface CWVTranslationController ()
47 50
48 // Convenience method to generate all supported languages from 51 // Convenience method to get the language with |languageCode|.
49 // |translateUIDelegate|. 52 - (CWVTranslationLanguage*)languageWithCode:(const std::string&)languageCode;
50 - (NSArray<CWVTranslationLanguage*>*)supportedLanguages;
51
52 // Convenience method to get a language at |index| from |translateUIDelegate|.
53 - (CWVTranslationLanguage*)languageAtIndex:(size_t)index;
54 53
55 @end 54 @end
56 55
57 @implementation CWVTranslationController { 56 @implementation CWVTranslationController {
58 ios_web_view::WebViewTranslateClient* _translateClient; 57 ios_web_view::WebViewTranslateClient* _translateClient;
59 std::unique_ptr<translate::TranslateUIDelegate> _translateUIDelegate; 58 std::unique_ptr<translate::TranslatePrefs> _translatePrefs;
59 NSArray<CWVTranslationLanguage*>* _supportedLanguages;
60 } 60 }
61 61
62 @synthesize delegate = _delegate; 62 @synthesize delegate = _delegate;
63 @synthesize webState = _webState; 63 @synthesize webState = _webState;
64 64
65 #pragma mark - Internal Methods 65 #pragma mark - Internal Methods
66 66
67 - (void)setWebState:(web::WebState*)webState { 67 - (void)setWebState:(web::WebState*)webState {
68 _webState = webState; 68 _webState = webState;
69 69
70 ios_web_view::WebViewTranslateClient::CreateForWebState(_webState); 70 ios_web_view::WebViewTranslateClient::CreateForWebState(_webState);
71 _translateClient = 71 _translateClient =
72 ios_web_view::WebViewTranslateClient::FromWebState(_webState); 72 ios_web_view::WebViewTranslateClient::FromWebState(_webState);
73 _translateClient->set_translation_controller(self); 73 _translateClient->set_translation_controller(self);
74 _translatePrefs = _translateClient->translate_manager()
75 ->translate_client()
76 ->GetTranslatePrefs();
77
78 NSMutableArray<CWVTranslationLanguage*>* supportedLanguages =
79 [NSMutableArray array];
80 std::vector<std::string> languageCodes;
81 translate::TranslateDownloadManager::GetSupportedLanguages(&languageCodes);
82 std::string locale =
83 translate::TranslateDownloadManager::GetInstance()->application_locale();
84 for (const std::string& languageCode : languageCodes) {
85 base::string16 languageName =
86 l10n_util::GetDisplayNameForLocale(languageCode, locale, true);
87 CWVTranslationLanguage* language =
88 [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode
89 languageName:languageName];
90 [supportedLanguages addObject:language];
91 }
92
93 [supportedLanguages sortUsingComparator:^NSComparisonResult(
94 CWVTranslationLanguage* languageA,
95 CWVTranslationLanguage* languageB) {
96 return [languageA.languageName compare:languageB.languageName];
97 }];
98 _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
74 } 99 }
75 100
76 - (void)updateTranslateStep:(translate::TranslateStep)step 101 - (void)updateTranslateStep:(translate::TranslateStep)step
77 sourceLanguage:(const std::string&)sourceLanguage 102 sourceLanguage:(const std::string&)sourceLanguage
78 targetLanguage:(const std::string&)targetLanguage 103 targetLanguage:(const std::string&)targetLanguage
79 errorType:(translate::TranslateErrors::Type)errorType 104 errorType:(translate::TranslateErrors::Type)errorType
80 triggeredFromMenu:(bool)triggeredFromMenu { 105 triggeredFromMenu:(bool)triggeredFromMenu {
81 translate::TranslateManager* manager = _translateClient->translate_manager(); 106 CWVTranslationLanguage* source = [self languageWithCode:sourceLanguage];
82 _translateUIDelegate = base::MakeUnique<translate::TranslateUIDelegate>( 107 CWVTranslationLanguage* target = [self languageWithCode:targetLanguage];
83 manager->GetWeakPtr(), sourceLanguage, targetLanguage);
84
85 CWVTranslationLanguage* source =
86 [self languageAtIndex:_translateUIDelegate->GetOriginalLanguageIndex()];
87 CWVTranslationLanguage* target =
88 [self languageAtIndex:_translateUIDelegate->GetTargetLanguageIndex()];
89 108
90 NSError* error; 109 NSError* error;
91 if (errorType != translate::TranslateErrors::NONE) { 110 if (errorType != translate::TranslateErrors::NONE) {
92 error = [NSError errorWithDomain:CWVTranslationErrorDomain 111 error = [NSError errorWithDomain:CWVTranslationErrorDomain
93 code:errorType 112 code:errorType
94 userInfo:nil]; 113 userInfo:nil];
95 } 114 }
96 115
97 switch (step) { 116 switch (step) {
98 case translate::TRANSLATE_STEP_BEFORE_TRANSLATE: { 117 case translate::TRANSLATE_STEP_BEFORE_TRANSLATE: {
99 CWVLanguageDetectionResult* languageDetectionResult = 118 CWVLanguageDetectionResult* languageDetectionResult =
100 [[CWVLanguageDetectionResult alloc] 119 [[CWVLanguageDetectionResult alloc]
101 initWithPageLanguage:source 120 initWithPageLanguage:source
102 suggestedTargetLanguage:target 121 suggestedTargetLanguage:target
103 supportedLanguages:[self supportedLanguages]]; 122 supportedLanguages:_supportedLanguages];
104 if ([_delegate respondsToSelector:@selector 123 if ([_delegate respondsToSelector:@selector
105 (translationController:didFinishLanguageDetectionWithResult 124 (translationController:didFinishLanguageDetectionWithResult
106 :error:)]) { 125 :error:)]) {
107 [_delegate translationController:self 126 [_delegate translationController:self
108 didFinishLanguageDetectionWithResult:languageDetectionResult 127 didFinishLanguageDetectionWithResult:languageDetectionResult
109 error:error]; 128 error:error];
110 } 129 }
111 break; 130 break;
112 } 131 }
113 case translate::TRANSLATE_STEP_TRANSLATING: 132 case translate::TRANSLATE_STEP_TRANSLATING:
(...skipping 19 matching lines...) Expand all
133 break; 152 break;
134 case translate::TRANSLATE_STEP_TRANSLATE_ERROR: 153 case translate::TRANSLATE_STEP_TRANSLATE_ERROR:
135 break; 154 break;
136 } 155 }
137 } 156 }
138 157
139 #pragma mark - Public Methods 158 #pragma mark - Public Methods
140 159
141 - (void)translatePageFromLanguage:(CWVTranslationLanguage*)sourceLanguage 160 - (void)translatePageFromLanguage:(CWVTranslationLanguage*)sourceLanguage
142 toLanguage:(CWVTranslationLanguage*)targetLanguage { 161 toLanguage:(CWVTranslationLanguage*)targetLanguage {
143 // TODO(706289): Use the passed parameters. 162 std::string sourceLanguageCode =
144 _translateUIDelegate->Translate(); 163 base::SysNSStringToUTF8(sourceLanguage.languageCode);
164 std::string targetLanguageCode =
165 base::SysNSStringToUTF8(targetLanguage.languageCode);
166 _translateClient->translate_manager()->TranslatePage(
167 sourceLanguageCode, targetLanguageCode, false);
145 } 168 }
146 169
147 - (void)revertTranslation { 170 - (void)revertTranslation {
148 _translateUIDelegate->RevertTranslation(); 171 _translateClient->translate_manager()->RevertTranslation();
172 }
173
174 - (void)setTranslationPolicy:(CWVTranslationPolicy*)policy
175 forPageLanguage:(CWVTranslationLanguage*)pageLanguage {
176 std::string languageCode = base::SysNSStringToUTF8(pageLanguage.languageCode);
177 switch (policy.type) {
178 case CWVTranslationPolicyAsk: {
179 _translatePrefs->UnblockLanguage(languageCode);
180 _translatePrefs->RemoveLanguagePairFromWhitelist(languageCode,
181 std::string());
182 break;
183 }
184 case CWVTranslationPolicyNever: {
185 _translatePrefs->BlockLanguage(languageCode);
186 break;
187 }
188 case CWVTranslationPolicyAuto: {
189 _translatePrefs->UnblockLanguage(languageCode);
190 _translatePrefs->WhitelistLanguagePair(
191 languageCode, base::SysNSStringToUTF8(policy.language.languageCode));
192 break;
193 }
194 }
195 }
196
197 - (CWVTranslationPolicy*)translationPolicyForPageLanguage:
198 (CWVTranslationLanguage*)pageLanguage {
199 std::string languageCode = base::SysNSStringToUTF8(pageLanguage.languageCode);
200 bool isLanguageBlocked = _translatePrefs->IsBlockedLanguage(languageCode);
201 if (isLanguageBlocked) {
202 return [CWVTranslationPolicy translationPolicyNever];
203 }
204
205 std::string autoTargetLanguageCode;
206 if (!_translatePrefs->ShouldAutoTranslate(languageCode,
207 &autoTargetLanguageCode)) {
208 return [CWVTranslationPolicy translationPolicyAsk];
209 }
210
211 CWVTranslationLanguage* targetLanguage =
212 [self languageWithCode:autoTargetLanguageCode];
213 return [CWVTranslationPolicy
214 translationPolicyAutoTranslateToLanguage:targetLanguage];
215 }
216
217 - (void)setTranslationPolicy:(CWVTranslationPolicy*)policy
218 forPageHost:(NSString*)pageHost {
219 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.
220 switch (policy.type) {
221 case CWVTranslationPolicyAsk: {
222 _translatePrefs->RemoveSiteFromBlacklist(
223 base::SysNSStringToUTF8(pageHost));
224 break;
225 }
226 case CWVTranslationPolicyNever: {
227 _translatePrefs->BlacklistSite(base::SysNSStringToUTF8(pageHost));
228 break;
229 }
230 case CWVTranslationPolicyAuto: {
231 // 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.
232 NOTREACHED();
233 break;
234 }
235 }
236 }
237
238 - (CWVTranslationPolicy*)translationPolicyForPageHost:(NSString*)pageHost {
239 bool isSiteBlackListed =
240 _translatePrefs->IsSiteBlacklisted(base::SysNSStringToUTF8(pageHost));
241 if (isSiteBlackListed) {
242 return [CWVTranslationPolicy translationPolicyNever];
243 }
244 return [CWVTranslationPolicy translationPolicyAsk];
149 } 245 }
150 246
151 #pragma mark - Private Methods 247 #pragma mark - Private Methods
152 248
153 - (NSArray<CWVTranslationLanguage*>*)supportedLanguages { 249 - (CWVTranslationLanguage*)languageWithCode:(const std::string&)languageCode {
154 NSMutableArray* supportedLanguages = [NSMutableArray array]; 250 NSString* languageCodeString = base::SysUTF8ToNSString(languageCode);
155 for (size_t i = 0; i < _translateUIDelegate->GetNumberOfLanguages(); i++) { 251 for (CWVTranslationLanguage* language in _supportedLanguages) {
156 CWVTranslationLanguage* language = [self languageAtIndex:i]; 252 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 :)
157 [supportedLanguages addObject:language]; 253 return language;
254 }
158 } 255 }
159 256 return nil;
160 return [supportedLanguages copy];
161 }
162
163 - (CWVTranslationLanguage*)languageAtIndex:(size_t)index {
164 std::string languageCode = _translateUIDelegate->GetLanguageCodeAt(index);
165 base::string16 languageName = _translateUIDelegate->GetLanguageNameAt(index);
166 return [[CWVTranslationLanguage alloc] initWithLanguageCode:languageCode
167 languageName:languageName];
168 } 257 }
169 258
170 @end 259 @end
OLDNEW
« no previous file with comments | « ios/web_view/BUILD.gn ('k') | ios/web_view/internal/translate/cwv_translation_language.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698