| Index: chrome/browser/managed_mode/managed_mode_interstitial.cc
|
| diff --git a/chrome/browser/managed_mode/managed_mode_interstitial.cc b/chrome/browser/managed_mode/managed_mode_interstitial.cc
|
| index b3daecc6e2eefdb11b5fffdc6082455324af2fb2..afd06fa66c253b6569c8f1f4d9a85553c140b712 100644
|
| --- a/chrome/browser/managed_mode/managed_mode_interstitial.cc
|
| +++ b/chrome/browser/managed_mode/managed_mode_interstitial.cc
|
| @@ -17,7 +17,6 @@
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/interstitial_page.h"
|
| #include "content/public/browser/web_contents.h"
|
| -#include "content/public/browser/web_contents_delegate.h"
|
| #include "content/public/browser/web_ui.h"
|
| #include "grit/browser_resources.h"
|
| #include "grit/generated_resources.h"
|
| @@ -34,13 +33,37 @@ ManagedModeInterstitial::ManagedModeInterstitial(
|
| const GURL& url,
|
| const base::Callback<void(bool)>& callback)
|
| : web_contents_(web_contents),
|
| + interstitial_page_(NULL),
|
| url_(url),
|
| - weak_ptr_factory_(this),
|
| callback_(callback) {
|
| + if (ShouldProceed()) {
|
| + // It can happen that the site was only allowed very recently and the URL
|
| + // filter on the IO thread had not been updated yet. Proceed with the
|
| + // request without showing the interstitial.
|
| + DispatchContinueRequest(true);
|
| + delete this;
|
| + return;
|
| + }
|
| +
|
| + // TODO(bauerb): Extract an observer callback on ManagedUserService for this.
|
| Profile* profile =
|
| Profile::FromBrowserContext(web_contents->GetBrowserContext());
|
| - languages_ = profile->GetPrefs()->GetString(prefs::kAcceptLanguages);
|
| -
|
| + PrefService* prefs = profile->GetPrefs();
|
| + pref_change_registrar_.Init(prefs);
|
| + pref_change_registrar_.Add(
|
| + prefs::kDefaultManagedModeFilteringBehavior,
|
| + base::Bind(&ManagedModeInterstitial::OnFilteringPrefsChanged,
|
| + base::Unretained(this)));
|
| + pref_change_registrar_.Add(
|
| + prefs::kManagedModeManualHosts,
|
| + base::Bind(&ManagedModeInterstitial::OnFilteringPrefsChanged,
|
| + base::Unretained(this)));
|
| + pref_change_registrar_.Add(
|
| + prefs::kManagedModeManualURLs,
|
| + base::Bind(&ManagedModeInterstitial::OnFilteringPrefsChanged,
|
| + base::Unretained(this)));
|
| +
|
| + languages_ = prefs->GetString(prefs::kAcceptLanguages);
|
| interstitial_page_ =
|
| content::InterstitialPage::Create(web_contents, true, url_, this);
|
| interstitial_page_->Show();
|
| @@ -125,12 +148,33 @@ void ManagedModeInterstitial::CommandReceived(const std::string& command) {
|
| NOTREACHED();
|
| }
|
|
|
| -void ManagedModeInterstitial::OnProceed() { NOTREACHED(); }
|
| +void ManagedModeInterstitial::OnProceed() {
|
| + // CHECK instead of DCHECK as defense in depth in case we'd accidentally
|
| + // proceed on a blocked page.
|
| + CHECK(ShouldProceed());
|
| + DispatchContinueRequest(true);
|
| +}
|
|
|
| void ManagedModeInterstitial::OnDontProceed() {
|
| DispatchContinueRequest(false);
|
| }
|
|
|
| +bool ManagedModeInterstitial::ShouldProceed() {
|
| + Profile* profile =
|
| + Profile::FromBrowserContext(web_contents_->GetBrowserContext());
|
| + ManagedUserService* managed_user_service =
|
| + ManagedUserServiceFactory::GetForProfile(profile);
|
| + ManagedModeURLFilter* url_filter =
|
| + managed_user_service->GetURLFilterForUIThread();
|
| + return url_filter->GetFilteringBehaviorForURL(url_) !=
|
| + ManagedModeURLFilter::BLOCK;
|
| +}
|
| +
|
| +void ManagedModeInterstitial::OnFilteringPrefsChanged() {
|
| + if (ShouldProceed())
|
| + interstitial_page_->Proceed();
|
| +}
|
| +
|
| void ManagedModeInterstitial::DispatchContinueRequest(bool continue_request) {
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE, base::Bind(callback_, continue_request));
|
|
|