summaryrefslogtreecommitdiffstats
path: root/chrome/browser/content_settings
diff options
context:
space:
mode:
authoravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-27 17:05:52 +0000
committeravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-27 17:05:52 +0000
commit7027c77c2d9a654fe233f4d496fcdd523e9424f0 (patch)
tree7ca1a1082a978cce749a4599f125636b4049b663 /chrome/browser/content_settings
parent9ca2f0e8e2a3c2fc600631d24732ffd42767cc98 (diff)
downloadchromium_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.cc11
-rw-r--r--chrome/browser/content_settings/tab_specific_content_settings.h4
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_;