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 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_RENDERER_FETCHERS_RESOURCE_FETCHER_H_ 6 #define CONTENT_RENDERER_FETCHERS_RESOURCE_FETCHER_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/callback.h" 12 #include "base/compiler_specific.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/timer/timer.h" 15 #include "content/public/renderer/resource_fetcher.h" 16 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 17 #include "third_party/WebKit/public/platform/WebURLRequest.h" 18 #include "third_party/WebKit/public/platform/WebURLResponse.h" 19 20 class GURL; 21 22 namespace blink { 23 class WebFrame; 24 class WebURLLoader; 25 struct WebURLError; 26 } 27 28 namespace content { 29 30 class ResourceFetcherImpl : public ResourceFetcher, 31 public blink::WebURLLoaderClient { 32 public: 33 // ResourceFetcher implementation: 34 virtual void SetTimeout(const base::TimeDelta& timeout) OVERRIDE; 35 36 private: 37 friend class ResourceFetcher; 38 39 ResourceFetcherImpl( 40 const GURL& url, blink::WebFrame* frame, 41 blink::WebURLRequest::TargetType target_type, 42 const Callback& callback); 43 44 virtual ~ResourceFetcherImpl(); 45 46 // Start the actual download. 47 void Start(const GURL& url, blink::WebFrame* frame, 48 blink::WebURLRequest::TargetType target_type); 49 50 void RunCallback(const blink::WebURLResponse& response, 51 const std::string& data); 52 53 // Callback for timer that limits how long we wait for the server. If this 54 // timer fires and the request hasn't completed, we kill the request. 55 void TimeoutFired(); 56 57 // WebURLLoaderClient methods: 58 virtual void willSendRequest( 59 blink::WebURLLoader* loader, blink::WebURLRequest& new_request, 60 const blink::WebURLResponse& redirect_response); 61 virtual void didSendData( 62 blink::WebURLLoader* loader, unsigned long long bytes_sent, 63 unsigned long long total_bytes_to_be_sent); 64 virtual void didReceiveResponse( 65 blink::WebURLLoader* loader, const blink::WebURLResponse& response); 66 virtual void didReceiveCachedMetadata( 67 blink::WebURLLoader* loader, const char* data, int data_length); 68 69 virtual void didReceiveData( 70 blink::WebURLLoader* loader, const char* data, int data_length, 71 int encoded_data_length); 72 virtual void didFinishLoading( 73 blink::WebURLLoader* loader, double finishTime); 74 virtual void didFail( 75 blink::WebURLLoader* loader, const blink::WebURLError& error); 76 77 scoped_ptr<blink::WebURLLoader> loader_; 78 79 // Set to true once the request is complete. 80 bool completed_; 81 82 // Buffer to hold the content from the server. 83 std::string data_; 84 85 // A copy of the original resource response. 86 blink::WebURLResponse response_; 87 88 // Callback when we're done. 89 Callback callback_; 90 91 // Buffer to hold metadata from the cache. 92 std::string metadata_; 93 94 // Limit how long to wait for the server. 95 base::OneShotTimer<ResourceFetcherImpl> timeout_timer_; 96 97 DISALLOW_COPY_AND_ASSIGN(ResourceFetcherImpl); 98 }; 99 100 } // namespace content 101 102 #endif // CONTENT_RENDERER_FETCHERS_RESOURCE_FETCHER_H_ 103