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

Unified Diff: chrome/browser/translate/translate_manager.cc

Issue 14846026: [Translate] When reloading a page Wait until some content has actually been re-loaded before trigg… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/translate/translate_manager.cc
diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc
index f9e3e72bd31768944df1a9eb9e882d91799c8459..49f7f22de6b14ee8bd89d7a63b50f68d28e83204 100644
--- a/chrome/browser/translate/translate_manager.cc
+++ b/chrome/browser/translate/translate_manager.cc
@@ -167,6 +167,14 @@ const char kSourceLanguageQueryName[] = "sl";
// Used in kReportLanguageDetectionErrorURL to specify the page URL.
const char kUrlQueryName[] = "u";
+// The delay in ms that we'll wait to check if a page has finished loading
+// before attempting a translation.
+const int kTranslateLoadCheckDelayMs = 150;
+
+// The maximum number of attempts we'll do to see if the page has finshed
+// loading before giving up the translation
+const int kMaxTranslateLoadCheckAttempts = 20;
+
const int kMaxRetryLanguageListFetch = 5;
const int kTranslateScriptExpirationDelayDays = 1;
@@ -343,6 +351,7 @@ void TranslateManager::Observe(int type,
load_details->type != content::NAVIGATION_TYPE_SAME_PAGE) {
return;
}
+
// When doing a page reload, TAB_LANGUAGE_DETERMINED is not sent,
// so the translation needs to be explicitly initiated, but only when the
// page is translatable.
@@ -358,7 +367,7 @@ void TranslateManager::Observe(int type,
weak_method_factory_.GetWeakPtr(),
controller->GetWebContents()->GetRenderProcessHost()->GetID(),
controller->GetWebContents()->GetRenderViewHost()->GetRoutingID(),
- translate_tab_helper->language_state().original_language()));
+ translate_tab_helper->language_state().original_language(), 0));
break;
}
case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: {
@@ -439,6 +448,7 @@ void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) {
std::string data;
source->GetResponseAsString(&data);
translate_script_ += argument + data;
+
// We'll expire the cached script after some time, to make sure long
// running browsers still get fixes that might get pushed with newer
// scripts.
@@ -498,9 +508,10 @@ void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) {
}
TranslateManager::TranslateManager()
- : weak_method_factory_(this),
- translate_script_expiration_delay_(
- base::TimeDelta::FromDays(kTranslateScriptExpirationDelayDays)) {
+ : weak_method_factory_(this),
+ translate_script_expiration_delay_(base::TimeDelta::FromDays(
+ kTranslateScriptExpirationDelayDays)),
+ max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts) {
notification_registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
content::NotificationService::AllSources());
notification_registrar_.Add(this,
@@ -583,7 +594,7 @@ void TranslateManager::InitiateTranslation(WebContents* web_contents,
}
void TranslateManager::InitiateTranslationPosted(
- int process_id, int render_id, const std::string& page_lang) {
+ int process_id, int render_id, const std::string& page_lang, int attempt) {
// The tab might have been closed.
WebContents* web_contents =
tab_util::GetWebContentsByID(process_id, render_id);
@@ -595,6 +606,20 @@ void TranslateManager::InitiateTranslationPosted(
if (translate_tab_helper->language_state().translation_pending())
return;
+ // During a reload we need some content to be already loaded before the
MAD 2013/05/09 14:05:24 The text seem to imply that as soon as "some" cont
Miguel Garcia 2013/05/10 12:00:02 Done.
+ // translate script is executed. Otherwise we will run the translate script on
+ // an empty DOM which will fail. Therefore we wait a bit to see if the page
+ // has finished.
+ if ((web_contents->IsLoading()) && attempt < kMaxTranslateLoadCheckAttempts) {
+ int backoff = attempt * max_reload_check_attempts_;
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE, base::Bind(&TranslateManager::InitiateTranslationPosted,
+ weak_method_factory_.GetWeakPtr(), process_id,
+ render_id, page_lang, ++attempt),
+ base::TimeDelta::FromMilliseconds(backoff));
+ return;
+ }
+
InitiateTranslation(web_contents, GetLanguageCode(page_lang));
}
@@ -856,6 +881,7 @@ void TranslateManager::RequestTranslateScript() {
translate_script_url,
kCallbackQueryName,
kCallbackQueryValue);
+
translate_script_url = AddHostLocaleToUrl(translate_script_url);
translate_script_url = AddApiKeyToUrl(translate_script_url);

Powered by Google App Engine
This is Rietveld 408576698