url_checker_delegate_impl.cc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright 2019 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. #include "weblayer/browser/safe_browsing/url_checker_delegate_impl.h"
  5. #include "base/bind.h"
  6. #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
  7. #include "components/safe_browsing/content/browser/ui_manager.h"
  8. #include "components/safe_browsing/core/browser/db/database_manager.h"
  9. #include "components/security_interstitials/content/unsafe_resource_util.h"
  10. #include "components/security_interstitials/core/unsafe_resource.h"
  11. #include "content/public/browser/browser_task_traits.h"
  12. #include "content/public/browser/browser_thread.h"
  13. #include "weblayer/browser/no_state_prefetch/no_state_prefetch_manager_factory.h"
  14. #include "weblayer/browser/no_state_prefetch/no_state_prefetch_utils.h"
  15. namespace weblayer {
  16. namespace {
  17. // Destroys the NoStatePrefetch contents associated with the web_contents, if
  18. // any.
  19. void DestroyNoStatePrefetchContents(
  20. content::WebContents::OnceGetter web_contents_getter) {
  21. content::WebContents* web_contents = std::move(web_contents_getter).Run();
  22. auto* no_state_prefetch_contents =
  23. NoStatePrefetchContentsFromWebContents(web_contents);
  24. if (no_state_prefetch_contents)
  25. no_state_prefetch_contents->Destroy(prerender::FINAL_STATUS_SAFE_BROWSING);
  26. }
  27. } // namespace
  28. UrlCheckerDelegateImpl::UrlCheckerDelegateImpl(
  29. scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> database_manager,
  30. scoped_refptr<safe_browsing::SafeBrowsingUIManager> ui_manager)
  31. : database_manager_(std::move(database_manager)),
  32. ui_manager_(std::move(ui_manager)),
  33. threat_types_(safe_browsing::CreateSBThreatTypeSet(
  34. {safe_browsing::SB_THREAT_TYPE_URL_MALWARE,
  35. safe_browsing::SB_THREAT_TYPE_URL_PHISHING,
  36. safe_browsing::SB_THREAT_TYPE_URL_UNWANTED,
  37. safe_browsing::SB_THREAT_TYPE_BILLING})) {}
  38. UrlCheckerDelegateImpl::~UrlCheckerDelegateImpl() = default;
  39. void UrlCheckerDelegateImpl::MaybeDestroyNoStatePrefetchContents(
  40. content::WebContents::OnceGetter web_contents_getter) {
  41. // Destroy the prefetch with FINAL_STATUS_SAFE_BROWSING.
  42. content::GetUIThreadTaskRunner({})->PostTask(
  43. FROM_HERE, base::BindOnce(&DestroyNoStatePrefetchContents,
  44. std::move(web_contents_getter)));
  45. }
  46. void UrlCheckerDelegateImpl::StartDisplayingBlockingPageHelper(
  47. const security_interstitials::UnsafeResource& resource,
  48. const std::string& method,
  49. const net::HttpRequestHeaders& headers,
  50. bool is_main_frame,
  51. bool has_user_gesture) {
  52. content::GetUIThreadTaskRunner({})->PostTask(
  53. FROM_HERE,
  54. base::BindOnce(
  55. &UrlCheckerDelegateImpl::StartDisplayingDefaultBlockingPage,
  56. base::Unretained(this), resource));
  57. }
  58. void UrlCheckerDelegateImpl::
  59. StartObservingInteractionsForDelayedBlockingPageHelper(
  60. const security_interstitials::UnsafeResource& resource,
  61. bool is_main_frame) {
  62. NOTREACHED() << "Delayed warnings aren't implemented for WebLayer";
  63. }
  64. void UrlCheckerDelegateImpl::StartDisplayingDefaultBlockingPage(
  65. const security_interstitials::UnsafeResource& resource) {
  66. content::WebContents* web_contents =
  67. security_interstitials::GetWebContentsForResource(resource);
  68. if (web_contents) {
  69. GetUIManager()->DisplayBlockingPage(resource);
  70. return;
  71. }
  72. // Report back that it is not ok to proceed with loading the URL.
  73. content::GetIOThreadTaskRunner({})->PostTask(
  74. FROM_HERE, base::BindOnce(resource.callback, false /* proceed */,
  75. false /* showed_interstitial */));
  76. }
  77. bool UrlCheckerDelegateImpl::IsUrlAllowlisted(const GURL& url) {
  78. // TODO(timvolodine): false for now, we may want allowlisting support later.
  79. return false;
  80. }
  81. void UrlCheckerDelegateImpl::SetPolicyAllowlistDomains(
  82. const std::vector<std::string>& allowlist_domains) {
  83. // The SafeBrowsingAllowlistDomains policy is not supported on WebLayer.
  84. return;
  85. }
  86. bool UrlCheckerDelegateImpl::ShouldSkipRequestCheck(
  87. const GURL& original_url,
  88. int frame_tree_node_id,
  89. int render_process_id,
  90. int render_frame_id,
  91. bool originated_from_service_worker) {
  92. return false;
  93. }
  94. void UrlCheckerDelegateImpl::NotifySuspiciousSiteDetected(
  95. const base::RepeatingCallback<content::WebContents*()>&
  96. web_contents_getter) {}
  97. const safe_browsing::SBThreatTypeSet& UrlCheckerDelegateImpl::GetThreatTypes() {
  98. return threat_types_;
  99. }
  100. safe_browsing::SafeBrowsingDatabaseManager*
  101. UrlCheckerDelegateImpl::GetDatabaseManager() {
  102. return database_manager_.get();
  103. }
  104. safe_browsing::BaseUIManager* UrlCheckerDelegateImpl::GetUIManager() {
  105. return ui_manager_.get();
  106. }
  107. } // namespace weblayer