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/browser/renderer_host/resource_dispatcher_host.h" | 7 #include "content/browser/renderer_host/resource_dispatcher_host.h" |
8 | 8 |
9 #include <set> | 9 #include <set> |
10 #include <vector> | 10 #include <vector> |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 allow_cross_origin_auth_prompt_(false) { | 305 allow_cross_origin_auth_prompt_(false) { |
306 resource_queue_.Initialize(resource_queue_delegates); | 306 resource_queue_.Initialize(resource_queue_delegates); |
307 | 307 |
308 ANNOTATE_BENIGN_RACE( | 308 ANNOTATE_BENIGN_RACE( |
309 &last_user_gesture_time_, | 309 &last_user_gesture_time_, |
310 "We don't care about the precise value, see http://crbug.com/92889"); | 310 "We don't care about the precise value, see http://crbug.com/92889"); |
311 } | 311 } |
312 | 312 |
313 ResourceDispatcherHost::~ResourceDispatcherHost() { | 313 ResourceDispatcherHost::~ResourceDispatcherHost() { |
314 AsyncResourceHandler::GlobalCleanup(); | 314 AsyncResourceHandler::GlobalCleanup(); |
| 315 for (PendingRequestList::const_iterator i = pending_requests_.begin(); |
| 316 i != pending_requests_.end(); ++i) { |
| 317 transferred_navigations_.erase(i->first); |
| 318 } |
315 STLDeleteValues(&pending_requests_); | 319 STLDeleteValues(&pending_requests_); |
| 320 DCHECK(transferred_navigations_.empty()); |
316 } | 321 } |
317 | 322 |
318 void ResourceDispatcherHost::Initialize() { | 323 void ResourceDispatcherHost::Initialize() { |
319 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 324 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
320 BrowserThread::PostTask( | 325 BrowserThread::PostTask( |
321 BrowserThread::IO, FROM_HERE, | 326 BrowserThread::IO, FROM_HERE, |
322 base::Bind(&appcache::AppCacheInterceptor::EnsureRegistered)); | 327 base::Bind(&appcache::AppCacheInterceptor::EnsureRegistered)); |
323 } | 328 } |
324 | 329 |
325 void ResourceDispatcherHost::Shutdown() { | 330 void ResourceDispatcherHost::Shutdown() { |
326 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 331 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
327 BrowserThread::PostTask(BrowserThread::IO, | 332 BrowserThread::PostTask(BrowserThread::IO, |
328 FROM_HERE, | 333 FROM_HERE, |
329 base::Bind(&ResourceDispatcherHost::OnShutdown, | 334 base::Bind(&ResourceDispatcherHost::OnShutdown, |
330 base::Unretained(this))); | 335 base::Unretained(this))); |
331 } | 336 } |
332 | 337 |
333 void ResourceDispatcherHost::SetRequestInfo( | 338 void ResourceDispatcherHost::SetRequestInfo( |
334 net::URLRequest* request, | 339 net::URLRequest* request, |
335 ResourceDispatcherHostRequestInfo* info) { | 340 ResourceDispatcherHostRequestInfo* info) { |
336 request->SetUserData(NULL, info); | 341 request->SetUserData(NULL, info); |
337 } | 342 } |
338 | 343 |
339 void ResourceDispatcherHost::OnShutdown() { | 344 void ResourceDispatcherHost::OnShutdown() { |
340 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 345 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
341 is_shutdown_ = true; | 346 is_shutdown_ = true; |
342 resource_queue_.Shutdown(); | 347 resource_queue_.Shutdown(); |
| 348 for (PendingRequestList::const_iterator i = pending_requests_.begin(); |
| 349 i != pending_requests_.end(); ++i) { |
| 350 transferred_navigations_.erase(i->first); |
| 351 } |
343 STLDeleteValues(&pending_requests_); | 352 STLDeleteValues(&pending_requests_); |
344 // Make sure we shutdown the timer now, otherwise by the time our destructor | 353 // Make sure we shutdown the timer now, otherwise by the time our destructor |
345 // runs if the timer is still running the Task is deleted twice (once by | 354 // runs if the timer is still running the Task is deleted twice (once by |
346 // the MessageLoop and the second time by RepeatingTimer). | 355 // the MessageLoop and the second time by RepeatingTimer). |
347 update_load_states_timer_.Stop(); | 356 update_load_states_timer_.Stop(); |
348 | 357 |
349 // Clear blocked requests if any left. | 358 // Clear blocked requests if any left. |
350 // Note that we have to do this in 2 passes as we cannot call | 359 // Note that we have to do this in 2 passes as we cannot call |
351 // CancelBlockedRequestsForRoute while iterating over | 360 // CancelBlockedRequestsForRoute while iterating over |
352 // blocked_requests_map_, as it modifies it. | 361 // blocked_requests_map_, as it modifies it. |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 int route_id) { | 459 int route_id) { |
451 content::ProcessType process_type = filter_->process_type(); | 460 content::ProcessType process_type = filter_->process_type(); |
452 int child_id = filter_->child_id(); | 461 int child_id = filter_->child_id(); |
453 | 462 |
454 // If we crash here, figure out what URL the renderer was requesting. | 463 // If we crash here, figure out what URL the renderer was requesting. |
455 // http://crbug.com/91398 | 464 // http://crbug.com/91398 |
456 char url_buf[128]; | 465 char url_buf[128]; |
457 base::strlcpy(url_buf, request_data.url.spec().c_str(), arraysize(url_buf)); | 466 base::strlcpy(url_buf, request_data.url.spec().c_str(), arraysize(url_buf)); |
458 base::debug::Alias(url_buf); | 467 base::debug::Alias(url_buf); |
459 | 468 |
| 469 // If the request that's coming in is being transferred from another process, |
| 470 // we want to reuse and resume the old request rather than start a new one. |
| 471 net::URLRequest* deferred_request = NULL; |
| 472 |
| 473 GlobalRequestID old_request_id(request_data.transferred_request_child_id, |
| 474 request_data.transferred_request_request_id); |
| 475 TransferredNavigations::iterator iter = |
| 476 transferred_navigations_.find(old_request_id); |
| 477 if (iter != transferred_navigations_.end()) { |
| 478 deferred_request = iter->second; |
| 479 pending_requests_.erase(old_request_id); |
| 480 transferred_navigations_.erase(iter); |
| 481 } |
| 482 |
460 const content::ResourceContext& resource_context = | 483 const content::ResourceContext& resource_context = |
461 filter_->resource_context(); | 484 filter_->resource_context(); |
462 | 485 |
463 // Might need to resolve the blob references in the upload data. | 486 // Might need to resolve the blob references in the upload data. |
464 if (request_data.upload_data) { | 487 if (request_data.upload_data) { |
465 resource_context.blob_storage_context()->controller()-> | 488 resource_context.blob_storage_context()->controller()-> |
466 ResolveBlobReferencesInUploadData(request_data.upload_data.get()); | 489 ResolveBlobReferencesInUploadData(request_data.upload_data.get()); |
467 } | 490 } |
468 | 491 |
469 if (is_shutdown_ || | 492 if (is_shutdown_ || |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 handler = new RedirectToFileResourceHandler(handler, child_id, this); | 524 handler = new RedirectToFileResourceHandler(handler, child_id, this); |
502 | 525 |
503 if (HandleExternalProtocol(request_id, child_id, route_id, | 526 if (HandleExternalProtocol(request_id, child_id, route_id, |
504 request_data.url, request_data.resource_type, | 527 request_data.url, request_data.resource_type, |
505 *resource_context.request_context()->job_factory(), | 528 *resource_context.request_context()->job_factory(), |
506 handler)) { | 529 handler)) { |
507 return; | 530 return; |
508 } | 531 } |
509 | 532 |
510 // Construct the request. | 533 // Construct the request. |
511 net::URLRequest* request = new net::URLRequest(request_data.url, this); | 534 net::URLRequest* request; |
512 request->set_method(request_data.method); | 535 if (deferred_request) { |
513 request->set_first_party_for_cookies(request_data.first_party_for_cookies); | 536 request = deferred_request; |
514 request->set_referrer(referrer.spec()); | 537 } else { |
515 net::HttpRequestHeaders headers; | 538 request = new net::URLRequest(request_data.url, this); |
516 headers.AddHeadersFromString(request_data.headers); | 539 request->set_method(request_data.method); |
517 request->SetExtraRequestHeaders(headers); | 540 request->set_first_party_for_cookies(request_data.first_party_for_cookies); |
| 541 request->set_referrer(referrer.spec()); |
| 542 net::HttpRequestHeaders headers; |
| 543 headers.AddHeadersFromString(request_data.headers); |
| 544 request->SetExtraRequestHeaders(headers); |
| 545 } |
518 | 546 |
519 int load_flags = request_data.load_flags; | 547 int load_flags = request_data.load_flags; |
520 // Although EV status is irrelevant to sub-frames and sub-resources, we have | 548 // Although EV status is irrelevant to sub-frames and sub-resources, we have |
521 // to perform EV certificate verification on all resources because an HTTP | 549 // to perform EV certificate verification on all resources because an HTTP |
522 // keep-alive connection created to load a sub-frame or a sub-resource could | 550 // keep-alive connection created to load a sub-frame or a sub-resource could |
523 // be reused to load a main frame. | 551 // be reused to load a main frame. |
524 load_flags |= net::LOAD_VERIFY_EV_CERT; | 552 load_flags |= net::LOAD_VERIFY_EV_CERT; |
525 if (request_data.resource_type == ResourceType::MAIN_FRAME) { | 553 if (request_data.resource_type == ResourceType::MAIN_FRAME) { |
526 load_flags |= net::LOAD_MAIN_FRAME; | 554 load_flags |= net::LOAD_MAIN_FRAME; |
527 } else if (request_data.resource_type == ResourceType::SUB_FRAME) { | 555 } else if (request_data.resource_type == ResourceType::SUB_FRAME) { |
528 load_flags |= net::LOAD_SUB_FRAME; | 556 load_flags |= net::LOAD_SUB_FRAME; |
529 } else if (request_data.resource_type == ResourceType::PREFETCH) { | 557 } else if (request_data.resource_type == ResourceType::PREFETCH) { |
530 load_flags |= (net::LOAD_PREFETCH | net::LOAD_DO_NOT_PROMPT_FOR_LOGIN); | 558 load_flags |= (net::LOAD_PREFETCH | net::LOAD_DO_NOT_PROMPT_FOR_LOGIN); |
531 } else if (request_data.resource_type == ResourceType::FAVICON) { | 559 } else if (request_data.resource_type == ResourceType::FAVICON) { |
532 load_flags |= net::LOAD_DO_NOT_PROMPT_FOR_LOGIN; | 560 load_flags |= net::LOAD_DO_NOT_PROMPT_FOR_LOGIN; |
533 } | 561 } |
534 | 562 |
535 if (sync_result) | 563 if (sync_result) |
536 load_flags |= net::LOAD_IGNORE_LIMITS; | 564 load_flags |= net::LOAD_IGNORE_LIMITS; |
537 | 565 |
538 ChildProcessSecurityPolicy* policy = | 566 ChildProcessSecurityPolicy* policy = |
539 ChildProcessSecurityPolicy::GetInstance(); | 567 ChildProcessSecurityPolicy::GetInstance(); |
540 if (!policy->CanUseCookiesForOrigin(child_id, request_data.url)) { | 568 if (!policy->CanUseCookiesForOrigin(child_id, request_data.url)) { |
541 load_flags |= (net::LOAD_DO_NOT_SEND_COOKIES | | 569 load_flags |= (net::LOAD_DO_NOT_SEND_COOKIES | |
542 net::LOAD_DO_NOT_SEND_AUTH_DATA | | 570 net::LOAD_DO_NOT_SEND_AUTH_DATA | |
543 net::LOAD_DO_NOT_SAVE_COOKIES); | 571 net::LOAD_DO_NOT_SAVE_COOKIES); |
544 } | 572 } |
545 | 573 |
546 // Raw headers are sensitive, as they inclide Cookie/Set-Cookie, so only | 574 // Raw headers are sensitive, as they include Cookie/Set-Cookie, so only |
547 // allow requesting them if requestor has ReadRawCookies permission. | 575 // allow requesting them if requester has ReadRawCookies permission. |
548 if ((load_flags & net::LOAD_REPORT_RAW_HEADERS) | 576 if ((load_flags & net::LOAD_REPORT_RAW_HEADERS) |
549 && !policy->CanReadRawCookies(child_id)) { | 577 && !policy->CanReadRawCookies(child_id)) { |
550 VLOG(1) << "Denied unathorized request for raw headers"; | 578 VLOG(1) << "Denied unauthorized request for raw headers"; |
551 load_flags &= ~net::LOAD_REPORT_RAW_HEADERS; | 579 load_flags &= ~net::LOAD_REPORT_RAW_HEADERS; |
552 } | 580 } |
553 | 581 |
554 request->set_load_flags(load_flags); | 582 request->set_load_flags(load_flags); |
| 583 |
555 request->set_context( | 584 request->set_context( |
556 filter_->GetURLRequestContext(request_data.resource_type)); | 585 filter_->GetURLRequestContext(request_data.resource_type)); |
557 request->set_priority(DetermineRequestPriority(request_data.resource_type)); | 586 request->set_priority(DetermineRequestPriority(request_data.resource_type)); |
558 | 587 |
559 // Set upload data. | 588 // Set upload data. |
560 uint64 upload_size = 0; | 589 uint64 upload_size = 0; |
561 if (request_data.upload_data) { | 590 if (request_data.upload_data) { |
562 request->set_upload(request_data.upload_data); | 591 request->set_upload(request_data.upload_data); |
563 upload_size = request_data.upload_data->GetContentLength(); | 592 upload_size = request_data.upload_data->GetContentLength(); |
564 } | 593 } |
(...skipping 12 matching lines...) Expand all Loading... |
577 child_id, | 606 child_id, |
578 route_id, | 607 route_id, |
579 this); | 608 this); |
580 } | 609 } |
581 | 610 |
582 // Insert a buffered event handler before the actual one. | 611 // Insert a buffered event handler before the actual one. |
583 handler = new BufferedResourceHandler(handler, this, request); | 612 handler = new BufferedResourceHandler(handler, this, request); |
584 | 613 |
585 if (delegate_) { | 614 if (delegate_) { |
586 bool sub = request_data.resource_type != ResourceType::MAIN_FRAME; | 615 bool sub = request_data.resource_type != ResourceType::MAIN_FRAME; |
587 handler = delegate_->RequestBeginning(handler, request, resource_context, | 616 bool is_continuation_of_transferred_request = |
588 sub, child_id, route_id); | 617 (deferred_request != NULL); |
| 618 handler = delegate_->RequestBeginning( |
| 619 handler, request, resource_context, sub, child_id, route_id, |
| 620 is_continuation_of_transferred_request); |
589 } | 621 } |
590 | 622 |
591 // Make extra info and read footer (contains request ID). | 623 // Make extra info and read footer (contains request ID). |
592 ResourceDispatcherHostRequestInfo* extra_info = | 624 ResourceDispatcherHostRequestInfo* extra_info = |
593 new ResourceDispatcherHostRequestInfo( | 625 new ResourceDispatcherHostRequestInfo( |
594 handler, | 626 handler, |
595 process_type, | 627 process_type, |
596 child_id, | 628 child_id, |
597 route_id, | 629 route_id, |
598 request_data.origin_pid, | 630 request_data.origin_pid, |
(...skipping 18 matching lines...) Expand all Loading... |
617 resource_context.blob_storage_context()->controller(); | 649 resource_context.blob_storage_context()->controller(); |
618 extra_info->set_requested_blob_data( | 650 extra_info->set_requested_blob_data( |
619 controller->GetBlobDataFromUrl(request->url())); | 651 controller->GetBlobDataFromUrl(request->url())); |
620 } | 652 } |
621 | 653 |
622 // Have the appcache associate its extra info with the request. | 654 // Have the appcache associate its extra info with the request. |
623 appcache::AppCacheInterceptor::SetExtraRequestInfo( | 655 appcache::AppCacheInterceptor::SetExtraRequestInfo( |
624 request, resource_context.appcache_service(), child_id, | 656 request, resource_context.appcache_service(), child_id, |
625 request_data.appcache_host_id, request_data.resource_type); | 657 request_data.appcache_host_id, request_data.resource_type); |
626 | 658 |
627 BeginRequestInternal(request); | 659 if (deferred_request) { |
| 660 // This is a request that has been transferred from another process, so |
| 661 // resume it rather than continuing the regular procedure for starting a |
| 662 // request. Currently this is only done for redirects. |
| 663 GlobalRequestID global_id(extra_info->child_id(), extra_info->request_id()); |
| 664 pending_requests_[global_id] = request; |
| 665 request->FollowDeferredRedirect(); |
| 666 } else { |
| 667 BeginRequestInternal(request); |
| 668 } |
628 } | 669 } |
629 | 670 |
630 void ResourceDispatcherHost::OnReleaseDownloadedFile(int request_id) { | 671 void ResourceDispatcherHost::OnReleaseDownloadedFile(int request_id) { |
631 DCHECK(pending_requests_.end() == | 672 DCHECK(pending_requests_.end() == |
632 pending_requests_.find( | 673 pending_requests_.find( |
633 GlobalRequestID(filter_->child_id(), request_id))); | 674 GlobalRequestID(filter_->child_id(), request_id))); |
634 UnregisterDownloadedTempFile(filter_->child_id(), request_id); | 675 UnregisterDownloadedTempFile(filter_->child_id(), request_id); |
635 } | 676 } |
636 | 677 |
637 void ResourceDispatcherHost::OnDataReceivedACK(int request_id) { | 678 void ResourceDispatcherHost::OnDataReceivedACK(int request_id) { |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 // matching requests to be cancelled, and then we cancel them. Since there | 1073 // matching requests to be cancelled, and then we cancel them. Since there |
1033 // may be more than one request to cancel, we cannot simply hold onto the map | 1074 // may be more than one request to cancel, we cannot simply hold onto the map |
1034 // iterators found in the first loop. | 1075 // iterators found in the first loop. |
1035 | 1076 |
1036 // Find the global ID of all matching elements. | 1077 // Find the global ID of all matching elements. |
1037 std::vector<GlobalRequestID> matching_requests; | 1078 std::vector<GlobalRequestID> matching_requests; |
1038 for (PendingRequestList::const_iterator i = pending_requests_.begin(); | 1079 for (PendingRequestList::const_iterator i = pending_requests_.begin(); |
1039 i != pending_requests_.end(); ++i) { | 1080 i != pending_requests_.end(); ++i) { |
1040 if (i->first.child_id == child_id) { | 1081 if (i->first.child_id == child_id) { |
1041 ResourceDispatcherHostRequestInfo* info = InfoForRequest(i->second); | 1082 ResourceDispatcherHostRequestInfo* info = InfoForRequest(i->second); |
| 1083 GlobalRequestID id(child_id, i->first.request_id); |
| 1084 DCHECK(id == i->first); |
| 1085 // Don't cancel navigations that are transferring to another process, |
| 1086 // since they belong to another process now. |
1042 if (!info->is_download() && | 1087 if (!info->is_download() && |
| 1088 (transferred_navigations_.find(id) == |
| 1089 transferred_navigations_.end()) && |
1043 (route_id == -1 || route_id == info->route_id())) { | 1090 (route_id == -1 || route_id == info->route_id())) { |
1044 matching_requests.push_back( | 1091 matching_requests.push_back( |
1045 GlobalRequestID(child_id, i->first.request_id)); | 1092 GlobalRequestID(child_id, i->first.request_id)); |
1046 } | 1093 } |
1047 } | 1094 } |
1048 } | 1095 } |
1049 | 1096 |
1050 // Remove matches. | 1097 // Remove matches. |
1051 for (size_t i = 0; i < matching_requests.size(); ++i) { | 1098 for (size_t i = 0; i < matching_requests.size(); ++i) { |
1052 PendingRequestList::iterator iter = | 1099 PendingRequestList::iterator iter = |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1411 | 1458 |
1412 NotifyResponseStarted(request, info->child_id()); | 1459 NotifyResponseStarted(request, info->child_id()); |
1413 info->set_called_on_response_started(true); | 1460 info->set_called_on_response_started(true); |
1414 return info->resource_handler()->OnResponseStarted(info->request_id(), | 1461 return info->resource_handler()->OnResponseStarted(info->request_id(), |
1415 response.get()); | 1462 response.get()); |
1416 } | 1463 } |
1417 | 1464 |
1418 void ResourceDispatcherHost::CancelRequest(int child_id, | 1465 void ResourceDispatcherHost::CancelRequest(int child_id, |
1419 int request_id, | 1466 int request_id, |
1420 bool from_renderer) { | 1467 bool from_renderer) { |
1421 PendingRequestList::iterator i = pending_requests_.find( | 1468 GlobalRequestID id(child_id, request_id); |
1422 GlobalRequestID(child_id, request_id)); | 1469 if (from_renderer) { |
| 1470 // When the old renderer dies, it sends a message to us to cancel its |
| 1471 // requests. |
| 1472 if (transferred_navigations_.find(id) != transferred_navigations_.end()) |
| 1473 return; |
| 1474 } |
| 1475 |
| 1476 PendingRequestList::iterator i = pending_requests_.find(id); |
1423 if (i == pending_requests_.end()) { | 1477 if (i == pending_requests_.end()) { |
1424 // We probably want to remove this warning eventually, but I wanted to be | 1478 // We probably want to remove this warning eventually, but I wanted to be |
1425 // able to notice when this happens during initial development since it | 1479 // able to notice when this happens during initial development since it |
1426 // should be rare and may indicate a bug. | 1480 // should be rare and may indicate a bug. |
1427 DLOG(WARNING) << "Canceling a request that wasn't found"; | 1481 DLOG(WARNING) << "Canceling a request that wasn't found"; |
1428 return; | 1482 return; |
1429 } | 1483 } |
1430 net::URLRequest* request = i->second; | 1484 net::URLRequest* request = i->second; |
1431 const bool started_before_cancel = request->is_pending(); | 1485 const bool started_before_cancel = request->is_pending(); |
1432 | 1486 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1474 OutstandingRequestsMemoryCostMap::iterator prev_entry = | 1528 OutstandingRequestsMemoryCostMap::iterator prev_entry = |
1475 outstanding_requests_memory_cost_map_.find(child_id); | 1529 outstanding_requests_memory_cost_map_.find(child_id); |
1476 int new_cost = 0; | 1530 int new_cost = 0; |
1477 if (prev_entry != outstanding_requests_memory_cost_map_.end()) | 1531 if (prev_entry != outstanding_requests_memory_cost_map_.end()) |
1478 new_cost = prev_entry->second; | 1532 new_cost = prev_entry->second; |
1479 | 1533 |
1480 // Insert/update the total; delete entries when their value reaches 0. | 1534 // Insert/update the total; delete entries when their value reaches 0. |
1481 new_cost += cost; | 1535 new_cost += cost; |
1482 CHECK(new_cost >= 0); | 1536 CHECK(new_cost >= 0); |
1483 if (new_cost == 0) | 1537 if (new_cost == 0) |
1484 outstanding_requests_memory_cost_map_.erase(prev_entry); | 1538 outstanding_requests_memory_cost_map_.erase(child_id); |
1485 else | 1539 else |
1486 outstanding_requests_memory_cost_map_[child_id] = new_cost; | 1540 outstanding_requests_memory_cost_map_[child_id] = new_cost; |
1487 | 1541 |
1488 return new_cost; | 1542 return new_cost; |
1489 } | 1543 } |
1490 | 1544 |
1491 // static | 1545 // static |
1492 int ResourceDispatcherHost::CalculateApproximateMemoryCost( | 1546 int ResourceDispatcherHost::CalculateApproximateMemoryCost( |
1493 net::URLRequest* request) { | 1547 net::URLRequest* request) { |
1494 // The following fields should be a minor size contribution (experimentally | 1548 // The following fields should be a minor size contribution (experimentally |
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2172 return HTTP_AUTH_RESOURCE_BLOCKED_CROSS; | 2226 return HTTP_AUTH_RESOURCE_BLOCKED_CROSS; |
2173 } | 2227 } |
2174 | 2228 |
2175 bool ResourceDispatcherHost::allow_cross_origin_auth_prompt() { | 2229 bool ResourceDispatcherHost::allow_cross_origin_auth_prompt() { |
2176 return allow_cross_origin_auth_prompt_; | 2230 return allow_cross_origin_auth_prompt_; |
2177 } | 2231 } |
2178 | 2232 |
2179 void ResourceDispatcherHost::set_allow_cross_origin_auth_prompt(bool value) { | 2233 void ResourceDispatcherHost::set_allow_cross_origin_auth_prompt(bool value) { |
2180 allow_cross_origin_auth_prompt_ = value; | 2234 allow_cross_origin_auth_prompt_ = value; |
2181 } | 2235 } |
| 2236 |
| 2237 void ResourceDispatcherHost::MarkAsTransferredNavigation( |
| 2238 const GlobalRequestID& transferred_request_id, |
| 2239 net::URLRequest* ransferred_request) { |
| 2240 transferred_navigations_[transferred_request_id] = ransferred_request; |
| 2241 } |
OLD | NEW |