| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // A wrapper around ResourceHandle and ResourceHandleClient that simplifies |
| // the download of an HTTP object. The interface is modeled after URLFetcher |
| // in the /chrome/browser. |
| // |
| // ResourceFetcher::Delegate::OnURLFetchComplete will be called async after |
| // the ResourceFetcher object is created. |
| |
| #ifndef WEBKIT_GLUE_RESOURCE_FETCHER_H_ |
| #define WEBKIT_GLUE_RESOURCE_FETCHER_H_ |
| |
| #include <string> |
| |
| #include "base/basictypes.h" |
| #include "base/callback.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/timer.h" |
| #include "googleurl/src/gurl.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h" |
| |
| class GURL; |
| |
| namespace WebKit { |
| class WebFrame; |
| class WebURLLoader; |
| struct WebURLError; |
| } |
| |
| namespace webkit_glue { |
| |
| class ResourceFetcher : public WebKit::WebURLLoaderClient { |
| public: |
| // This will be called when the URL has been fetched, successfully or not. |
| // If there is a failure, response and data will both be empty. |response| |
| // and |data| are both valid until the URLFetcher instance is destroyed. |
| typedef Callback2<const WebKit::WebURLResponse&, |
| const std::string&>::Type Callback; |
| |
| // We need a frame to make requests. |
| ResourceFetcher( |
| const GURL& url, WebKit::WebFrame* frame, |
| WebKit::WebURLRequest::TargetType target_type, Callback* callback); |
| ~ResourceFetcher(); |
| |
| // Stop the request and don't call the callback. |
| void Cancel(); |
| |
| bool completed() const { return completed_; } |
| |
| protected: |
| // WebURLLoaderClient methods: |
| virtual void willSendRequest( |
| WebKit::WebURLLoader* loader, WebKit::WebURLRequest& new_request, |
| const WebKit::WebURLResponse& redirect_response); |
| virtual void didSendData( |
| WebKit::WebURLLoader* loader, unsigned long long bytes_sent, |
| unsigned long long total_bytes_to_be_sent); |
| virtual void didReceiveResponse( |
| WebKit::WebURLLoader* loader, const WebKit::WebURLResponse& response); |
| virtual void didReceiveCachedMetadata( |
| WebKit::WebURLLoader* loader, const char* data, int data_length); |
| |
| virtual void didReceiveData( |
| WebKit::WebURLLoader* loader, const char* data, int data_length, |
| int encoded_data_length); |
| virtual void didFinishLoading( |
| WebKit::WebURLLoader* loader, double finishTime); |
| virtual void didFail( |
| WebKit::WebURLLoader* loader, const WebKit::WebURLError& error); |
| |
| scoped_ptr<WebKit::WebURLLoader> loader_; |
| |
| // URL we're fetching |
| GURL url_; |
| |
| // Target type |
| WebKit::WebURLRequest::TargetType target_type_; |
| |
| // A copy of the original resource response |
| WebKit::WebURLResponse response_; |
| |
| // Set to true once the request is compelte. |
| bool completed_; |
| |
| private: |
| // Start the actual download. |
| void Start(WebKit::WebFrame* frame); |
| |
| void RunCallback(const WebKit::WebURLResponse& response, |
| const std::string& data); |
| |
| // Callback when we're done |
| scoped_ptr<Callback> callback_; |
| |
| // Buffer to hold the content from the server. |
| std::string data_; |
| |
| // Buffer to hold metadata from the cache. |
| std::string metadata_; |
| }; |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // A resource fetcher with a timeout |
| class ResourceFetcherWithTimeout : public ResourceFetcher { |
| public: |
| ResourceFetcherWithTimeout(const GURL& url, |
| WebKit::WebFrame* frame, |
| WebKit::WebURLRequest::TargetType target_type, |
| int timeout_secs, |
| Callback* callback); |
| virtual ~ResourceFetcherWithTimeout(); |
| |
| private: |
| // Callback for timer that limits how long we wait for the alternate error |
| // page server. If this timer fires and the request hasn't completed, we |
| // kill the request. |
| void TimeoutFired(); |
| |
| // Limit how long we wait for the alternate error page server. |
| base::OneShotTimer<ResourceFetcherWithTimeout> timeout_timer_; |
| }; |
| |
| } // namespace webkit_glue |
| |
| #endif // WEBKIT_GLUE_RESOURCE_FETCHER_H_ |