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