summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorsky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-08-28 22:33:36 +0000
committersky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-08-28 22:33:36 +0000
commita03a3b25f70f7cf8b061b32c04f0575625b1bc6e (patch)
tree0c0bc76c4a1947202b571840bafee27b700f12d2 /chrome
parent586f300066e3b683b83bcce1fd6fa660dc807ff4 (diff)
downloadchromium_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.cc20
-rw-r--r--chrome/browser/views/clear_browsing_data.h5
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__
-