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/mime_sniffing_resource_handler.h" | 5 #include "content/browser/loader/mime_sniffing_resource_handler.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 : LayeredResourceHandler(request, std::move(next_handler)), | 118 : LayeredResourceHandler(request, std::move(next_handler)), |
119 state_(STATE_STARTING), | 119 state_(STATE_STARTING), |
120 host_(host), | 120 host_(host), |
121 #if BUILDFLAG(ENABLE_PLUGINS) | 121 #if BUILDFLAG(ENABLE_PLUGINS) |
122 plugin_service_(plugin_service), | 122 plugin_service_(plugin_service), |
123 #endif | 123 #endif |
124 must_download_(false), | 124 must_download_(false), |
125 must_download_is_set_(false), | 125 must_download_is_set_(false), |
126 read_buffer_size_(0), | 126 read_buffer_size_(0), |
127 bytes_read_(0), | 127 bytes_read_(0), |
| 128 parent_read_buffer_(nullptr), |
| 129 parent_read_buffer_size_(nullptr), |
128 intercepting_handler_(intercepting_handler), | 130 intercepting_handler_(intercepting_handler), |
129 request_context_type_(request_context_type), | 131 request_context_type_(request_context_type), |
130 in_state_loop_(false), | 132 in_state_loop_(false), |
131 advance_state_(false), | 133 advance_state_(false), |
132 weak_ptr_factory_(this) { | 134 weak_ptr_factory_(this) { |
133 } | 135 } |
134 | 136 |
135 MimeSniffingResourceHandler::~MimeSniffingResourceHandler() {} | 137 MimeSniffingResourceHandler::~MimeSniffingResourceHandler() {} |
136 | 138 |
137 void MimeSniffingResourceHandler::OnWillStart( | 139 void MimeSniffingResourceHandler::OnWillStart( |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 if (response_->head.mime_type == "application/rss+xml" || | 210 if (response_->head.mime_type == "application/rss+xml" || |
209 response_->head.mime_type == "application/atom+xml") { | 211 response_->head.mime_type == "application/atom+xml") { |
210 response_->head.mime_type.assign("text/plain"); | 212 response_->head.mime_type.assign("text/plain"); |
211 } | 213 } |
212 } | 214 } |
213 | 215 |
214 HoldController(std::move(controller)); | 216 HoldController(std::move(controller)); |
215 AdvanceState(); | 217 AdvanceState(); |
216 } | 218 } |
217 | 219 |
218 bool MimeSniffingResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, | 220 void MimeSniffingResourceHandler::OnWillRead( |
219 int* buf_size) { | 221 scoped_refptr<net::IOBuffer>* buf, |
220 if (state_ == STATE_STREAMING) | 222 int* buf_size, |
221 return next_handler_->OnWillRead(buf, buf_size); | 223 std::unique_ptr<ResourceController> controller) { |
| 224 DCHECK(buf); |
| 225 DCHECK(buf_size); |
| 226 DCHECK(!parent_read_buffer_); |
| 227 DCHECK(!parent_read_buffer_size_); |
| 228 |
| 229 if (state_ == STATE_STREAMING) { |
| 230 next_handler_->OnWillRead(buf, buf_size, std::move(controller)); |
| 231 return; |
| 232 } |
| 233 |
| 234 DCHECK_EQ(State::STATE_BUFFERING, state_); |
222 | 235 |
223 if (read_buffer_.get()) { | 236 if (read_buffer_.get()) { |
224 CHECK_LT(bytes_read_, read_buffer_size_); | 237 CHECK_LT(bytes_read_, read_buffer_size_); |
225 *buf = new DependentIOBuffer(read_buffer_.get(), bytes_read_); | 238 *buf = new DependentIOBuffer(read_buffer_.get(), bytes_read_); |
226 *buf_size = read_buffer_size_ - bytes_read_; | 239 *buf_size = read_buffer_size_ - bytes_read_; |
227 } else { | 240 controller->Resume(); |
228 if (!next_handler_->OnWillRead(buf, buf_size)) | 241 return; |
229 return false; | 242 } |
230 | 243 |
231 read_buffer_ = *buf; | 244 DCHECK(!read_buffer_size_); |
232 read_buffer_size_ = *buf_size; | 245 |
233 DCHECK_GE(read_buffer_size_, net::kMaxBytesToSniff * 2); | 246 parent_read_buffer_ = buf; |
234 } | 247 parent_read_buffer_size_ = buf_size; |
235 return true; | 248 |
| 249 HoldController(std::move(controller)); |
| 250 |
| 251 // Have to go through AdvanceState here so that if OnWillRead completes |
| 252 // synchronously, won't post a task. |
| 253 state_ = State::STATE_CALLING_ON_WILL_READ; |
| 254 AdvanceState(); |
236 } | 255 } |
237 | 256 |
238 void MimeSniffingResourceHandler::OnReadCompleted( | 257 void MimeSniffingResourceHandler::OnReadCompleted( |
239 int bytes_read, | 258 int bytes_read, |
240 std::unique_ptr<ResourceController> controller) { | 259 std::unique_ptr<ResourceController> controller) { |
241 DCHECK(!has_controller()); | 260 DCHECK(!has_controller()); |
242 | 261 |
243 if (state_ == STATE_STREAMING) { | 262 if (state_ == STATE_STREAMING) { |
244 next_handler_->OnReadCompleted(bytes_read, std::move(controller)); | 263 next_handler_->OnReadCompleted(bytes_read, std::move(controller)); |
245 return; | 264 return; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 | 328 |
310 base::AutoReset<bool> auto_in_state_loop(&in_state_loop_, true); | 329 base::AutoReset<bool> auto_in_state_loop(&in_state_loop_, true); |
311 advance_state_ = true; | 330 advance_state_ = true; |
312 while (advance_state_) { | 331 while (advance_state_) { |
313 advance_state_ = false; | 332 advance_state_ = false; |
314 | 333 |
315 switch (state_) { | 334 switch (state_) { |
316 case STATE_BUFFERING: | 335 case STATE_BUFFERING: |
317 MaybeIntercept(); | 336 MaybeIntercept(); |
318 break; | 337 break; |
| 338 case STATE_CALLING_ON_WILL_READ: |
| 339 CallOnWillRead(); |
| 340 break; |
| 341 case STATE_WAITING_FOR_BUFFER: |
| 342 BufferReceived(); |
| 343 break; |
319 case STATE_INTERCEPTION_CHECK_DONE: | 344 case STATE_INTERCEPTION_CHECK_DONE: |
320 ReplayResponseReceived(); | 345 ReplayResponseReceived(); |
321 break; | 346 break; |
322 case STATE_REPLAYING_RESPONSE_RECEIVED: | 347 case STATE_REPLAYING_RESPONSE_RECEIVED: |
323 ReplayReadCompleted(); | 348 ReplayReadCompleted(); |
324 break; | 349 break; |
325 case STATE_STARTING: | 350 case STATE_STARTING: |
326 case STATE_STREAMING: | 351 case STATE_STREAMING: |
327 in_state_loop_ = false; | |
328 Resume(); | 352 Resume(); |
329 return; | 353 return; |
330 default: | 354 default: |
331 NOTREACHED(); | 355 NOTREACHED(); |
332 break; | 356 break; |
333 } | 357 } |
334 } | 358 } |
335 | 359 |
336 DCHECK(in_state_loop_); | 360 DCHECK(in_state_loop_); |
337 in_state_loop_ = false; | 361 in_state_loop_ = false; |
338 } | 362 } |
339 | 363 |
340 void MimeSniffingResourceHandler::MaybeIntercept() { | 364 void MimeSniffingResourceHandler::MaybeIntercept() { |
341 DCHECK_EQ(STATE_BUFFERING, state_); | 365 DCHECK_EQ(STATE_BUFFERING, state_); |
342 // If a request that can be intercepted failed the check for interception | 366 // If a request that can be intercepted failed the check for interception |
343 // step, it should be canceled. | 367 // step, it should be canceled. |
344 if (!MaybeStartInterception()) | 368 if (!MaybeStartInterception()) |
345 return; | 369 return; |
346 | 370 |
347 state_ = STATE_INTERCEPTION_CHECK_DONE; | 371 state_ = STATE_INTERCEPTION_CHECK_DONE; |
348 ResumeInternal(); | 372 ResumeInternal(); |
349 } | 373 } |
350 | 374 |
| 375 void MimeSniffingResourceHandler::CallOnWillRead() { |
| 376 DCHECK_EQ(STATE_CALLING_ON_WILL_READ, state_); |
| 377 |
| 378 state_ = STATE_WAITING_FOR_BUFFER; |
| 379 next_handler_->OnWillRead(&read_buffer_, &read_buffer_size_, |
| 380 base::MakeUnique<Controller>(this)); |
| 381 } |
| 382 |
| 383 void MimeSniffingResourceHandler::BufferReceived() { |
| 384 DCHECK_EQ(STATE_WAITING_FOR_BUFFER, state_); |
| 385 |
| 386 DCHECK(read_buffer_); |
| 387 DCHECK(parent_read_buffer_); |
| 388 DCHECK(parent_read_buffer_size_); |
| 389 DCHECK_GE(read_buffer_size_, net::kMaxBytesToSniff * 2); |
| 390 |
| 391 *parent_read_buffer_ = read_buffer_; |
| 392 *parent_read_buffer_size_ = read_buffer_size_; |
| 393 |
| 394 parent_read_buffer_ = nullptr; |
| 395 parent_read_buffer_size_ = nullptr; |
| 396 |
| 397 state_ = State::STATE_BUFFERING; |
| 398 Resume(); |
| 399 } |
| 400 |
351 void MimeSniffingResourceHandler::ReplayResponseReceived() { | 401 void MimeSniffingResourceHandler::ReplayResponseReceived() { |
352 DCHECK_EQ(STATE_INTERCEPTION_CHECK_DONE, state_); | 402 DCHECK_EQ(STATE_INTERCEPTION_CHECK_DONE, state_); |
353 state_ = STATE_REPLAYING_RESPONSE_RECEIVED; | 403 state_ = STATE_REPLAYING_RESPONSE_RECEIVED; |
354 next_handler_->OnResponseStarted(response_.get(), | 404 next_handler_->OnResponseStarted(response_.get(), |
355 base::MakeUnique<Controller>(this)); | 405 base::MakeUnique<Controller>(this)); |
356 } | 406 } |
357 | 407 |
358 void MimeSniffingResourceHandler::ReplayReadCompleted() { | 408 void MimeSniffingResourceHandler::ReplayReadCompleted() { |
359 DCHECK_EQ(STATE_REPLAYING_RESPONSE_RECEIVED, state_); | 409 DCHECK_EQ(STATE_REPLAYING_RESPONSE_RECEIVED, state_); |
360 | 410 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 | 605 |
556 void MimeSniffingResourceHandler::OnPluginsLoaded( | 606 void MimeSniffingResourceHandler::OnPluginsLoaded( |
557 const std::vector<WebPluginInfo>& plugins) { | 607 const std::vector<WebPluginInfo>& plugins) { |
558 // No longer blocking on the plugins being loaded. | 608 // No longer blocking on the plugins being loaded. |
559 request()->LogUnblocked(); | 609 request()->LogUnblocked(); |
560 if (state_ == STATE_BUFFERING) | 610 if (state_ == STATE_BUFFERING) |
561 AdvanceState(); | 611 AdvanceState(); |
562 } | 612 } |
563 | 613 |
564 } // namespace content | 614 } // namespace content |
OLD | NEW |