OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/common/resource_dispatcher.h" | 7 #include "chrome/common/resource_dispatcher.h" |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 if (new_peer) { | 360 if (new_peer) { |
361 request_info.peer = new_peer; | 361 request_info.peer = new_peer; |
362 peer = new_peer; | 362 peer = new_peer; |
363 } | 363 } |
364 | 364 |
365 RESOURCE_LOG("Dispatching response for " << | 365 RESOURCE_LOG("Dispatching response for " << |
366 peer->GetURLForDebugging().possibly_invalid_spec()); | 366 peer->GetURLForDebugging().possibly_invalid_spec()); |
367 peer->OnReceivedResponse(response_head, false); | 367 peer->OnReceivedResponse(response_head, false); |
368 } | 368 } |
369 | 369 |
| 370 void ResourceDispatcher::OnReceivedCachedMetadata( |
| 371 int request_id, const std::vector<char>& data) { |
| 372 PendingRequestList::iterator it = pending_requests_.find(request_id); |
| 373 if (it == pending_requests_.end()) { |
| 374 // this might happen for kill()ed requests on the webkit end, so perhaps |
| 375 // it shouldn't be a warning... |
| 376 DLOG(WARNING) << "Got metadata for a nonexistant or finished request"; |
| 377 return; |
| 378 } |
| 379 |
| 380 if (data.size()) { |
| 381 PendingRequestInfo& request_info = it->second; |
| 382 RESOURCE_LOG("Dispatching " << data.size() << " metadata bytes for " << |
| 383 request_info.peer->GetURLForDebugging().possibly_invalid_spec()); |
| 384 request_info.peer->OnReceivedCachedMetadata(&data.front(), data.size()); |
| 385 } |
| 386 } |
| 387 |
370 void ResourceDispatcher::OnReceivedData(const IPC::Message& message, | 388 void ResourceDispatcher::OnReceivedData(const IPC::Message& message, |
371 int request_id, | 389 int request_id, |
372 base::SharedMemoryHandle shm_handle, | 390 base::SharedMemoryHandle shm_handle, |
373 int data_len) { | 391 int data_len) { |
374 // Acknowledge the reception of this data. | 392 // Acknowledge the reception of this data. |
375 message_sender()->Send( | 393 message_sender()->Send( |
376 new ViewHostMsg_DataReceived_ACK(message.routing_id(), request_id)); | 394 new ViewHostMsg_DataReceived_ACK(message.routing_id(), request_id)); |
377 | 395 |
378 const bool shm_valid = base::SharedMemory::IsHandleValid(shm_handle); | 396 const bool shm_valid = base::SharedMemory::IsHandleValid(shm_handle); |
379 DCHECK((shm_valid && data_len > 0) || (!shm_valid && !data_len)); | 397 DCHECK((shm_valid && data_len > 0) || (!shm_valid && !data_len)); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 MessageLoop::current()->PostTask(FROM_HERE, | 539 MessageLoop::current()->PostTask(FROM_HERE, |
522 method_factory_.NewRunnableMethod( | 540 method_factory_.NewRunnableMethod( |
523 &ResourceDispatcher::FlushDeferredMessages, request_id)); | 541 &ResourceDispatcher::FlushDeferredMessages, request_id)); |
524 } | 542 } |
525 } | 543 } |
526 | 544 |
527 void ResourceDispatcher::DispatchMessage(const IPC::Message& message) { | 545 void ResourceDispatcher::DispatchMessage(const IPC::Message& message) { |
528 IPC_BEGIN_MESSAGE_MAP(ResourceDispatcher, message) | 546 IPC_BEGIN_MESSAGE_MAP(ResourceDispatcher, message) |
529 IPC_MESSAGE_HANDLER(ViewMsg_Resource_UploadProgress, OnUploadProgress) | 547 IPC_MESSAGE_HANDLER(ViewMsg_Resource_UploadProgress, OnUploadProgress) |
530 IPC_MESSAGE_HANDLER(ViewMsg_Resource_ReceivedResponse, OnReceivedResponse) | 548 IPC_MESSAGE_HANDLER(ViewMsg_Resource_ReceivedResponse, OnReceivedResponse) |
| 549 IPC_MESSAGE_HANDLER( |
| 550 ViewMsg_Resource_ReceivedCachedMetadata, OnReceivedCachedMetadata) |
531 IPC_MESSAGE_HANDLER(ViewMsg_Resource_ReceivedRedirect, OnReceivedRedirect) | 551 IPC_MESSAGE_HANDLER(ViewMsg_Resource_ReceivedRedirect, OnReceivedRedirect) |
532 IPC_MESSAGE_HANDLER(ViewMsg_Resource_DataReceived, OnReceivedData) | 552 IPC_MESSAGE_HANDLER(ViewMsg_Resource_DataReceived, OnReceivedData) |
533 IPC_MESSAGE_HANDLER(ViewMsg_Resource_RequestComplete, OnRequestComplete) | 553 IPC_MESSAGE_HANDLER(ViewMsg_Resource_RequestComplete, OnRequestComplete) |
534 IPC_END_MESSAGE_MAP() | 554 IPC_END_MESSAGE_MAP() |
535 } | 555 } |
536 | 556 |
537 void ResourceDispatcher::FlushDeferredMessages(int request_id) { | 557 void ResourceDispatcher::FlushDeferredMessages(int request_id) { |
538 PendingRequestList::iterator it = pending_requests_.find(request_id); | 558 PendingRequestList::iterator it = pending_requests_.find(request_id); |
539 if (it == pending_requests_.end()) // The request could have become invalid. | 559 if (it == pending_requests_.end()) // The request could have become invalid. |
540 return; | 560 return; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 return new webkit_glue::IPCResourceLoaderBridge(this, request_info, | 592 return new webkit_glue::IPCResourceLoaderBridge(this, request_info, |
573 host_renderer_id, | 593 host_renderer_id, |
574 host_render_view_id); | 594 host_render_view_id); |
575 } | 595 } |
576 | 596 |
577 bool ResourceDispatcher::IsResourceDispatcherMessage( | 597 bool ResourceDispatcher::IsResourceDispatcherMessage( |
578 const IPC::Message& message) { | 598 const IPC::Message& message) { |
579 switch (message.type()) { | 599 switch (message.type()) { |
580 case ViewMsg_Resource_UploadProgress::ID: | 600 case ViewMsg_Resource_UploadProgress::ID: |
581 case ViewMsg_Resource_ReceivedResponse::ID: | 601 case ViewMsg_Resource_ReceivedResponse::ID: |
| 602 case ViewMsg_Resource_ReceivedCachedMetadata::ID: |
582 case ViewMsg_Resource_ReceivedRedirect::ID: | 603 case ViewMsg_Resource_ReceivedRedirect::ID: |
583 case ViewMsg_Resource_DataReceived::ID: | 604 case ViewMsg_Resource_DataReceived::ID: |
584 case ViewMsg_Resource_RequestComplete::ID: | 605 case ViewMsg_Resource_RequestComplete::ID: |
585 return true; | 606 return true; |
586 | 607 |
587 default: | 608 default: |
588 break; | 609 break; |
589 } | 610 } |
590 | 611 |
591 return false; | 612 return false; |
(...skipping 23 matching lines...) Expand all Loading... |
615 | 636 |
616 // static | 637 // static |
617 void ResourceDispatcher::ReleaseResourcesInMessageQueue(MessageQueue* queue) { | 638 void ResourceDispatcher::ReleaseResourcesInMessageQueue(MessageQueue* queue) { |
618 while (!queue->empty()) { | 639 while (!queue->empty()) { |
619 IPC::Message* message = queue->front(); | 640 IPC::Message* message = queue->front(); |
620 ReleaseResourcesInDataMessage(*message); | 641 ReleaseResourcesInDataMessage(*message); |
621 queue->pop_front(); | 642 queue->pop_front(); |
622 delete message; | 643 delete message; |
623 } | 644 } |
624 } | 645 } |
OLD | NEW |