| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 // Copyright 2017 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/renderer/safe_browsing/safe_browsing_url_loader_throttle.h" | 
|  | 6 | 
|  | 7 #include "base/logging.h" | 
|  | 8 #include "mojo/public/cpp/bindings/interface_request.h" | 
|  | 9 #include "net/url_request/redirect_info.h" | 
|  | 10 | 
|  | 11 namespace safe_browsing { | 
|  | 12 | 
|  | 13 SafeBrowsingURLLoaderThrottle::SafeBrowsingURLLoaderThrottle( | 
|  | 14     chrome::mojom::SafeBrowsing* safe_browsing, | 
|  | 15     int render_frame_id) | 
|  | 16     : safe_browsing_(safe_browsing), | 
|  | 17       render_frame_id_(render_frame_id), | 
|  | 18       weak_factory_(this) {} | 
|  | 19 | 
|  | 20 SafeBrowsingURLLoaderThrottle::~SafeBrowsingURLLoaderThrottle() = default; | 
|  | 21 | 
|  | 22 void SafeBrowsingURLLoaderThrottle::WillStartRequest( | 
|  | 23     const GURL& url, | 
|  | 24     int load_flags, | 
|  | 25     content::ResourceType resource_type, | 
|  | 26     bool* defer) { | 
|  | 27   DCHECK_EQ(0u, pending_checks_); | 
|  | 28   DCHECK(!blocked_); | 
|  | 29   DCHECK(!url_checker_); | 
|  | 30 | 
|  | 31   pending_checks_++; | 
|  | 32   // Use a weak pointer to self because |safe_browsing_| is not owned by this | 
|  | 33   // object. | 
|  | 34   safe_browsing_->CreateCheckerAndCheck( | 
|  | 35       render_frame_id_, mojo::MakeRequest(&url_checker_), url, load_flags, | 
|  | 36       resource_type, | 
|  | 37       base::BindOnce(&SafeBrowsingURLLoaderThrottle::OnCheckUrlResult, | 
|  | 38                      weak_factory_.GetWeakPtr())); | 
|  | 39   safe_browsing_ = nullptr; | 
|  | 40 | 
|  | 41   url_checker_.set_connection_error_handler( | 
|  | 42       base::Bind(&SafeBrowsingURLLoaderThrottle::OnConnectionError, | 
|  | 43                  base::Unretained(this))); | 
|  | 44 } | 
|  | 45 | 
|  | 46 void SafeBrowsingURLLoaderThrottle::WillRedirectRequest( | 
|  | 47     const net::RedirectInfo& redirect_info, | 
|  | 48     bool* defer) { | 
|  | 49   // If |blocked_| is true, the resource load has been canceled and there | 
|  | 50   // shouldn't be such a notification. | 
|  | 51   DCHECK(!blocked_); | 
|  | 52 | 
|  | 53   if (!url_checker_) { | 
|  | 54     DCHECK_EQ(0u, pending_checks_); | 
|  | 55     return; | 
|  | 56   } | 
|  | 57 | 
|  | 58   pending_checks_++; | 
|  | 59   url_checker_->CheckUrl( | 
|  | 60       redirect_info.new_url, | 
|  | 61       base::BindOnce(&SafeBrowsingURLLoaderThrottle::OnCheckUrlResult, | 
|  | 62                      base::Unretained(this))); | 
|  | 63 } | 
|  | 64 | 
|  | 65 void SafeBrowsingURLLoaderThrottle::WillProcessResponse(bool* defer) { | 
|  | 66   // If |blocked_| is true, the resource load has been canceled and there | 
|  | 67   // shouldn't be such a notification. | 
|  | 68   DCHECK(!blocked_); | 
|  | 69 | 
|  | 70   if (pending_checks_ > 0) | 
|  | 71     *defer = true; | 
|  | 72 } | 
|  | 73 | 
|  | 74 void SafeBrowsingURLLoaderThrottle::OnCheckUrlResult(bool safe) { | 
|  | 75   if (blocked_ || !url_checker_) | 
|  | 76     return; | 
|  | 77 | 
|  | 78   DCHECK_LT(0u, pending_checks_); | 
|  | 79   pending_checks_--; | 
|  | 80 | 
|  | 81   if (safe) { | 
|  | 82     if (pending_checks_ == 0) { | 
|  | 83       // The resource load is not necessarily deferred, in that case Resume() is | 
|  | 84       // a no-op. | 
|  | 85       delegate_->Resume(); | 
|  | 86     } | 
|  | 87   } else { | 
|  | 88     url_checker_.reset(); | 
|  | 89     blocked_ = true; | 
|  | 90     pending_checks_ = 0; | 
|  | 91     delegate_->CancelWithError(net::ERR_ABORTED); | 
|  | 92   } | 
|  | 93 } | 
|  | 94 | 
|  | 95 void SafeBrowsingURLLoaderThrottle::OnConnectionError() { | 
|  | 96   DCHECK(!blocked_); | 
|  | 97 | 
|  | 98   // If a service-side disconnect happens, treat all URLs as if they are safe. | 
|  | 99   url_checker_.reset(); | 
|  | 100   pending_checks_ = 0; | 
|  | 101   delegate_->Resume(); | 
|  | 102 } | 
|  | 103 | 
|  | 104 }  // namespace safe_browsing | 
| OLD | NEW | 
|---|