Chromium Code Reviews| 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 7e6b28e4c09c574cdb002f896663425db5e6bad1..bd6e80704d6d0cb844210965fd5fcc0f50c5a9c2 100644 |
| --- a/chrome/browser/managed_mode/managed_mode_resource_throttle.cc |
| +++ b/chrome/browser/managed_mode/managed_mode_resource_throttle.cc |
| @@ -4,13 +4,27 @@ |
| #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_navigation_observer.h" |
|
Bernhard Bauer
2012/11/26 16:06:30
We don't need this, I think.
Sergiu
2012/11/27 15:37:34
Done.
|
| #include "chrome/browser/managed_mode/managed_mode_url_filter.h" |
| -#include "chrome/browser/policy/url_blacklist_manager.h" |
| +#include "chrome/browser/tab_contents/tab_util.h" |
|
Bernhard Bauer
2012/11/26 16:06:30
Why do we need this?
Sergiu
2012/11/27 15:37:34
I needed it, then deleted the call apparently. :(
|
| #include "content/public/browser/resource_controller.h" |
| #include "net/url_request/url_request.h" |
| +namespace { |
| + |
| +// This map contains hostnames mapped to <render_process_host_id_, |
| +// render_view_id> pairs which identify individual tabs. If a hostname |
|
Bernhard Bauer
2012/11/26 16:06:30
The other way around.
Sergiu
2012/11/27 15:37:34
Keys mapped to values, makes sense.
|
| +// 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; |
|
Bernhard Bauer
2012/11/26 16:06:30
Nit: no space before >
Sergiu
2012/11/27 15:37:34
Done.
|
| +static base::LazyInstance<PreviewMap> |
| + in_preview_mode = LAZY_INSTANCE_INITIALIZER; |
| + |
| +} |
| + |
| ManagedModeResourceThrottle::ManagedModeResourceThrottle( |
| const net::URLRequest* request, |
| int render_process_host_id, |
| @@ -21,29 +35,68 @@ ManagedModeResourceThrottle::ManagedModeResourceThrottle( |
| render_process_host_id_(render_process_host_id), |
| render_view_id_(render_view_id), |
| is_main_frame_(is_main_frame), |
| + is_in_preview_mode_(false), |
| url_filter_(ManagedMode::GetURLFilterForIOThread()) {} |
| ManagedModeResourceThrottle::~ManagedModeResourceThrottle() {} |
| -void ManagedModeResourceThrottle::WillStartRequest(bool* defer) { |
| - if (url_filter_->GetFilteringBehaviorForURL(request_->url()) != |
| +// static |
| +void ManagedModeResourceThrottle::AddObserver(int render_process_host_id, |
| + int render_view_id, |
| + const std::string& host) { |
| + in_preview_mode.Get().insert( |
| + std::make_pair(std::make_pair(render_process_host_id, render_view_id), |
| + host)); |
| +} |
| + |
| +// static |
| +void ManagedModeResourceThrottle::RemoveObserver(int render_process_host_id, |
| + int render_view_id) { |
| + if (in_preview_mode.Pointer()) { |
|
Bernhard Bauer
2012/11/26 16:06:30
Why this check?
Sergiu
2012/11/27 15:37:34
I was under the impression that in_preview_mode ca
|
| + in_preview_mode.Get().erase(std::make_pair(render_process_host_id, |
| + render_view_id)); |
| + } |
| +} |
| + |
| +void ManagedModeResourceThrottle::CheckNeedToShowInterstitial(bool is_redirect, |
| + const GURL& url, |
| + bool* defer) { |
| + // Only treat main frame requests for now (without 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())); |
| - } else { |
| - // NOTREACHED(); |
| - // XXX |
| - } |
| + // 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::iterator it = in_preview_mode.Get().find( |
|
Bernhard Bauer
2012/11/26 16:06:30
You could probably save the map pointer you get he
Sergiu
2012/11/27 15:37:34
Done.
|
| + std::make_pair(render_process_host_id_, render_view_id_)); |
| + if ((is_redirect && is_in_preview_mode_) || |
|
Bernhard Bauer
2012/11/26 16:06:30
Hm. If |is_in_preview_mode_| is true, we should se
Sergiu
2012/11/27 15:37:34
Done.
|
| + (it != in_preview_mode.Get().end() && url.host() == it->second)) |
|
Bernhard Bauer
2012/11/26 16:06:30
You could split these up into separate if-statemen
Sergiu
2012/11/27 15:37:34
Done.
|
| + return; |
| + |
| + *defer = true; |
| + DLOG(ERROR) << "Showing interstitial"; |
| + ManagedModeInterstitial::ShowInterstitial( |
| + render_process_host_id_, render_view_id_, url, |
| + base::Bind(&ManagedModeResourceThrottle::OnInterstitialResult, |
| + weak_ptr_factory_.GetWeakPtr())); |
| +} |
| + |
| +void ManagedModeResourceThrottle::WillStartRequest(bool* defer) { |
| + CheckNeedToShowInterstitial(false, request_->url(), defer); |
| +} |
| + |
| +void ManagedModeResourceThrottle::WillRedirectRequest(const GURL& new_url, |
| + bool* defer) { |
| + CheckNeedToShowInterstitial(true, new_url, defer); |
| } |
| void ManagedModeResourceThrottle::OnInterstitialResult(bool continue_request) { |
| if (continue_request) { |
| + is_in_preview_mode_ = true; |
| controller()->Resume(); |
| } else { |
| controller()->Cancel(); |