Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(258)

Side by Side Diff: content/browser/loader/throttling_resource_handler.cc

Issue 2526983002: Refactor ResourceHandler API. (Closed)
Patch Set: Fix stuff Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698