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

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

Issue 2845053002: Avoid showing the supervised user block interstitial more than once (Closed)
Patch Set: comment Created 3 years, 8 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_navigation_observer.cc
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
index 56edc80fde92452957ca4c5ecb9e76b72191ce1c..01bad11617023f3e40dccd057c42c29adc193c0e 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
+++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
@@ -49,19 +49,20 @@ void SupervisedUserNavigationObserver::OnRequestBlocked(
const base::Callback<void(bool)>& callback) {
SupervisedUserNavigationObserver* navigation_observer =
SupervisedUserNavigationObserver::FromWebContents(web_contents);
- if (navigation_observer)
- navigation_observer->OnRequestBlockedInternal(url);
- // Show the interstitial.
- const bool initial_page_load = true;
- SupervisedUserInterstitial::Show(web_contents, url, reason, initial_page_load,
- callback);
+ // Cancel the navigation if there is no navigation observer.
+ if (!navigation_observer) {
+ callback.Run(false);
+ return;
+ }
+
+ navigation_observer->OnRequestBlockedInternal(url, reason, callback);
}
void SupervisedUserNavigationObserver::DidFinishNavigation(
content::NavigationHandle* navigation_handle) {
// Only filter same page navigations (eg. pushState/popState); others will
- // have been filtered by the ResourceThrottle.
+ // have been filtered by the NavigationThrottle.
if (!navigation_handle->IsSameDocument())
return;
@@ -84,7 +85,9 @@ void SupervisedUserNavigationObserver::OnURLFilterChanged() {
}
void SupervisedUserNavigationObserver::OnRequestBlockedInternal(
- const GURL& url) {
+ const GURL& url,
+ supervised_user_error_page::FilteringBehaviorReason reason,
+ const base::Callback<void(bool)>& callback) {
Time timestamp = Time::Now(); // TODO(bauerb): Use SaneTime when available.
// Create a history entry for the attempt and mark it as such.
history::HistoryAddPageArgs add_page_args(
@@ -111,6 +114,10 @@ void SupervisedUserNavigationObserver::OnRequestBlockedInternal(
blocked_navigations_.size(), *entry));
blocked_navigations_.push_back(std::move(serialized_entry));
supervised_user_service_->DidBlockNavigation(web_contents());
+
+ // Show the interstitial.
+ const bool initial_page_load = true;
+ MaybeShowInterstitial(url, reason, initial_page_load, callback);
}
void SupervisedUserNavigationObserver::URLFilterCheckCallback(
@@ -122,10 +129,33 @@ void SupervisedUserNavigationObserver::URLFilterCheckCallback(
if (url != web_contents()->GetLastCommittedURL())
return;
- const bool initial_page_load = false;
if (behavior == SupervisedUserURLFilter::FilteringBehavior::BLOCK) {
- SupervisedUserInterstitial::Show(web_contents(), url, reason,
- initial_page_load,
- base::Callback<void(bool)>());
+ const bool initial_page_load = false;
+ MaybeShowInterstitial(url, reason, initial_page_load,
+ base::Callback<void(bool)>());
}
}
+
+void SupervisedUserNavigationObserver::MaybeShowInterstitial(
+ const GURL& url,
+ supervised_user_error_page::FilteringBehaviorReason reason,
+ bool initial_page_load,
+ const base::Callback<void(bool)>& callback) {
+ if (is_showing_interstitial_)
+ return;
+
+ is_showing_interstitial_ = true;
+ base::Callback<void(bool)> wrapped_callback =
+ base::Bind(&SupervisedUserNavigationObserver::OnInterstitialResult,
+ weak_ptr_factory_.GetWeakPtr(), callback);
+ SupervisedUserInterstitial::Show(web_contents(), url, reason,
+ initial_page_load, wrapped_callback);
+}
+
+void SupervisedUserNavigationObserver::OnInterstitialResult(
+ const base::Callback<void(bool)>& callback,
+ bool result) {
+ is_showing_interstitial_ = false;
+ if (callback)
+ callback.Run(result);
+}

Powered by Google App Engine
This is Rietveld 408576698