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

Unified Diff: chrome/browser/managed_mode/managed_mode_navigation_observer.cc

Issue 13533017: Fix managed mode allow/block flow (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rename variable Created 7 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/managed_mode/managed_mode_navigation_observer.cc
diff --git a/chrome/browser/managed_mode/managed_mode_navigation_observer.cc b/chrome/browser/managed_mode/managed_mode_navigation_observer.cc
index 2740d5fa5a0cea03ae196e436f0f77c315126949..ce1d91834f92b4ed4c3289556947babd40708948 100644
--- a/chrome/browser/managed_mode/managed_mode_navigation_observer.cc
+++ b/chrome/browser/managed_mode/managed_mode_navigation_observer.cc
@@ -263,10 +263,10 @@ ManagedModeNavigationObserver::ManagedModeNavigationObserver(
: WebContentsObserver(web_contents),
warn_infobar_delegate_(NULL),
preview_infobar_delegate_(NULL),
- got_user_gesture_(false),
state_(RECORDING_URLS_BEFORE_PREVIEW),
is_elevated_(false),
- last_allowed_page_(-1) {
+ last_allowed_page_(-1),
+ finished_redirects_(false) {
Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext());
managed_user_service_ = ManagedUserServiceFactory::GetForProfile(profile);
@@ -285,21 +285,7 @@ void ManagedModeNavigationObserver::AddTemporaryException() {
base::Bind(&ManagedModeResourceThrottle::AddTemporaryException,
web_contents()->GetRenderProcessHost()->GetID(),
web_contents()->GetRenderViewHost()->GetRoutingID(),
- last_url_,
- got_user_gesture_));
-}
-
-void ManagedModeNavigationObserver::UpdateExceptionNavigationStatus() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(web_contents());
-
- BrowserThread::PostTask(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(&ManagedModeResourceThrottle::UpdateExceptionNavigationStatus,
- web_contents()->GetRenderProcessHost()->GetID(),
- web_contents()->GetRenderViewHost()->GetRoutingID(),
- got_user_gesture_));
+ last_url_));
}
void ManagedModeNavigationObserver::RemoveTemporaryException() {
@@ -408,10 +394,17 @@ void ManagedModeNavigationObserver::NavigateToPendingEntry(
// the user types a new URL. So do the main work in
// ProvisionalChangeToMainFrameUrl and only check that the user didn't go
// back to a blocked site here.
- if (web_contents()->GetController().GetCurrentEntryIndex() <
- last_allowed_page_) {
+ ManagedModeURLFilter::FilteringBehavior behavior =
+ url_filter_->GetFilteringBehaviorForURL(url);
+ int current_index = web_contents()->GetController().GetCurrentEntryIndex();
+ // First check that the user didn't go back to a blocked page, then check
+ // that the navigation is allowed.
+ if (last_allowed_page_ < 0 || current_index <= last_allowed_page_ ||
+ (behavior == ManagedModeURLFilter::BLOCK &&
+ !CanTemporarilyNavigateHost(url))) {
ClearObserverState();
}
+ finished_redirects_ = false;
}
void ManagedModeNavigationObserver::DidNavigateMainFrame(
@@ -419,30 +412,48 @@ void ManagedModeNavigationObserver::DidNavigateMainFrame(
const content::FrameNavigateParams& params) {
if (!ShouldStayElevatedForURL(params.url))
is_elevated_ = false;
-
+ DVLOG(1) << "DidNavigateMainFrame " << params.url.spec();
+
+ // The page already loaded so we are not redirecting anymore, so the
+ // next call to ProvisionalChangeToMainFrameURL will probably be after a
+ // click.
+ // TODO(sergiu): One case where I think this fails is if we get a client-side
+ // redirect to a different domain as that will not have a temporary
+ // exception. See about that in the future.
+ finished_redirects_ = true;
content::RecordAction(UserMetricsAction("ManagedMode_MainFrameNavigation"));
ManagedModeURLFilter::FilteringBehavior behavior =
url_filter_->GetFilteringBehaviorForURL(params.url);
+ if (behavior == ManagedModeURLFilter::ALLOW) {
+ // Update the last allowed page so that we can go back to it.
+ last_allowed_page_ = web_contents()->GetController().GetCurrentEntryIndex();
+ }
+
UMA_HISTOGRAM_ENUMERATION("ManagedMode.FilteringBehavior",
behavior,
ManagedModeURLFilter::HISTOGRAM_BOUNDING_VALUE);
- // The page can be redirected to a different domain, record those URLs as
- // well.
- if (behavior == ManagedModeURLFilter::BLOCK &&
- !CanTemporarilyNavigateHost(params.url))
- AddURLToPatternList(params.url);
+ // Record all the URLs this navigation went through.
+ if ((behavior == ManagedModeURLFilter::ALLOW &&
+ state_ == RECORDING_URLS_AFTER_PREVIEW) ||
+ !CanTemporarilyNavigateHost(params.url)) {
+ for (std::vector<GURL>::const_iterator it = params.redirects.begin();
+ it != params.redirects.end(); ++it) {
+ DVLOG(1) << "Adding: " << it->spec();
+ AddURLToPatternList(*it);
+ }
+ }
if (behavior == ManagedModeURLFilter::ALLOW &&
state_ == RECORDING_URLS_AFTER_PREVIEW) {
// The initial page that triggered the interstitial was blocked but the
// final page is already in the whitelist so add the series of URLs
// which lead to the final page to the whitelist as well.
- // Update the |last_url_| since it was not added to the list before.
- last_url_ = params.url;
AddSavedURLsToWhitelistAndClearState();
+ // This page is now allowed so save the index as well.
+ last_allowed_page_ = web_contents()->GetController().GetCurrentEntryIndex();
SimpleAlertInfoBarDelegate::Create(
InfoBarService::FromWebContents(web_contents()),
NULL,
@@ -456,10 +467,6 @@ void ManagedModeNavigationObserver::DidNavigateMainFrame(
if (state_ == RECORDING_URLS_AFTER_PREVIEW) {
AddTemporaryException();
}
-
- // The navigation is complete, unless there is a redirect. So set the
- // new navigation to false to detect user interaction.
- got_user_gesture_ = false;
}
void ManagedModeNavigationObserver::ProvisionalChangeToMainFrameUrl(
@@ -471,21 +478,15 @@ void ManagedModeNavigationObserver::ProvisionalChangeToMainFrameUrl(
// This function is the last one to be called before the resource throttle
// shows the interstitial if the URL must be blocked.
DVLOG(1) << "ProvisionalChangeToMainFrameURL " << url.spec();
+
ManagedModeURLFilter::FilteringBehavior behavior =
url_filter_->GetFilteringBehaviorForURL(url);
-
if (behavior != ManagedModeURLFilter::BLOCK)
return;
- if (state_ == RECORDING_URLS_AFTER_PREVIEW && got_user_gesture_ &&
+ if (finished_redirects_ && state_ == RECORDING_URLS_AFTER_PREVIEW &&
!CanTemporarilyNavigateHost(url))
ClearObserverState();
-
- if (behavior == ManagedModeURLFilter::BLOCK &&
- !CanTemporarilyNavigateHost(url))
- AddURLToPatternList(url);
-
- got_user_gesture_ = false;
}
void ManagedModeNavigationObserver::DidCommitProvisionalLoadForFrame(
@@ -523,14 +524,4 @@ void ManagedModeNavigationObserver::DidCommitProvisionalLoadForFrame(
InfoBarService::FromWebContents(web_contents()));
}
}
-
- if (behavior == ManagedModeURLFilter::ALLOW)
- last_allowed_page_ = web_contents()->GetController().GetCurrentEntryIndex();
-}
-
-void ManagedModeNavigationObserver::DidGetUserGesture() {
- got_user_gesture_ = true;
- // Update the exception status so that the resource throttle knows that
- // there was a manual navigation.
- UpdateExceptionNavigationStatus();
}

Powered by Google App Engine
This is Rietveld 408576698