| 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 "webkit/plugins/ppapi/ppb_url_loader_impl.h" | 5 #include "webkit/plugins/ppapi/ppb_url_loader_impl.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
| 9 #include "ppapi/c/pp_completion_callback.h" | 9 #include "ppapi/c/pp_completion_callback.h" |
| 10 #include "ppapi/c/pp_errors.h" | 10 #include "ppapi/c/pp_errors.h" |
| 11 #include "ppapi/c/ppb_url_loader.h" | 11 #include "ppapi/c/ppb_url_loader.h" |
| 12 #include "ppapi/c/trusted/ppb_url_loader_trusted.h" | 12 #include "ppapi/c/trusted/ppb_url_loader_trusted.h" |
| 13 #include "ppapi/shared_impl/ppapi_globals.h" |
| 14 #include "ppapi/shared_impl/url_response_info_data.h" |
| 13 #include "ppapi/thunk/enter.h" | 15 #include "ppapi/thunk/enter.h" |
| 14 #include "ppapi/thunk/ppb_url_request_info_api.h" | 16 #include "ppapi/thunk/ppb_url_request_info_api.h" |
| 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
| 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" | 20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" |
| 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebKitPlatfo
rmSupport.h" | 21 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebKitPlatfo
rmSupport.h" |
| 20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" | 22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" |
| 21 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" | 23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" |
| 22 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLError.
h" | 24 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLError.
h" |
| 23 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLLoader
.h" | 25 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLLoader
.h" |
| 24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderOptions.h
" | 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderOptions.h
" |
| 25 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLReques
t.h" | 27 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLReques
t.h" |
| 26 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLRespon
se.h" | 28 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLRespon
se.h" |
| 27 #include "webkit/appcache/web_application_cache_host_impl.h" | 29 #include "webkit/appcache/web_application_cache_host_impl.h" |
| 28 #include "webkit/plugins/ppapi/common.h" | 30 #include "webkit/plugins/ppapi/common.h" |
| 29 #include "webkit/plugins/ppapi/plugin_module.h" | 31 #include "webkit/plugins/ppapi/plugin_module.h" |
| 30 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 32 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
| 31 #include "webkit/plugins/ppapi/resource_helper.h" | 33 #include "webkit/plugins/ppapi/resource_helper.h" |
| 32 #include "webkit/plugins/ppapi/url_request_info_util.h" | 34 #include "webkit/plugins/ppapi/url_request_info_util.h" |
| 33 #include "webkit/plugins/ppapi/ppb_url_response_info_impl.h" | 35 #include "webkit/plugins/ppapi/url_response_info_util.h" |
| 34 | 36 |
| 35 using appcache::WebApplicationCacheHostImpl; | 37 using appcache::WebApplicationCacheHostImpl; |
| 36 using ppapi::Resource; | 38 using ppapi::Resource; |
| 37 using ppapi::thunk::EnterResourceNoLock; | 39 using ppapi::thunk::EnterResourceNoLock; |
| 38 using ppapi::thunk::PPB_URLLoader_API; | 40 using ppapi::thunk::PPB_URLLoader_API; |
| 39 using ppapi::thunk::PPB_URLRequestInfo_API; | 41 using ppapi::thunk::PPB_URLRequestInfo_API; |
| 40 using ppapi::TrackedCallback; | 42 using ppapi::TrackedCallback; |
| 41 using WebKit::WebFrame; | 43 using WebKit::WebFrame; |
| 42 using WebKit::WebString; | 44 using WebKit::WebString; |
| 43 using WebKit::WebURL; | 45 using WebKit::WebURL; |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 *bytes_received = 0; | 215 *bytes_received = 0; |
| 214 *total_bytes_to_be_received = 0; | 216 *total_bytes_to_be_received = 0; |
| 215 return PP_FALSE; | 217 return PP_FALSE; |
| 216 } | 218 } |
| 217 *bytes_received = bytes_received_; | 219 *bytes_received = bytes_received_; |
| 218 *total_bytes_to_be_received = total_bytes_to_be_received_; | 220 *total_bytes_to_be_received = total_bytes_to_be_received_; |
| 219 return PP_TRUE; | 221 return PP_TRUE; |
| 220 } | 222 } |
| 221 | 223 |
| 222 PP_Resource PPB_URLLoader_Impl::GetResponseInfo() { | 224 PP_Resource PPB_URLLoader_Impl::GetResponseInfo() { |
| 223 if (!response_info_) | 225 ::ppapi::thunk::EnterResourceCreationNoLock enter(pp_instance()); |
| 226 if (enter.failed() || !response_info_.get()) |
| 224 return 0; | 227 return 0; |
| 225 return response_info_->GetReference(); | 228 |
| 229 // Since we're the "host" the process-local resource for the file ref is |
| 230 // the same as the host resource. |
| 231 return enter.functions()->CreateURLResponseInfo( |
| 232 pp_instance(), |
| 233 *response_info_, |
| 234 response_info_->body_as_file_ref.resource.host_resource()); |
| 226 } | 235 } |
| 227 | 236 |
| 228 int32_t PPB_URLLoader_Impl::ReadResponseBody( | 237 int32_t PPB_URLLoader_Impl::ReadResponseBody( |
| 229 void* buffer, | 238 void* buffer, |
| 230 int32_t bytes_to_read, | 239 int32_t bytes_to_read, |
| 231 scoped_refptr<TrackedCallback> callback) { | 240 scoped_refptr<TrackedCallback> callback) { |
| 232 int32_t rv = ValidateCallback(callback); | 241 int32_t rv = ValidateCallback(callback); |
| 233 if (rv != PP_OK) | 242 if (rv != PP_OK) |
| 234 return rv; | 243 return rv; |
| 235 if (!response_info_ || response_info_->body()) | 244 if (!response_info_.get() || |
| 245 !response_info_->body_as_file_ref.resource.is_null()) |
| 236 return PP_ERROR_FAILED; | 246 return PP_ERROR_FAILED; |
| 237 if (bytes_to_read <= 0 || !buffer) | 247 if (bytes_to_read <= 0 || !buffer) |
| 238 return PP_ERROR_BADARGUMENT; | 248 return PP_ERROR_BADARGUMENT; |
| 239 | 249 |
| 240 user_buffer_ = static_cast<char*>(buffer); | 250 user_buffer_ = static_cast<char*>(buffer); |
| 241 user_buffer_size_ = bytes_to_read; | 251 user_buffer_size_ = bytes_to_read; |
| 242 | 252 |
| 243 if (!buffer_.empty()) | 253 if (!buffer_.empty()) |
| 244 return FillUserBuffer(); | 254 return FillUserBuffer(); |
| 245 | 255 |
| 246 // We may have already reached EOF. | 256 // We may have already reached EOF. |
| 247 if (done_status_ != PP_OK_COMPLETIONPENDING) { | 257 if (done_status_ != PP_OK_COMPLETIONPENDING) { |
| 248 user_buffer_ = NULL; | 258 user_buffer_ = NULL; |
| 249 user_buffer_size_ = 0; | 259 user_buffer_size_ = 0; |
| 250 return done_status_; | 260 return done_status_; |
| 251 } | 261 } |
| 252 | 262 |
| 253 RegisterCallback(callback); | 263 RegisterCallback(callback); |
| 254 return PP_OK_COMPLETIONPENDING; | 264 return PP_OK_COMPLETIONPENDING; |
| 255 } | 265 } |
| 256 | 266 |
| 257 int32_t PPB_URLLoader_Impl::FinishStreamingToFile( | 267 int32_t PPB_URLLoader_Impl::FinishStreamingToFile( |
| 258 scoped_refptr<TrackedCallback> callback) { | 268 scoped_refptr<TrackedCallback> callback) { |
| 259 int32_t rv = ValidateCallback(callback); | 269 int32_t rv = ValidateCallback(callback); |
| 260 if (rv != PP_OK) | 270 if (rv != PP_OK) |
| 261 return rv; | 271 return rv; |
| 262 if (!response_info_ || !response_info_->body()) | 272 if (!response_info_.get() || |
| 273 response_info_->body_as_file_ref.resource.is_null()) |
| 263 return PP_ERROR_FAILED; | 274 return PP_ERROR_FAILED; |
| 264 | 275 |
| 265 // We may have already reached EOF. | 276 // We may have already reached EOF. |
| 266 if (done_status_ != PP_OK_COMPLETIONPENDING) | 277 if (done_status_ != PP_OK_COMPLETIONPENDING) |
| 267 return done_status_; | 278 return done_status_; |
| 268 | 279 |
| 269 is_streaming_to_file_ = true; | 280 is_streaming_to_file_ = true; |
| 270 if (is_asynchronous_load_suspended_) | 281 if (is_asynchronous_load_suspended_) |
| 271 SetDefersLoading(false); | 282 SetDefersLoading(false); |
| 272 | 283 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 286 | 297 |
| 287 void PPB_URLLoader_Impl::GrantUniversalAccess() { | 298 void PPB_URLLoader_Impl::GrantUniversalAccess() { |
| 288 has_universal_access_ = true; | 299 has_universal_access_ = true; |
| 289 } | 300 } |
| 290 | 301 |
| 291 void PPB_URLLoader_Impl::SetStatusCallback( | 302 void PPB_URLLoader_Impl::SetStatusCallback( |
| 292 PP_URLLoaderTrusted_StatusCallback cb) { | 303 PP_URLLoaderTrusted_StatusCallback cb) { |
| 293 status_callback_ = cb; | 304 status_callback_ = cb; |
| 294 } | 305 } |
| 295 | 306 |
| 307 bool PPB_URLLoader_Impl::GetResponseInfoData( |
| 308 ::ppapi::URLResponseInfoData* data) { |
| 309 if (!response_info_.get()) |
| 310 return false; |
| 311 |
| 312 *data = *response_info_; |
| 313 |
| 314 // We transfer one plugin reference to the FileRef to the caller. |
| 315 if (!response_info_->body_as_file_ref.resource.is_null()) { |
| 316 ::ppapi::PpapiGlobals::Get()->GetResourceTracker()->AddRefResource( |
| 317 response_info_->body_as_file_ref.resource.host_resource()); |
| 318 } |
| 319 return true; |
| 320 } |
| 321 |
| 296 void PPB_URLLoader_Impl::willSendRequest( | 322 void PPB_URLLoader_Impl::willSendRequest( |
| 297 WebURLLoader* loader, | 323 WebURLLoader* loader, |
| 298 WebURLRequest& new_request, | 324 WebURLRequest& new_request, |
| 299 const WebURLResponse& redirect_response) { | 325 const WebURLResponse& redirect_response) { |
| 300 if (!request_data_.follow_redirects) { | 326 if (!request_data_.follow_redirects) { |
| 301 SaveResponse(redirect_response); | 327 SaveResponse(redirect_response); |
| 302 SetDefersLoading(true); | 328 SetDefersLoading(true); |
| 303 RunCallback(PP_OK); | 329 RunCallback(PP_OK); |
| 304 } | 330 } |
| 305 } | 331 } |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 SetDefersLoading(false); | 490 SetDefersLoading(false); |
| 465 } | 491 } |
| 466 | 492 |
| 467 // Reset for next time. | 493 // Reset for next time. |
| 468 user_buffer_ = NULL; | 494 user_buffer_ = NULL; |
| 469 user_buffer_size_ = 0; | 495 user_buffer_size_ = 0; |
| 470 return bytes_to_copy; | 496 return bytes_to_copy; |
| 471 } | 497 } |
| 472 | 498 |
| 473 void PPB_URLLoader_Impl::SaveResponse(const WebURLResponse& response) { | 499 void PPB_URLLoader_Impl::SaveResponse(const WebURLResponse& response) { |
| 474 scoped_refptr<PPB_URLResponseInfo_Impl> response_info( | 500 // DataFromWebURLResponse returns a file ref with one reference to it, which |
| 475 new PPB_URLResponseInfo_Impl(pp_instance())); | 501 // we take over via our ScopedPPResource. |
| 476 if (response_info->Initialize(response)) | 502 response_info_.reset(new ::ppapi::URLResponseInfoData( |
| 477 response_info_ = response_info; | 503 DataFromWebURLResponse(pp_instance(), response))); |
| 504 response_info_file_ref_ = ::ppapi::ScopedPPResource( |
| 505 ::ppapi::ScopedPPResource::PassRef(), |
| 506 response_info_->body_as_file_ref.resource.host_resource()); |
| 478 } | 507 } |
| 479 | 508 |
| 480 void PPB_URLLoader_Impl::UpdateStatus() { | 509 void PPB_URLLoader_Impl::UpdateStatus() { |
| 481 if (status_callback_ && | 510 if (status_callback_ && |
| 482 (RecordDownloadProgress() || RecordUploadProgress())) { | 511 (RecordDownloadProgress() || RecordUploadProgress())) { |
| 483 // Here we go through some effort to only send the exact information that | 512 // Here we go through some effort to only send the exact information that |
| 484 // the requestor wanted in the request flags. It would be just as | 513 // the requestor wanted in the request flags. It would be just as |
| 485 // efficient to send all of it, but we don't want people to rely on | 514 // efficient to send all of it, but we don't want people to rely on |
| 486 // getting download progress when they happen to set the upload progress | 515 // getting download progress when they happen to set the upload progress |
| 487 // flag. | 516 // flag. |
| 488 status_callback_( | 517 status_callback_( |
| 489 pp_instance(), pp_resource(), | 518 pp_instance(), pp_resource(), |
| 490 RecordUploadProgress() ? bytes_sent_ : -1, | 519 RecordUploadProgress() ? bytes_sent_ : -1, |
| 491 RecordUploadProgress() ? total_bytes_to_be_sent_ : -1, | 520 RecordUploadProgress() ? total_bytes_to_be_sent_ : -1, |
| 492 RecordDownloadProgress() ? bytes_received_ : -1, | 521 RecordDownloadProgress() ? bytes_received_ : -1, |
| 493 RecordDownloadProgress() ? total_bytes_to_be_received_ : -1); | 522 RecordDownloadProgress() ? total_bytes_to_be_received_ : -1); |
| 494 } | 523 } |
| 495 } | 524 } |
| 496 | 525 |
| 497 bool PPB_URLLoader_Impl::RecordDownloadProgress() const { | 526 bool PPB_URLLoader_Impl::RecordDownloadProgress() const { |
| 498 return request_data_.record_download_progress; | 527 return request_data_.record_download_progress; |
| 499 } | 528 } |
| 500 | 529 |
| 501 bool PPB_URLLoader_Impl::RecordUploadProgress() const { | 530 bool PPB_URLLoader_Impl::RecordUploadProgress() const { |
| 502 return request_data_.record_upload_progress; | 531 return request_data_.record_upload_progress; |
| 503 } | 532 } |
| 504 | 533 |
| 505 } // namespace ppapi | 534 } // namespace ppapi |
| 506 } // namespace webkit | 535 } // namespace webkit |
| OLD | NEW |