Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / renderer / security_filter_peer.h
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 #ifndef CHROME_RENDERER_SECURITY_FILTER_PEER_H_
6 #define CHROME_RENDERER_SECURITY_FILTER_PEER_H_
7
8 #include "content/public/child/request_peer.h"
9 #include "webkit/common/resource_response_info.h"
10 #include "webkit/common/resource_type.h"
11
12 // The SecurityFilterPeer is a proxy to a
13 // content::RequestPeer instance.  It is used to pre-process
14 // unsafe resources (such as mixed-content resource).
15 // Call the factory method CreateSecurityFilterPeer() to obtain an instance of
16 // SecurityFilterPeer based on the original Peer.
17 // NOTE: subclasses should insure they delete themselves at the end of the
18 // OnReceiveComplete call.
19 class SecurityFilterPeer : public content::RequestPeer {
20  public:
21   virtual ~SecurityFilterPeer();
22
23   static SecurityFilterPeer* CreateSecurityFilterPeerForDeniedRequest(
24       ResourceType::Type resource_type,
25       content::RequestPeer* peer,
26       int os_error);
27
28   static SecurityFilterPeer* CreateSecurityFilterPeerForFrame(
29       content::RequestPeer* peer,
30       int os_error);
31
32   // content::RequestPeer methods.
33   virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE;
34   virtual bool OnReceivedRedirect(const GURL& new_url,
35                                   const webkit_glue::ResourceResponseInfo& info,
36                                   bool* has_new_first_party_for_cookies,
37                                   GURL* new_first_party_for_cookies) OVERRIDE;
38   virtual void OnReceivedResponse(
39       const webkit_glue::ResourceResponseInfo& info) OVERRIDE;
40   virtual void OnDownloadedData(int len, int encoded_data_length) OVERRIDE {}
41   virtual void OnReceivedData(const char* data,
42                               int data_length,
43                               int encoded_data_length) OVERRIDE;
44   virtual void OnCompletedRequest(int error_code,
45                                   bool was_ignored_by_handler,
46                                   bool stale_copy_in_cache,
47                                   const std::string& security_info,
48                                   const base::TimeTicks& completion_time,
49                                   int64 total_transfer_size) OVERRIDE;
50
51  protected:
52   explicit SecurityFilterPeer(content::RequestPeer* peer);
53
54   content::RequestPeer* original_peer_;
55
56  private:
57   DISALLOW_COPY_AND_ASSIGN(SecurityFilterPeer);
58 };
59
60 // The BufferedPeer reads all the data of the request into an internal buffer.
61 // Subclasses should implement DataReady() to process the data as necessary.
62 class BufferedPeer : public SecurityFilterPeer {
63  public:
64   BufferedPeer(content::RequestPeer* peer, const std::string& mime_type);
65   virtual ~BufferedPeer();
66
67   // content::RequestPeer Implementation.
68   virtual void OnReceivedResponse(
69       const webkit_glue::ResourceResponseInfo& info) OVERRIDE;
70   virtual void OnReceivedData(const char* data,
71                               int data_length,
72                               int encoded_data_length) OVERRIDE;
73   virtual void OnCompletedRequest(
74       int error_code,
75       bool was_ignored_by_handler,
76       bool stale_copy_in_cache,
77       const std::string& security_info,
78       const base::TimeTicks& completion_time,
79       int64 total_transfer_size) OVERRIDE;
80
81  protected:
82   // Invoked when the entire request has been processed before the data is sent
83   // to the original peer, giving an opportunity to subclasses to process the
84   // data in data_.  If this method returns true, the data is fed to the
85   // original peer, if it returns false, an error is sent instead.
86   virtual bool DataReady() = 0;
87
88   webkit_glue::ResourceResponseInfo response_info_;
89   std::string data_;
90
91  private:
92   std::string mime_type_;
93
94   DISALLOW_COPY_AND_ASSIGN(BufferedPeer);
95 };
96
97 // The ReplaceContentPeer cancels the request and serves the provided data as
98 // content instead.
99 // TODO(jcampan): For now the resource is still being fetched, but ignored, as
100 // once we have provided the replacement content, the associated pending request
101 // in ResourceDispatcher is removed and further OnReceived* notifications are
102 // ignored.
103 class ReplaceContentPeer : public SecurityFilterPeer {
104  public:
105   ReplaceContentPeer(content::RequestPeer* peer,
106                      const std::string& mime_type,
107                      const std::string& data);
108   virtual ~ReplaceContentPeer();
109
110   // content::RequestPeer Implementation.
111   virtual void OnReceivedResponse(
112       const webkit_glue::ResourceResponseInfo& info) OVERRIDE;
113   virtual void OnReceivedData(const char* data,
114                               int data_length,
115                               int encoded_data_length) OVERRIDE;
116   virtual void OnCompletedRequest(
117       int error_code,
118       bool was_ignored_by_handler,
119       bool stale_copy_in_cache,
120       const std::string& security_info,
121       const base::TimeTicks& completion_time,
122       int64 total_transfer_size) OVERRIDE;
123
124  private:
125   webkit_glue::ResourceResponseInfo response_info_;
126   std::string mime_type_;
127   std::string data_;
128
129   DISALLOW_COPY_AND_ASSIGN(ReplaceContentPeer);
130 };
131
132 #endif  // CHROME_RENDERER_SECURITY_FILTER_PEER_H_