Home | History | Annotate | Download | only in glue
      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 
     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