• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // A wrapper around ResourceHandle and ResourceHandleClient that simplifies
6 // the download of an HTTP object.  The interface is modeled after URLFetcher
7 // in the /chrome/browser.
8 //
9 // ResourceFetcher::Delegate::OnURLFetchComplete will be called async after
10 // the ResourceFetcher object is created.
11 
12 #ifndef WEBKIT_GLUE_RESOURCE_FETCHER_H_
13 #define WEBKIT_GLUE_RESOURCE_FETCHER_H_
14 
15 #include <string>
16 
17 #include "base/basictypes.h"
18 #include "base/callback.h"
19 #include "base/memory/scoped_ptr.h"
20 #include "base/timer.h"
21 #include "googleurl/src/gurl.h"
22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h"
23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
25 
26 class GURL;
27 
28 namespace WebKit {
29 class WebFrame;
30 class WebURLLoader;
31 struct WebURLError;
32 }
33 
34 namespace webkit_glue {
35 
36 class ResourceFetcher : public WebKit::WebURLLoaderClient {
37  public:
38   // This will be called when the URL has been fetched, successfully or not.
39   // If there is a failure, response and data will both be empty.  |response|
40   // and |data| are both valid until the URLFetcher instance is destroyed.
41   typedef Callback2<const WebKit::WebURLResponse&,
42                     const std::string&>::Type Callback;
43 
44   // We need a frame to make requests.
45   ResourceFetcher(
46       const GURL& url, WebKit::WebFrame* frame,
47       WebKit::WebURLRequest::TargetType target_type, Callback* callback);
48   ~ResourceFetcher();
49 
50   // Stop the request and don't call the callback.
51   void Cancel();
52 
completed()53   bool completed() const { return completed_; }
54 
55  protected:
56   // WebURLLoaderClient methods:
57   virtual void willSendRequest(
58       WebKit::WebURLLoader* loader, WebKit::WebURLRequest& new_request,
59       const WebKit::WebURLResponse& redirect_response);
60   virtual void didSendData(
61       WebKit::WebURLLoader* loader, unsigned long long bytes_sent,
62       unsigned long long total_bytes_to_be_sent);
63   virtual void didReceiveResponse(
64       WebKit::WebURLLoader* loader, const WebKit::WebURLResponse& response);
65   virtual void didReceiveCachedMetadata(
66       WebKit::WebURLLoader* loader, const char* data, int data_length);
67 
68   virtual void didReceiveData(
69       WebKit::WebURLLoader* loader, const char* data, int data_length,
70       int encoded_data_length);
71   virtual void didFinishLoading(
72       WebKit::WebURLLoader* loader, double finishTime);
73   virtual void didFail(
74       WebKit::WebURLLoader* loader, const WebKit::WebURLError& error);
75 
76   scoped_ptr<WebKit::WebURLLoader> loader_;
77 
78   // URL we're fetching
79   GURL url_;
80 
81   // Target type
82   WebKit::WebURLRequest::TargetType target_type_;
83 
84   // A copy of the original resource response
85   WebKit::WebURLResponse response_;
86 
87   // Set to true once the request is compelte.
88   bool completed_;
89 
90  private:
91   // Start the actual download.
92   void Start(WebKit::WebFrame* frame);
93 
94   void RunCallback(const WebKit::WebURLResponse& response,
95                    const std::string& data);
96 
97   // Callback when we're done
98   scoped_ptr<Callback> callback_;
99 
100   // Buffer to hold the content from the server.
101   std::string data_;
102 
103   // Buffer to hold metadata from the cache.
104   std::string metadata_;
105 };
106 
107 /////////////////////////////////////////////////////////////////////////////
108 // A resource fetcher with a timeout
109 class ResourceFetcherWithTimeout : public ResourceFetcher {
110  public:
111   ResourceFetcherWithTimeout(const GURL& url,
112                              WebKit::WebFrame* frame,
113                              WebKit::WebURLRequest::TargetType target_type,
114                              int timeout_secs,
115                              Callback* callback);
116   virtual ~ResourceFetcherWithTimeout();
117 
118  private:
119   // Callback for timer that limits how long we wait for the alternate error
120   // page server.  If this timer fires and the request hasn't completed, we
121   // kill the request.
122   void TimeoutFired();
123 
124   // Limit how long we wait for the alternate error page server.
125   base::OneShotTimer<ResourceFetcherWithTimeout> timeout_timer_;
126 };
127 
128 }  // namespace webkit_glue
129 
130 #endif  // WEBKIT_GLUE_RESOURCE_FETCHER_H_
131