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

Side by Side Diff: components/translate/core/browser/translate_manager.cc

Issue 2697703004: Allow TranslateRanker to override decisions taken by heuristics. (Closed)
Patch Set: Make ShouldSuppressBubbleUI easier to read. Created 3 years, 8 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
OLDNEW
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_manager.h" 5 #include "components/translate/core/browser/translate_manager.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 language_state_.translation_declined() || 158 language_state_.translation_declined() ||
159 language_state_.IsPageTranslated()) { 159 language_state_.IsPageTranslated()) {
160 return; 160 return;
161 } 161 }
162 162
163 // Also, skip if the connection is currently offline - initiation doesn't make 163 // Also, skip if the connection is currently offline - initiation doesn't make
164 // sense there, either. 164 // sense there, either.
165 if (net::NetworkChangeNotifier::IsOffline()) 165 if (net::NetworkChangeNotifier::IsOffline())
166 return; 166 return;
167 167
168 if (!ignore_missing_key_for_testing_ && 168 if (!ignore_missing_key_for_testing_ && !::google_apis::HasKeysConfigured()) {
169 !::google_apis::HasKeysConfigured()) {
170 // Without an API key, translate won't work, so don't offer to translate 169 // Without an API key, translate won't work, so don't offer to translate
171 // in the first place. Leave prefs::kEnableTranslate on, though, because 170 // in the first place. Leave prefs::kEnableTranslate on, though, because
172 // that settings syncs and we don't want to turn off translate everywhere 171 // that settings syncs and we don't want to turn off translate everywhere
173 // else. 172 // else.
174 TranslateBrowserMetrics::ReportInitiationStatus( 173 TranslateBrowserMetrics::ReportInitiationStatus(
175 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_KEY); 174 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_KEY);
176 return; 175 return;
177 } 176 }
178 177
179 std::unique_ptr<TranslatePrefs> translate_prefs( 178 std::unique_ptr<TranslatePrefs> translate_prefs(
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 220
222 InitTranslateEvent(language_code, target_lang, *translate_prefs); 221 InitTranslateEvent(language_code, target_lang, *translate_prefs);
223 222
224 // Don't translate similar languages (ex: en-US to en). 223 // Don't translate similar languages (ex: en-US to en).
225 if (language_code == target_lang) { 224 if (language_code == target_lang) {
226 TranslateBrowserMetrics::ReportInitiationStatus( 225 TranslateBrowserMetrics::ReportInitiationStatus(
227 TranslateBrowserMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES); 226 TranslateBrowserMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES);
228 return; 227 return;
229 } 228 }
230 229
231 bool ranker_should_offer_translation = true; 230 // Querying the ranker now, but not exiting immediately so that we may log
232 if (translate_ranker_->IsQueryEnabled() || 231 // other potential suppression reasons.
233 translate_ranker_->IsEnforcementEnabled()) { 232 bool should_offer_translation = translate_ranker_->ShouldOfferTranslation(
234 ranker_should_offer_translation = translate_ranker_->ShouldOfferTranslation( 233 *translate_prefs, language_code, target_lang, translate_event_.get());
235 *translate_prefs, language_code, target_lang);
236 translate_event_->set_ranker_request_timestamp_sec(
237 (base::TimeTicks::Now() - base::TimeTicks()).InSeconds());
238 translate_event_->set_ranker_version(translate_ranker_->GetModelVersion());
239 translate_event_->set_ranker_response(
240 ranker_should_offer_translation
241 ? metrics::TranslateEventProto::SHOW
242 : metrics::TranslateEventProto::DONT_SHOW);
243 }
244 234
245 // Nothing to do if either the language Chrome is in or the language of the 235 // Nothing to do if either the language Chrome is in or the language of
246 // page is not supported by the translation server. 236 // the page is not supported by the translation server.
247 if (target_lang.empty() || 237 if (target_lang.empty() ||
248 !TranslateDownloadManager::IsSupportedLanguage(language_code)) { 238 !TranslateDownloadManager::IsSupportedLanguage(language_code)) {
249 TranslateBrowserMetrics::ReportInitiationStatus( 239 TranslateBrowserMetrics::ReportInitiationStatus(
250 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED); 240 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED);
251 TranslateBrowserMetrics::ReportUnsupportedLanguageAtInitiation( 241 TranslateBrowserMetrics::ReportUnsupportedLanguageAtInitiation(
252 language_code); 242 language_code);
253 RecordTranslateEvent(metrics::TranslateEventProto::UNSUPPORTED_LANGUAGE); 243 RecordTranslateEvent(metrics::TranslateEventProto::UNSUPPORTED_LANGUAGE);
254 return; 244 return;
255 } 245 }
256 246
257 TranslateAcceptLanguages* accept_languages = 247 TranslateAcceptLanguages* accept_languages =
258 translate_client_->GetTranslateAcceptLanguages(); 248 translate_client_->GetTranslateAcceptLanguages();
259 // Don't translate any user black-listed languages. 249 // Don't translate any user black-listed languages.
260 if (!translate_prefs->CanTranslateLanguage(accept_languages, 250 if (!translate_prefs->CanTranslateLanguage(accept_languages, language_code)) {
261 language_code)) {
262 TranslateBrowserMetrics::ReportInitiationStatus( 251 TranslateBrowserMetrics::ReportInitiationStatus(
263 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG); 252 TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG);
264 RecordTranslateEvent( 253 RecordTranslateEvent(
265 metrics::TranslateEventProto::LANGUAGE_DISABLED_BY_USER_CONFIG); 254 metrics::TranslateEventProto::LANGUAGE_DISABLED_BY_USER_CONFIG);
266 return; 255 return;
267 } 256 }
268 257
269 // Don't translate any user black-listed URLs. 258 // Don't translate any user black-listed URLs.
270 if (translate_prefs->IsSiteBlacklisted(page_url.HostNoBrackets())) { 259 if (translate_prefs->IsSiteBlacklisted(page_url.HostNoBrackets())) {
271 TranslateBrowserMetrics::ReportInitiationStatus( 260 TranslateBrowserMetrics::ReportInitiationStatus(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 return; 294 return;
306 } 295 }
307 296
308 if (LanguageInULP(language_code)) { 297 if (LanguageInULP(language_code)) {
309 TranslateBrowserMetrics::ReportInitiationStatus( 298 TranslateBrowserMetrics::ReportInitiationStatus(
310 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IN_ULP); 299 TranslateBrowserMetrics::INITIATION_STATUS_LANGUAGE_IN_ULP);
311 RecordTranslateEvent(metrics::TranslateEventProto::LANGUAGE_IN_ULP); 300 RecordTranslateEvent(metrics::TranslateEventProto::LANGUAGE_IN_ULP);
312 return; 301 return;
313 } 302 }
314 303
315 if (!ranker_should_offer_translation && 304 if (!should_offer_translation) {
316 translate_ranker_->IsEnforcementEnabled()) {
317 TranslateBrowserMetrics::ReportInitiationStatus( 305 TranslateBrowserMetrics::ReportInitiationStatus(
318 TranslateBrowserMetrics::INITIATION_STATUS_ABORTED_BY_RANKER); 306 TranslateBrowserMetrics::INITIATION_STATUS_ABORTED_BY_RANKER);
319 RecordTranslateEvent(metrics::TranslateEventProto::DISABLED_BY_RANKER); 307 RecordTranslateEvent(metrics::TranslateEventProto::DISABLED_BY_RANKER);
320 return; 308 return;
321 } 309 }
322 310
323 TranslateBrowserMetrics::ReportInitiationStatus( 311 TranslateBrowserMetrics::ReportInitiationStatus(
324 TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR); 312 TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR);
325 313
326 // Prompts the user if they want the page translated. 314 // Prompts the user if they want the page translated.
327 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_BEFORE_TRANSLATE, 315 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_BEFORE_TRANSLATE,
328 language_code, 316 language_code, target_lang,
329 target_lang, 317 TranslateErrors::NONE, false);
330 TranslateErrors::NONE,
331 false);
332 } 318 }
333 319
334 bool TranslateManager::LanguageInULP(const std::string& language) const { 320 bool TranslateManager::LanguageInULP(const std::string& language) const {
335 if (!base::FeatureList::IsEnabled(kTranslateLanguageByULP)) 321 if (!base::FeatureList::IsEnabled(kTranslateLanguageByULP))
336 return false; 322 return false;
337 std::map<std::string, std::string> params; 323 std::map<std::string, std::string> params;
338 variations::GetVariationParamsByFeature(translate::kTranslateLanguageByULP, 324 variations::GetVariationParamsByFeature(translate::kTranslateLanguageByULP,
339 &params); 325 &params);
340 // Check the language & probability on the reading list. 326 // Check the language & probability on the reading list.
341 TranslatePrefs::LanguageAndProbabilityList reading; 327 TranslatePrefs::LanguageAndProbabilityList reading;
(...skipping 26 matching lines...) Expand all
368 if (!TranslateDownloadManager::IsSupportedLanguage(source_lang)) 354 if (!TranslateDownloadManager::IsSupportedLanguage(source_lang))
369 source_lang = std::string(translate::kUnknownLanguageCode); 355 source_lang = std::string(translate::kUnknownLanguageCode);
370 356
371 // Capture the translate event if we were triggered from the menu. 357 // Capture the translate event if we were triggered from the menu.
372 if (triggered_from_menu) { 358 if (triggered_from_menu) {
373 RecordTranslateEvent( 359 RecordTranslateEvent(
374 metrics::TranslateEventProto::USER_CONTEXT_MENU_TRANSLATE); 360 metrics::TranslateEventProto::USER_CONTEXT_MENU_TRANSLATE);
375 } 361 }
376 362
377 // Trigger the "translating now" UI. 363 // Trigger the "translating now" UI.
378 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_TRANSLATING, 364 translate_client_->ShowTranslateUI(
379 source_lang, 365 translate::TRANSLATE_STEP_TRANSLATING, source_lang, target_lang,
380 target_lang, 366 TranslateErrors::NONE, triggered_from_menu);
381 TranslateErrors::NONE,
382 triggered_from_menu);
383 367
384 TranslateScript* script = TranslateDownloadManager::GetInstance()->script(); 368 TranslateScript* script = TranslateDownloadManager::GetInstance()->script();
385 DCHECK(script != NULL); 369 DCHECK(script != NULL);
386 370
387 const std::string& script_data = script->data(); 371 const std::string& script_data = script->data();
388 if (!script_data.empty()) { 372 if (!script_data.empty()) {
389 DoTranslatePage(script_data, source_lang, target_lang); 373 DoTranslatePage(script_data, source_lang, target_lang);
390 return; 374 return;
391 } 375 }
392 376
393 // The script is not available yet. Queue that request and query for the 377 // The script is not available yet. Queue that request and query for the
394 // script. Once it is downloaded we'll do the translate. 378 // script. Once it is downloaded we'll do the translate.
395 TranslateScript::RequestCallback callback = base::Bind( 379 TranslateScript::RequestCallback callback =
396 &TranslateManager::OnTranslateScriptFetchComplete, GetWeakPtr(), 380 base::Bind(&TranslateManager::OnTranslateScriptFetchComplete,
397 source_lang, target_lang); 381 GetWeakPtr(), source_lang, target_lang);
398 382
399 script->Request(callback); 383 script->Request(callback);
400 } 384 }
401 385
402 void TranslateManager::RevertTranslation() { 386 void TranslateManager::RevertTranslation() {
403 // Capture the revert event in the translate metrics 387 // Capture the revert event in the translate metrics
404 RecordTranslateEvent(metrics::TranslateEventProto::USER_REVERT); 388 RecordTranslateEvent(metrics::TranslateEventProto::USER_REVERT);
405 389
406 // Revert the translation. 390 // Revert the translation.
407 translate_driver_->RevertTranslation(page_seq_no_); 391 translate_driver_->RevertTranslation(page_seq_no_);
408 language_state_.SetCurrentLanguage(language_state_.original_language()); 392 language_state_.SetCurrentLanguage(language_state_.original_language());
409 } 393 }
410 394
411 void TranslateManager::ReportLanguageDetectionError() { 395 void TranslateManager::ReportLanguageDetectionError() {
412 TranslateBrowserMetrics::ReportLanguageDetectionError(); 396 TranslateBrowserMetrics::ReportLanguageDetectionError();
413 397
414 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL); 398 GURL report_error_url = GURL(kReportLanguageDetectionErrorURL);
415 399
416 report_error_url = net::AppendQueryParameter( 400 report_error_url = net::AppendQueryParameter(
417 report_error_url, kUrlQueryName, 401 report_error_url, kUrlQueryName,
418 translate_driver_->GetLastCommittedURL().spec()); 402 translate_driver_->GetLastCommittedURL().spec());
419 403
420 report_error_url = 404 report_error_url =
421 net::AppendQueryParameter(report_error_url, 405 net::AppendQueryParameter(report_error_url, kSourceLanguageQueryName,
422 kSourceLanguageQueryName,
423 language_state_.original_language()); 406 language_state_.original_language());
424 407
425 report_error_url = translate::AddHostLocaleToUrl(report_error_url); 408 report_error_url = translate::AddHostLocaleToUrl(report_error_url);
426 report_error_url = translate::AddApiKeyToUrl(report_error_url); 409 report_error_url = translate::AddApiKeyToUrl(report_error_url);
427 410
428 translate_client_->ShowReportLanguageDetectionErrorUI(report_error_url); 411 translate_client_->ShowReportLanguageDetectionErrorUI(report_error_url);
429 } 412 }
430 413
431 void TranslateManager::DoTranslatePage(const std::string& translate_script, 414 void TranslateManager::DoTranslatePage(const std::string& translate_script,
432 const std::string& source_lang, 415 const std::string& source_lang,
433 const std::string& target_lang) { 416 const std::string& target_lang) {
434 language_state_.set_translation_pending(true); 417 language_state_.set_translation_pending(true);
435 translate_driver_->TranslatePage( 418 translate_driver_->TranslatePage(page_seq_no_, translate_script, source_lang,
436 page_seq_no_, translate_script, source_lang, target_lang); 419 target_lang);
437 } 420 }
438 421
439 // Notifies |g_callback_list_| of translate errors. 422 // Notifies |g_callback_list_| of translate errors.
440 void TranslateManager::NotifyTranslateError(TranslateErrors::Type error_type) { 423 void TranslateManager::NotifyTranslateError(TranslateErrors::Type error_type) {
441 if (!g_callback_list_ || error_type == TranslateErrors::NONE || 424 if (!g_callback_list_ || error_type == TranslateErrors::NONE ||
442 translate_driver_->IsIncognito()) { 425 translate_driver_->IsIncognito()) {
443 return; 426 return;
444 } 427 }
445 428
446 TranslateErrorDetails error_details; 429 TranslateErrorDetails error_details;
447 error_details.time = base::Time::Now(); 430 error_details.time = base::Time::Now();
448 error_details.url = translate_driver_->GetLastCommittedURL(); 431 error_details.url = translate_driver_->GetLastCommittedURL();
449 error_details.error = error_type; 432 error_details.error = error_type;
450 g_callback_list_->Notify(error_details); 433 g_callback_list_->Notify(error_details);
451 } 434 }
452 435
453 void TranslateManager::PageTranslated(const std::string& source_lang, 436 void TranslateManager::PageTranslated(const std::string& source_lang,
454 const std::string& target_lang, 437 const std::string& target_lang,
455 TranslateErrors::Type error_type) { 438 TranslateErrors::Type error_type) {
456 language_state_.SetCurrentLanguage(target_lang); 439 language_state_.SetCurrentLanguage(target_lang);
457 language_state_.set_translation_pending(false); 440 language_state_.set_translation_pending(false);
458 441
459 if ((error_type == TranslateErrors::NONE) && 442 if ((error_type == TranslateErrors::NONE) &&
460 source_lang != translate::kUnknownLanguageCode && 443 source_lang != translate::kUnknownLanguageCode &&
461 !TranslateDownloadManager::IsSupportedLanguage(source_lang)) { 444 !TranslateDownloadManager::IsSupportedLanguage(source_lang)) {
462 error_type = TranslateErrors::UNSUPPORTED_LANGUAGE; 445 error_type = TranslateErrors::UNSUPPORTED_LANGUAGE;
463 } 446 }
464 447
465 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_AFTER_TRANSLATE, 448 translate_client_->ShowTranslateUI(translate::TRANSLATE_STEP_AFTER_TRANSLATE,
466 source_lang, 449 source_lang, target_lang, error_type,
467 target_lang,
468 error_type,
469 false); 450 false);
470 NotifyTranslateError(error_type); 451 NotifyTranslateError(error_type);
471 } 452 }
472 453
473 void TranslateManager::OnTranslateScriptFetchComplete( 454 void TranslateManager::OnTranslateScriptFetchComplete(
474 const std::string& source_lang, 455 const std::string& source_lang,
475 const std::string& target_lang, 456 const std::string& target_lang,
476 bool success, 457 bool success,
477 const std::string& data) { 458 const std::string& data) {
478 if (!translate_driver_->HasCurrentPage()) 459 if (!translate_driver_->HasCurrentPage())
479 return; 460 return;
480 461
481 if (success) { 462 if (success) {
482 // Translate the page. 463 // Translate the page.
483 TranslateScript* translate_script = 464 TranslateScript* translate_script =
484 TranslateDownloadManager::GetInstance()->script(); 465 TranslateDownloadManager::GetInstance()->script();
485 DCHECK(translate_script); 466 DCHECK(translate_script);
486 DoTranslatePage(translate_script->data(), source_lang, target_lang); 467 DoTranslatePage(translate_script->data(), source_lang, target_lang);
487 } else { 468 } else {
488 translate_client_->ShowTranslateUI( 469 translate_client_->ShowTranslateUI(
489 translate::TRANSLATE_STEP_TRANSLATE_ERROR, 470 translate::TRANSLATE_STEP_TRANSLATE_ERROR, source_lang, target_lang,
490 source_lang, 471 TranslateErrors::NETWORK, false);
491 target_lang,
492 TranslateErrors::NETWORK,
493 false);
494 NotifyTranslateError(TranslateErrors::NETWORK); 472 NotifyTranslateError(TranslateErrors::NETWORK);
495 } 473 }
496 } 474 }
497 475
498 // static 476 // static
499 std::string TranslateManager::GetTargetLanguage(const TranslatePrefs* prefs) { 477 std::string TranslateManager::GetTargetLanguage(const TranslatePrefs* prefs) {
500 std::string language; 478 std::string language;
501 479
502 // Get the override UI language. 480 // Get the override UI language.
503 TranslateExperiment::OverrideUiLanguage(prefs->GetCountry(), &language); 481 TranslateExperiment::OverrideUiLanguage(prefs->GetCountry(), &language);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 prefs.GetTranslationDeniedCount(src_lang)); 572 prefs.GetTranslationDeniedCount(src_lang));
595 translate_event_->set_ignore_count( 573 translate_event_->set_ignore_count(
596 prefs.GetTranslationIgnoredCount(src_lang)); 574 prefs.GetTranslationIgnoredCount(src_lang));
597 translate_event_->set_ranker_response( 575 translate_event_->set_ranker_response(
598 metrics::TranslateEventProto::NOT_QUERIED); 576 metrics::TranslateEventProto::NOT_QUERIED);
599 translate_event_->set_event_type(metrics::TranslateEventProto::UNKNOWN); 577 translate_event_->set_event_type(metrics::TranslateEventProto::UNKNOWN);
600 // TODO(rogerm): Populate the language list. 578 // TODO(rogerm): Populate the language list.
601 } 579 }
602 580
603 void TranslateManager::RecordTranslateEvent(int event_type) { 581 void TranslateManager::RecordTranslateEvent(int event_type) {
604 DCHECK(metrics::TranslateEventProto::EventType_IsValid(event_type)); 582 translate_ranker_->RecordTranslateEvent(
605 translate_event_->set_event_type( 583 event_type, translate_driver_->GetVisibleURL(), translate_event_.get());
606 static_cast<metrics::TranslateEventProto::EventType>(event_type)); 584 }
607 translate_event_->set_event_timestamp_sec( 585
608 (base::TimeTicks::Now() - base::TimeTicks()).InSeconds()); 586 bool TranslateManager::ShouldOverrideDecision(int event_type) {
609 translate_ranker_->AddTranslateEvent(*translate_event_, 587 return translate_ranker_->ShouldOverrideDecision(
610 translate_driver_->GetVisibleURL()); 588 event_type, translate_driver_->GetVisibleURL(), translate_event_.get());
589 }
590
591 bool TranslateManager::ShouldSuppressBubbleUI(
592 bool triggered_from_menu,
593 const std::string& source_language) {
594 // Suppress the UI if the user navigates to a page with
595 // the same language as the previous page. In the new UI,
596 // continue offering translation after the user navigates
597 // to another page.
598 language_state_.SetTranslateEnabled(true);
599 if (!base::FeatureList::IsEnabled(translate::kTranslateUI2016Q2) &&
600 !language_state_.HasLanguageChanged() &&
601 !ShouldOverrideDecision(
602 metrics::TranslateEventProto::MATCHES_PREVIOUS_LANGUAGE)) {
603 return true;
604 }
605
606 // Suppress the UI if the user denied translation for this language
607 // too often.
608 if (!triggered_from_menu &&
609 translate_client_->GetTranslatePrefs()->IsTooOftenDenied(
610 source_language) &&
611 !ShouldOverrideDecision(
612 metrics::TranslateEventProto::LANGUAGE_DISABLED_BY_AUTO_BLACKLIST)) {
613 return true;
614 }
615
616 return false;
611 } 617 }
612 618
613 } // namespace translate 619 } // namespace translate
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698