Home | History | Annotate | Download | only in managed_mode
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/managed_mode/managed_mode_resource_throttle.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/lazy_instance.h"
      9 #include "chrome/browser/managed_mode/managed_mode_interstitial.h"
     10 #include "chrome/browser/managed_mode/managed_mode_navigation_observer.h"
     11 #include "chrome/browser/managed_mode/managed_mode_url_filter.h"
     12 #include "content/public/browser/browser_thread.h"
     13 #include "content/public/browser/resource_controller.h"
     14 #include "net/url_request/url_request.h"
     15 
     16 using content::BrowserThread;
     17 
     18 ManagedModeResourceThrottle::ManagedModeResourceThrottle(
     19     const net::URLRequest* request,
     20     int render_process_host_id,
     21     int render_view_id,
     22     bool is_main_frame,
     23     const ManagedModeURLFilter* url_filter)
     24     : weak_ptr_factory_(this),
     25       request_(request),
     26       render_process_host_id_(render_process_host_id),
     27       render_view_id_(render_view_id),
     28       is_main_frame_(is_main_frame),
     29       url_filter_(url_filter) {}
     30 
     31 ManagedModeResourceThrottle::~ManagedModeResourceThrottle() {}
     32 
     33 void ManagedModeResourceThrottle::ShowInterstitialIfNeeded(bool is_redirect,
     34                                                            const GURL& url,
     35                                                            bool* defer) {
     36   // Only treat main frame requests for now (ignoring subresources).
     37   if (!is_main_frame_)
     38     return;
     39 
     40   if (url_filter_->GetFilteringBehaviorForURL(url) !=
     41       ManagedModeURLFilter::BLOCK) {
     42     return;
     43   }
     44 
     45   *defer = true;
     46   BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
     47       base::Bind(&ManagedModeNavigationObserver::OnRequestBlocked,
     48                  render_process_host_id_, render_view_id_, url,
     49                  base::Bind(&ManagedModeResourceThrottle::OnInterstitialResult,
     50                             weak_ptr_factory_.GetWeakPtr())));
     51 }
     52 
     53 void ManagedModeResourceThrottle::WillStartRequest(bool* defer) {
     54   ShowInterstitialIfNeeded(false, request_->url(), defer);
     55 }
     56 
     57 void ManagedModeResourceThrottle::WillRedirectRequest(const GURL& new_url,
     58                                                       bool* defer) {
     59   ShowInterstitialIfNeeded(true, new_url, defer);
     60 }
     61 
     62 void ManagedModeResourceThrottle::OnInterstitialResult(bool continue_request) {
     63   if (continue_request)
     64     controller()->Resume();
     65   else
     66     controller()->Cancel();
     67 }
     68