OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 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" |
(...skipping 11 matching lines...) Expand all Loading... |
22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoader.h" | 22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoader.h" |
23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderOptions.h
" | 23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderOptions.h
" |
24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" | 24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" |
25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h" | 25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h" |
26 #include "webkit/appcache/web_application_cache_host_impl.h" | 26 #include "webkit/appcache/web_application_cache_host_impl.h" |
27 #include "webkit/plugins/ppapi/common.h" | 27 #include "webkit/plugins/ppapi/common.h" |
28 #include "webkit/plugins/ppapi/plugin_module.h" | 28 #include "webkit/plugins/ppapi/plugin_module.h" |
29 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 29 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
30 #include "webkit/plugins/ppapi/ppb_url_request_info_impl.h" | 30 #include "webkit/plugins/ppapi/ppb_url_request_info_impl.h" |
31 #include "webkit/plugins/ppapi/ppb_url_response_info_impl.h" | 31 #include "webkit/plugins/ppapi/ppb_url_response_info_impl.h" |
| 32 #include "webkit/plugins/ppapi/resource_helper.h" |
32 | 33 |
33 using appcache::WebApplicationCacheHostImpl; | 34 using appcache::WebApplicationCacheHostImpl; |
| 35 using ppapi::Resource; |
34 using ppapi::thunk::EnterResourceNoLock; | 36 using ppapi::thunk::EnterResourceNoLock; |
35 using ppapi::thunk::PPB_URLLoader_API; | 37 using ppapi::thunk::PPB_URLLoader_API; |
36 using ppapi::thunk::PPB_URLRequestInfo_API; | 38 using ppapi::thunk::PPB_URLRequestInfo_API; |
37 using WebKit::WebFrame; | 39 using WebKit::WebFrame; |
38 using WebKit::WebString; | 40 using WebKit::WebString; |
39 using WebKit::WebURL; | 41 using WebKit::WebURL; |
40 using WebKit::WebURLError; | 42 using WebKit::WebURLError; |
41 using WebKit::WebURLLoader; | 43 using WebKit::WebURLLoader; |
42 using WebKit::WebURLLoaderOptions; | 44 using WebKit::WebURLLoaderOptions; |
43 using WebKit::WebURLRequest; | 45 using WebKit::WebURLRequest; |
44 using WebKit::WebURLResponse; | 46 using WebKit::WebURLResponse; |
45 | 47 |
46 #ifdef _MSC_VER | 48 #ifdef _MSC_VER |
47 // Do not warn about use of std::copy with raw pointers. | 49 // Do not warn about use of std::copy with raw pointers. |
48 #pragma warning(disable : 4996) | 50 #pragma warning(disable : 4996) |
49 #endif | 51 #endif |
50 | 52 |
51 namespace webkit { | 53 namespace webkit { |
52 namespace ppapi { | 54 namespace ppapi { |
53 | 55 |
54 PPB_URLLoader_Impl::PPB_URLLoader_Impl(PluginInstance* instance, | 56 namespace { |
| 57 |
| 58 WebFrame* GetFrameForResource(const Resource* resource) { |
| 59 PluginInstance* plugin_instance = ResourceHelper::GetPluginInstance(resource); |
| 60 if (!plugin_instance) |
| 61 return NULL; |
| 62 return plugin_instance->container()->element().document().frame(); |
| 63 } |
| 64 |
| 65 } // namespace |
| 66 |
| 67 PPB_URLLoader_Impl::PPB_URLLoader_Impl(PP_Instance instance, |
55 bool main_document_loader) | 68 bool main_document_loader) |
56 : Resource(instance), | 69 : Resource(instance), |
57 main_document_loader_(main_document_loader), | 70 main_document_loader_(main_document_loader), |
58 pending_callback_(), | 71 pending_callback_(), |
59 bytes_sent_(0), | 72 bytes_sent_(0), |
60 total_bytes_to_be_sent_(-1), | 73 total_bytes_to_be_sent_(-1), |
61 bytes_received_(0), | 74 bytes_received_(0), |
62 total_bytes_to_be_received_(-1), | 75 total_bytes_to_be_received_(-1), |
63 user_buffer_(NULL), | 76 user_buffer_(NULL), |
64 user_buffer_size_(0), | 77 user_buffer_size_(0), |
(...skipping 27 matching lines...) Expand all Loading... |
92 int32_t rv = ValidateCallback(callback); | 105 int32_t rv = ValidateCallback(callback); |
93 if (rv != PP_OK) | 106 if (rv != PP_OK) |
94 return rv; | 107 return rv; |
95 | 108 |
96 if (request->RequiresUniversalAccess() && !has_universal_access_) | 109 if (request->RequiresUniversalAccess() && !has_universal_access_) |
97 return PP_ERROR_NOACCESS; | 110 return PP_ERROR_NOACCESS; |
98 | 111 |
99 if (loader_.get()) | 112 if (loader_.get()) |
100 return PP_ERROR_INPROGRESS; | 113 return PP_ERROR_INPROGRESS; |
101 | 114 |
102 WebFrame* frame = instance()->container()->element().document().frame(); | 115 WebFrame* frame = GetFrameForResource(this); |
103 if (!frame) | 116 if (!frame) |
104 return PP_ERROR_FAILED; | 117 return PP_ERROR_FAILED; |
105 WebURLRequest web_request(request->ToWebURLRequest(frame)); | 118 WebURLRequest web_request(request->ToWebURLRequest(frame)); |
106 | 119 |
107 WebURLLoaderOptions options; | 120 WebURLLoaderOptions options; |
108 if (has_universal_access_) { | 121 if (has_universal_access_) { |
109 // Universal access allows cross-origin requests and sends credentials. | 122 // Universal access allows cross-origin requests and sends credentials. |
110 options.crossOriginRequestPolicy = | 123 options.crossOriginRequestPolicy = |
111 WebURLLoaderOptions::CrossOriginRequestPolicyAllow; | 124 WebURLLoaderOptions::CrossOriginRequestPolicyAllow; |
112 options.allowCredentials = true; | 125 options.allowCredentials = true; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 loader_->setDefersLoading(false); | 232 loader_->setDefersLoading(false); |
220 is_asynchronous_load_suspended_ = false; | 233 is_asynchronous_load_suspended_ = false; |
221 } | 234 } |
222 | 235 |
223 // Wait for didFinishLoading / didFail. | 236 // Wait for didFinishLoading / didFail. |
224 RegisterCallback(callback); | 237 RegisterCallback(callback); |
225 return PP_OK_COMPLETIONPENDING; | 238 return PP_OK_COMPLETIONPENDING; |
226 } | 239 } |
227 | 240 |
228 void PPB_URLLoader_Impl::Close() { | 241 void PPB_URLLoader_Impl::Close() { |
229 if (loader_.get()) { | 242 if (loader_.get()) |
230 loader_->cancel(); | 243 loader_->cancel(); |
231 } else if (main_document_loader_) { | 244 else if (main_document_loader_) |
232 WebFrame* frame = instance()->container()->element().document().frame(); | 245 GetFrameForResource(this)->stopLoading(); |
233 frame->stopLoading(); | |
234 } | |
235 // TODO(viettrungluu): Check what happens to the callback (probably the | 246 // TODO(viettrungluu): Check what happens to the callback (probably the |
236 // wrong thing). May need to post abort here. crbug.com/69457 | 247 // wrong thing). May need to post abort here. crbug.com/69457 |
237 } | 248 } |
238 | 249 |
239 void PPB_URLLoader_Impl::GrantUniversalAccess() { | 250 void PPB_URLLoader_Impl::GrantUniversalAccess() { |
240 has_universal_access_ = true; | 251 has_universal_access_ = true; |
241 } | 252 } |
242 | 253 |
243 void PPB_URLLoader_Impl::SetStatusCallback( | 254 void PPB_URLLoader_Impl::SetStatusCallback( |
244 PP_URLLoaderTrusted_StatusCallback cb) { | 255 PP_URLLoaderTrusted_StatusCallback cb) { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 if (pending_callback_.get() && !pending_callback_->completed()) | 366 if (pending_callback_.get() && !pending_callback_->completed()) |
356 return PP_ERROR_INPROGRESS; | 367 return PP_ERROR_INPROGRESS; |
357 | 368 |
358 return PP_OK; | 369 return PP_OK; |
359 } | 370 } |
360 | 371 |
361 void PPB_URLLoader_Impl::RegisterCallback(PP_CompletionCallback callback) { | 372 void PPB_URLLoader_Impl::RegisterCallback(PP_CompletionCallback callback) { |
362 DCHECK(callback.func); | 373 DCHECK(callback.func); |
363 DCHECK(!pending_callback_.get() || pending_callback_->completed()); | 374 DCHECK(!pending_callback_.get() || pending_callback_->completed()); |
364 | 375 |
| 376 PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
| 377 if (!plugin_module) |
| 378 return; |
| 379 |
365 pending_callback_ = new TrackedCompletionCallback( | 380 pending_callback_ = new TrackedCompletionCallback( |
366 instance()->module()->GetCallbackTracker(), pp_resource(), callback); | 381 plugin_module->GetCallbackTracker(), pp_resource(), callback); |
367 } | 382 } |
368 | 383 |
369 void PPB_URLLoader_Impl::RunCallback(int32_t result) { | 384 void PPB_URLLoader_Impl::RunCallback(int32_t result) { |
370 // This may be null only when this is a main document loader. | 385 // This may be null only when this is a main document loader. |
371 if (!pending_callback_.get()) { | 386 if (!pending_callback_.get()) { |
372 CHECK(main_document_loader_); | 387 CHECK(main_document_loader_); |
373 return; | 388 return; |
374 } | 389 } |
375 | 390 |
376 scoped_refptr<TrackedCompletionCallback> callback; | 391 scoped_refptr<TrackedCompletionCallback> callback; |
(...skipping 20 matching lines...) Expand all Loading... |
397 } | 412 } |
398 | 413 |
399 // Reset for next time. | 414 // Reset for next time. |
400 user_buffer_ = NULL; | 415 user_buffer_ = NULL; |
401 user_buffer_size_ = 0; | 416 user_buffer_size_ = 0; |
402 return bytes_to_copy; | 417 return bytes_to_copy; |
403 } | 418 } |
404 | 419 |
405 void PPB_URLLoader_Impl::SaveResponse(const WebURLResponse& response) { | 420 void PPB_URLLoader_Impl::SaveResponse(const WebURLResponse& response) { |
406 scoped_refptr<PPB_URLResponseInfo_Impl> response_info( | 421 scoped_refptr<PPB_URLResponseInfo_Impl> response_info( |
407 new PPB_URLResponseInfo_Impl(instance())); | 422 new PPB_URLResponseInfo_Impl(pp_instance())); |
408 if (response_info->Initialize(response)) | 423 if (response_info->Initialize(response)) |
409 response_info_ = response_info; | 424 response_info_ = response_info; |
410 } | 425 } |
411 | 426 |
412 void PPB_URLLoader_Impl::UpdateStatus() { | 427 void PPB_URLLoader_Impl::UpdateStatus() { |
413 if (status_callback_ && | 428 if (status_callback_ && |
414 (RecordDownloadProgress() || RecordUploadProgress())) { | 429 (RecordDownloadProgress() || RecordUploadProgress())) { |
415 // Here we go through some effort to only send the exact information that | 430 // Here we go through some effort to only send the exact information that |
416 // the requestor wanted in the request flags. It would be just as | 431 // the requestor wanted in the request flags. It would be just as |
417 // efficient to send all of it, but we don't want people to rely on | 432 // efficient to send all of it, but we don't want people to rely on |
418 // getting download progress when they happen to set the upload progress | 433 // getting download progress when they happen to set the upload progress |
419 // flag. | 434 // flag. |
420 status_callback_( | 435 status_callback_( |
421 instance()->pp_instance(), pp_resource(), | 436 pp_instance(), pp_resource(), |
422 RecordUploadProgress() ? bytes_sent_ : -1, | 437 RecordUploadProgress() ? bytes_sent_ : -1, |
423 RecordUploadProgress() ? total_bytes_to_be_sent_ : -1, | 438 RecordUploadProgress() ? total_bytes_to_be_sent_ : -1, |
424 RecordDownloadProgress() ? bytes_received_ : -1, | 439 RecordDownloadProgress() ? bytes_received_ : -1, |
425 RecordDownloadProgress() ? total_bytes_to_be_received_ : -1); | 440 RecordDownloadProgress() ? total_bytes_to_be_received_ : -1); |
426 } | 441 } |
427 } | 442 } |
428 | 443 |
429 bool PPB_URLLoader_Impl::RecordDownloadProgress() const { | 444 bool PPB_URLLoader_Impl::RecordDownloadProgress() const { |
430 return request_info_ && request_info_->record_download_progress(); | 445 return request_info_ && request_info_->record_download_progress(); |
431 } | 446 } |
432 | 447 |
433 bool PPB_URLLoader_Impl::RecordUploadProgress() const { | 448 bool PPB_URLLoader_Impl::RecordUploadProgress() const { |
434 return request_info_ && request_info_->record_upload_progress(); | 449 return request_info_ && request_info_->record_upload_progress(); |
435 } | 450 } |
436 | 451 |
437 } // namespace ppapi | 452 } // namespace ppapi |
438 } // namespace webkit | 453 } // namespace webkit |
OLD | NEW |