Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6950)

Unified Diff: chrome/browser/supervised_user/supervised_user_interstitial.cc

Issue 597573002: Add a SupervisedUserServiceObserver. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix use-after-destroy of webcontents Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/supervised_user/supervised_user_interstitial.cc
diff --git a/chrome/browser/supervised_user/supervised_user_interstitial.cc b/chrome/browser/supervised_user/supervised_user_interstitial.cc
index 468820a2ba053052760bf0d6924cd84ef1888562..6057740ab6db119879c2974be34040e1fb9beb23 100644
--- a/chrome/browser/supervised_user/supervised_user_interstitial.cc
+++ b/chrome/browser/supervised_user/supervised_user_interstitial.cc
@@ -115,7 +115,9 @@ SupervisedUserInterstitial::SupervisedUserInterstitial(
url_(url),
callback_(callback) {}
-SupervisedUserInterstitial::~SupervisedUserInterstitial() {}
+SupervisedUserInterstitial::~SupervisedUserInterstitial() {
+ DCHECK(!web_contents_);
+}
bool SupervisedUserInterstitial::Init() {
if (ShouldProceed()) {
@@ -152,24 +154,11 @@ bool SupervisedUserInterstitial::Init() {
}
}
- // TODO(bauerb): Extract an observer callback on SupervisedUserService for
- // this.
Profile* profile =
Profile::FromBrowserContext(web_contents_->GetBrowserContext());
- PrefService* prefs = profile->GetPrefs();
- pref_change_registrar_.Init(prefs);
- pref_change_registrar_.Add(
- prefs::kDefaultSupervisedUserFilteringBehavior,
- base::Bind(&SupervisedUserInterstitial::OnFilteringPrefsChanged,
- base::Unretained(this)));
- pref_change_registrar_.Add(
- prefs::kSupervisedUserManualHosts,
- base::Bind(&SupervisedUserInterstitial::OnFilteringPrefsChanged,
- base::Unretained(this)));
- pref_change_registrar_.Add(
- prefs::kSupervisedUserManualURLs,
- base::Bind(&SupervisedUserInterstitial::OnFilteringPrefsChanged,
- base::Unretained(this)));
+ SupervisedUserService* supervised_user_service =
+ SupervisedUserServiceFactory::GetForProfile(profile);
+ supervised_user_service->AddObserver(this);
interstitial_page_ =
content::InterstitialPage::Create(web_contents_, true, url_, this);
@@ -287,7 +276,13 @@ void SupervisedUserInterstitial::OnDontProceed() {
DispatchContinueRequest(false);
}
+void SupervisedUserInterstitial::OnURLFilterChanged() {
+ if (web_contents_ && ShouldProceed())
Bernhard Bauer 2014/09/24 11:51:59 Why do we need the |web_contents_| check now? Just
Marc Treib 2014/09/24 12:02:27 Because ShouldProceed uses the WebContents to get
+ interstitial_page_->Proceed();
+}
+
bool SupervisedUserInterstitial::ShouldProceed() {
+ DCHECK(web_contents_);
Profile* profile =
Profile::FromBrowserContext(web_contents_->GetBrowserContext());
SupervisedUserService* supervised_user_service =
@@ -298,13 +293,19 @@ bool SupervisedUserInterstitial::ShouldProceed() {
SupervisedUserURLFilter::BLOCK;
}
-void SupervisedUserInterstitial::OnFilteringPrefsChanged() {
- if (ShouldProceed())
- interstitial_page_->Proceed();
-}
-
void SupervisedUserInterstitial::DispatchContinueRequest(
bool continue_request) {
+ DCHECK(web_contents_);
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents_->GetBrowserContext());
+ SupervisedUserService* supervised_user_service =
+ SupervisedUserServiceFactory::GetForProfile(profile);
+ supervised_user_service->RemoveObserver(this);
+
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE, base::Bind(callback_, continue_request));
+
+ // After this, the WebContents may be destroyed. Make sure we don't try to use
+ // it again.
+ web_contents_ = NULL;
Bernhard Bauer 2014/09/24 11:51:59 Is it guaranteed that this will be called, even if
Marc Treib 2014/09/24 12:02:27 Yes, InterstitialPageImpl calls OnDontProceed when
Bernhard Bauer 2014/09/24 12:58:43 Hm, accessing |web_contents_| above already worrie
Marc Treib 2014/09/24 13:25:25 That's a good point.
}

Powered by Google App Engine
This is Rietveld 408576698