OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading | 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading |
6 | 6 |
7 #include "content/common/resource_dispatcher.h" | 7 #include "content/common/resource_dispatcher.h" |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 | 66 |
67 // The request to send, created on initialization for modification and | 67 // The request to send, created on initialization for modification and |
68 // appending data. | 68 // appending data. |
69 ResourceHostMsg_Request request_; | 69 ResourceHostMsg_Request request_; |
70 | 70 |
71 // ID for the request, valid once Start()ed, -1 if not valid yet. | 71 // ID for the request, valid once Start()ed, -1 if not valid yet. |
72 int request_id_; | 72 int request_id_; |
73 | 73 |
74 // The routing id used when sending IPC messages. | 74 // The routing id used when sending IPC messages. |
75 int routing_id_; | 75 int routing_id_; |
| 76 |
| 77 bool is_synchronous_request_; |
76 }; | 78 }; |
77 | 79 |
78 IPCResourceLoaderBridge::IPCResourceLoaderBridge( | 80 IPCResourceLoaderBridge::IPCResourceLoaderBridge( |
79 ResourceDispatcher* dispatcher, | 81 ResourceDispatcher* dispatcher, |
80 const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) | 82 const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) |
81 : peer_(NULL), | 83 : peer_(NULL), |
82 dispatcher_(dispatcher), | 84 dispatcher_(dispatcher), |
83 request_id_(-1), | 85 request_id_(-1), |
84 routing_id_(request_info.routing_id) { | 86 routing_id_(request_info.routing_id), |
| 87 is_synchronous_request_(false) { |
85 DCHECK(dispatcher_) << "no resource dispatcher"; | 88 DCHECK(dispatcher_) << "no resource dispatcher"; |
86 request_.method = request_info.method; | 89 request_.method = request_info.method; |
87 request_.url = request_info.url; | 90 request_.url = request_info.url; |
88 request_.first_party_for_cookies = request_info.first_party_for_cookies; | 91 request_.first_party_for_cookies = request_info.first_party_for_cookies; |
89 request_.referrer = request_info.referrer; | 92 request_.referrer = request_info.referrer; |
90 request_.headers = request_info.headers; | 93 request_.headers = request_info.headers; |
91 request_.load_flags = request_info.load_flags; | 94 request_.load_flags = request_info.load_flags; |
92 request_.origin_pid = request_info.requestor_pid; | 95 request_.origin_pid = request_info.requestor_pid; |
93 request_.resource_type = request_info.request_type; | 96 request_.resource_type = request_info.request_type; |
94 request_.request_context = request_info.request_context; | 97 request_.request_context = request_info.request_context; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 return dispatcher_->message_sender()->Send( | 186 return dispatcher_->message_sender()->Send( |
184 new ResourceHostMsg_RequestResource(routing_id_, request_id_, request_)); | 187 new ResourceHostMsg_RequestResource(routing_id_, request_id_, request_)); |
185 } | 188 } |
186 | 189 |
187 void IPCResourceLoaderBridge::Cancel() { | 190 void IPCResourceLoaderBridge::Cancel() { |
188 if (request_id_ < 0) { | 191 if (request_id_ < 0) { |
189 NOTREACHED() << "Trying to cancel an unstarted request"; | 192 NOTREACHED() << "Trying to cancel an unstarted request"; |
190 return; | 193 return; |
191 } | 194 } |
192 | 195 |
193 dispatcher_->CancelPendingRequest(routing_id_, request_id_); | 196 if (!is_synchronous_request_) |
| 197 dispatcher_->CancelPendingRequest(routing_id_, request_id_); |
194 | 198 |
195 // We can't remove the request ID from the resource dispatcher because more | 199 // We can't remove the request ID from the resource dispatcher because more |
196 // data might be pending. Sending the cancel message may cause more data | 200 // data might be pending. Sending the cancel message may cause more data |
197 // to be flushed, and will then cause a complete message to be sent. | 201 // to be flushed, and will then cause a complete message to be sent. |
198 } | 202 } |
199 | 203 |
200 void IPCResourceLoaderBridge::SetDefersLoading(bool value) { | 204 void IPCResourceLoaderBridge::SetDefersLoading(bool value) { |
201 if (request_id_ < 0) { | 205 if (request_id_ < 0) { |
202 NOTREACHED() << "Trying to (un)defer an unstarted request"; | 206 NOTREACHED() << "Trying to (un)defer an unstarted request"; |
203 return; | 207 return; |
204 } | 208 } |
205 | 209 |
206 dispatcher_->SetDefersLoading(request_id_, value); | 210 dispatcher_->SetDefersLoading(request_id_, value); |
207 } | 211 } |
208 | 212 |
209 void IPCResourceLoaderBridge::SyncLoad(SyncLoadResponse* response) { | 213 void IPCResourceLoaderBridge::SyncLoad(SyncLoadResponse* response) { |
210 if (request_id_ != -1) { | 214 if (request_id_ != -1) { |
211 NOTREACHED() << "Starting a request twice"; | 215 NOTREACHED() << "Starting a request twice"; |
212 response->status.set_status(net::URLRequestStatus::FAILED); | 216 response->status.set_status(net::URLRequestStatus::FAILED); |
213 return; | 217 return; |
214 } | 218 } |
215 | 219 |
216 request_id_ = MakeRequestID(); | 220 request_id_ = MakeRequestID(); |
| 221 is_synchronous_request_ = true; |
217 | 222 |
218 content::SyncLoadResult result; | 223 content::SyncLoadResult result; |
219 IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad(routing_id_, request_id_, | 224 IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad(routing_id_, request_id_, |
220 request_, &result); | 225 request_, &result); |
221 // NOTE: This may pump events (see RenderThread::Send). | 226 // NOTE: This may pump events (see RenderThread::Send). |
222 if (!dispatcher_->message_sender()->Send(msg)) { | 227 if (!dispatcher_->message_sender()->Send(msg)) { |
223 response->status.set_status(net::URLRequestStatus::FAILED); | 228 response->status.set_status(net::URLRequestStatus::FAILED); |
224 return; | 229 return; |
225 } | 230 } |
226 | 231 |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 | 615 |
611 // static | 616 // static |
612 void ResourceDispatcher::ReleaseResourcesInMessageQueue(MessageQueue* queue) { | 617 void ResourceDispatcher::ReleaseResourcesInMessageQueue(MessageQueue* queue) { |
613 while (!queue->empty()) { | 618 while (!queue->empty()) { |
614 IPC::Message* message = queue->front(); | 619 IPC::Message* message = queue->front(); |
615 ReleaseResourcesInDataMessage(*message); | 620 ReleaseResourcesInDataMessage(*message); |
616 queue->pop_front(); | 621 queue->pop_front(); |
617 delete message; | 622 delete message; |
618 } | 623 } |
619 } | 624 } |
OLD | NEW |