| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/browser/loader/safe_browsing_resource_throttle.h" | 5 #include "chrome/browser/loader/safe_browsing_resource_throttle.h" | 
| 6 | 6 | 
| 7 #include <iterator> | 7 #include <iterator> | 
| 8 #include <utility> | 8 #include <utility> | 
|  | 9 #include <vector> | 
| 9 | 10 | 
|  | 11 #include "base/bind.h" | 
| 10 #include "base/logging.h" | 12 #include "base/logging.h" | 
| 11 #include "base/trace_event/trace_event.h" | 13 #include "base/memory/ptr_util.h" | 
| 12 #include "chrome/browser/prerender/prerender_contents.h" | 14 #include "chrome/browser/prerender/prerender_contents.h" | 
| 13 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 15 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 
|  | 16 #include "chrome/browser/safe_browsing/ui_manager.h" | 
| 14 #include "components/safe_browsing/base_ui_manager.h" | 17 #include "components/safe_browsing/base_ui_manager.h" | 
| 15 #include "components/safe_browsing_db/util.h" | 18 #include "components/safe_browsing/resource_throttle.h" | 
| 16 #include "components/safe_browsing_db/v4_feature_list.h" |  | 
| 17 #include "components/safe_browsing_db/v4_local_database_manager.h" |  | 
| 18 #include "components/security_interstitials/content/unsafe_resource.h" | 19 #include "components/security_interstitials/content/unsafe_resource.h" | 
| 19 #include "components/subresource_filter/content/browser/content_subresource_filt
     er_driver_factory.h" |  | 
| 20 #include "content/public/browser/browser_thread.h" | 20 #include "content/public/browser/browser_thread.h" | 
| 21 #include "content/public/browser/resource_request_info.h" | 21 #include "content/public/browser/resource_request_info.h" | 
| 22 #include "content/public/browser/web_contents.h" | 22 #include "content/public/browser/web_contents.h" | 
| 23 #include "net/url_request/redirect_info.h" | 23 #include "net/url_request/redirect_info.h" | 
| 24 #include "net/url_request/url_request.h" | 24 #include "net/url_request/url_request.h" | 
| 25 | 25 | 
| 26 using safe_browsing::BaseUIManager; | 26 using safe_browsing::BaseUIManager; | 
| 27 | 27 | 
| 28 namespace { | 28 namespace { | 
| 29 | 29 | 
| 30 // Destroys the prerender contents associated with the web_contents, if any. | 30 // Destroys the prerender contents associated with the web_contents, if any. | 
| 31 void DestroyPrerenderContents( | 31 void DestroyPrerenderContents( | 
| 32     const content::ResourceRequestInfo::WebContentsGetter& | 32     const content::ResourceRequestInfo::WebContentsGetter& | 
| 33         web_contents_getter) { | 33         web_contents_getter) { | 
| 34   content::WebContents* web_contents = web_contents_getter.Run(); | 34   content::WebContents* web_contents = web_contents_getter.Run(); | 
| 35   if (web_contents) { | 35   if (web_contents) { | 
| 36     prerender::PrerenderContents* prerender_contents = | 36     prerender::PrerenderContents* prerender_contents = | 
| 37         prerender::PrerenderContents::FromWebContents(web_contents); | 37         prerender::PrerenderContents::FromWebContents(web_contents); | 
| 38     if (prerender_contents) | 38     if (prerender_contents) | 
| 39       prerender_contents->Destroy(prerender::FINAL_STATUS_SAFE_BROWSING); | 39       prerender_contents->Destroy(prerender::FINAL_STATUS_SAFE_BROWSING); | 
| 40   } | 40   } | 
| 41 } | 41 } | 
| 42 | 42 | 
| 43 }  // namespace | 43 void StartDisplayingBlockingPageOnUIThread( | 
| 44 |  | 
| 45 // static |  | 
| 46 SafeBrowsingResourceThrottle* SafeBrowsingResourceThrottle::MaybeCreate( |  | 
| 47     net::URLRequest* request, |  | 
| 48     content::ResourceType resource_type, |  | 
| 49     safe_browsing::SafeBrowsingService* sb_service) { |  | 
| 50   if (sb_service->database_manager()->IsSupported()) { |  | 
| 51     return new SafeBrowsingResourceThrottle(request, resource_type, sb_service); |  | 
| 52   } |  | 
| 53   return nullptr; |  | 
| 54 } |  | 
| 55 |  | 
| 56 SafeBrowsingResourceThrottle::SafeBrowsingResourceThrottle( |  | 
| 57     const net::URLRequest* request, |  | 
| 58     content::ResourceType resource_type, |  | 
| 59     safe_browsing::SafeBrowsingService* sb_service) |  | 
| 60     : safe_browsing::BaseResourceThrottle(request, |  | 
| 61                                           resource_type, |  | 
| 62                                           sb_service->database_manager(), |  | 
| 63                                           sb_service->ui_manager()) {} |  | 
| 64 |  | 
| 65 SafeBrowsingResourceThrottle::~SafeBrowsingResourceThrottle() {} |  | 
| 66 |  | 
| 67 const char* SafeBrowsingResourceThrottle::GetNameForLogging() const { |  | 
| 68   return "SafeBrowsingResourceThrottle"; |  | 
| 69 } |  | 
| 70 |  | 
| 71 void SafeBrowsingResourceThrottle::MaybeDestroyPrerenderContents( |  | 
| 72     const content::ResourceRequestInfo* info) { |  | 
| 73   // Destroy the prefetch with FINAL_STATUS_SAFEBROSWING. |  | 
| 74   content::BrowserThread::PostTask( |  | 
| 75       content::BrowserThread::UI, FROM_HERE, |  | 
| 76       base::BindOnce(&DestroyPrerenderContents, |  | 
| 77                      info->GetWebContentsGetterForRequest())); |  | 
| 78 } |  | 
| 79 |  | 
| 80 void SafeBrowsingResourceThrottle::StartDisplayingBlockingPageHelper( |  | 
| 81     security_interstitials::UnsafeResource resource) { |  | 
| 82   content::BrowserThread::PostTask( |  | 
| 83       content::BrowserThread::UI, FROM_HERE, |  | 
| 84       base::BindOnce(&SafeBrowsingResourceThrottle::StartDisplayingBlockingPage, |  | 
| 85                      AsWeakPtr(), ui_manager(), resource)); |  | 
| 86 } |  | 
| 87 |  | 
| 88 // Static |  | 
| 89 void SafeBrowsingResourceThrottle::StartDisplayingBlockingPage( |  | 
| 90     const base::WeakPtr<safe_browsing::BaseResourceThrottle>& throttle, |  | 
| 91     scoped_refptr<BaseUIManager> ui_manager, | 44     scoped_refptr<BaseUIManager> ui_manager, | 
| 92     const security_interstitials::UnsafeResource& resource) { | 45     const security_interstitials::UnsafeResource& resource, | 
|  | 46     base::OnceClosure cancel_on_io_thread) { | 
| 93   content::WebContents* web_contents = resource.web_contents_getter.Run(); | 47   content::WebContents* web_contents = resource.web_contents_getter.Run(); | 
| 94   if (web_contents) { | 48   if (web_contents) { | 
| 95     prerender::PrerenderContents* prerender_contents = | 49     prerender::PrerenderContents* prerender_contents = | 
| 96         prerender::PrerenderContents::FromWebContents(web_contents); | 50         prerender::PrerenderContents::FromWebContents(web_contents); | 
| 97     if (prerender_contents) { | 51     if (prerender_contents) { | 
| 98       prerender_contents->Destroy(prerender::FINAL_STATUS_SAFE_BROWSING); | 52       prerender_contents->Destroy(prerender::FINAL_STATUS_SAFE_BROWSING); | 
| 99     } else { | 53     } else { | 
| 100       ui_manager->DisplayBlockingPage(resource); | 54       ui_manager->DisplayBlockingPage(resource); | 
| 101       return; | 55       return; | 
| 102     } | 56     } | 
| 103   } | 57   } | 
| 104 | 58 | 
| 105   // Tab is gone or it's being prerendered. | 59   // Tab is gone or it's being prerendered. | 
| 106   content::BrowserThread::PostTask( | 60   content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, | 
| 107       content::BrowserThread::IO, FROM_HERE, | 61                                    std::move(cancel_on_io_thread)); | 
| 108       base::BindOnce(&SafeBrowsingResourceThrottle::Cancel, throttle)); |  | 
| 109 } | 62 } | 
|  | 63 | 
|  | 64 class SafeBrowsingResourceThrottleDelegate final | 
|  | 65     : public safe_browsing::ResourceThrottle::Delegate { | 
|  | 66  public: | 
|  | 67   SafeBrowsingResourceThrottleDelegate() {} | 
|  | 68   ~SafeBrowsingResourceThrottleDelegate() override {} | 
|  | 69 | 
|  | 70   void MaybeDestroyPrerenderContents( | 
|  | 71       const WebContentsGetter& web_contents_getter) final { | 
|  | 72     // Destroy the prefetch with FINAL_STATUS_SAFEBROWSING. | 
|  | 73     content::BrowserThread::PostTask( | 
|  | 74         content::BrowserThread::UI, FROM_HERE, | 
|  | 75         base::BindOnce(&DestroyPrerenderContents, web_contents_getter)); | 
|  | 76   } | 
|  | 77 | 
|  | 78   void StartDisplayingBlockingPage( | 
|  | 79       const security_interstitials::UnsafeResource& resource, | 
|  | 80       scoped_refptr<BaseUIManager> ui_manager, | 
|  | 81       base::OnceClosure cancel_on_io_thread) final { | 
|  | 82     content::BrowserThread::PostTask( | 
|  | 83         content::BrowserThread::UI, FROM_HERE, | 
|  | 84         base::BindOnce(&StartDisplayingBlockingPageOnUIThread, | 
|  | 85                        std::move(ui_manager), resource, | 
|  | 86                        std::move(cancel_on_io_thread))); | 
|  | 87   } | 
|  | 88 | 
|  | 89  private: | 
|  | 90   DISALLOW_COPY_AND_ASSIGN(SafeBrowsingResourceThrottleDelegate); | 
|  | 91 }; | 
|  | 92 | 
|  | 93 }  // namespace | 
|  | 94 | 
|  | 95 std::unique_ptr<content::ResourceThrottle> | 
|  | 96 MaybeCreateSafeBrowsingResourceThrottle( | 
|  | 97     net::URLRequest* request, | 
|  | 98     content::ResourceType resource_type, | 
|  | 99     safe_browsing::SafeBrowsingService* sb_service) { | 
|  | 100   if (!sb_service->database_manager()->IsSupported()) | 
|  | 101     return nullptr; | 
|  | 102   return base::MakeUnique<safe_browsing::ResourceThrottle>( | 
|  | 103       request, resource_type, sb_service->database_manager(), | 
|  | 104       sb_service->ui_manager(), | 
|  | 105       base::MakeUnique<SafeBrowsingResourceThrottleDelegate>()); | 
|  | 106   return nullptr; | 
|  | 107 } | 
| OLD | NEW | 
|---|