| 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 |