• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_FRAME_PLUGIN_URL_REQUEST_H_
6 #define CHROME_FRAME_PLUGIN_URL_REQUEST_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "base/memory/ref_counted.h"
12 #include "base/time/time.h"
13 #include "base/win/scoped_comptr.h"
14 #include "chrome_frame/chrome_frame_delegate.h"
15 #include "chrome_frame/urlmon_upload_data_stream.h"
16 #include "ipc/ipc_message.h"
17 #include "net/base/host_port_pair.h"
18 #include "net/base/upload_data.h"
19 #include "net/url_request/url_request_status.h"
20 #include "webkit/common/resource_type.h"
21 
22 class PluginUrlRequest;
23 class PluginUrlRequestDelegate;
24 class PluginUrlRequestManager;
25 
26 class DECLSPEC_NOVTABLE PluginUrlRequestDelegate {  // NOLINT
27  public:
28   virtual void OnResponseStarted(
29       int request_id, const char* mime_type, const char* headers, int size,
30       base::Time last_modified, const std::string& redirect_url,
31       int redirect_status, const net::HostPortPair& socket_address,
32       uint64 upload_size) = 0;
33   virtual void OnReadComplete(int request_id, const std::string& data) = 0;
34   virtual void OnResponseEnd(int request_id,
35                              const net::URLRequestStatus& status) = 0;
AddPrivacyDataForUrl(const std::string & url,const std::string & policy_ref,int32 flags)36   virtual void AddPrivacyDataForUrl(const std::string& url,
37                                     const std::string& policy_ref,
38                                     int32 flags) {}
39  protected:
PluginUrlRequestDelegate()40   PluginUrlRequestDelegate() {}
~PluginUrlRequestDelegate()41   ~PluginUrlRequestDelegate() {}
42 };
43 
44 class DECLSPEC_NOVTABLE PluginUrlRequestManager {  // NOLINT
45  public:
PluginUrlRequestManager()46   PluginUrlRequestManager() : delegate_(NULL), enable_frame_busting_(true) {}
~PluginUrlRequestManager()47   virtual ~PluginUrlRequestManager() {}
48 
set_frame_busting(bool enable)49   void set_frame_busting(bool enable) {
50     enable_frame_busting_ = enable;
51   }
52 
set_delegate(PluginUrlRequestDelegate * delegate)53   virtual void set_delegate(PluginUrlRequestDelegate* delegate) {
54     delegate_ = delegate;
55   }
56 
57   enum ThreadSafeFlags {
58     NOT_THREADSAFE               = 0x00,
59     START_REQUEST_THREADSAFE     = 0x01,
60     STOP_REQUEST_THREADSAFE      = 0x02,
61     READ_REQUEST_THREADSAFE      = 0x04,
62     DOWNLOAD_REQUEST_THREADSAFE  = 0x08,
63     COOKIE_REQUEST_THREADSAFE    = 0x10
64   };
65   virtual ThreadSafeFlags GetThreadSafeFlags() = 0;
66 
67   // These are called directly from Automation Client when network related
68   // automation messages are received from Chrome.
69   // Strip 'tab' handle and forward to the virtual methods implemented by
70   // derived classes.
StartUrlRequest(int request_id,const AutomationURLRequest & request_info)71   void StartUrlRequest(int request_id,
72                        const AutomationURLRequest& request_info) {
73     StartRequest(request_id, request_info);
74   }
75 
ReadUrlRequest(int request_id,int bytes_to_read)76   void ReadUrlRequest(int request_id, int bytes_to_read) {
77     ReadRequest(request_id, bytes_to_read);
78   }
79 
EndUrlRequest(int request_id,const net::URLRequestStatus & s)80   void EndUrlRequest(int request_id, const net::URLRequestStatus& s) {
81     EndRequest(request_id);
82   }
83 
DownloadUrlRequestInHost(int request_id)84   void DownloadUrlRequestInHost(int request_id) {
85     DownloadRequestInHost(request_id);
86   }
87 
StopAllRequests()88   void StopAllRequests() {
89     StopAll();
90   }
91 
92  protected:
93   PluginUrlRequestDelegate* delegate_;
94   bool enable_frame_busting_;
95 
96  private:
97   virtual void StartRequest(
98       int request_id, const AutomationURLRequest& request_info) = 0;
99   virtual void ReadRequest(int request_id, int bytes_to_read) = 0;
100   virtual void EndRequest(int request_id) = 0;
101   virtual void DownloadRequestInHost(int request_id) = 0;
102   virtual void StopAll() = 0;
103 };
104 
105 // Used as base class. Holds Url request properties (url, method, referrer..)
106 class PluginUrlRequest {
107  public:
108   PluginUrlRequest();
109   ~PluginUrlRequest();
110 
111   bool Initialize(PluginUrlRequestDelegate* delegate,
112       int remote_request_id, const std::string& url, const std::string& method,
113       const std::string& referrer, const std::string& extra_headers,
114       net::UploadData* upload_data, ResourceType::Type resource_type,
115       bool enable_frame_busting_, int load_flags);
116 
117   // Accessors.
id()118   int id() const {
119     return remote_request_id_;
120   }
121 
url()122   const std::string& url() const {
123     return url_;
124   }
125 
method()126   const std::string& method() const {
127     return method_;
128   }
129 
referrer()130   const std::string& referrer() const {
131     return referrer_;
132   }
133 
extra_headers()134   const std::string& extra_headers() const {
135     return extra_headers_;
136   }
137 
post_data_len()138   uint64 post_data_len() const {
139     return post_data_len_;
140   }
141 
is_chunked_upload()142   bool is_chunked_upload() const {
143     return is_chunked_upload_;
144   }
145 
146  protected:
get_upload_data(IStream ** ret)147   HRESULT get_upload_data(IStream** ret) {
148     DCHECK(ret);
149     if (!upload_data_.get())
150       return S_FALSE;
151     *ret = upload_data_.get();
152     (*ret)->AddRef();
153     return S_OK;
154   }
155 
set_url(const std::string & url)156   void set_url(const std::string& url) {
157     url_ = url;
158   }
159 
160   void SendData();
161   bool enable_frame_busting_;
162 
163   PluginUrlRequestDelegate* delegate_;
164   int remote_request_id_;
165   uint64 post_data_len_;
166   std::string url_;
167   std::string method_;
168   std::string referrer_;
169   std::string extra_headers_;
170   ResourceType::Type resource_type_;
171   int load_flags_;
172   base::win::ScopedComPtr<IStream> upload_data_;
173   bool is_chunked_upload_;
174   // Contains the ip address and port of the destination host.
175   net::HostPortPair socket_address_;
176 };
177 
178 #endif  // CHROME_FRAME_PLUGIN_URL_REQUEST_H_
179