| 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 "net/url_request/url_fetcher_core.h" | 5 #include "net/url_request/url_fetcher_core.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
| 13 #include "base/profiler/scoped_tracker.h" | 13 #include "base/profiler/scoped_tracker.h" |
| 14 #include "base/sequenced_task_runner.h" | 14 #include "base/sequenced_task_runner.h" |
| 15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
| 17 #include "base/threading/thread_task_runner_handle.h" | 17 #include "base/threading/sequenced_task_runner_handle.h" |
| 18 #include "base/tracked_objects.h" | 18 #include "base/tracked_objects.h" |
| 19 #include "net/base/elements_upload_data_stream.h" | 19 #include "net/base/elements_upload_data_stream.h" |
| 20 #include "net/base/io_buffer.h" | 20 #include "net/base/io_buffer.h" |
| 21 #include "net/base/load_flags.h" | 21 #include "net/base/load_flags.h" |
| 22 #include "net/base/net_errors.h" | 22 #include "net/base/net_errors.h" |
| 23 #include "net/base/request_priority.h" | 23 #include "net/base/request_priority.h" |
| 24 #include "net/base/upload_bytes_element_reader.h" | 24 #include "net/base/upload_bytes_element_reader.h" |
| 25 #include "net/base/upload_data_stream.h" | 25 #include "net/base/upload_data_stream.h" |
| 26 #include "net/base/upload_file_element_reader.h" | 26 #include "net/base/upload_file_element_reader.h" |
| 27 #include "net/http/http_response_headers.h" | 27 #include "net/http/http_response_headers.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 URLFetcherCore::g_registry = LAZY_INSTANCE_INITIALIZER; | 72 URLFetcherCore::g_registry = LAZY_INSTANCE_INITIALIZER; |
| 73 | 73 |
| 74 URLFetcherCore::URLFetcherCore(URLFetcher* fetcher, | 74 URLFetcherCore::URLFetcherCore(URLFetcher* fetcher, |
| 75 const GURL& original_url, | 75 const GURL& original_url, |
| 76 URLFetcher::RequestType request_type, | 76 URLFetcher::RequestType request_type, |
| 77 URLFetcherDelegate* d) | 77 URLFetcherDelegate* d) |
| 78 : fetcher_(fetcher), | 78 : fetcher_(fetcher), |
| 79 original_url_(original_url), | 79 original_url_(original_url), |
| 80 request_type_(request_type), | 80 request_type_(request_type), |
| 81 delegate_(d), | 81 delegate_(d), |
| 82 delegate_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 82 delegate_task_runner_(base::SequencedTaskRunnerHandle::Get()), |
| 83 load_flags_(LOAD_NORMAL), | 83 load_flags_(LOAD_NORMAL), |
| 84 response_code_(URLFetcher::RESPONSE_CODE_INVALID), | 84 response_code_(URLFetcher::RESPONSE_CODE_INVALID), |
| 85 buffer_(new IOBuffer(kBufferSize)), | 85 buffer_(new IOBuffer(kBufferSize)), |
| 86 url_request_data_key_(NULL), | 86 url_request_data_key_(NULL), |
| 87 was_fetched_via_proxy_(false), | 87 was_fetched_via_proxy_(false), |
| 88 was_cached_(false), | 88 was_cached_(false), |
| 89 received_response_content_length_(0), | 89 received_response_content_length_(0), |
| 90 total_received_bytes_(0), | 90 total_received_bytes_(0), |
| 91 upload_content_set_(false), | 91 upload_content_set_(false), |
| 92 upload_range_offset_(0), | 92 upload_range_offset_(0), |
| 93 upload_range_length_(0), | 93 upload_range_length_(0), |
| 94 referrer_policy_( | 94 referrer_policy_( |
| 95 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE), | 95 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE), |
| 96 is_chunked_upload_(false), | 96 is_chunked_upload_(false), |
| 97 was_cancelled_(false), | 97 was_cancelled_(false), |
| 98 stop_on_redirect_(false), | 98 stop_on_redirect_(false), |
| 99 stopped_on_redirect_(false), | 99 stopped_on_redirect_(false), |
| 100 automatically_retry_on_5xx_(true), | 100 automatically_retry_on_5xx_(true), |
| 101 num_retries_on_5xx_(0), | 101 num_retries_on_5xx_(0), |
| 102 max_retries_on_5xx_(0), | 102 max_retries_on_5xx_(0), |
| 103 num_retries_on_network_changes_(0), | 103 num_retries_on_network_changes_(0), |
| 104 max_retries_on_network_changes_(0), | 104 max_retries_on_network_changes_(0), |
| 105 current_upload_bytes_(-1), | 105 current_upload_bytes_(-1), |
| 106 current_response_bytes_(0), | 106 current_response_bytes_(0), |
| 107 total_response_bytes_(-1) { | 107 total_response_bytes_(-1) { |
| 108 CHECK(original_url_.is_valid()); | 108 CHECK(original_url_.is_valid()); |
| 109 } | 109 } |
| 110 | 110 |
| 111 void URLFetcherCore::Start() { | 111 void URLFetcherCore::Start() { |
| 112 DCHECK(delegate_task_runner_.get()); | 112 DCHECK(delegate_task_runner_); |
| 113 DCHECK(request_context_getter_.get()) << "We need an URLRequestContext!"; | 113 DCHECK(request_context_getter_.get()) << "We need an URLRequestContext!"; |
| 114 if (network_task_runner_.get()) { | 114 if (network_task_runner_.get()) { |
| 115 DCHECK_EQ(network_task_runner_, | 115 DCHECK_EQ(network_task_runner_, |
| 116 request_context_getter_->GetNetworkTaskRunner()); | 116 request_context_getter_->GetNetworkTaskRunner()); |
| 117 } else { | 117 } else { |
| 118 network_task_runner_ = request_context_getter_->GetNetworkTaskRunner(); | 118 network_task_runner_ = request_context_getter_->GetNetworkTaskRunner(); |
| 119 } | 119 } |
| 120 DCHECK(network_task_runner_.get()) << "We need an IO task runner"; | 120 DCHECK(network_task_runner_.get()) << "We need an IO task runner"; |
| 121 | 121 |
| 122 network_task_runner_->PostTask( | 122 network_task_runner_->PostTask( |
| 123 FROM_HERE, base::Bind(&URLFetcherCore::StartOnIOThread, this)); | 123 FROM_HERE, base::Bind(&URLFetcherCore::StartOnIOThread, this)); |
| 124 } | 124 } |
| 125 | 125 |
| 126 void URLFetcherCore::Stop() { | 126 void URLFetcherCore::Stop() { |
| 127 if (delegate_task_runner_.get()) // May be NULL in tests. | 127 if (delegate_task_runner_) // May be NULL in tests. |
| 128 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 128 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 129 | 129 |
| 130 delegate_ = NULL; | 130 delegate_ = NULL; |
| 131 fetcher_ = NULL; | 131 fetcher_ = NULL; |
| 132 if (!network_task_runner_.get()) | 132 if (!network_task_runner_.get()) |
| 133 return; | 133 return; |
| 134 if (network_task_runner_->RunsTasksOnCurrentThread()) { | 134 if (network_task_runner_->RunsTasksOnCurrentThread()) { |
| 135 CancelURLRequest(ERR_ABORTED); | 135 CancelURLRequest(ERR_ABORTED); |
| 136 } else { | 136 } else { |
| 137 network_task_runner_->PostTask( | 137 network_task_runner_->PostTask( |
| 138 FROM_HERE, | 138 FROM_HERE, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 // to ensure non-empty upload content as it is not yet supplied. | 197 // to ensure non-empty upload content as it is not yet supplied. |
| 198 DCHECK(!content_type.empty()); | 198 DCHECK(!content_type.empty()); |
| 199 | 199 |
| 200 upload_content_type_ = content_type; | 200 upload_content_type_ = content_type; |
| 201 upload_content_.clear(); | 201 upload_content_.clear(); |
| 202 is_chunked_upload_ = true; | 202 is_chunked_upload_ = true; |
| 203 } | 203 } |
| 204 | 204 |
| 205 void URLFetcherCore::AppendChunkToUpload(const std::string& content, | 205 void URLFetcherCore::AppendChunkToUpload(const std::string& content, |
| 206 bool is_last_chunk) { | 206 bool is_last_chunk) { |
| 207 DCHECK(delegate_task_runner_.get()); | 207 DCHECK(delegate_task_runner_); |
| 208 DCHECK(network_task_runner_.get()); | 208 DCHECK(network_task_runner_.get()); |
| 209 DCHECK(is_chunked_upload_); | 209 DCHECK(is_chunked_upload_); |
| 210 network_task_runner_->PostTask( | 210 network_task_runner_->PostTask( |
| 211 FROM_HERE, | 211 FROM_HERE, |
| 212 base::Bind(&URLFetcherCore::CompleteAddingUploadDataChunk, this, content, | 212 base::Bind(&URLFetcherCore::CompleteAddingUploadDataChunk, this, content, |
| 213 is_last_chunk)); | 213 is_last_chunk)); |
| 214 } | 214 } |
| 215 | 215 |
| 216 void URLFetcherCore::SetLoadFlags(int load_flags) { | 216 void URLFetcherCore::SetLoadFlags(int load_flags) { |
| 217 load_flags_ = load_flags; | 217 load_flags_ = load_flags; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 return backoff_delay_; | 282 return backoff_delay_; |
| 283 } | 283 } |
| 284 | 284 |
| 285 void URLFetcherCore::SetAutomaticallyRetryOnNetworkChanges(int max_retries) { | 285 void URLFetcherCore::SetAutomaticallyRetryOnNetworkChanges(int max_retries) { |
| 286 max_retries_on_network_changes_ = max_retries; | 286 max_retries_on_network_changes_ = max_retries; |
| 287 } | 287 } |
| 288 | 288 |
| 289 void URLFetcherCore::SaveResponseToFileAtPath( | 289 void URLFetcherCore::SaveResponseToFileAtPath( |
| 290 const base::FilePath& file_path, | 290 const base::FilePath& file_path, |
| 291 scoped_refptr<base::SequencedTaskRunner> file_task_runner) { | 291 scoped_refptr<base::SequencedTaskRunner> file_task_runner) { |
| 292 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 292 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 293 SaveResponseWithWriter(std::unique_ptr<URLFetcherResponseWriter>( | 293 SaveResponseWithWriter(std::unique_ptr<URLFetcherResponseWriter>( |
| 294 new URLFetcherFileWriter(file_task_runner, file_path))); | 294 new URLFetcherFileWriter(file_task_runner, file_path))); |
| 295 } | 295 } |
| 296 | 296 |
| 297 void URLFetcherCore::SaveResponseToTemporaryFile( | 297 void URLFetcherCore::SaveResponseToTemporaryFile( |
| 298 scoped_refptr<base::SequencedTaskRunner> file_task_runner) { | 298 scoped_refptr<base::SequencedTaskRunner> file_task_runner) { |
| 299 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 299 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 300 SaveResponseWithWriter(std::unique_ptr<URLFetcherResponseWriter>( | 300 SaveResponseWithWriter(std::unique_ptr<URLFetcherResponseWriter>( |
| 301 new URLFetcherFileWriter(file_task_runner, base::FilePath()))); | 301 new URLFetcherFileWriter(file_task_runner, base::FilePath()))); |
| 302 } | 302 } |
| 303 | 303 |
| 304 void URLFetcherCore::SaveResponseWithWriter( | 304 void URLFetcherCore::SaveResponseWithWriter( |
| 305 std::unique_ptr<URLFetcherResponseWriter> response_writer) { | 305 std::unique_ptr<URLFetcherResponseWriter> response_writer) { |
| 306 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 306 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 307 response_writer_ = std::move(response_writer); | 307 response_writer_ = std::move(response_writer); |
| 308 } | 308 } |
| 309 | 309 |
| 310 HttpResponseHeaders* URLFetcherCore::GetResponseHeaders() const { | 310 HttpResponseHeaders* URLFetcherCore::GetResponseHeaders() const { |
| 311 return response_headers_.get(); | 311 return response_headers_.get(); |
| 312 } | 312 } |
| 313 | 313 |
| 314 // TODO(panayiotis): socket_address_ is written in the IO thread, | 314 // TODO(panayiotis): socket_address_ is written in the IO thread, |
| 315 // if this is accessed in the UI thread, this could result in a race. | 315 // if this is accessed in the UI thread, this could result in a race. |
| 316 // Same for response_headers_ above and was_fetched_via_proxy_ below. | 316 // Same for response_headers_ above and was_fetched_via_proxy_ below. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 344 | 344 |
| 345 const URLRequestStatus& URLFetcherCore::GetStatus() const { | 345 const URLRequestStatus& URLFetcherCore::GetStatus() const { |
| 346 return status_; | 346 return status_; |
| 347 } | 347 } |
| 348 | 348 |
| 349 int URLFetcherCore::GetResponseCode() const { | 349 int URLFetcherCore::GetResponseCode() const { |
| 350 return response_code_; | 350 return response_code_; |
| 351 } | 351 } |
| 352 | 352 |
| 353 void URLFetcherCore::ReceivedContentWasMalformed() { | 353 void URLFetcherCore::ReceivedContentWasMalformed() { |
| 354 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 354 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 355 if (network_task_runner_.get()) { | 355 if (network_task_runner_.get()) { |
| 356 network_task_runner_->PostTask( | 356 network_task_runner_->PostTask( |
| 357 FROM_HERE, base::Bind(&URLFetcherCore::NotifyMalformedContent, this)); | 357 FROM_HERE, base::Bind(&URLFetcherCore::NotifyMalformedContent, this)); |
| 358 } | 358 } |
| 359 } | 359 } |
| 360 | 360 |
| 361 bool URLFetcherCore::GetResponseAsString( | 361 bool URLFetcherCore::GetResponseAsString( |
| 362 std::string* out_response_string) const { | 362 std::string* out_response_string) const { |
| 363 URLFetcherStringWriter* string_writer = | 363 URLFetcherStringWriter* string_writer = |
| 364 response_writer_ ? response_writer_->AsStringWriter() : NULL; | 364 response_writer_ ? response_writer_->AsStringWriter() : NULL; |
| 365 if (!string_writer) | 365 if (!string_writer) |
| 366 return false; | 366 return false; |
| 367 | 367 |
| 368 *out_response_string = string_writer->data(); | 368 *out_response_string = string_writer->data(); |
| 369 UMA_HISTOGRAM_MEMORY_KB("UrlFetcher.StringResponseSize", | 369 UMA_HISTOGRAM_MEMORY_KB("UrlFetcher.StringResponseSize", |
| 370 (string_writer->data().length() / 1024)); | 370 (string_writer->data().length() / 1024)); |
| 371 return true; | 371 return true; |
| 372 } | 372 } |
| 373 | 373 |
| 374 bool URLFetcherCore::GetResponseAsFilePath(bool take_ownership, | 374 bool URLFetcherCore::GetResponseAsFilePath(bool take_ownership, |
| 375 base::FilePath* out_response_path) { | 375 base::FilePath* out_response_path) { |
| 376 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 376 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 377 | 377 |
| 378 URLFetcherFileWriter* file_writer = | 378 URLFetcherFileWriter* file_writer = |
| 379 response_writer_ ? response_writer_->AsFileWriter() : NULL; | 379 response_writer_ ? response_writer_->AsFileWriter() : NULL; |
| 380 if (!file_writer) | 380 if (!file_writer) |
| 381 return false; | 381 return false; |
| 382 | 382 |
| 383 *out_response_path = file_writer->file_path(); | 383 *out_response_path = file_writer->file_path(); |
| 384 | 384 |
| 385 if (take_ownership) { | 385 if (take_ownership) { |
| 386 // Intentionally calling a file_writer_ method directly without posting | 386 // Intentionally calling a file_writer_ method directly without posting |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 if (!original_url_throttler_entry_.get()) { | 663 if (!original_url_throttler_entry_.get()) { |
| 664 original_url_throttler_entry_ = | 664 original_url_throttler_entry_ = |
| 665 context->throttler_manager()->RegisterRequestUrl(original_url_); | 665 context->throttler_manager()->RegisterRequestUrl(original_url_); |
| 666 } | 666 } |
| 667 | 667 |
| 668 if (original_url_throttler_entry_.get()) { | 668 if (original_url_throttler_entry_.get()) { |
| 669 int64_t delay = | 669 int64_t delay = |
| 670 original_url_throttler_entry_->ReserveSendingTimeForNextRequest( | 670 original_url_throttler_entry_->ReserveSendingTimeForNextRequest( |
| 671 GetBackoffReleaseTime()); | 671 GetBackoffReleaseTime()); |
| 672 if (delay != 0) { | 672 if (delay != 0) { |
| 673 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 673 network_task_runner_->PostDelayedTask( |
| 674 FROM_HERE, base::Bind(&URLFetcherCore::StartURLRequest, this), | 674 FROM_HERE, base::Bind(&URLFetcherCore::StartURLRequest, this), |
| 675 base::TimeDelta::FromMilliseconds(delay)); | 675 base::TimeDelta::FromMilliseconds(delay)); |
| 676 return; | 676 return; |
| 677 } | 677 } |
| 678 } | 678 } |
| 679 } | 679 } |
| 680 | 680 |
| 681 StartURLRequest(); | 681 StartURLRequest(); |
| 682 } | 682 } |
| 683 | 683 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 703 // context. | 703 // context. |
| 704 request_context_getter_ = NULL; | 704 request_context_getter_ = NULL; |
| 705 initiator_.reset(); | 705 initiator_.reset(); |
| 706 url_request_data_key_ = NULL; | 706 url_request_data_key_ = NULL; |
| 707 url_request_create_data_callback_.Reset(); | 707 url_request_create_data_callback_.Reset(); |
| 708 was_cancelled_ = true; | 708 was_cancelled_ = true; |
| 709 } | 709 } |
| 710 | 710 |
| 711 void URLFetcherCore::OnCompletedURLRequest( | 711 void URLFetcherCore::OnCompletedURLRequest( |
| 712 base::TimeDelta backoff_delay) { | 712 base::TimeDelta backoff_delay) { |
| 713 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 713 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 714 | 714 |
| 715 // Save the status and backoff_delay so that delegates can read it. | 715 // Save the status and backoff_delay so that delegates can read it. |
| 716 if (delegate_) { | 716 if (delegate_) { |
| 717 backoff_delay_ = backoff_delay; | 717 backoff_delay_ = backoff_delay; |
| 718 InformDelegateFetchIsComplete(); | 718 InformDelegateFetchIsComplete(); |
| 719 } | 719 } |
| 720 } | 720 } |
| 721 | 721 |
| 722 void URLFetcherCore::InformDelegateFetchIsComplete() { | 722 void URLFetcherCore::InformDelegateFetchIsComplete() { |
| 723 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 723 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 724 if (delegate_) | 724 if (delegate_) |
| 725 delegate_->OnURLFetchComplete(fetcher_); | 725 delegate_->OnURLFetchComplete(fetcher_); |
| 726 } | 726 } |
| 727 | 727 |
| 728 void URLFetcherCore::NotifyMalformedContent() { | 728 void URLFetcherCore::NotifyMalformedContent() { |
| 729 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 729 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 730 if (url_throttler_entry_.get()) { | 730 if (url_throttler_entry_.get()) { |
| 731 int status_code = response_code_; | 731 int status_code = response_code_; |
| 732 if (status_code == URLFetcher::RESPONSE_CODE_INVALID) { | 732 if (status_code == URLFetcher::RESPONSE_CODE_INVALID) { |
| 733 // The status code will generally be known by the time clients | 733 // The status code will generally be known by the time clients |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 904 if (!is_chunked_upload_) { | 904 if (!is_chunked_upload_) { |
| 905 total = static_cast<int64_t>(request_->GetUploadProgress().size()); | 905 total = static_cast<int64_t>(request_->GetUploadProgress().size()); |
| 906 // Total may be zero if the UploadDataStream::Init has not been called | 906 // Total may be zero if the UploadDataStream::Init has not been called |
| 907 // yet. Don't send the upload progress until the size is initialized. | 907 // yet. Don't send the upload progress until the size is initialized. |
| 908 if (!total) | 908 if (!total) |
| 909 return; | 909 return; |
| 910 } | 910 } |
| 911 delegate_task_runner_->PostTask( | 911 delegate_task_runner_->PostTask( |
| 912 FROM_HERE, | 912 FROM_HERE, |
| 913 base::Bind( | 913 base::Bind( |
| 914 &URLFetcherCore::InformDelegateUploadProgressInDelegateThread, | 914 &URLFetcherCore::InformDelegateUploadProgressInDelegateSequence, |
| 915 this, current, total)); | 915 this, current, total)); |
| 916 } | 916 } |
| 917 } | 917 } |
| 918 } | 918 } |
| 919 | 919 |
| 920 void URLFetcherCore::InformDelegateUploadProgressInDelegateThread( | 920 void URLFetcherCore::InformDelegateUploadProgressInDelegateSequence( |
| 921 int64_t current, | 921 int64_t current, |
| 922 int64_t total) { | 922 int64_t total) { |
| 923 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 923 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 924 if (delegate_) | 924 if (delegate_) |
| 925 delegate_->OnURLFetchUploadProgress(fetcher_, current, total); | 925 delegate_->OnURLFetchUploadProgress(fetcher_, current, total); |
| 926 } | 926 } |
| 927 | 927 |
| 928 void URLFetcherCore::InformDelegateDownloadProgress() { | 928 void URLFetcherCore::InformDelegateDownloadProgress() { |
| 929 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 929 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 930 | 930 |
| 931 // TODO(pkasting): Remove ScopedTracker below once crbug.com/455952 is fixed. | 931 // TODO(pkasting): Remove ScopedTracker below once crbug.com/455952 is fixed. |
| 932 tracked_objects::ScopedTracker tracking_profile2( | 932 tracked_objects::ScopedTracker tracking_profile2( |
| 933 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 933 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 934 "455952 delegate_task_runner_->PostTask()")); | 934 "455952 delegate_task_runner_->PostTask()")); |
| 935 | 935 |
| 936 delegate_task_runner_->PostTask( | 936 delegate_task_runner_->PostTask( |
| 937 FROM_HERE, | 937 FROM_HERE, |
| 938 base::Bind( | 938 base::Bind( |
| 939 &URLFetcherCore::InformDelegateDownloadProgressInDelegateThread, this, | 939 &URLFetcherCore::InformDelegateDownloadProgressInDelegateSequence, |
| 940 current_response_bytes_, total_response_bytes_, | 940 this, current_response_bytes_, total_response_bytes_, |
| 941 request_->GetTotalReceivedBytes())); | 941 request_->GetTotalReceivedBytes())); |
| 942 } | 942 } |
| 943 | 943 |
| 944 void URLFetcherCore::InformDelegateDownloadProgressInDelegateThread( | 944 void URLFetcherCore::InformDelegateDownloadProgressInDelegateSequence( |
| 945 int64_t current, | 945 int64_t current, |
| 946 int64_t total, | 946 int64_t total, |
| 947 int64_t current_network_bytes) { | 947 int64_t current_network_bytes) { |
| 948 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 948 DCHECK(delegate_task_runner_->RunsTasksOnCurrentThread()); |
| 949 if (delegate_) | 949 if (delegate_) |
| 950 delegate_->OnURLFetchDownloadProgress(fetcher_, current, total, | 950 delegate_->OnURLFetchDownloadProgress(fetcher_, current, total, |
| 951 current_network_bytes); | 951 current_network_bytes); |
| 952 } | 952 } |
| 953 | 953 |
| 954 void URLFetcherCore::AssertHasNoUploadData() const { | 954 void URLFetcherCore::AssertHasNoUploadData() const { |
| 955 DCHECK(!upload_content_set_); | 955 DCHECK(!upload_content_set_); |
| 956 DCHECK(upload_content_.empty()); | 956 DCHECK(upload_content_.empty()); |
| 957 DCHECK(upload_file_path_.empty()); | 957 DCHECK(upload_file_path_.empty()); |
| 958 DCHECK(upload_stream_factory_.is_null()); | 958 DCHECK(upload_stream_factory_.is_null()); |
| 959 } | 959 } |
| 960 | 960 |
| 961 } // namespace net | 961 } // namespace net |
| OLD | NEW |