diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-22 19:10:32 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-22 19:10:32 +0000 |
commit | dc4939992b56ee738e8bb1ae2bb6f127c103b14a (patch) | |
tree | 7a8a833c433305918b2da03eb5ee25f76f78d647 /components | |
parent | fddd8c81876a00c2c976c1f52cc35b00b3250aee (diff) | |
download | chromium_src-dc4939992b56ee738e8bb1ae2bb6f127c103b14a.zip chromium_src-dc4939992b56ee738e8bb1ae2bb6f127c103b14a.tar.gz chromium_src-dc4939992b56ee738e8bb1ae2bb6f127c103b14a.tar.bz2 |
Revert 272217 "LanguageState should be owned by TranslateManager"
This CL is breaking the asan/lsan bots. A snippet of the failure:
==10649==ERROR: AddressSanitizer: heap-use-after-free on address 0x60b0000d0592 at pc 0xbf31f90 bp 0x7fff0930b610 sp 0x7fff0930b608
WRITE of size 1 at 0x60b0000d0592 thread T0 (browser_tests)
#0 0xbf31f8f in set_translation_declined components/translate/core/browser/language_state.h:62
#1 0xbf31f8f in TranslateUIDelegate::TranslationDeclined(bool) components/translate/core/browser/translate_ui_delegate.cc:188
#2 0x4614bb4 in TranslateBubbleView::WindowClosing() chrome/browser/ui/views/translate/translate_bubble_view.cc:205
#3 0x4224e9c in views::Widget::OnNativeWidgetDestroying() ui/views/widget/widget.cc:1086
#4 0x4212c95 in OnWindowDestroying ui/views/widget/native_widget_aura.cc:793
#5 0x4212c95 in non-virtual thunk to views::NativeWidgetAura::OnWindowDestroying(aura::Window*) ui/views/widget/native_widget_aura.cc:797
#6 0x60362b7 in aura::Window::~Window() ui/aura/window.cc:225
#7 0x60388ed in aura::Window::~Window() ui/aura/window.cc:218
#8 0x421fb19 in views::Widget::CloseNow() ui/views/widget/widget.cc:614
#9 0x5a03a46 in content::WebContentsImpl::~WebContentsImpl() content/browser/web_contents/web_contents_impl.cc:422
#10 0x5a05ead in content::WebContentsImpl::~WebContentsImpl() content/browser/web_contents/web_contents_impl.cc:373
#11 0x443bda1 in TabStripModel::InternalCloseTab(content::WebContents*, int, bool) chrome/browser/ui/tabs/tab_strip_model.cc:1272
#12 0x4434198 in TabStripModel::InternalCloseTabs(std::vector\u003Cint, std::allocator\u003Cint> > const&, unsigned int) chrome/browser/ui/tabs/tab_strip_model.cc:1247
#13 0x4432c73 in TabStripModel::CloseAllTabs() chrome/browser/ui/tabs/tab_strip_model.cc:545
...
0x60b0000d0592 is located 82 bytes inside of 104-byte region [0x60b0000d0540,0x60b0000d05a8)
freed by thread T0 (browser_tests) here:
#0 0x56fcbb in operator delete(void*) /usr/local/google/work/chromium/src/third_party/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:94
#1 0xbf20b7c in TranslateManager::~TranslateManager() components/translate/core/browser/translate_manager.cc:59
#2 0x2926a06 in operator() base/memory/scoped_ptr.h:137
#3 0x2926a06 in reset base/memory/scoped_ptr.h:246
#4 0x2926a06 in reset base/memory/scoped_ptr.h:367
#5 0x2926a06 in WebContentsDestroyed chrome/browser/translate/translate_tab_helper.cc:314
#6 0x2926a06 in non-virtual thunk to TranslateTabHelper::WebContentsDestroyed() chrome/browser/translate/translate_tab_helper.cc:315
#7 0x5a03a46 in content::WebContentsImpl::~WebContentsImpl() content/browser/web_contents/web_contents_impl.cc:422
#8 0x5a05ead in content::WebContentsImpl::~WebContentsImpl() content/browser/web_contents/web_contents_impl.cc:373
#9 0x443bda1 in TabStripModel::InternalCloseTab(content::WebContents*, int, bool) chrome/browser/ui/tabs/tab_strip_model.cc:1272
#10 0x4434198 in TabStripModel::InternalCloseTabs(std::vector\u003Cint, std::allocator\u003Cint> > const&, unsigned int) chrome/browser/ui/tabs/tab_strip_model.cc:1247
#11 0x4432c73 in TabStripModel::CloseAllTabs() chrome/browser/ui/tabs/tab_strip_model.cc:545
...
previously allocated by thread T0 (browser_tests) here:
#0 0x56f77b in operator new(unsigned long) /usr/local/google/work/chromium/src/third_party/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:62
#1 0x2923028 in TranslateTabHelper::TranslateTabHelper(content::WebContents*) chrome/browser/translate/translate_tab_helper.cc:78
#2 0x4428959 in CreateForWebContents content/public/browser/web_contents_user_data.h:38
#3 0x4428959 in TabHelpers::AttachTabHelpers(content::WebContents*) chrome/browser/ui/tab_helpers.cc:142
...
> LanguageState should be owned by TranslateManager
>
> LanguageState is currently owned by ContentTranslateManager,
> but it should be moved under TranslateManager
>
> BUG=345690
> TEST=unittests --gtest_filter=Translate*
> TBR=thakis@chromium.org
>
> Review URL: https://codereview.chromium.org/290573013
TBR=naiem.shaik@gmail.com
Review URL: https://codereview.chromium.org/296003014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@272264 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components')
7 files changed, 47 insertions, 27 deletions
diff --git a/components/translate/content/browser/content_translate_driver.cc b/components/translate/content/browser/content_translate_driver.cc index 60757db..ffebdc7 100644 --- a/components/translate/content/browser/content_translate_driver.cc +++ b/components/translate/content/browser/content_translate_driver.cc @@ -8,6 +8,7 @@ #include "components/translate/content/common/translate_messages.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/navigation_controller.h" +#include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/page_navigator.h" #include "content/public/browser/render_view_host.h" @@ -18,12 +19,22 @@ ContentTranslateDriver::ContentTranslateDriver( content::NavigationController* nav_controller) : navigation_controller_(nav_controller), + language_state_(this), observer_(NULL) { DCHECK(navigation_controller_); } ContentTranslateDriver::~ContentTranslateDriver() {} +void ContentTranslateDriver::DidNavigate( + const content::LoadCommittedDetails& details) { + const bool reload = + details.entry->GetTransitionType() == content::PAGE_TRANSITION_RELOAD || + details.type == content::NAVIGATION_TYPE_SAME_PAGE; + language_state_.DidNavigate( + details.is_in_page, details.is_main_frame, reload); +} + // TranslateDriver methods bool ContentTranslateDriver::IsLinkNavigation() { @@ -48,6 +59,10 @@ void ContentTranslateDriver::OnIsPageTranslatedChanged() { } } +LanguageState& ContentTranslateDriver::GetLanguageState() { + return language_state_; +} + void ContentTranslateDriver::TranslatePage(const std::string& translate_script, const std::string& source_lang, const std::string& target_lang) { diff --git a/components/translate/content/browser/content_translate_driver.h b/components/translate/content/browser/content_translate_driver.h index 7f686f3..1d3112d 100644 --- a/components/translate/content/browser/content_translate_driver.h +++ b/components/translate/content/browser/content_translate_driver.h @@ -5,10 +5,12 @@ #ifndef COMPONENTS_TRANSLATE_CONTENT_BROWSER_CONTENT_TRANSLATE_DRIVER_H_ #define COMPONENTS_TRANSLATE_CONTENT_BROWSER_CONTENT_TRANSLATE_DRIVER_H_ -#include "base/basictypes.h" #include "components/translate/core/browser/translate_driver.h" +#include "components/translate/core/browser/language_state.h" + namespace content { +struct LoadCommittedDetails; class NavigationController; class WebContents; } @@ -36,10 +38,14 @@ class ContentTranslateDriver : public TranslateDriver { // Sets the Observer. Calling this method is optional. void set_observer(Observer* observer) { observer_ = observer; } + // Must be called on navigations. + void DidNavigate(const content::LoadCommittedDetails& details); + // TranslateDriver methods. virtual void OnIsPageTranslatedChanged() OVERRIDE; virtual void OnTranslateEnabledChanged() OVERRIDE; virtual bool IsLinkNavigation() OVERRIDE; + virtual LanguageState& GetLanguageState() OVERRIDE; virtual void TranslatePage(const std::string& translate_script, const std::string& source_lang, const std::string& target_lang) OVERRIDE; @@ -57,6 +63,7 @@ class ContentTranslateDriver : public TranslateDriver { // The navigation controller of the tab we are associated with. content::NavigationController* navigation_controller_; + LanguageState language_state_; Observer* observer_; DISALLOW_COPY_AND_ASSIGN(ContentTranslateDriver); diff --git a/components/translate/core/browser/language_state_unittest.cc b/components/translate/core/browser/language_state_unittest.cc index 32a0ed3..9f7d84a 100644 --- a/components/translate/core/browser/language_state_unittest.cc +++ b/components/translate/core/browser/language_state_unittest.cc @@ -41,6 +41,10 @@ class MockTranslateDriver : public TranslateDriver { return false; } + virtual LanguageState& GetLanguageState() OVERRIDE { + return language_state_; + } + virtual void TranslatePage(const std::string& translate_script, const std::string& source_lang, const std::string& target_lang) OVERRIDE {} diff --git a/components/translate/core/browser/translate_driver.h b/components/translate/core/browser/translate_driver.h index 805db05..788a267 100644 --- a/components/translate/core/browser/translate_driver.h +++ b/components/translate/core/browser/translate_driver.h @@ -8,6 +8,7 @@ #include <string> class GURL; +class LanguageState; // Interface that allows Translate core code to interact with its driver (i.e., // obtain information from it and give information to it). A concrete @@ -23,6 +24,9 @@ class TranslateDriver { // Called when the page is "translated" state of the page changed. virtual void OnIsPageTranslatedChanged() = 0; + // Gets the LanguageState associated with the driver. + virtual LanguageState& GetLanguageState() = 0; + // Translates the page contents from |source_lang| to |target_lang|. virtual void TranslatePage(const std::string& translate_script, const std::string& source_lang, diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc index 63ada40..dcc8c30 100644 --- a/components/translate/core/browser/translate_manager.cc +++ b/components/translate/core/browser/translate_manager.cc @@ -73,7 +73,6 @@ TranslateManager::TranslateManager( : accept_languages_pref_name_(accept_languages_pref_name), translate_client_(translate_client), translate_driver_(translate_client_->GetTranslateDriver()), - language_state_(translate_driver_), weak_method_factory_(this) {} base::WeakPtr<TranslateManager> TranslateManager::GetWeakPtr() { @@ -83,10 +82,11 @@ base::WeakPtr<TranslateManager> TranslateManager::GetWeakPtr() { void TranslateManager::InitiateTranslation(const std::string& page_lang) { // Short-circuit out if not in a state where initiating translation makes // sense (this method may be called muhtiple times for a given page). - if (!language_state_.page_needs_translation() || - language_state_.translation_pending() || - language_state_.translation_declined() || - language_state_.IsPageTranslated()) { + LanguageState& language_state = translate_driver_->GetLanguageState(); + if (!language_state.page_needs_translation() || + language_state.translation_pending() || + language_state.translation_declined() || + language_state.IsPageTranslated()) { return; } @@ -190,7 +190,7 @@ void TranslateManager::InitiateTranslation(const std::string& page_lang) { } } - std::string auto_translate_to = language_state_.AutoTranslateTo(); + std::string auto_translate_to = language_state.AutoTranslateTo(); if (!auto_translate_to.empty()) { // This page was navigated through a click from a translated page. TranslateBrowserMetrics::ReportInitiationStatus( @@ -252,8 +252,8 @@ void TranslateManager::TranslatePage(const std::string& original_source_lang, void TranslateManager::RevertTranslation() { translate_driver_->RevertTranslation(); - language_state_.SetCurrentLanguage( - language_state_.original_language()); + translate_driver_->GetLanguageState().SetCurrentLanguage( + translate_driver_->GetLanguageState().original_language()); } void TranslateManager::ReportLanguageDetectionError() { @@ -269,7 +269,7 @@ void TranslateManager::ReportLanguageDetectionError() { report_error_url = net::AppendQueryParameter( report_error_url, kSourceLanguageQueryName, - language_state_.original_language()); + translate_driver_->GetLanguageState().original_language()); report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url); report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url); @@ -280,15 +280,15 @@ void TranslateManager::ReportLanguageDetectionError() { void TranslateManager::DoTranslatePage(const std::string& translate_script, const std::string& source_lang, const std::string& target_lang) { - language_state_.set_translation_pending(true); + translate_driver_->GetLanguageState().set_translation_pending(true); translate_driver_->TranslatePage(translate_script, source_lang, target_lang); } void TranslateManager::PageTranslated(const std::string& source_lang, const std::string& target_lang, TranslateErrors::Type error_type) { - language_state_.SetCurrentLanguage(target_lang); - language_state_.set_translation_pending(false); + translate_driver_->GetLanguageState().SetCurrentLanguage(target_lang); + translate_driver_->GetLanguageState().set_translation_pending(false); if ((error_type == TranslateErrors::NONE) && source_lang != translate::kUnknownLanguageCode && @@ -385,7 +385,3 @@ std::string TranslateManager::GetAutoTargetLanguage( } return std::string(); } - -LanguageState& TranslateManager::GetLanguageState() { - return language_state_; -} diff --git a/components/translate/core/browser/translate_manager.h b/components/translate/core/browser/translate_manager.h index d02eec7..c29b167 100644 --- a/components/translate/core/browser/translate_manager.h +++ b/components/translate/core/browser/translate_manager.h @@ -13,7 +13,6 @@ #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" -#include "components/translate/core/browser/language_state.h" #include "components/translate/core/common/translate_errors.h" class GURL; @@ -89,9 +88,6 @@ class TranslateManager { static scoped_ptr<TranslateErrorCallbackList::Subscription> RegisterTranslateErrorCallback(const TranslateErrorCallback& callback); - // Gets the LanguageState associated with the TranslateManager - LanguageState& GetLanguageState(); - private: // Sends a translation request to the TranslateDriver. void DoTranslatePage(const std::string& translate_script, @@ -112,8 +108,6 @@ class TranslateManager { TranslateClient* translate_client_; // Weak. TranslateDriver* translate_driver_; // Weak. - LanguageState language_state_; - base::WeakPtrFactory<TranslateManager> weak_method_factory_; DISALLOW_COPY_AND_ASSIGN(TranslateManager); diff --git a/components/translate/core/browser/translate_ui_delegate.cc b/components/translate/core/browser/translate_ui_delegate.cc index b9bbe19..30448f0 100644 --- a/components/translate/core/browser/translate_ui_delegate.cc +++ b/components/translate/core/browser/translate_ui_delegate.cc @@ -103,7 +103,7 @@ void TranslateUIDelegate::OnErrorShown(TranslateErrors::Type error_type) { } const LanguageState& TranslateUIDelegate::GetLanguageState() { - return translate_manager_->GetLanguageState(); + return translate_driver_->GetLanguageState(); } size_t TranslateUIDelegate::GetNumberOfLanguages() const { @@ -185,7 +185,7 @@ void TranslateUIDelegate::TranslationDeclined(bool explicitly_closed) { // translations when getting a LANGUAGE_DETERMINED from the page, which // happens when a load stops. That could happen multiple times, including // after the user already declined the translation.) - translate_manager_->GetLanguageState().set_translation_declined(true); + translate_driver_->GetLanguageState().set_translation_declined(true); UMA_HISTOGRAM_BOOLEAN(kDeclineTranslate, true); @@ -200,7 +200,7 @@ bool TranslateUIDelegate::IsLanguageBlocked() { void TranslateUIDelegate::SetLanguageBlocked(bool value) { if (value) { prefs_->BlockLanguage(GetOriginalLanguageCode()); - translate_manager_->GetLanguageState().SetTranslateEnabled(false); + translate_driver_->GetLanguageState().SetTranslateEnabled(false); } else { prefs_->UnblockLanguage(GetOriginalLanguageCode()); } @@ -220,7 +220,7 @@ void TranslateUIDelegate::SetSiteBlacklist(bool value) { if (value) { prefs_->BlacklistSite(host); - translate_manager_->GetLanguageState().SetTranslateEnabled(false); + translate_driver_->GetLanguageState().SetTranslateEnabled(false); } else { prefs_->RemoveSiteFromBlacklist(host); } |