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