1 // Copyright 2015 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 "content/public/browser/navigation_throttle.h"
6 
7 #include "content/browser/frame_host/navigation_request.h"
8 
9 namespace content {
10 
11 namespace {
12 
DefaultNetErrorCode(NavigationThrottle::ThrottleAction action)13 net::Error DefaultNetErrorCode(NavigationThrottle::ThrottleAction action) {
14   switch (action) {
15     case NavigationThrottle::PROCEED:
16     case NavigationThrottle::DEFER:
17       return net::OK;
18     case NavigationThrottle::CANCEL:
19     case NavigationThrottle::CANCEL_AND_IGNORE:
20       return net::ERR_ABORTED;
21     case NavigationThrottle::BLOCK_REQUEST:
22     case NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE:
23       return net::ERR_BLOCKED_BY_CLIENT;
24     case NavigationThrottle::BLOCK_RESPONSE:
25       return net::ERR_BLOCKED_BY_RESPONSE;
26     default:
27       NOTREACHED();
28       return net::ERR_UNEXPECTED;
29   }
30 }
31 
32 }  // namespace
33 
ThrottleCheckResult(NavigationThrottle::ThrottleAction action)34 NavigationThrottle::ThrottleCheckResult::ThrottleCheckResult(
35     NavigationThrottle::ThrottleAction action)
36     : NavigationThrottle::ThrottleCheckResult(action,
37                                               DefaultNetErrorCode(action),
38                                               base::nullopt) {}
39 
ThrottleCheckResult(NavigationThrottle::ThrottleAction action,net::Error net_error_code)40 NavigationThrottle::ThrottleCheckResult::ThrottleCheckResult(
41     NavigationThrottle::ThrottleAction action,
42     net::Error net_error_code)
43     : NavigationThrottle::ThrottleCheckResult(action,
44                                               net_error_code,
45                                               base::nullopt) {}
46 
ThrottleCheckResult(NavigationThrottle::ThrottleAction action,net::Error net_error_code,base::Optional<std::string> error_page_content)47 NavigationThrottle::ThrottleCheckResult::ThrottleCheckResult(
48     NavigationThrottle::ThrottleAction action,
49     net::Error net_error_code,
50     base::Optional<std::string> error_page_content)
51     : action_(action),
52       net_error_code_(net_error_code),
53       error_page_content_(error_page_content) {}
54 
55 NavigationThrottle::ThrottleCheckResult::ThrottleCheckResult(
56     const ThrottleCheckResult& other) = default;
57 
~ThrottleCheckResult()58 NavigationThrottle::ThrottleCheckResult::~ThrottleCheckResult() {}
59 
NavigationThrottle(NavigationHandle * navigation_handle)60 NavigationThrottle::NavigationThrottle(NavigationHandle* navigation_handle)
61     : navigation_handle_(navigation_handle) {}
62 
~NavigationThrottle()63 NavigationThrottle::~NavigationThrottle() {}
64 
WillStartRequest()65 NavigationThrottle::ThrottleCheckResult NavigationThrottle::WillStartRequest() {
66   return NavigationThrottle::PROCEED;
67 }
68 
69 NavigationThrottle::ThrottleCheckResult
WillRedirectRequest()70 NavigationThrottle::WillRedirectRequest() {
71   return NavigationThrottle::PROCEED;
72 }
73 
WillFailRequest()74 NavigationThrottle::ThrottleCheckResult NavigationThrottle::WillFailRequest() {
75   return NavigationThrottle::PROCEED;
76 }
77 
78 NavigationThrottle::ThrottleCheckResult
WillProcessResponse()79 NavigationThrottle::WillProcessResponse() {
80   return NavigationThrottle::PROCEED;
81 }
82 
Resume()83 void NavigationThrottle::Resume() {
84   if (resume_callback_) {
85     resume_callback_.Run();
86     return;
87   }
88   NavigationRequest::From(navigation_handle_)->Resume(this);
89 }
90 
CancelDeferredNavigation(NavigationThrottle::ThrottleCheckResult result)91 void NavigationThrottle::CancelDeferredNavigation(
92     NavigationThrottle::ThrottleCheckResult result) {
93   if (cancel_deferred_navigation_callback_) {
94     cancel_deferred_navigation_callback_.Run(result);
95     return;
96   }
97   NavigationRequest::From(navigation_handle_)
98       ->CancelDeferredNavigation(this, result);
99 }
100 
101 }  // namespace content
102