| 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/translate/core/browser/language_state.h" | 11 #include "components/translate/core/browser/language_state.h" |
| 11 #include "components/translate/core/browser/translate_client.h" | 12 #include "components/translate/core/browser/translate_client.h" |
| 12 #include "components/translate/core/browser/translate_download_manager.h" | 13 #include "components/translate/core/browser/translate_download_manager.h" |
| 13 #include "components/translate/core/browser/translate_driver.h" | 14 #include "components/translate/core/browser/translate_driver.h" |
| 14 #include "components/translate/core/browser/translate_manager.h" | 15 #include "components/translate/core/browser/translate_manager.h" |
| 15 #include "components/translate/core/browser/translate_prefs.h" | 16 #include "components/translate/core/browser/translate_prefs.h" |
| 16 #include "components/translate/core/common/translate_constants.h" | 17 #include "components/translate/core/common/translate_constants.h" |
| 17 #include "components/variations/variations_associated_data.h" | 18 #include "components/variations/variations_associated_data.h" |
| 18 #include "third_party/icu/source/i18n/unicode/coll.h" | 19 #include "third_party/icu/source/i18n/unicode/coll.h" |
| 19 #include "ui/base/l10n/l10n_util.h" | 20 #include "ui/base/l10n/l10n_util.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 | 143 |
| 143 UMA_HISTOGRAM_BOOLEAN(kModifyOriginalLang, true); | 144 UMA_HISTOGRAM_BOOLEAN(kModifyOriginalLang, true); |
| 144 original_language_index_ = language_index; | 145 original_language_index_ = language_index; |
| 145 } | 146 } |
| 146 | 147 |
| 147 void TranslateUIDelegate::UpdateOriginalLanguage( | 148 void TranslateUIDelegate::UpdateOriginalLanguage( |
| 148 const std::string& language_code) { | 149 const std::string& language_code) { |
| 149 for (size_t i = 0; i < languages_.size(); ++i) { | 150 for (size_t i = 0; i < languages_.size(); ++i) { |
| 150 if (languages_[i].first.compare(language_code) == 0) { | 151 if (languages_[i].first.compare(language_code) == 0) { |
| 151 UpdateOriginalLanguageIndex(i); | 152 UpdateOriginalLanguageIndex(i); |
| 153 if (translate_manager_) { |
| 154 translate_manager_->mutable_translate_event() |
| 155 ->set_modified_source_language(language_code); |
| 156 } |
| 152 return; | 157 return; |
| 153 } | 158 } |
| 154 } | 159 } |
| 155 } | 160 } |
| 156 | 161 |
| 157 size_t TranslateUIDelegate::GetTargetLanguageIndex() const { | 162 size_t TranslateUIDelegate::GetTargetLanguageIndex() const { |
| 158 return target_language_index_; | 163 return target_language_index_; |
| 159 } | 164 } |
| 160 | 165 |
| 161 void TranslateUIDelegate::UpdateTargetLanguageIndex(size_t language_index) { | 166 void TranslateUIDelegate::UpdateTargetLanguageIndex(size_t language_index) { |
| 162 if (target_language_index_ == language_index) | 167 if (target_language_index_ == language_index) |
| 163 return; | 168 return; |
| 164 | 169 |
| 165 DCHECK_LT(language_index, GetNumberOfLanguages()); | 170 DCHECK_LT(language_index, GetNumberOfLanguages()); |
| 166 UMA_HISTOGRAM_BOOLEAN(kModifyTargetLang, true); | 171 UMA_HISTOGRAM_BOOLEAN(kModifyTargetLang, true); |
| 167 target_language_index_ = language_index; | 172 target_language_index_ = language_index; |
| 168 } | 173 } |
| 169 | 174 |
| 170 void TranslateUIDelegate::UpdateTargetLanguage( | 175 void TranslateUIDelegate::UpdateTargetLanguage( |
| 171 const std::string& language_code) { | 176 const std::string& language_code) { |
| 172 for (size_t i = 0; i < languages_.size(); ++i) { | 177 for (size_t i = 0; i < languages_.size(); ++i) { |
| 173 if (languages_[i].first.compare(language_code) == 0) { | 178 if (languages_[i].first.compare(language_code) == 0) { |
| 174 UpdateTargetLanguageIndex(i); | 179 UpdateTargetLanguageIndex(i); |
| 180 if (translate_manager_) { |
| 181 translate_manager_->mutable_translate_event() |
| 182 ->set_modified_target_language(language_code); |
| 183 } |
| 175 return; | 184 return; |
| 176 } | 185 } |
| 177 } | 186 } |
| 178 } | 187 } |
| 179 | 188 |
| 180 std::string TranslateUIDelegate::GetLanguageCodeAt(size_t index) const { | 189 std::string TranslateUIDelegate::GetLanguageCodeAt(size_t index) const { |
| 181 DCHECK_LT(index, GetNumberOfLanguages()); | 190 DCHECK_LT(index, GetNumberOfLanguages()); |
| 182 return languages_[index].first; | 191 return languages_[index].first; |
| 183 } | 192 } |
| 184 | 193 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 202 } | 211 } |
| 203 | 212 |
| 204 void TranslateUIDelegate::Translate() { | 213 void TranslateUIDelegate::Translate() { |
| 205 if (!translate_driver_->IsOffTheRecord()) { | 214 if (!translate_driver_->IsOffTheRecord()) { |
| 206 prefs_->ResetTranslationDeniedCount(GetOriginalLanguageCode()); | 215 prefs_->ResetTranslationDeniedCount(GetOriginalLanguageCode()); |
| 207 prefs_->ResetTranslationIgnoredCount(GetOriginalLanguageCode()); | 216 prefs_->ResetTranslationIgnoredCount(GetOriginalLanguageCode()); |
| 208 prefs_->IncrementTranslationAcceptedCount(GetOriginalLanguageCode()); | 217 prefs_->IncrementTranslationAcceptedCount(GetOriginalLanguageCode()); |
| 209 } | 218 } |
| 210 | 219 |
| 211 if (translate_manager_) { | 220 if (translate_manager_) { |
| 221 translate_manager_->RecordTranslateEvent( |
| 222 metrics::TranslateEventProto::USER_ACCEPT); |
| 212 translate_manager_->TranslatePage(GetOriginalLanguageCode(), | 223 translate_manager_->TranslatePage(GetOriginalLanguageCode(), |
| 213 GetTargetLanguageCode(), false); | 224 GetTargetLanguageCode(), false); |
| 214 UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true); | 225 UMA_HISTOGRAM_BOOLEAN(kPerformTranslate, true); |
| 215 } | 226 } |
| 216 } | 227 } |
| 217 | 228 |
| 218 void TranslateUIDelegate::RevertTranslation() { | 229 void TranslateUIDelegate::RevertTranslation() { |
| 219 if (translate_manager_) { | 230 if (translate_manager_) { |
| 220 translate_manager_->RevertTranslation(); | 231 translate_manager_->RevertTranslation(); |
| 221 UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true); | 232 UMA_HISTOGRAM_BOOLEAN(kRevertTranslation, true); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 232 } else { | 243 } else { |
| 233 prefs_->IncrementTranslationIgnoredCount(language); | 244 prefs_->IncrementTranslationIgnoredCount(language); |
| 234 } | 245 } |
| 235 } | 246 } |
| 236 | 247 |
| 237 // Remember that the user declined the translation so as to prevent showing a | 248 // Remember that the user declined the translation so as to prevent showing a |
| 238 // translate UI for that page again. (TranslateManager initiates translations | 249 // translate UI for that page again. (TranslateManager initiates translations |
| 239 // when getting a LANGUAGE_DETERMINED from the page, which happens when a load | 250 // when getting a LANGUAGE_DETERMINED from the page, which happens when a load |
| 240 // stops. That could happen multiple times, including after the user already | 251 // stops. That could happen multiple times, including after the user already |
| 241 // declined the translation.) | 252 // declined the translation.) |
| 242 if (explicitly_closed && translate_manager_) { | 253 if (translate_manager_) { |
| 243 translate_manager_->GetLanguageState().set_translation_declined(true); | 254 translate_manager_->RecordTranslateEvent( |
| 244 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); | 255 explicitly_closed ? metrics::TranslateEventProto::USER_DECLINE |
| 256 : metrics::TranslateEventProto::USER_IGNORE); |
| 257 if (explicitly_closed) |
| 258 translate_manager_->GetLanguageState().set_translation_declined(true); |
| 245 } | 259 } |
| 246 | 260 |
| 247 if (!explicitly_closed) { | 261 if (explicitly_closed) { |
| 262 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); |
| 263 } else { |
| 248 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslateDismissUI, true); | 264 UMA_HISTOGRAM_BOOLEAN(kDeclineTranslateDismissUI, true); |
| 249 } | 265 } |
| 250 } | 266 } |
| 251 | 267 |
| 252 bool TranslateUIDelegate::IsLanguageBlocked() { | 268 bool TranslateUIDelegate::IsLanguageBlocked() { |
| 253 return prefs_->IsBlockedLanguage(GetOriginalLanguageCode()); | 269 return prefs_->IsBlockedLanguage(GetOriginalLanguageCode()); |
| 254 } | 270 } |
| 255 | 271 |
| 256 void TranslateUIDelegate::SetLanguageBlocked(bool value) { | 272 void TranslateUIDelegate::SetLanguageBlocked(bool value) { |
| 257 if (value) { | 273 if (value) { |
| 258 prefs_->BlockLanguage(GetOriginalLanguageCode()); | 274 prefs_->BlockLanguage(GetOriginalLanguageCode()); |
| 259 if (translate_manager_) { | 275 if (translate_manager_) { |
| 260 translate_manager_->GetLanguageState().SetTranslateEnabled(false); | 276 translate_manager_->GetLanguageState().SetTranslateEnabled(false); |
| 277 // Translation has been blocked for this language. Capture that in the |
| 278 // metrics. Note that we don't capture a language being unblocked... which |
| 279 // is not the same as accepting a given translation for this language. |
| 280 translate_manager_->RecordTranslateEvent( |
| 281 metrics::TranslateEventProto::USER_NEVER_TRANSLATE_LANGUAGE); |
| 261 } | 282 } |
| 262 } else { | 283 } else { |
| 263 prefs_->UnblockLanguage(GetOriginalLanguageCode()); | 284 prefs_->UnblockLanguage(GetOriginalLanguageCode()); |
| 264 } | 285 } |
| 265 | 286 |
| 266 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, value); | 287 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateLang, value); |
| 267 } | 288 } |
| 268 | 289 |
| 269 bool TranslateUIDelegate::IsSiteBlacklisted() { | 290 bool TranslateUIDelegate::IsSiteBlacklisted() { |
| 270 std::string host = GetPageHost(); | 291 std::string host = GetPageHost(); |
| 271 return !host.empty() && prefs_->IsSiteBlacklisted(host); | 292 return !host.empty() && prefs_->IsSiteBlacklisted(host); |
| 272 } | 293 } |
| 273 | 294 |
| 274 void TranslateUIDelegate::SetSiteBlacklist(bool value) { | 295 void TranslateUIDelegate::SetSiteBlacklist(bool value) { |
| 275 std::string host = GetPageHost(); | 296 std::string host = GetPageHost(); |
| 276 if (host.empty()) | 297 if (host.empty()) |
| 277 return; | 298 return; |
| 278 | 299 |
| 279 if (value) { | 300 if (value) { |
| 280 prefs_->BlacklistSite(host); | 301 prefs_->BlacklistSite(host); |
| 281 if (translate_manager_) { | 302 if (translate_manager_) { |
| 282 translate_manager_->GetLanguageState().SetTranslateEnabled(false); | 303 translate_manager_->GetLanguageState().SetTranslateEnabled(false); |
| 304 // Translation has been blocked for this site. Capture that in the metrics |
| 305 // Note that we don't capture a language being unblocked... which is not |
| 306 // the same as accepting a given translation for this site. |
| 307 translate_manager_->RecordTranslateEvent( |
| 308 metrics::TranslateEventProto::USER_NEVER_TRANSLATE_SITE); |
| 283 } | 309 } |
| 284 } else { | 310 } else { |
| 285 prefs_->RemoveSiteFromBlacklist(host); | 311 prefs_->RemoveSiteFromBlacklist(host); |
| 286 } | 312 } |
| 287 | 313 |
| 288 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, value); | 314 UMA_HISTOGRAM_BOOLEAN(kNeverTranslateSite, value); |
| 289 } | 315 } |
| 290 | 316 |
| 291 bool TranslateUIDelegate::ShouldAlwaysTranslate() { | 317 bool TranslateUIDelegate::ShouldAlwaysTranslate() { |
| 292 return prefs_->IsLanguagePairWhitelisted(GetOriginalLanguageCode(), | 318 return prefs_->IsLanguagePairWhitelisted(GetOriginalLanguageCode(), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 313 // The only chance the bubble will show up is after the user manually unchecks | 339 // The only chance the bubble will show up is after the user manually unchecks |
| 314 // "Always do this?". In that case, since it is after user explictly unchecks, | 340 // "Always do this?". In that case, since it is after user explictly unchecks, |
| 315 // we should show as it as unchecked so we only check == N instead of >= N. | 341 // we should show as it as unchecked so we only check == N instead of >= N. |
| 316 return prefs_->GetTranslationAcceptedCount(GetOriginalLanguageCode()) == | 342 return prefs_->GetTranslationAcceptedCount(GetOriginalLanguageCode()) == |
| 317 threshold; | 343 threshold; |
| 318 } | 344 } |
| 319 | 345 |
| 320 void TranslateUIDelegate::SetAlwaysTranslate(bool value) { | 346 void TranslateUIDelegate::SetAlwaysTranslate(bool value) { |
| 321 const std::string& original_lang = GetOriginalLanguageCode(); | 347 const std::string& original_lang = GetOriginalLanguageCode(); |
| 322 const std::string& target_lang = GetTargetLanguageCode(); | 348 const std::string& target_lang = GetTargetLanguageCode(); |
| 323 if (value) | 349 if (value) { |
| 324 prefs_->WhitelistLanguagePair(original_lang, target_lang); | 350 prefs_->WhitelistLanguagePair(original_lang, target_lang); |
| 325 else | 351 // A default translation mapping has been accepted for this language. |
| 352 // Capture that in the metrics. Note that we don't capture a language being |
| 353 // unmapped... which is not the same as accepting some other translation |
| 354 // for this language. |
| 355 if (translate_manager_) { |
| 356 translate_manager_->RecordTranslateEvent( |
| 357 metrics::TranslateEventProto::USER_ALWAYS_TRANSLATE_LANGUAGE); |
| 358 } |
| 359 } else { |
| 326 prefs_->RemoveLanguagePairFromWhitelist(original_lang, target_lang); | 360 prefs_->RemoveLanguagePairFromWhitelist(original_lang, target_lang); |
| 361 } |
| 327 | 362 |
| 328 UMA_HISTOGRAM_BOOLEAN(kAlwaysTranslateLang, value); | 363 UMA_HISTOGRAM_BOOLEAN(kAlwaysTranslateLang, value); |
| 329 } | 364 } |
| 330 | 365 |
| 331 std::string TranslateUIDelegate::GetPageHost() { | 366 std::string TranslateUIDelegate::GetPageHost() { |
| 332 if (!translate_driver_->HasCurrentPage()) | 367 if (!translate_driver_->HasCurrentPage()) |
| 333 return std::string(); | 368 return std::string(); |
| 334 return translate_driver_->GetLastCommittedURL().HostNoBrackets(); | 369 return translate_driver_->GetLastCommittedURL().HostNoBrackets(); |
| 335 } | 370 } |
| 336 | 371 |
| 337 } // namespace translate | 372 } // namespace translate |
| OLD | NEW |