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