| Index: chrome/browser/managed_mode/managed_mode_resource_throttle.cc
|
| diff --git a/chrome/browser/managed_mode/managed_mode_resource_throttle.cc b/chrome/browser/managed_mode/managed_mode_resource_throttle.cc
|
| index 5d95d093fcef713e300d3e6bbdecf3a8f232d6a0..a8f60eeab48cd573d89765340e4dc5c3c419f295 100644
|
| --- a/chrome/browser/managed_mode/managed_mode_resource_throttle.cc
|
| +++ b/chrome/browser/managed_mode/managed_mode_resource_throttle.cc
|
| @@ -4,12 +4,24 @@
|
|
|
| #include "chrome/browser/managed_mode/managed_mode_resource_throttle.h"
|
|
|
| +#include "base/lazy_instance.h"
|
| #include "chrome/browser/managed_mode/managed_mode.h"
|
| #include "chrome/browser/managed_mode/managed_mode_interstitial.h"
|
| #include "chrome/browser/managed_mode/managed_mode_url_filter.h"
|
| #include "content/public/browser/resource_controller.h"
|
| #include "net/url_request/url_request.h"
|
|
|
| +namespace {
|
| +
|
| +// This map contains <render_process_host_id_, render_view_id> pairs mapped
|
| +// to hostnames which identify individual tabs. If a hostname
|
| +// is present for a specific pair then the user clicked preview, is
|
| +// navigating around and has not clicked one of the options on the infobar.
|
| +typedef std::map<std::pair<int, int>, std::string> PreviewMap;
|
| +base::LazyInstance<PreviewMap> g_in_preview_mode = LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +}
|
| +
|
| ManagedModeResourceThrottle::ManagedModeResourceThrottle(
|
| const net::URLRequest* request,
|
| int render_process_host_id,
|
| @@ -20,27 +32,72 @@ ManagedModeResourceThrottle::ManagedModeResourceThrottle(
|
| render_process_host_id_(render_process_host_id),
|
| render_view_id_(render_view_id),
|
| is_main_frame_(is_main_frame),
|
| + temporarily_allowed_(false),
|
| url_filter_(ManagedMode::GetURLFilterForIOThread()) {}
|
|
|
| ManagedModeResourceThrottle::~ManagedModeResourceThrottle() {}
|
|
|
| -void ManagedModeResourceThrottle::WillStartRequest(bool* defer) {
|
| - if (url_filter_->GetFilteringBehaviorForURL(request_->url()) !=
|
| +// static
|
| +void ManagedModeResourceThrottle::AddTemporaryException(
|
| + int render_process_host_id,
|
| + int render_view_id,
|
| + const GURL& url) {
|
| + g_in_preview_mode.Get()[std::make_pair(render_process_host_id,
|
| + render_view_id)] = url.host();
|
| +}
|
| +
|
| +// static
|
| +void ManagedModeResourceThrottle::RemoveTemporaryException(
|
| + int render_process_host_id,
|
| + int render_view_id) {
|
| + g_in_preview_mode.Get().erase(std::make_pair(render_process_host_id,
|
| + render_view_id));
|
| +}
|
| +
|
| +void ManagedModeResourceThrottle::ShowInterstitialIfNeeded(bool is_redirect,
|
| + const GURL& url,
|
| + bool* defer) {
|
| + // Only treat main frame requests for now (ignoring subresources).
|
| + if (!is_main_frame_)
|
| + return;
|
| +
|
| + if (url_filter_->GetFilteringBehaviorForURL(url) !=
|
| ManagedModeURLFilter::BLOCK) {
|
| return;
|
| }
|
|
|
| - if (is_main_frame_) {
|
| - *defer = true;
|
| - ManagedModeInterstitial::ShowInterstitial(
|
| - render_process_host_id_, render_view_id_, request_->url(),
|
| - base::Bind(&ManagedModeResourceThrottle::OnInterstitialResult,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| + // Do not show interstitial for redirects in preview mode and URLs which have
|
| + // the same hostname as the one on which the user clicked "Preview" on.
|
| + PreviewMap* preview_map = g_in_preview_mode.Pointer();
|
| + if (temporarily_allowed_) {
|
| + DCHECK(is_redirect);
|
| + return;
|
| }
|
| +
|
| + PreviewMap::iterator it = preview_map->find(
|
| + std::make_pair(render_process_host_id_, render_view_id_));
|
| + if (it != preview_map->end() && url.host() == it->second)
|
| + return;
|
| +
|
| + *defer = true;
|
| + ManagedModeInterstitial::ShowInterstitial(
|
| + render_process_host_id_, render_view_id_, url,
|
| + base::Bind(&ManagedModeResourceThrottle::OnInterstitialResult,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| +}
|
| +
|
| +void ManagedModeResourceThrottle::WillStartRequest(bool* defer) {
|
| + ShowInterstitialIfNeeded(false, request_->url(), defer);
|
| +}
|
| +
|
| +void ManagedModeResourceThrottle::WillRedirectRequest(const GURL& new_url,
|
| + bool* defer) {
|
| + ShowInterstitialIfNeeded(true, new_url, defer);
|
| }
|
|
|
| void ManagedModeResourceThrottle::OnInterstitialResult(bool continue_request) {
|
| if (continue_request) {
|
| + temporarily_allowed_ = true;
|
| controller()->Resume();
|
| } else {
|
| controller()->Cancel();
|
|
|