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 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_LOADER_ASYNC_RESOURCE_HANDLER_H_ 6 #define CONTENT_BROWSER_LOADER_ASYNC_RESOURCE_HANDLER_H_ 7 8 #include <string> 9 10 #include "base/memory/ref_counted.h" 11 #include "content/browser/loader/resource_handler.h" 12 #include "content/browser/loader/resource_message_delegate.h" 13 #include "url/gurl.h" 14 15 namespace net { 16 class URLRequest; 17 } 18 19 namespace content { 20 class ResourceBuffer; 21 class ResourceContext; 22 class ResourceDispatcherHostImpl; 23 class ResourceMessageFilter; 24 class SharedIOBuffer; 25 26 // Used to complete an asynchronous resource request in response to resource 27 // load events from the resource dispatcher host. 28 class AsyncResourceHandler : public ResourceHandler, 29 public ResourceMessageDelegate { 30 public: 31 AsyncResourceHandler(net::URLRequest* request, 32 ResourceDispatcherHostImpl* rdh); 33 virtual ~AsyncResourceHandler(); 34 35 virtual bool OnMessageReceived(const IPC::Message& message, 36 bool* message_was_ok) OVERRIDE; 37 38 // ResourceHandler implementation: 39 virtual bool OnUploadProgress(int request_id, 40 uint64 position, 41 uint64 size) OVERRIDE; 42 virtual bool OnRequestRedirected(int request_id, 43 const GURL& new_url, 44 ResourceResponse* response, 45 bool* defer) OVERRIDE; 46 virtual bool OnResponseStarted(int request_id, 47 ResourceResponse* response, 48 bool* defer) OVERRIDE; 49 virtual bool OnWillStart(int request_id, 50 const GURL& url, 51 bool* defer) OVERRIDE; 52 virtual bool OnWillRead(int request_id, 53 scoped_refptr<net::IOBuffer>* buf, 54 int* buf_size, 55 int min_size) OVERRIDE; 56 virtual bool OnReadCompleted(int request_id, 57 int bytes_read, 58 bool* defer) OVERRIDE; 59 virtual void OnResponseCompleted(int request_id, 60 const net::URLRequestStatus& status, 61 const std::string& security_info, 62 bool* defer) OVERRIDE; 63 virtual void OnDataDownloaded(int request_id, 64 int bytes_downloaded) OVERRIDE; 65 66 private: 67 // IPC message handlers: 68 void OnFollowRedirect(int request_id, 69 bool has_new_first_party_for_cookies, 70 const GURL& new_first_party_for_cookies); 71 void OnDataReceivedACK(int request_id); 72 73 bool EnsureResourceBufferIsInitialized(); 74 void ResumeIfDeferred(); 75 void OnDefer(); 76 77 scoped_refptr<ResourceBuffer> buffer_; 78 ResourceDispatcherHostImpl* rdh_; 79 80 // Number of messages we've sent to the renderer that we haven't gotten an 81 // ACK for. This allows us to avoid having too many messages in flight. 82 int pending_data_count_; 83 84 int allocation_size_; 85 86 bool did_defer_; 87 88 bool has_checked_for_sufficient_resources_; 89 bool sent_received_response_msg_; 90 bool sent_first_data_msg_; 91 92 DISALLOW_COPY_AND_ASSIGN(AsyncResourceHandler); 93 }; 94 95 } // namespace content 96 97 #endif // CONTENT_BROWSER_LOADER_ASYNC_RESOURCE_HANDLER_H_ 98