diff options
author | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-28 22:33:36 +0000 |
---|---|---|
committer | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-08-28 22:33:36 +0000 |
commit | a03a3b25f70f7cf8b061b32c04f0575625b1bc6e (patch) | |
tree | 0c0bc76c4a1947202b571840bafee27b700f12d2 /chrome | |
parent | 586f300066e3b683b83bcce1fd6fa660dc807ff4 (diff) | |
download | chromium_src-a03a3b25f70f7cf8b061b32c04f0575625b1bc6e.zip chromium_src-a03a3b25f70f7cf8b061b32c04f0575625b1bc6e.tar.gz chromium_src-a03a3b25f70f7cf8b061b32c04f0575625b1bc6e.tar.bz2 |
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
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/views/clear_browsing_data.cc | 20 | ||||
-rw-r--r-- | chrome/browser/views/clear_browsing_data.h | 5 |
2 files changed, 19 insertions, 6 deletions
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__ - |