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 "content/browser/loader/throttling_resource_handler.h" | 5 #include "content/browser/loader/throttling_resource_handler.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "content/browser/loader/resource_request_info_impl.h" | 9 #include "content/browser/loader/resource_request_info_impl.h" |
10 #include "content/public/browser/resource_throttle.h" | 10 #include "content/public/browser/resource_throttle.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 throttles_[i]->set_controller(this); | 26 throttles_[i]->set_controller(this); |
27 // Throttles must have a name, as otherwise, bugs where a throttle fails | 27 // Throttles must have a name, as otherwise, bugs where a throttle fails |
28 // to resume a request can be very difficult to debug. | 28 // to resume a request can be very difficult to debug. |
29 DCHECK(throttles_[i]->GetNameForLogging()); | 29 DCHECK(throttles_[i]->GetNameForLogging()); |
30 } | 30 } |
31 } | 31 } |
32 | 32 |
33 ThrottlingResourceHandler::~ThrottlingResourceHandler() { | 33 ThrottlingResourceHandler::~ThrottlingResourceHandler() { |
34 } | 34 } |
35 | 35 |
36 bool ThrottlingResourceHandler::OnRequestRedirected( | 36 void ThrottlingResourceHandler::OnRequestRedirected( |
37 const net::RedirectInfo& redirect_info, | 37 const net::RedirectInfo& redirect_info, |
38 ResourceResponse* response, | 38 ResourceResponse* response, |
39 bool* defer) { | 39 std::unique_ptr<ResourceController> controller) { |
| 40 DCHECK(!has_controller()); |
40 DCHECK(!cancelled_by_resource_throttle_); | 41 DCHECK(!cancelled_by_resource_throttle_); |
41 | 42 |
42 *defer = false; | 43 set_controller(std::move(controller)); |
43 while (next_index_ < throttles_.size()) { | 44 while (next_index_ < throttles_.size()) { |
44 int index = next_index_; | 45 int index = next_index_; |
45 throttles_[index]->WillRedirectRequest(redirect_info, defer); | 46 bool defer = false; |
| 47 throttles_[index]->WillRedirectRequest(redirect_info, &defer); |
46 next_index_++; | 48 next_index_++; |
47 if (cancelled_by_resource_throttle_) | 49 if (cancelled_by_resource_throttle_) |
48 return false; | 50 return; |
49 if (*defer) { | 51 if (defer) { |
50 OnRequestDefered(index); | 52 OnRequestDefered(index); |
51 deferred_stage_ = DEFERRED_REDIRECT; | 53 deferred_stage_ = DEFERRED_REDIRECT; |
52 deferred_redirect_ = redirect_info; | 54 deferred_redirect_ = redirect_info; |
53 deferred_response_ = response; | 55 deferred_response_ = response; |
54 return true; // Do not cancel. | 56 return; |
55 } | 57 } |
56 } | 58 } |
57 | 59 |
58 next_index_ = 0; // Reset for next time. | 60 next_index_ = 0; // Reset for next time. |
59 | 61 |
60 return next_handler_->OnRequestRedirected(redirect_info, response, defer); | 62 return next_handler_->OnRequestRedirected(redirect_info, response, |
| 63 TakeController()); |
61 } | 64 } |
62 | 65 |
63 bool ThrottlingResourceHandler::OnWillStart(const GURL& url, bool* defer) { | 66 void ThrottlingResourceHandler::OnWillStart( |
| 67 const GURL& url, |
| 68 std::unique_ptr<ResourceController> controller) { |
64 DCHECK(!cancelled_by_resource_throttle_); | 69 DCHECK(!cancelled_by_resource_throttle_); |
| 70 DCHECK(!has_controller()); |
65 | 71 |
66 *defer = false; | 72 set_controller(std::move(controller)); |
67 while (next_index_ < throttles_.size()) { | 73 while (next_index_ < throttles_.size()) { |
68 int index = next_index_; | 74 int index = next_index_; |
69 throttles_[index]->WillStartRequest(defer); | 75 bool defer = false; |
| 76 throttles_[index]->WillStartRequest(&defer); |
70 next_index_++; | 77 next_index_++; |
71 if (cancelled_by_resource_throttle_) | 78 if (cancelled_by_resource_throttle_) |
72 return false; | 79 return; |
73 if (*defer) { | 80 if (defer) { |
74 OnRequestDefered(index); | 81 OnRequestDefered(index); |
75 deferred_stage_ = DEFERRED_START; | 82 deferred_stage_ = DEFERRED_START; |
76 deferred_url_ = url; | 83 deferred_url_ = url; |
77 return true; // Do not cancel. | 84 return; |
78 } | 85 } |
79 } | 86 } |
80 | 87 |
81 next_index_ = 0; // Reset for next time. | 88 next_index_ = 0; // Reset for next time. |
82 | 89 |
83 return next_handler_->OnWillStart(url, defer); | 90 return next_handler_->OnWillStart(url, TakeController()); |
84 } | 91 } |
85 | 92 |
86 bool ThrottlingResourceHandler::OnResponseStarted(ResourceResponse* response, | 93 void ThrottlingResourceHandler::OnResponseStarted( |
87 bool* defer) { | 94 ResourceResponse* response, |
| 95 std::unique_ptr<ResourceController> controller) { |
88 DCHECK(!cancelled_by_resource_throttle_); | 96 DCHECK(!cancelled_by_resource_throttle_); |
| 97 DCHECK(!has_controller()); |
89 | 98 |
| 99 set_controller(std::move(controller)); |
90 while (next_index_ < throttles_.size()) { | 100 while (next_index_ < throttles_.size()) { |
91 int index = next_index_; | 101 int index = next_index_; |
92 throttles_[index]->WillProcessResponse(defer); | 102 bool defer = false; |
| 103 throttles_[index]->WillProcessResponse(&defer); |
93 next_index_++; | 104 next_index_++; |
94 if (cancelled_by_resource_throttle_) | 105 if (cancelled_by_resource_throttle_) |
95 return false; | 106 return; |
96 if (*defer) { | 107 if (defer) { |
97 OnRequestDefered(index); | 108 OnRequestDefered(index); |
98 deferred_stage_ = DEFERRED_RESPONSE; | 109 deferred_stage_ = DEFERRED_RESPONSE; |
99 deferred_response_ = response; | 110 deferred_response_ = response; |
100 return true; // Do not cancel. | 111 return; |
101 } | 112 } |
102 } | 113 } |
103 | 114 |
104 next_index_ = 0; // Reset for next time. | 115 next_index_ = 0; // Reset for next time. |
105 | 116 |
106 return next_handler_->OnResponseStarted(response, defer); | 117 return next_handler_->OnResponseStarted(response, TakeController()); |
107 } | 118 } |
108 | 119 |
109 void ThrottlingResourceHandler::Cancel() { | 120 void ThrottlingResourceHandler::Cancel() { |
110 cancelled_by_resource_throttle_ = true; | 121 cancelled_by_resource_throttle_ = true; |
111 controller()->Cancel(); | 122 ResourceHandler::Cancel(); |
112 } | 123 } |
113 | 124 |
114 void ThrottlingResourceHandler::CancelAndIgnore() { | 125 void ThrottlingResourceHandler::CancelAndIgnore() { |
115 cancelled_by_resource_throttle_ = true; | 126 cancelled_by_resource_throttle_ = true; |
116 controller()->CancelAndIgnore(); | 127 ResourceHandler::CancelAndIgnore(); |
117 } | 128 } |
118 | 129 |
119 void ThrottlingResourceHandler::CancelWithError(int error_code) { | 130 void ThrottlingResourceHandler::CancelWithError(int error_code) { |
120 cancelled_by_resource_throttle_ = true; | 131 cancelled_by_resource_throttle_ = true; |
121 controller()->CancelWithError(error_code); | 132 ResourceHandler::CancelWithError(error_code); |
122 } | 133 } |
123 | 134 |
124 void ThrottlingResourceHandler::Resume() { | 135 void ThrottlingResourceHandler::Resume() { |
125 DCHECK(!cancelled_by_resource_throttle_); | 136 DCHECK(!cancelled_by_resource_throttle_); |
| 137 DCHECK(has_controller()); |
126 | 138 |
127 DeferredStage last_deferred_stage = deferred_stage_; | 139 DeferredStage last_deferred_stage = deferred_stage_; |
128 deferred_stage_ = DEFERRED_NONE; | 140 deferred_stage_ = DEFERRED_NONE; |
129 // Clear information about the throttle that delayed the request. | 141 // Clear information about the throttle that delayed the request. |
130 request()->LogUnblocked(); | 142 request()->LogUnblocked(); |
131 switch (last_deferred_stage) { | 143 switch (last_deferred_stage) { |
132 case DEFERRED_NONE: | 144 case DEFERRED_NONE: |
133 NOTREACHED(); | 145 NOTREACHED(); |
134 break; | 146 break; |
135 case DEFERRED_START: | 147 case DEFERRED_START: |
136 ResumeStart(); | 148 ResumeStart(); |
137 break; | 149 break; |
138 case DEFERRED_REDIRECT: | 150 case DEFERRED_REDIRECT: |
139 ResumeRedirect(); | 151 ResumeRedirect(); |
140 break; | 152 break; |
141 case DEFERRED_RESPONSE: | 153 case DEFERRED_RESPONSE: |
142 ResumeResponse(); | 154 ResumeResponse(); |
143 break; | 155 break; |
144 } | 156 } |
145 } | 157 } |
146 | 158 |
147 void ThrottlingResourceHandler::ResumeStart() { | 159 void ThrottlingResourceHandler::ResumeStart() { |
148 DCHECK(!cancelled_by_resource_throttle_); | 160 DCHECK(!cancelled_by_resource_throttle_); |
| 161 DCHECK(has_controller()); |
149 | 162 |
150 GURL url = deferred_url_; | 163 GURL url = deferred_url_; |
151 deferred_url_ = GURL(); | 164 deferred_url_ = GURL(); |
152 | 165 |
153 bool defer = false; | 166 OnWillStart(url, TakeController()); |
154 if (!OnWillStart(url, &defer)) { | |
155 controller()->Cancel(); | |
156 } else if (!defer) { | |
157 controller()->Resume(); | |
158 } | |
159 } | 167 } |
160 | 168 |
161 void ThrottlingResourceHandler::ResumeRedirect() { | 169 void ThrottlingResourceHandler::ResumeRedirect() { |
162 DCHECK(!cancelled_by_resource_throttle_); | 170 DCHECK(!cancelled_by_resource_throttle_); |
| 171 DCHECK(has_controller()); |
163 | 172 |
164 net::RedirectInfo redirect_info = deferred_redirect_; | 173 net::RedirectInfo redirect_info = deferred_redirect_; |
165 deferred_redirect_ = net::RedirectInfo(); | 174 deferred_redirect_ = net::RedirectInfo(); |
166 scoped_refptr<ResourceResponse> response; | 175 scoped_refptr<ResourceResponse> response; |
167 deferred_response_.swap(response); | 176 deferred_response_.swap(response); |
168 | 177 |
169 bool defer = false; | 178 OnRequestRedirected(redirect_info, response.get(), TakeController()); |
170 if (!OnRequestRedirected(redirect_info, response.get(), &defer)) { | |
171 controller()->Cancel(); | |
172 } else if (!defer) { | |
173 controller()->Resume(); | |
174 } | |
175 } | 179 } |
176 | 180 |
177 void ThrottlingResourceHandler::ResumeResponse() { | 181 void ThrottlingResourceHandler::ResumeResponse() { |
178 DCHECK(!cancelled_by_resource_throttle_); | 182 DCHECK(!cancelled_by_resource_throttle_); |
| 183 DCHECK(has_controller()); |
179 | 184 |
180 scoped_refptr<ResourceResponse> response; | 185 scoped_refptr<ResourceResponse> response; |
181 deferred_response_.swap(response); | 186 deferred_response_.swap(response); |
182 | 187 |
183 bool defer = false; | 188 OnResponseStarted(response.get(), TakeController()); |
184 if (!OnResponseStarted(response.get(), &defer)) { | |
185 controller()->Cancel(); | |
186 } else if (!defer) { | |
187 controller()->Resume(); | |
188 } | |
189 } | 189 } |
190 | 190 |
191 void ThrottlingResourceHandler::OnRequestDefered(int throttle_index) { | 191 void ThrottlingResourceHandler::OnRequestDefered(int throttle_index) { |
192 request()->LogBlockedBy(throttles_[throttle_index]->GetNameForLogging()); | 192 request()->LogBlockedBy(throttles_[throttle_index]->GetNameForLogging()); |
193 } | 193 } |
194 | 194 |
195 } // namespace content | 195 } // namespace content |
OLD | NEW |