Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/child/url_loader_client_impl.h" | 5 #include "content/child/url_loader_client_impl.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/single_thread_task_runner.h" | 8 #include "base/single_thread_task_runner.h" |
| 9 #include "content/child/resource_dispatcher.h" | 9 #include "content/child/resource_dispatcher.h" |
| 10 #include "content/child/url_response_body_consumer.h" | 10 #include "content/child/url_response_body_consumer.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 53 // - transfer size change (dispatched later) | 53 // - transfer size change (dispatched later) |
| 54 // - completion (dispatched by |body_consumer_| or dispatched later) | 54 // - completion (dispatched by |body_consumer_| or dispatched later) |
| 55 for (size_t index = 0; index < messages.size(); ++index) { | 55 for (size_t index = 0; index < messages.size(); ++index) { |
| 56 if (messages[index].type() == ResourceMsg_RequestComplete::ID) { | 56 if (messages[index].type() == ResourceMsg_RequestComplete::ID) { |
| 57 // The completion message arrives at the end of the message queue. | 57 // The completion message arrives at the end of the message queue. |
| 58 DCHECK(!has_completion_message); | 58 DCHECK(!has_completion_message); |
| 59 DCHECK_EQ(index, messages.size() - 1); | 59 DCHECK_EQ(index, messages.size() - 1); |
| 60 has_completion_message = true; | 60 has_completion_message = true; |
| 61 break; | 61 break; |
| 62 } | 62 } |
| 63 Dispatch(messages[index]); | 63 resource_dispatcher_->DispatchMessage(messages[index]); |
| 64 if (!weak_this) | 64 if (!weak_this) |
| 65 return; | 65 return; |
| 66 if (is_deferred_) { | 66 if (is_deferred_) { |
| 67 deferred_messages_.insert(deferred_messages_.begin(), | 67 deferred_messages_.insert(deferred_messages_.begin(), |
| 68 messages.begin() + index + 1, messages.end()); | 68 messages.begin() + index + 1, messages.end()); |
| 69 return; | 69 return; |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 | 72 |
| 73 // Dispatch the transfer size update. | 73 // Dispatch the transfer size update. |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 96 // Dispatch the response body. | 96 // Dispatch the response body. |
| 97 body_consumer_->UnsetDefersLoading(); | 97 body_consumer_->UnsetDefersLoading(); |
| 98 return; | 98 return; |
| 99 } | 99 } |
| 100 | 100 |
| 101 // Dispatch the completion message. | 101 // Dispatch the completion message. |
| 102 if (has_completion_message) { | 102 if (has_completion_message) { |
| 103 DCHECK_GT(messages.size(), 0u); | 103 DCHECK_GT(messages.size(), 0u); |
| 104 DCHECK_EQ(messages.back().type(), | 104 DCHECK_EQ(messages.back().type(), |
| 105 static_cast<uint32_t>(ResourceMsg_RequestComplete::ID)); | 105 static_cast<uint32_t>(ResourceMsg_RequestComplete::ID)); |
| 106 Dispatch(messages.back()); | 106 |
| 107 resource_dispatcher_->DispatchMessage(messages.back()); | |
| 107 } | 108 } |
| 108 } | 109 } |
| 109 | 110 |
| 110 void URLLoaderClientImpl::OnReceiveResponse( | 111 void URLLoaderClientImpl::OnReceiveResponse( |
| 111 const ResourceResponseHead& response_head, | 112 const ResourceResponseHead& response_head, |
| 112 mojom::DownloadedTempFilePtr downloaded_file) { | 113 mojom::DownloadedTempFilePtr downloaded_file) { |
| 113 has_received_response_ = true; | 114 has_received_response_ = true; |
| 114 downloaded_file_ = std::move(downloaded_file); | 115 downloaded_file_ = std::move(downloaded_file); |
| 115 Dispatch(ResourceMsg_ReceivedResponse(request_id_, response_head)); | 116 if (NeedsStoringMessage()) |
| 117 StoreAndDispatch(ResourceMsg_ReceivedResponse(request_id_, response_head)); | |
| 118 else | |
| 119 resource_dispatcher_->OnReceivedResponse(request_id_, response_head); | |
| 116 } | 120 } |
| 117 | 121 |
| 118 void URLLoaderClientImpl::OnReceiveRedirect( | 122 void URLLoaderClientImpl::OnReceiveRedirect( |
| 119 const net::RedirectInfo& redirect_info, | 123 const net::RedirectInfo& redirect_info, |
| 120 const ResourceResponseHead& response_head) { | 124 const ResourceResponseHead& response_head) { |
| 121 DCHECK(!has_received_response_); | 125 DCHECK(!has_received_response_); |
| 122 DCHECK(!body_consumer_); | 126 DCHECK(!body_consumer_); |
| 123 Dispatch( | 127 if (NeedsStoringMessage()) { |
| 124 ResourceMsg_ReceivedRedirect(request_id_, redirect_info, response_head)); | 128 StoreAndDispatch(ResourceMsg_ReceivedRedirect(request_id_, redirect_info, |
| 129 response_head)); | |
| 130 } else { | |
| 131 resource_dispatcher_->OnReceivedRedirect(request_id_, redirect_info, | |
| 132 response_head); | |
| 133 } | |
| 125 } | 134 } |
| 126 | 135 |
| 127 void URLLoaderClientImpl::OnDataDownloaded(int64_t data_len, | 136 void URLLoaderClientImpl::OnDataDownloaded(int64_t data_len, |
| 128 int64_t encoded_data_len) { | 137 int64_t encoded_data_len) { |
| 129 Dispatch(ResourceMsg_DataDownloaded(request_id_, data_len, encoded_data_len)); | 138 if (NeedsStoringMessage()) { |
| 139 StoreAndDispatch( | |
| 140 ResourceMsg_DataDownloaded(request_id_, data_len, encoded_data_len)); | |
| 141 } else { | |
| 142 resource_dispatcher_->OnDownloadedData(request_id_, data_len, | |
| 143 encoded_data_len); | |
| 144 } | |
| 130 } | 145 } |
| 131 | 146 |
| 132 void URLLoaderClientImpl::OnReceiveCachedMetadata( | 147 void URLLoaderClientImpl::OnReceiveCachedMetadata( |
| 133 const std::vector<uint8_t>& data) { | 148 const std::vector<uint8_t>& data) { |
| 134 const char* data_ptr = reinterpret_cast<const char*>(data.data()); | 149 const std::vector<char>& data_to_pass = |
| 135 Dispatch(ResourceMsg_ReceivedCachedMetadata( | 150 reinterpret_cast<const std::vector<char>&>(data); |
|
yhirano
2017/04/12 13:29:27
tzik@, is this OK?
tzik
2017/04/13 01:55:49
Oh... Can we avoid it by modifying the IPC?
yhirano
2017/04/13 14:16:26
We can, but it needs more work.
OK, I removed this
| |
| 136 request_id_, std::vector<char>(data_ptr, data_ptr + data.size()))); | 151 if (NeedsStoringMessage()) { |
| 152 StoreAndDispatch( | |
| 153 ResourceMsg_ReceivedCachedMetadata(request_id_, data_to_pass)); | |
| 154 } else { | |
| 155 resource_dispatcher_->OnReceivedCachedMetadata(request_id_, data_to_pass); | |
| 156 } | |
| 137 } | 157 } |
| 138 | 158 |
| 139 void URLLoaderClientImpl::OnTransferSizeUpdated(int32_t transfer_size_diff) { | 159 void URLLoaderClientImpl::OnTransferSizeUpdated(int32_t transfer_size_diff) { |
| 140 if (is_deferred_) { | 160 if (is_deferred_) { |
| 141 accumulated_transfer_size_diff_during_deferred_ += transfer_size_diff; | 161 accumulated_transfer_size_diff_during_deferred_ += transfer_size_diff; |
| 142 } else { | 162 } else { |
| 143 resource_dispatcher_->OnTransferSizeUpdated(request_id_, | 163 resource_dispatcher_->OnTransferSizeUpdated(request_id_, |
| 144 transfer_size_diff); | 164 transfer_size_diff); |
| 145 } | 165 } |
| 146 } | 166 } |
| 147 | 167 |
| 148 void URLLoaderClientImpl::OnStartLoadingResponseBody( | 168 void URLLoaderClientImpl::OnStartLoadingResponseBody( |
| 149 mojo::ScopedDataPipeConsumerHandle body) { | 169 mojo::ScopedDataPipeConsumerHandle body) { |
| 150 DCHECK(!body_consumer_); | 170 DCHECK(!body_consumer_); |
| 151 DCHECK(has_received_response_); | 171 DCHECK(has_received_response_); |
| 152 body_consumer_ = new URLResponseBodyConsumer( | 172 body_consumer_ = new URLResponseBodyConsumer( |
| 153 request_id_, resource_dispatcher_, std::move(body), task_runner_); | 173 request_id_, resource_dispatcher_, std::move(body), task_runner_); |
| 154 if (is_deferred_) | 174 if (is_deferred_) |
| 155 body_consumer_->SetDefersLoading(); | 175 body_consumer_->SetDefersLoading(); |
| 156 } | 176 } |
| 157 | 177 |
| 158 void URLLoaderClientImpl::OnComplete( | 178 void URLLoaderClientImpl::OnComplete( |
| 159 const ResourceRequestCompletionStatus& status) { | 179 const ResourceRequestCompletionStatus& status) { |
| 160 if (!body_consumer_) { | 180 if (!body_consumer_) { |
| 161 Dispatch(ResourceMsg_RequestComplete(request_id_, status)); | 181 if (NeedsStoringMessage()) { |
| 182 StoreAndDispatch(ResourceMsg_RequestComplete(request_id_, status)); | |
| 183 } else { | |
| 184 resource_dispatcher_->OnRequestComplete(request_id_, status); | |
| 185 } | |
| 162 return; | 186 return; |
| 163 } | 187 } |
| 164 body_consumer_->OnComplete(status); | 188 body_consumer_->OnComplete(status); |
| 165 } | 189 } |
| 166 | 190 |
| 167 void URLLoaderClientImpl::Dispatch(const IPC::Message& message) { | 191 bool URLLoaderClientImpl::NeedsStoringMessage() const { |
| 192 return is_deferred_ || deferred_messages_.size() > 0; | |
| 193 } | |
| 194 | |
| 195 void URLLoaderClientImpl::StoreAndDispatch(const IPC::Message& message) { | |
| 168 if (is_deferred_) { | 196 if (is_deferred_) { |
| 169 deferred_messages_.push_back(message); | 197 deferred_messages_.push_back(message); |
| 170 } else if (deferred_messages_.size() > 0) { | 198 } else if (deferred_messages_.size() > 0) { |
| 171 deferred_messages_.push_back(message); | 199 deferred_messages_.push_back(message); |
| 172 FlushDeferredMessages(); | 200 FlushDeferredMessages(); |
| 173 } else { | 201 } else { |
| 174 resource_dispatcher_->DispatchMessage(message); | 202 NOTREACHED(); |
|
tzik
2017/04/13 01:55:49
Can we DCHECK(is_deferred_ || !deferred_message_.e
yhirano
2017/04/13 14:16:26
Done.
| |
| 175 } | 203 } |
| 176 } | 204 } |
| 177 | 205 |
| 178 void URLLoaderClientImpl::OnUploadProgress(int64_t current_position, | 206 void URLLoaderClientImpl::OnUploadProgress(int64_t current_position, |
| 179 int64_t total_size, | 207 int64_t total_size, |
| 180 const base::Closure& ack_callback) { | 208 const base::Closure& ack_callback) { |
| 181 Dispatch( | 209 if (NeedsStoringMessage()) { |
| 182 ResourceMsg_UploadProgress(request_id_, current_position, total_size)); | 210 StoreAndDispatch( |
| 211 ResourceMsg_UploadProgress(request_id_, current_position, total_size)); | |
| 212 } else { | |
| 213 resource_dispatcher_->OnUploadProgress(request_id_, current_position, | |
| 214 total_size); | |
| 215 } | |
| 183 ack_callback.Run(); | 216 ack_callback.Run(); |
| 184 } | 217 } |
| 185 | 218 |
| 186 } // namespace content | 219 } // namespace content |
| OLD | NEW |