| 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(const net::URLRequest* request) final { |
| 71 const auto* info = content::ResourceRequestInfo::ForRequest(request); |
| 72 DCHECK(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 StartDisplayingBlockingPage( |
| 81 const security_interstitials::UnsafeResource& resource, |
| 82 scoped_refptr<BaseUIManager> ui_manager, |
| 83 base::OnceClosure cancel_on_io_thread) final { |
| 84 content::BrowserThread::PostTask( |
| 85 content::BrowserThread::UI, FROM_HERE, |
| 86 base::BindOnce(&StartDisplayingBlockingPageOnUIThread, |
| 87 std::move(ui_manager), resource, |
| 88 std::move(cancel_on_io_thread))); |
| 89 } |
| 90 |
| 91 private: |
| 92 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingResourceThrottleDelegate); |
| 93 }; |
| 94 |
| 95 } // namespace |
| 96 |
| 97 safe_browsing::ResourceThrottle* MaybeCreateSafeBrowsingResourceThrottle( |
| 98 net::URLRequest* request, |
| 99 content::ResourceType resource_type, |
| 100 safe_browsing::SafeBrowsingService* sb_service) { |
| 101 if (!sb_service->database_manager()->IsSupported()) |
| 102 return nullptr; |
| 103 return new safe_browsing::ResourceThrottle( |
| 104 request, resource_type, sb_service->database_manager(), |
| 105 sb_service->ui_manager(), |
| 106 base::MakeUnique<SafeBrowsingResourceThrottleDelegate>()); |
| 107 return nullptr; |
| 108 } |
| OLD | NEW |