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 // 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/browser/loader/resource_dispatcher_host_impl.h" | 7 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
8 | 8 |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 | 10 |
(...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1188 if (!handler->SanityCheckIsSameContext(filter_->service_worker_context())) { | 1188 if (!handler->SanityCheckIsSameContext(filter_->service_worker_context())) { |
1189 bad_message::ReceivedBadMessage( | 1189 bad_message::ReceivedBadMessage( |
1190 filter_, bad_message::RDHI_WRONG_STORAGE_PARTITION); | 1190 filter_, bad_message::RDHI_WRONG_STORAGE_PARTITION); |
1191 } else { | 1191 } else { |
1192 handler->CompleteCrossSiteTransfer( | 1192 handler->CompleteCrossSiteTransfer( |
1193 child_id, request_data.service_worker_provider_id); | 1193 child_id, request_data.service_worker_provider_id); |
1194 } | 1194 } |
1195 } | 1195 } |
1196 } | 1196 } |
1197 | 1197 |
| 1198 void ResourceDispatcherHostImpl::CompleteTransfer( |
| 1199 int request_id, |
| 1200 const ResourceRequest& request_data, |
| 1201 int route_id) { |
| 1202 // Caller should ensure that |request_data| is associated with a transfer. |
| 1203 DCHECK(request_data.transferred_request_child_id != -1 || |
| 1204 request_data.transferred_request_request_id != -1); |
| 1205 |
| 1206 bool is_navigational_request = |
| 1207 request_data.resource_type == RESOURCE_TYPE_MAIN_FRAME || |
| 1208 request_data.resource_type == RESOURCE_TYPE_SUB_FRAME; |
| 1209 if (!is_navigational_request) { |
| 1210 // Transfers apply only to navigational requests - the renderer seems to |
| 1211 // have sent bogus IPC data. |
| 1212 bad_message::ReceivedBadMessage( |
| 1213 filter_, bad_message::RDH_TRANSFERRING_NONNAVIGATIONAL_REQUEST); |
| 1214 return; |
| 1215 } |
| 1216 |
| 1217 // Attempt to find a loader associated with the deferred transfer request. |
| 1218 LoaderMap::iterator it = pending_loaders_.find( |
| 1219 GlobalRequestID(request_data.transferred_request_child_id, |
| 1220 request_data.transferred_request_request_id)); |
| 1221 if (it == pending_loaders_.end()) { |
| 1222 // Renderer sent transferred_request_request_id and/or |
| 1223 // transferred_request_child_id that doesn't have a corresponding entry on |
| 1224 // the browser side. |
| 1225 bad_message::ReceivedBadMessage( |
| 1226 filter_, bad_message::RDH_TRANSFERRING_REQUEST_NOT_FOUND); |
| 1227 return; |
| 1228 } |
| 1229 ResourceLoader* pending_loader = it->second.get(); |
| 1230 |
| 1231 if (!pending_loader->is_transferring()) { |
| 1232 // Renderer sent transferred_request_request_id and/or |
| 1233 // transferred_request_child_id that doesn't correspond to an actually |
| 1234 // transferring loader on the browser side. |
| 1235 base::debug::Alias(pending_loader); |
| 1236 bad_message::ReceivedBadMessage(filter_, |
| 1237 bad_message::RDH_REQUEST_NOT_TRANSFERRING); |
| 1238 return; |
| 1239 } |
| 1240 |
| 1241 // If the request is transferring to a new process, we can update our |
| 1242 // state and let it resume with its existing ResourceHandlers. |
| 1243 UpdateRequestForTransfer(filter_->child_id(), route_id, request_id, |
| 1244 request_data, it); |
| 1245 pending_loader->CompleteTransfer(); |
| 1246 } |
| 1247 |
1198 void ResourceDispatcherHostImpl::BeginRequest( | 1248 void ResourceDispatcherHostImpl::BeginRequest( |
1199 int request_id, | 1249 int request_id, |
1200 const ResourceRequest& request_data, | 1250 const ResourceRequest& request_data, |
1201 const SyncLoadResultCallback& sync_result_handler, // only valid for sync | 1251 const SyncLoadResultCallback& sync_result_handler, // only valid for sync |
1202 int route_id, | 1252 int route_id, |
1203 mojo::InterfaceRequest<mojom::URLLoader> mojo_request, | 1253 mojo::InterfaceRequest<mojom::URLLoader> mojo_request, |
1204 mojom::URLLoaderClientPtr url_loader_client) { | 1254 mojom::URLLoaderClientPtr url_loader_client) { |
1205 int process_type = filter_->process_type(); | 1255 int process_type = filter_->process_type(); |
1206 int child_id = filter_->child_id(); | 1256 int child_id = filter_->child_id(); |
1207 | 1257 |
(...skipping 24 matching lines...) Expand all Loading... |
1232 } | 1282 } |
1233 | 1283 |
1234 // If we crash here, figure out what URL the renderer was requesting. | 1284 // If we crash here, figure out what URL the renderer was requesting. |
1235 // http://crbug.com/91398 | 1285 // http://crbug.com/91398 |
1236 char url_buf[128]; | 1286 char url_buf[128]; |
1237 base::strlcpy(url_buf, request_data.url.spec().c_str(), arraysize(url_buf)); | 1287 base::strlcpy(url_buf, request_data.url.spec().c_str(), arraysize(url_buf)); |
1238 base::debug::Alias(url_buf); | 1288 base::debug::Alias(url_buf); |
1239 | 1289 |
1240 // If the request that's coming in is being transferred from another process, | 1290 // If the request that's coming in is being transferred from another process, |
1241 // we want to reuse and resume the old loader rather than start a new one. | 1291 // we want to reuse and resume the old loader rather than start a new one. |
1242 LoaderMap::iterator it = pending_loaders_.find( | 1292 if (request_data.transferred_request_child_id != -1 || |
1243 GlobalRequestID(request_data.transferred_request_child_id, | 1293 request_data.transferred_request_request_id != -1) { |
1244 request_data.transferred_request_request_id)); | |
1245 if (it != pending_loaders_.end()) { | |
1246 // TODO(yhirano): Make mojo work for this case. | 1294 // TODO(yhirano): Make mojo work for this case. |
1247 DCHECK(!url_loader_client); | 1295 DCHECK(!url_loader_client); |
1248 | 1296 |
1249 // If the request is transferring to a new process, we can update our | 1297 CompleteTransfer(request_id, request_data, route_id); |
1250 // state and let it resume with its existing ResourceHandlers. | |
1251 if (it->second->is_transferring()) { | |
1252 ResourceLoader* deferred_loader = it->second.get(); | |
1253 UpdateRequestForTransfer(child_id, route_id, request_id, | |
1254 request_data, it); | |
1255 deferred_loader->CompleteTransfer(); | |
1256 } else { | |
1257 bad_message::ReceivedBadMessage( | |
1258 filter_, bad_message::RDH_REQUEST_NOT_TRANSFERRING); | |
1259 } | |
1260 return; | 1298 return; |
1261 } | 1299 } |
1262 | 1300 |
1263 ResourceContext* resource_context = NULL; | 1301 ResourceContext* resource_context = NULL; |
1264 net::URLRequestContext* request_context = NULL; | 1302 net::URLRequestContext* request_context = NULL; |
1265 filter_->GetContexts(request_data.resource_type, &resource_context, | 1303 filter_->GetContexts(request_data.resource_type, &resource_context, |
1266 &request_context); | 1304 &request_context); |
1267 | 1305 |
1268 // Parse the headers before calling ShouldServiceRequest, so that they are | 1306 // Parse the headers before calling ShouldServiceRequest, so that they are |
1269 // available to be validated. | 1307 // available to be validated. |
(...skipping 1481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2751 &throttles); | 2789 &throttles); |
2752 if (!throttles.empty()) { | 2790 if (!throttles.empty()) { |
2753 handler.reset(new ThrottlingResourceHandler(std::move(handler), request, | 2791 handler.reset(new ThrottlingResourceHandler(std::move(handler), request, |
2754 std::move(throttles))); | 2792 std::move(throttles))); |
2755 } | 2793 } |
2756 } | 2794 } |
2757 return handler; | 2795 return handler; |
2758 } | 2796 } |
2759 | 2797 |
2760 } // namespace content | 2798 } // namespace content |
OLD | NEW |