From a03a3b25f70f7cf8b061b32c04f0575625b1bc6e Mon Sep 17 00:00:00 2001 From: "sky@google.com" Date: Thu, 28 Aug 2008 22:33:36 +0000 Subject: Fixes crash in ClearBrowsingDataView that can only occur during the automated tests. If the window is closed while a removal is in progress the BrowsingDataRemover would be left with a reference to a deleted object. This can only happen during automated testing as while clearing is in progress we don't allow the user to close the dialog. BUG=1138705 TEST=covered by automated test bot git-svn-id: svn://svn.chromium.org/chrome/trunk/src@1512 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/views/clear_browsing_data.cc | 20 +++++++++++++++----- chrome/browser/views/clear_browsing_data.h | 5 ++++- 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'chrome/browser/views') diff --git a/chrome/browser/views/clear_browsing_data.cc b/chrome/browser/views/clear_browsing_data.cc index 2fa8589..c8e3ea6 100644 --- a/chrome/browser/views/clear_browsing_data.cc +++ b/chrome/browser/views/clear_browsing_data.cc @@ -37,12 +37,19 @@ ClearBrowsingDataView::ClearBrowsingDataView(Profile* profile) time_period_label_(NULL), time_period_combobox_(NULL), delete_in_progress_(false), - profile_(profile) { + profile_(profile), + remover_(NULL) { DCHECK(profile); Init(); } ClearBrowsingDataView::~ClearBrowsingDataView(void) { + if (remover_) { + // We were destroyed while clearing history was in progress. This can only + // occur during automated tests (normally the user can't close the dialog + // while clearing is in progress as the dialog is modal and not closeable). + remover_->RemoveObserver(this); + } } void ClearBrowsingDataView::Init() { @@ -263,7 +270,7 @@ bool ClearBrowsingDataView::Accept() { } OnDelete(); - return false; // We close the dialog in OnDeletionDone(). + return false; // We close the dialog in OnBrowsingDataRemoverDone(). } ChromeViews::View* ClearBrowsingDataView::GetContentsView() { @@ -370,13 +377,16 @@ void ClearBrowsingDataView::OnDelete() { UpdateControlEnabledState(); // BrowsingDataRemover deletes itself when done. - BrowsingDataRemover* remover = + remover_ = new BrowsingDataRemover(profile_, delete_begin, Time()); - remover->AddObserver(this); - remover->Remove(remove_mask); + remover_->AddObserver(this); + remover_->Remove(remove_mask); } void ClearBrowsingDataView::OnBrowsingDataRemoverDone() { + // No need to remove ourselves as an observer as BrowsingDataRemover deletes + // itself after we return. + remover_ = NULL; window()->Close(); } diff --git a/chrome/browser/views/clear_browsing_data.h b/chrome/browser/views/clear_browsing_data.h index 56b063b..2b057a5 100644 --- a/chrome/browser/views/clear_browsing_data.h +++ b/chrome/browser/views/clear_browsing_data.h @@ -101,8 +101,11 @@ class ClearBrowsingDataView : public ChromeViews::View, Profile* profile_; + // If non-null it means removal is in progress. BrowsingDataRemover takes care + // of deleting itself when done. + BrowsingDataRemover* remover_; + DISALLOW_EVIL_CONSTRUCTORS(ClearBrowsingDataView); }; #endif // CHROME_BROWSER_VIEWS_CLEAR_BROWSING_DATA_H__ - -- cgit v1.1