diff options
author | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-27 17:05:52 +0000 |
---|---|---|
committer | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-27 17:05:52 +0000 |
commit | 7027c77c2d9a654fe233f4d496fcdd523e9424f0 (patch) | |
tree | 7ca1a1082a978cce749a4599f125636b4049b663 /chrome/browser/content_settings | |
parent | 9ca2f0e8e2a3c2fc600631d24732ffd42767cc98 (diff) | |
download | chromium_src-7027c77c2d9a654fe233f4d496fcdd523e9424f0.zip chromium_src-7027c77c2d9a654fe233f4d496fcdd523e9424f0.tar.gz chromium_src-7027c77c2d9a654fe233f4d496fcdd523e9424f0.tar.bz2 |
Allow SiteDataObserver to outlive TabSpecificContentSettings.
This fixes and extends r158617.
BUG=151591
TEST=the bug's test case should have been crashing (not just DCHECKing) even after r158617; it should _really_ be fixed now.
Review URL: https://chromiumcodereview.appspot.com/10983044
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@159054 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/content_settings')
-rw-r--r-- | chrome/browser/content_settings/tab_specific_content_settings.cc | 11 | ||||
-rw-r--r-- | chrome/browser/content_settings/tab_specific_content_settings.h | 4 |
2 files changed, 13 insertions, 2 deletions
diff --git a/chrome/browser/content_settings/tab_specific_content_settings.cc b/chrome/browser/content_settings/tab_specific_content_settings.cc index e08a581..6500c17 100644 --- a/chrome/browser/content_settings/tab_specific_content_settings.cc +++ b/chrome/browser/content_settings/tab_specific_content_settings.cc @@ -66,7 +66,12 @@ TabSpecificContentSettings::SiteDataObserver::SiteDataObserver( } TabSpecificContentSettings::SiteDataObserver::~SiteDataObserver() { - tab_specific_content_settings_->RemoveSiteDataObserver(this); + if (tab_specific_content_settings_) + tab_specific_content_settings_->RemoveSiteDataObserver(this); +} + +void TabSpecificContentSettings::SiteDataObserver::ContentSettingsDestroyed() { + tab_specific_content_settings_ = NULL; } TabSpecificContentSettings::TabSpecificContentSettings(WebContents* tab) @@ -89,6 +94,8 @@ TabSpecificContentSettings::TabSpecificContentSettings(WebContents* tab) } TabSpecificContentSettings::~TabSpecificContentSettings() { + FOR_EACH_OBSERVER( + SiteDataObserver, observer_list_, ContentSettingsDestroyed()); g_tab_specific.Get().remove(this); } @@ -543,5 +550,5 @@ void TabSpecificContentSettings::RemoveSiteDataObserver( } void TabSpecificContentSettings::NotifySiteDataObservers() { - FOR_EACH_OBSERVER(SiteDataObserver, observer_list_, OnSiteDataAccessed()); + FOR_EACH_OBSERVER(SiteDataObserver, observer_list_, OnSiteDataAccessed()); } diff --git a/chrome/browser/content_settings/tab_specific_content_settings.h b/chrome/browser/content_settings/tab_specific_content_settings.h index 7536b4d..0781e6a 100644 --- a/chrome/browser/content_settings/tab_specific_content_settings.h +++ b/chrome/browser/content_settings/tab_specific_content_settings.h @@ -52,6 +52,10 @@ class TabSpecificContentSettings : public content::WebContentsObserver, return tab_specific_content_settings_; } + // Called when the TabSpecificContentSettings is destroyed; nulls out + // the local reference. + void ContentSettingsDestroyed(); + private: TabSpecificContentSettings* tab_specific_content_settings_; |