diff options
author | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-16 18:46:56 +0000 |
---|---|---|
committer | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-16 18:46:56 +0000 |
commit | 575c4e175880c7ba333e2d734dc7bb5a73b10f3b (patch) | |
tree | 4cdba0a726af43633becbbf887c75cdacb2c514a | |
parent | 65ec1925d1669521e60528fa8f976694565bcef7 (diff) | |
download | chromium_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.cc | 10 | ||||
-rw-r--r-- | chrome/browser/tab_contents/language_state.h | 2 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.cc | 3 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager.cc | 45 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager.h | 9 |
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); |