OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/proxy/ppb_url_loader_proxy.h" | 5 #include "ppapi/proxy/ppb_url_loader_proxy.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <deque> | 8 #include <deque> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 class URLLoader : public Resource, public PPB_URLLoader_API { | 84 class URLLoader : public Resource, public PPB_URLLoader_API { |
85 public: | 85 public: |
86 URLLoader(const HostResource& resource); | 86 URLLoader(const HostResource& resource); |
87 virtual ~URLLoader(); | 87 virtual ~URLLoader(); |
88 | 88 |
89 // Resource overrides. | 89 // Resource overrides. |
90 virtual PPB_URLLoader_API* AsPPB_URLLoader_API() OVERRIDE; | 90 virtual PPB_URLLoader_API* AsPPB_URLLoader_API() OVERRIDE; |
91 | 91 |
92 // PPB_URLLoader_API implementation. | 92 // PPB_URLLoader_API implementation. |
93 virtual int32_t Open(PP_Resource request_id, | 93 virtual int32_t Open(PP_Resource request_id, |
94 PP_CompletionCallback callback) OVERRIDE; | 94 scoped_refptr<TrackedCallback> callback) OVERRIDE; |
95 virtual int32_t FollowRedirect(PP_CompletionCallback callback) OVERRIDE; | 95 virtual int32_t FollowRedirect( |
| 96 scoped_refptr<TrackedCallback> callback) OVERRIDE; |
96 virtual PP_Bool GetUploadProgress(int64_t* bytes_sent, | 97 virtual PP_Bool GetUploadProgress(int64_t* bytes_sent, |
97 int64_t* total_bytes_to_be_sent) OVERRIDE; | 98 int64_t* total_bytes_to_be_sent) OVERRIDE; |
98 virtual PP_Bool GetDownloadProgress( | 99 virtual PP_Bool GetDownloadProgress( |
99 int64_t* bytes_received, | 100 int64_t* bytes_received, |
100 int64_t* total_bytes_to_be_received) OVERRIDE; | 101 int64_t* total_bytes_to_be_received) OVERRIDE; |
101 virtual PP_Resource GetResponseInfo() OVERRIDE; | 102 virtual PP_Resource GetResponseInfo() OVERRIDE; |
102 virtual int32_t ReadResponseBody(void* buffer, | 103 virtual int32_t ReadResponseBody( |
103 int32_t bytes_to_read, | 104 void* buffer, |
104 PP_CompletionCallback callback) OVERRIDE; | 105 int32_t bytes_to_read, |
| 106 scoped_refptr<TrackedCallback> callback) OVERRIDE; |
105 virtual int32_t FinishStreamingToFile( | 107 virtual int32_t FinishStreamingToFile( |
106 PP_CompletionCallback callback) OVERRIDE; | 108 scoped_refptr<TrackedCallback> callback) OVERRIDE; |
107 virtual void Close() OVERRIDE; | 109 virtual void Close() OVERRIDE; |
108 virtual void GrantUniversalAccess() OVERRIDE; | 110 virtual void GrantUniversalAccess() OVERRIDE; |
109 virtual void SetStatusCallback( | 111 virtual void SetStatusCallback( |
110 PP_URLLoaderTrusted_StatusCallback cb) OVERRIDE; | 112 PP_URLLoaderTrusted_StatusCallback cb) OVERRIDE; |
111 | 113 |
112 // Called when the browser has new up/download progress to report. | 114 // Called when the browser has new up/download progress to report. |
113 void UpdateProgress(const PPBURLLoader_UpdateProgress_Params& params); | 115 void UpdateProgress(const PPBURLLoader_UpdateProgress_Params& params); |
114 | 116 |
115 // Called when the browser responds to our ReadResponseBody request. | 117 // Called when the browser responds to our ReadResponseBody request. |
116 void ReadResponseBodyAck(int32_t result, const std::string& data); | 118 void ReadResponseBodyAck(int32_t result, const std::string& data); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 URLLoader::~URLLoader() { | 173 URLLoader::~URLLoader() { |
172 if (response_info_) | 174 if (response_info_) |
173 PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(response_info_); | 175 PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(response_info_); |
174 } | 176 } |
175 | 177 |
176 PPB_URLLoader_API* URLLoader::AsPPB_URLLoader_API() { | 178 PPB_URLLoader_API* URLLoader::AsPPB_URLLoader_API() { |
177 return this; | 179 return this; |
178 } | 180 } |
179 | 181 |
180 int32_t URLLoader::Open(PP_Resource request_id, | 182 int32_t URLLoader::Open(PP_Resource request_id, |
181 PP_CompletionCallback callback) { | 183 scoped_refptr<TrackedCallback> callback) { |
182 EnterResourceNoLock<thunk::PPB_URLRequestInfo_API> enter(request_id, true); | 184 EnterResourceNoLock<thunk::PPB_URLRequestInfo_API> enter(request_id, true); |
183 if (enter.failed()) { | 185 if (enter.failed()) { |
184 Log(PP_LOGLEVEL_ERROR, "PPB_URLLoader.Open: The URL you're requesting is " | 186 Log(PP_LOGLEVEL_ERROR, "PPB_URLLoader.Open: The URL you're requesting is " |
185 " on a different security origin than your plugin. To request " | 187 " on a different security origin than your plugin. To request " |
186 " cross-origin resources, see " | 188 " cross-origin resources, see " |
187 " PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS."); | 189 " PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS."); |
188 return PP_ERROR_BADRESOURCE; | 190 return PP_ERROR_BADRESOURCE; |
189 } | 191 } |
190 | 192 |
191 if (TrackedCallback::IsPending(current_callback_)) | 193 if (TrackedCallback::IsPending(current_callback_)) |
192 return PP_ERROR_INPROGRESS; | 194 return PP_ERROR_INPROGRESS; |
193 | 195 |
194 if (!callback.func) | 196 current_callback_ = callback; |
195 return PP_ERROR_BLOCKS_MAIN_THREAD; | |
196 current_callback_ = new TrackedCallback(this, callback); | |
197 | 197 |
198 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_Open( | 198 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_Open( |
199 API_ID_PPB_URL_LOADER, host_resource(), enter.object()->GetData())); | 199 API_ID_PPB_URL_LOADER, host_resource(), enter.object()->GetData())); |
200 return PP_OK_COMPLETIONPENDING; | 200 return PP_OK_COMPLETIONPENDING; |
201 } | 201 } |
202 | 202 |
203 int32_t URLLoader::FollowRedirect(PP_CompletionCallback callback) { | 203 int32_t URLLoader::FollowRedirect(scoped_refptr<TrackedCallback> callback) { |
204 if (TrackedCallback::IsPending(current_callback_)) | 204 if (TrackedCallback::IsPending(current_callback_)) |
205 return PP_ERROR_INPROGRESS; | 205 return PP_ERROR_INPROGRESS; |
206 | 206 |
207 if (!callback.func) | 207 current_callback_ = callback; |
208 return PP_ERROR_BLOCKS_MAIN_THREAD; | |
209 current_callback_ = new TrackedCallback(this, callback); | |
210 | 208 |
211 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_FollowRedirect( | 209 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_FollowRedirect( |
212 API_ID_PPB_URL_LOADER, host_resource())); | 210 API_ID_PPB_URL_LOADER, host_resource())); |
213 return PP_OK_COMPLETIONPENDING; | 211 return PP_OK_COMPLETIONPENDING; |
214 } | 212 } |
215 | 213 |
216 PP_Bool URLLoader::GetUploadProgress(int64_t* bytes_sent, | 214 PP_Bool URLLoader::GetUploadProgress(int64_t* bytes_sent, |
217 int64_t* total_bytes_to_be_sent) { | 215 int64_t* total_bytes_to_be_sent) { |
218 if (bytes_sent_ == -1) { | 216 if (bytes_sent_ == -1) { |
219 *bytes_sent = 0; | 217 *bytes_sent = 0; |
(...skipping 30 matching lines...) Expand all Loading... |
250 response_id); | 248 response_id); |
251 } | 249 } |
252 | 250 |
253 // The caller expects to get a ref, and we want to keep holding ours. | 251 // The caller expects to get a ref, and we want to keep holding ours. |
254 PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(response_info_); | 252 PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(response_info_); |
255 return response_info_; | 253 return response_info_; |
256 } | 254 } |
257 | 255 |
258 int32_t URLLoader::ReadResponseBody(void* buffer, | 256 int32_t URLLoader::ReadResponseBody(void* buffer, |
259 int32_t bytes_to_read, | 257 int32_t bytes_to_read, |
260 PP_CompletionCallback callback) { | 258 scoped_refptr<TrackedCallback> callback) { |
261 if (!buffer || bytes_to_read <= 0) | 259 if (!buffer || bytes_to_read <= 0) |
262 return PP_ERROR_BADARGUMENT; // Must specify an output buffer. | 260 return PP_ERROR_BADARGUMENT; // Must specify an output buffer. |
263 if (TrackedCallback::IsPending(current_callback_)) | 261 if (TrackedCallback::IsPending(current_callback_)) |
264 return PP_ERROR_INPROGRESS; // Can only have one request pending. | 262 return PP_ERROR_INPROGRESS; // Can only have one request pending. |
265 | 263 |
266 // Currently we don't support sync calls to read. We'll need to revisit | |
267 // how this works when we allow blocking calls (from background threads). | |
268 if (!callback.func) | |
269 return PP_ERROR_BADARGUMENT; | |
270 | |
271 if (static_cast<size_t>(bytes_to_read) <= buffer_.size()) { | 264 if (static_cast<size_t>(bytes_to_read) <= buffer_.size()) { |
272 // Special case: we've buffered enough data to be able to synchronously | 265 // Special case: we've buffered enough data to be able to synchronously |
273 // return data to the caller. Do so without making IPCs. | 266 // return data to the caller. Do so without making IPCs. |
274 PopBuffer(buffer, bytes_to_read); | 267 PopBuffer(buffer, bytes_to_read); |
275 return bytes_to_read; | 268 return bytes_to_read; |
276 } | 269 } |
277 | 270 |
278 current_callback_ = new TrackedCallback(this, callback); | 271 current_callback_ = callback; |
279 current_read_buffer_ = buffer; | 272 current_read_buffer_ = buffer; |
280 current_read_buffer_size_ = bytes_to_read; | 273 current_read_buffer_size_ = bytes_to_read; |
281 | 274 |
282 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_ReadResponseBody( | 275 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_ReadResponseBody( |
283 API_ID_PPB_URL_LOADER, host_resource(), bytes_to_read)); | 276 API_ID_PPB_URL_LOADER, host_resource(), bytes_to_read)); |
284 return PP_OK_COMPLETIONPENDING; | 277 return PP_OK_COMPLETIONPENDING; |
285 } | 278 } |
286 | 279 |
287 int32_t URLLoader::FinishStreamingToFile(PP_CompletionCallback callback) { | 280 int32_t URLLoader::FinishStreamingToFile( |
| 281 scoped_refptr<TrackedCallback> callback) { |
288 if (TrackedCallback::IsPending(current_callback_)) | 282 if (TrackedCallback::IsPending(current_callback_)) |
289 return PP_ERROR_INPROGRESS; | 283 return PP_ERROR_INPROGRESS; |
290 | 284 |
291 if (!callback.func) | 285 current_callback_ = callback; |
292 return PP_ERROR_BLOCKS_MAIN_THREAD; | |
293 current_callback_ = new TrackedCallback(this, callback); | |
294 | 286 |
295 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_FinishStreamingToFile( | 287 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_FinishStreamingToFile( |
296 API_ID_PPB_URL_LOADER, host_resource())); | 288 API_ID_PPB_URL_LOADER, host_resource())); |
297 return PP_OK_COMPLETIONPENDING; | 289 return PP_OK_COMPLETIONPENDING; |
298 } | 290 } |
299 | 291 |
300 void URLLoader::Close() { | 292 void URLLoader::Close() { |
301 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_Close( | 293 GetDispatcher()->Send(new PpapiHostMsg_PPBURLLoader_Close( |
302 API_ID_PPB_URL_LOADER, host_resource())); | 294 API_ID_PPB_URL_LOADER, host_resource())); |
303 } | 295 } |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 } | 589 } |
598 | 590 |
599 void PPB_URLLoader_Proxy::OnCallback(int32_t result, | 591 void PPB_URLLoader_Proxy::OnCallback(int32_t result, |
600 const HostResource& resource) { | 592 const HostResource& resource) { |
601 dispatcher()->Send(new PpapiMsg_PPBURLLoader_CallbackComplete( | 593 dispatcher()->Send(new PpapiMsg_PPBURLLoader_CallbackComplete( |
602 API_ID_PPB_URL_LOADER, resource, result)); | 594 API_ID_PPB_URL_LOADER, resource, result)); |
603 } | 595 } |
604 | 596 |
605 } // namespace proxy | 597 } // namespace proxy |
606 } // namespace ppapi | 598 } // namespace ppapi |
OLD | NEW |