summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-16 18:46:56 +0000
committerjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-16 18:46:56 +0000
commit575c4e175880c7ba333e2d734dc7bb5a73b10f3b (patch)
tree4cdba0a726af43633becbbf887c75cdacb2c514a
parent65ec1925d1669521e60528fa8f976694565bcef7 (diff)
downloadchromium_src-575c4e175880c7ba333e2d734dc7bb5a73b10f3b.zip
chromium_src-575c4e175880c7ba333e2d734dc7bb5a73b10f3b.tar.gz
chromium_src-575c4e175880c7ba333e2d734dc7bb5a73b10f3b.tar.bz2
Reloading a page would not show a translate infobar.
This CL fixes that bug. BUG=35602, 35482 TEST=Navigate to a page in a foreign language. The tranlate infobar is shown. Reload the page, the infobar should be shown again. Review URL: http://codereview.chromium.org/597065 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39106 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/tab_contents/language_state.cc10
-rw-r--r--chrome/browser/tab_contents/language_state.h2
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc3
-rw-r--r--chrome/browser/translate/translate_manager.cc45
-rw-r--r--chrome/browser/translate/translate_manager.h9
5 files changed, 62 insertions, 7 deletions
diff --git a/chrome/browser/tab_contents/language_state.cc b/chrome/browser/tab_contents/language_state.cc
index 8522ed3..87fe217 100644
--- a/chrome/browser/tab_contents/language_state.cc
+++ b/chrome/browser/tab_contents/language_state.cc
@@ -15,11 +15,13 @@ LanguageState::LanguageState(NavigationController* nav_controller)
LanguageState::~LanguageState() {
}
-void LanguageState::DidNavigate() {
- prev_original_lang_ = original_lang_;
- prev_current_lang_ = current_lang_;
+void LanguageState::DidNavigate(bool reload) {
+ if (!reload) {
+ prev_original_lang_ = original_lang_;
+ prev_current_lang_ = current_lang_;
+ original_lang_.clear();
+ }
- original_lang_.clear();
current_lang_.clear();
translation_pending_ = false;
diff --git a/chrome/browser/tab_contents/language_state.h b/chrome/browser/tab_contents/language_state.h
index d5c7df6..f8b2a68 100644
--- a/chrome/browser/tab_contents/language_state.h
+++ b/chrome/browser/tab_contents/language_state.h
@@ -27,7 +27,7 @@ class LanguageState {
// Should be called when the page did a new navigation (whether it is a main
// frame or sub-frame navigation).
- void DidNavigate();
+ void DidNavigate(bool reload);
// Should be called when the language of the page has been determined.
void LanguageDetermined(const std::string& page_language);
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index ed15084..9d3ab59 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -1507,7 +1507,8 @@ void TabContents::DidNavigateAnyFramePostCommit(
GetPasswordManager()->ProvisionallySavePassword(params.password_form);
// Let the LanguageState clear its state.
- language_state_.DidNavigate();
+ language_state_.DidNavigate(details.entry->transition_type() ==
+ PageTransition::RELOAD);
}
void TabContents::CloseConstrainedWindows() {
diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc
index 742f9f0..212447b 100644
--- a/chrome/browser/translate/translate_manager.cc
+++ b/chrome/browser/translate/translate_manager.cc
@@ -4,14 +4,18 @@
#include "chrome/browser/translate/translate_manager.h"
+#include "base/compiler_specific.h"
#include "base/string_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profile.h"
+#include "chrome/browser/renderer_host/render_process_host.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
#include "chrome/browser/renderer_host/translation_service.h"
#include "chrome/browser/tab_contents/language_state.h"
#include "chrome/browser/tab_contents/navigation_controller.h"
#include "chrome/browser/tab_contents/navigation_entry.h"
#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/tab_contents/tab_util.h"
#include "chrome/browser/translate/translate_infobars_delegates.h"
#include "chrome/browser/translate/translate_prefs.h"
#include "chrome/common/notification_details.h"
@@ -31,6 +35,31 @@ void TranslateManager::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
switch (type.value) {
+ case NotificationType::NAV_ENTRY_COMMITTED: {
+ NavigationController* controller =
+ Source<NavigationController>(source).ptr();
+ NavigationEntry* entry = controller->GetActiveEntry();
+ if (!entry) {
+ NOTREACHED();
+ return;
+ }
+ if (entry->transition_type() != PageTransition::RELOAD)
+ return;
+ // When doing a page reload, we don't get a TAB_LANGUAGE_DETERMINED
+ // notification. So we need to explictly initiate the translation.
+ // Note that we delay it as the TranslateManager gets this notification
+ // before the TabContents and the TabContents processing might remove the
+ // current infobars. Since InitTranslation might add an infobar, it must
+ // be done after that.
+ MessageLoop::current()->PostTask(FROM_HERE,
+ method_factory_.NewRunnableMethod(
+ &TranslateManager::InitiateTranslationPosted,
+ controller->tab_contents()->render_view_host()->process()->id(),
+ controller->tab_contents()->render_view_host()->routing_id(),
+ controller->tab_contents()->language_state().
+ original_language()));
+ break;
+ }
case NotificationType::TAB_LANGUAGE_DETERMINED: {
TabContents* tab = Source<TabContents>(source).ptr();
std::string language = *(Details<std::string>(details).ptr());
@@ -85,10 +114,13 @@ void TranslateManager::Observe(NotificationType type,
}
}
-TranslateManager::TranslateManager() {
+TranslateManager::TranslateManager()
+ : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
if (!test_enabled_ && !TranslationService::IsTranslationEnabled())
return;
+ notification_registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED,
+ NotificationService::AllSources());
notification_registrar_.Add(this, NotificationType::TAB_LANGUAGE_DETERMINED,
NotificationService::AllSources());
notification_registrar_.Add(this, NotificationType::PAGE_TRANSLATED,
@@ -140,6 +172,17 @@ void TranslateManager::InitiateTranslation(TabContents* tab,
page_lang, ui_lang));
}
+void TranslateManager::InitiateTranslationPosted(int process_id,
+ int render_id,
+ const std::string& page_lang) {
+ // The tab might have been closed.
+ TabContents* tab = tab_util::GetTabContentsByID(process_id, render_id);
+ if (!tab || tab->language_state().translation_pending())
+ return;
+
+ InitiateTranslation(tab, page_lang);
+}
+
bool TranslateManager::IsAcceptLanguage(TabContents* tab,
const std::string& language) {
PrefService* pref_service = tab->profile()->GetPrefs();
diff --git a/chrome/browser/translate/translate_manager.h b/chrome/browser/translate/translate_manager.h
index 706dd2c..f14dfdd 100644
--- a/chrome/browser/translate/translate_manager.h
+++ b/chrome/browser/translate/translate_manager.h
@@ -10,6 +10,7 @@
#include <string>
#include "base/singleton.h"
+#include "base/task.h"
#include "chrome/common/notification_observer.h"
#include "chrome/common/notification_registrar.h"
@@ -43,6 +44,12 @@ class TranslateManager : public NotificationObserver {
// |page_lang| language.
void InitiateTranslation(TabContents* tab, const std::string& page_lang);
+ // If the tab identified by |process_id| and |render_id| has been closed, this
+ // does nothing, otherwise it calls InitiateTranslation.
+ void InitiateTranslationPosted(int process_id,
+ int render_id,
+ const std::string& page_lang);
+
// Returns true if the passed language has been configured by the user as an
// accept language.
bool IsAcceptLanguage(TabContents* tab, const std::string& language);
@@ -58,6 +65,8 @@ class TranslateManager : public NotificationObserver {
typedef std::map<PrefService*, LanguageSet> PrefServiceLanguagesMap;
PrefServiceLanguagesMap accept_languages_;
+ ScopedRunnableMethodFactory<TranslateManager> method_factory_;
+
static bool test_enabled_;
DISALLOW_COPY_AND_ASSIGN(TranslateManager);