summaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-22 19:10:32 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-22 19:10:32 +0000
commitdc4939992b56ee738e8bb1ae2bb6f127c103b14a (patch)
tree7a8a833c433305918b2da03eb5ee25f76f78d647 /components
parentfddd8c81876a00c2c976c1f52cc35b00b3250aee (diff)
downloadchromium_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')
-rw-r--r--components/translate/content/browser/content_translate_driver.cc15
-rw-r--r--components/translate/content/browser/content_translate_driver.h9
-rw-r--r--components/translate/core/browser/language_state_unittest.cc4
-rw-r--r--components/translate/core/browser/translate_driver.h4
-rw-r--r--components/translate/core/browser/translate_manager.cc28
-rw-r--r--components/translate/core/browser/translate_manager.h6
-rw-r--r--components/translate/core/browser/translate_ui_delegate.cc8
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);
}