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