15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://dev.chromium.org/developers/design-documents/multi-process-resource-loading 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef CONTENT_CHILD_RESOURCE_DISPATCHER_H_ 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define CONTENT_CHILD_RESOURCE_DISPATCHER_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_listener.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h" 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/request_priority.h" 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "webkit/common/resource_type.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct ResourceMsg_RequestCompleteData; 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace blink { 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class WebThreadedDataReceiver; 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace webkit_glue { 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ResourceLoaderBridge; 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass RequestPeer; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceDispatcherDelegate; 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ThreadedDataProvider; 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct ResourceResponseInfo; 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstruct RequestInfo; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResourceResponseHead; 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct SiteIsolationResponseMetaData; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class serves as a communication interface between the 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ResourceDispatcherHost in the browser process and the ResourceLoaderBridge in 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the child process. It can be used from any child process. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT ResourceDispatcher : public IPC::Listener { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ResourceDispatcher(IPC::Sender* sender); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ResourceDispatcher(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Listener implementation. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a ResourceLoaderBridge for this type of dispatcher, this is so 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this can be tested regardless of the ResourceLoaderBridge::Create 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implementation. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_glue::ResourceLoaderBridge* CreateBridge( 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const RequestInfo& request_info); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 600de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Adds a request from the |pending_requests_| list, returning the new 610de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // requests' ID. 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int AddPendingRequest(RequestPeer* callback, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type, 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int origin_pid, 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const GURL& frame_origin, 660de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) const GURL& request_url, 670de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) bool download_to_file); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 690de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Removes a request from the |pending_requests_| list, returning true if the 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request was found and removed. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RemovePendingRequest(int request_id); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Cancels a request in the |pending_requests_| list. The request will be 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // removed from the dispatcher as well. 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void CancelPendingRequest(int request_id); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Toggles the is_deferred attribute for the specified request. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetDefersLoading(int request_id, bool value); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates the priority of the specified request changed. 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void DidChangePriority(int request_id, 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net::RequestPriority new_priority, 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int intra_priority_value); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The provided data receiver will receive incoming resource data rather 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // than the resource bridge. 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool AttachThreadedDataReceiver( 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int request_id, blink::WebThreadedDataReceiver* threaded_data_receiver); 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 900de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) IPC::Sender* message_sender() const { return message_sender_; } 910de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This does not take ownership of the delegate. It is expected that the 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delegate have a longer lifetime than the ResourceDispatcher. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_delegate(ResourceDispatcherDelegate* delegate) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_ = delegate; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Remembers IO thread timestamp for next resource message. 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void set_io_timestamp(base::TimeTicks io_timestamp) { 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) io_timestamp_ = io_timestamp; 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ResourceDispatcherTest; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::deque<IPC::Message*> MessageQueue; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PendingRequestInfo { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingRequestInfo(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PendingRequestInfo(RequestPeer* peer, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type, 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int origin_pid, 113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const GURL& frame_origin, 1140de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) const GURL& request_url, 1150de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) bool download_to_file); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PendingRequestInfo(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RequestPeer* peer; 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ThreadedDataProvider* threaded_data_provider; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type; 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The PID of the original process which issued this request. This gets 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // non-zero only for a request proxied by another renderer, particularly 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // requests from plugins. 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int origin_pid; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageQueue deferred_message_queue; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_deferred; 128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Original requested url. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The security origin of the frame that initiates this request. 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GURL frame_origin; 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The url of the latest response even in case of redirection. 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GURL response_url; 1340de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) bool download_to_file; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<IPC::Message> pending_redirect_message; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks request_start; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks response_start; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks completion_time; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<base::SharedMemory> buffer; 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) linked_ptr<SiteIsolationResponseMetaData> site_isolation_metadata; 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool blocked_response; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<int, PendingRequestInfo> PendingRequestList; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to lookup the info based on the request_id. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // May return NULL if the request as been canceled from the client side. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingRequestInfo* GetPendingRequestInfo(int request_id); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Follows redirect, if any, for the given request. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FollowPendingRedirect(int request_id, PendingRequestInfo& request_info); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message response handlers, called by the message handler for this process. 1540de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) void OnUploadProgress(int request_id, int64 position, int64 size); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnReceivedResponse(int request_id, const ResourceResponseHead&); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnReceivedCachedMetadata(int request_id, const std::vector<char>& data); 1570de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) void OnReceivedRedirect(int request_id, 1580de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) const GURL& new_url, 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& new_first_party_for_cookies, 1600de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) const ResourceResponseHead& response_head); 1610de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) void OnSetDataBuffer(int request_id, 1620de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) base::SharedMemoryHandle shm_handle, 1630de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) int shm_size, 1640de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) base::ProcessId renderer_pid); 1650de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) void OnReceivedData(int request_id, 1660de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) int data_offset, 1670de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) int data_length, 1680de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) int encoded_data_length); 1690de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) void OnDownloadedData(int request_id, int data_len, int encoded_data_length); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnRequestComplete( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id, 1720de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) const ResourceMsg_RequestCompleteData& request_complete_data); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatch the message to one of the message response handlers. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DispatchMessage(const IPC::Message& message); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatch any deferred messages for the given request, provided it is not 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // again in the deferred state. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FlushDeferredMessages(int request_id); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void ToResourceResponseInfo(const PendingRequestInfo& request_info, 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ResourceResponseHead& browser_info, 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResourceResponseInfo* renderer_info) const; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks ToRendererCompletionTime( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PendingRequestInfo& request_info, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& browser_completion_time) const; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns timestamp provided by IO thread. If no timestamp is supplied, 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // then current time is returned. Saved timestamp is reset, so following 191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // invocations will return current time until set_io_timestamp is called. 192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::TimeTicks ConsumeIOTimestamp(); 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the message passed in is a resource related message. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsResourceDispatcherMessage(const IPC::Message& message); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ViewHostMsg_Resource_DataReceived is not POD, it has a shared memory 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handle in it that we should cleanup it up nicely. This method accepts any 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message and determine whether the message is 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ViewHostMsg_Resource_DataReceived and clean up the shared memory handle. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ReleaseResourcesInDataMessage(const IPC::Message& message); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterate through a message queue and clean up the messages by calling 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ReleaseResourcesInDataMessage and removing them from the queue. Intended 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for use on deferred message queues that are no longer needed. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ReleaseResourcesInMessageQueue(MessageQueue* queue); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Sender* message_sender_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All pending requests issued to the host 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingRequestList pending_requests_; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<ResourceDispatcher> weak_factory_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherDelegate* delegate_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // IO thread timestamp for ongoing IPC message. 218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::TimeTicks io_timestamp_; 219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ResourceDispatcher); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // CONTENT_CHILD_RESOURCE_DISPATCHER_H_ 226