Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "components/translate/core/browser/translate_ui_delegate.h" | 5 #include "components/translate/core/browser/translate_ui_delegate.h" |
| 6 | 6 |
| 7 #include "base/i18n/string_compare.h" | 7 #include "base/i18n/string_compare.h" |
| 8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "components/metrics/proto/translate_event.pb.h" | 10 #include "components/metrics/proto/translate_event.pb.h" |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 return; | 182 return; |
| 183 } | 183 } |
| 184 } | 184 } |
| 185 } | 185 } |
| 186 | 186 |
| 187 std::string TranslateUIDelegate::GetLanguageCodeAt(size_t index) const { | 187 std::string TranslateUIDelegate::GetLanguageCodeAt(size_t index) const { |
| 188 DCHECK_LT(index, GetNumberOfLanguages()); | 188 DCHECK_LT(index, GetNumberOfLanguages()); |
| 189 return languages_[index].first; | 189 return languages_[index].first; |
| 190 } | 190 } |
| 191 | 191 |
| 192 size_t TranslateUIDelegate::GetLanguageIndex(const std::string& language_code) { | |
| 193 auto result = std::find_if(languages_.begin(), languages_.end(), | |
|
Eugene But (OOO till 7-30)
2017/05/12 14:39:19
auto it = languages_.find(language_code);
return (
jzw1
2017/05/15 02:43:28
Will .find be able to do it? Think I need to keep
Hiroshi Ichikawa
2017/05/15 03:25:34
+1 to John. Note that it's a comparison against x.
Eugene But (OOO till 7-30)
2017/05/15 14:36:14
map::iterator::fist is a key in std::map. map::fin
Hiroshi Ichikawa
2017/05/16 04:30:55
|languages_| is a vector, not a map. So you cannot
Eugene But (OOO till 7-30)
2017/05/16 15:28:38
Sorry, if it's a vector, then |std::find(languages
| |
| 194 [&language_code](const LanguageNamePair& x) { | |
| 195 return x.first == language_code; | |
| 196 }); | |
| 197 if (result != languages_.end()) { | |
| 198 return result - languages_.begin(); | |
| 199 } else { | |
| 200 return kNoIndex; | |
| 201 } | |
| 202 } | |
| 203 | |
| 192 base::string16 TranslateUIDelegate::GetLanguageNameAt(size_t index) const { | 204 base::string16 TranslateUIDelegate::GetLanguageNameAt(size_t index) const { |
| 193 if (index == kNoIndex) | 205 if (index == kNoIndex) |
| 194 return base::string16(); | 206 return base::string16(); |
| 195 DCHECK_LT(index, GetNumberOfLanguages()); | 207 DCHECK_LT(index, GetNumberOfLanguages()); |
| 196 return languages_[index].second; | 208 return languages_[index].second; |
| 197 } | 209 } |
| 198 | 210 |
| 199 std::string TranslateUIDelegate::GetOriginalLanguageCode() const { | 211 std::string TranslateUIDelegate::GetOriginalLanguageCode() const { |
| 200 return (GetOriginalLanguageIndex() == kNoIndex) | 212 return (GetOriginalLanguageIndex() == kNoIndex) |
| 201 ? translate::kUnknownLanguageCode | 213 ? translate::kUnknownLanguageCode |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 } | 269 } |
| 258 | 270 |
| 259 if (explicitly_closed) { | 271 if (explicitly_closed) { |
| 260 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); | 272 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); |
| 261 } else { | 273 } else { |
| 262 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslateDismissUI, true); | 274 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslateDismissUI, true); |
| 263 } | 275 } |
| 264 } | 276 } |
| 265 | 277 |
| 266 bool TranslateUIDelegate::IsLanguageBlocked() { | 278 bool TranslateUIDelegate::IsLanguageBlocked() { |
| 267 return prefs_->IsBlockedLanguage(GetOriginalLanguageCode()); | 279 return IsLanguageBlocked(GetOriginalLanguageCode()); |
| 280 } | |
| 281 | |
| 282 bool TranslateUIDelegate::IsLanguageBlocked(const std::string& language_code) { | |
| 283 return prefs_->IsBlockedLanguage(language_code); | |
| 268 } | 284 } |
| 269 | 285 |
| 270 void TranslateUIDelegate::SetLanguageBlocked(bool value) { | 286 void TranslateUIDelegate::SetLanguageBlocked(bool value) { |
| 287 SetLanguageBlocked(value, GetOriginalLanguageCode()); | |
| 288 } | |
| 289 | |
| 290 void TranslateUIDelegate::SetLanguageBlocked(bool value, | |
| 291 const std::string& language_code) { | |
| 271 if (value) { | 292 if (value) { |
| 272 prefs_->BlockLanguage(GetOriginalLanguageCode()); | 293 prefs_->BlockLanguage(language_code); |
| 273 if (translate_manager_) { | 294 if (translate_manager_) { |
| 274 translate_manager_->GetLanguageState().SetTranslateEnabled(false); | 295 translate_manager_->GetLanguageState().SetTranslateEnabled(false); |
| 275 // Translation has been blocked for this language. Capture that in the | 296 // Translation has been blocked for this language. Capture that in the |
| 276 // metrics. Note that we don't capture a language being unblocked... which | 297 // metrics. Note that we don't capture a language being unblocked... which |
| 277 // is not the same as accepting a given translation for this language. | 298 // is not the same as accepting a given translation for this language. |
| 278 translate_manager_->RecordTranslateEvent( | 299 translate_manager_->RecordTranslateEvent( |
| 279 metrics::TranslateEventProto::USER_NEVER_TRANSLATE_LANGUAGE); | 300 metrics::TranslateEventProto::USER_NEVER_TRANSLATE_LANGUAGE); |
| 280 } | 301 } |
| 281 } else { | 302 } else { |
| 282 prefs_->UnblockLanguage(GetOriginalLanguageCode()); | 303 prefs_->UnblockLanguage(language_code); |
| 283 } | 304 } |
| 284 | 305 |
| 285 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, value); | 306 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, value); |
| 286 } | 307 } |
| 287 | 308 |
| 288 bool TranslateUIDelegate::IsSiteBlacklisted() { | 309 bool TranslateUIDelegate::IsSiteBlacklisted() { |
| 289 std::string host = GetPageHost(); | 310 return IsSiteBlacklisted(GetPageHost()); |
| 290 return !host.empty() && prefs_->IsSiteBlacklisted(host); | 311 } |
| 312 | |
| 313 bool TranslateUIDelegate::IsSiteBlacklisted(const std::string& page_host) { | |
| 314 return !page_host.empty() && prefs_->IsSiteBlacklisted(page_host); | |
| 291 } | 315 } |
| 292 | 316 |
| 293 void TranslateUIDelegate::SetSiteBlacklist(bool value) { | 317 void TranslateUIDelegate::SetSiteBlacklist(bool value) { |
| 294 std::string host = GetPageHost(); | 318 SetSiteBlacklist(value, GetPageHost()); |
| 295 if (host.empty()) | 319 } |
| 320 | |
| 321 void TranslateUIDelegate::SetSiteBlacklist(bool value, | |
| 322 const std::string& page_host) { | |
| 323 if (page_host.empty()) | |
|
Eugene But (OOO till 7-30)
2017/05/12 14:39:19
Comments says that empty host is not allowed, but
michaeldo
2017/05/12 15:29:09
To retain original behavior, you can move this ear
jzw1
2017/05/15 02:43:28
Should I just DCHECK(!page_host.empty())?
michaeldo
2017/05/15 17:09:30
yes, that is fine here.
| |
| 296 return; | 324 return; |
| 297 | 325 |
| 298 if (value) { | 326 if (value) { |
| 299 prefs_->BlacklistSite(host); | 327 prefs_->BlacklistSite(page_host); |
| 300 if (translate_manager_) { | 328 if (translate_manager_) { |
| 301 translate_manager_->GetLanguageState().SetTranslateEnabled(false); | 329 translate_manager_->GetLanguageState().SetTranslateEnabled(false); |
| 302 // Translation has been blocked for this site. Capture that in the metrics | 330 // Translation has been blocked for this site. Capture that in the metrics |
| 303 // Note that we don't capture a language being unblocked... which is not | 331 // Note that we don't capture a language being unblocked... which is not |
| 304 // the same as accepting a given translation for this site. | 332 // the same as accepting a given translation for this site. |
| 305 translate_manager_->RecordTranslateEvent( | 333 translate_manager_->RecordTranslateEvent( |
| 306 metrics::TranslateEventProto::USER_NEVER_TRANSLATE_SITE); | 334 metrics::TranslateEventProto::USER_NEVER_TRANSLATE_SITE); |
| 307 } | 335 } |
| 308 } else { | 336 } else { |
| 309 prefs_->RemoveSiteFromBlacklist(host); | 337 prefs_->RemoveSiteFromBlacklist(page_host); |
| 310 } | 338 } |
| 311 | 339 |
| 312 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, value); | 340 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, value); |
| 313 } | 341 } |
| 314 | 342 |
| 315 bool TranslateUIDelegate::ShouldAlwaysTranslate() { | 343 bool TranslateUIDelegate::ShouldAlwaysTranslate() { |
| 316 return prefs_->IsLanguagePairWhitelisted(GetOriginalLanguageCode(), | 344 return prefs_->IsLanguagePairWhitelisted(GetOriginalLanguageCode(), |
| 317 GetTargetLanguageCode()); | 345 GetTargetLanguageCode()); |
| 318 } | 346 } |
| 319 | 347 |
| 348 std::string TranslateUIDelegate::GetAlwaysTranslateToLanguage( | |
| 349 const std::string& from_language) { | |
| 350 std::string auto_target_lang; | |
| 351 if (prefs_->ShouldAutoTranslate(from_language, &auto_target_lang)) { | |
| 352 return auto_target_lang; | |
| 353 } else { | |
|
Eugene But (OOO till 7-30)
2017/05/12 14:39:19
Per Style Guide: no else after return please
jzw1
2017/05/15 02:43:28
Done.
| |
| 354 return std::string(); | |
| 355 } | |
| 356 } | |
| 357 | |
| 320 bool TranslateUIDelegate::ShouldAlwaysTranslateBeCheckedByDefault() { | 358 bool TranslateUIDelegate::ShouldAlwaysTranslateBeCheckedByDefault() { |
| 321 if (ShouldAlwaysTranslate()) | 359 if (ShouldAlwaysTranslate()) |
| 322 return true; | 360 return true; |
| 323 | 361 |
| 324 std::map<std::string, std::string> params; | 362 std::map<std::string, std::string> params; |
| 325 if (!variations::GetVariationParams(translate::kTranslateUI2016Q2TrialName, | 363 if (!variations::GetVariationParams(translate::kTranslateUI2016Q2TrialName, |
| 326 ¶ms)) | 364 ¶ms)) |
| 327 return false; | 365 return false; |
| 328 int threshold = 0; | 366 int threshold = 0; |
| 329 base::StringToInt(params[translate::kAlwaysTranslateOfferThreshold], | 367 base::StringToInt(params[translate::kAlwaysTranslateOfferThreshold], |
| 330 &threshold); | 368 &threshold); |
| 331 if (threshold <= 0) | 369 if (threshold <= 0) |
| 332 return false; | 370 return false; |
| 333 | 371 |
| 334 // After N clicks on Translate for the same language. | 372 // After N clicks on Translate for the same language. |
| 335 // We check for == N instead of >= N because if the user translates with the | 373 // We check for == N instead of >= N because if the user translates with the |
| 336 // "Always do this?" on, then the next time the bubble won't show up. | 374 // "Always do this?" on, then the next time the bubble won't show up. |
| 337 // The only chance the bubble will show up is after the user manually unchecks | 375 // The only chance the bubble will show up is after the user manually unchecks |
| 338 // "Always do this?". In that case, since it is after user explictly unchecks, | 376 // "Always do this?". In that case, since it is after user explictly unchecks, |
| 339 // we should show as it as unchecked so we only check == N instead of >= N. | 377 // we should show as it as unchecked so we only check == N instead of >= N. |
| 340 return prefs_->GetTranslationAcceptedCount(GetOriginalLanguageCode()) == | 378 return prefs_->GetTranslationAcceptedCount(GetOriginalLanguageCode()) == |
| 341 threshold; | 379 threshold; |
| 342 } | 380 } |
| 343 | 381 |
| 344 void TranslateUIDelegate::SetAlwaysTranslate(bool value) { | 382 void TranslateUIDelegate::SetAlwaysTranslate(bool value) { |
| 345 const std::string& original_lang = GetOriginalLanguageCode(); | 383 const std::string& original_lang = GetOriginalLanguageCode(); |
| 346 const std::string& target_lang = GetTargetLanguageCode(); | 384 const std::string& target_lang = GetTargetLanguageCode(); |
| 385 SetAlwaysTranslate(value, original_lang, target_lang); | |
| 386 } | |
| 387 | |
| 388 void TranslateUIDelegate::SetAlwaysTranslate(bool value, | |
| 389 const std::string& from_language, | |
| 390 const std::string& to_language) { | |
| 347 if (value) { | 391 if (value) { |
| 348 prefs_->WhitelistLanguagePair(original_lang, target_lang); | 392 prefs_->WhitelistLanguagePair(from_language, to_language); |
| 349 // A default translation mapping has been accepted for this language. | 393 // A default translation mapping has been accepted for this language. |
| 350 // Capture that in the metrics. Note that we don't capture a language being | 394 // Capture that in the metrics. Note that we don't capture a language being |
| 351 // unmapped... which is not the same as accepting some other translation | 395 // unmapped... which is not the same as accepting some other translation |
| 352 // for this language. | 396 // for this language. |
| 353 if (translate_manager_) { | 397 if (translate_manager_) { |
| 354 translate_manager_->RecordTranslateEvent( | 398 translate_manager_->RecordTranslateEvent( |
| 355 metrics::TranslateEventProto::USER_ALWAYS_TRANSLATE_LANGUAGE); | 399 metrics::TranslateEventProto::USER_ALWAYS_TRANSLATE_LANGUAGE); |
| 356 } | 400 } |
| 357 } else { | 401 } else { |
| 358 prefs_->RemoveLanguagePairFromWhitelist(original_lang, target_lang); | 402 prefs_->RemoveLanguagePairFromWhitelist(from_language, to_language); |
| 359 } | 403 } |
| 360 | 404 |
| 361 UMA_HISTOGRAM_BOOLEAN(kAlwaysTranslateLang, value); | 405 UMA_HISTOGRAM_BOOLEAN(kAlwaysTranslateLang, value); |
| 362 } | 406 } |
| 363 | 407 |
| 364 std::string TranslateUIDelegate::GetPageHost() { | 408 std::string TranslateUIDelegate::GetPageHost() { |
| 365 if (!translate_driver_->HasCurrentPage()) | 409 if (!translate_driver_->HasCurrentPage()) |
| 366 return std::string(); | 410 return std::string(); |
| 367 return translate_driver_->GetLastCommittedURL().HostNoBrackets(); | 411 return translate_driver_->GetLastCommittedURL().HostNoBrackets(); |
| 368 } | 412 } |
| 369 | 413 |
| 370 } // namespace translate | 414 } // namespace translate |
| OLD | NEW |