Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: webkit/tools/test_shell/simple_resource_loader_bridge.cc

Issue 3455022: Revert 60378 (trying to track down http://crbug.com/56752 )- Flesh out URLLoa... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/glue/weburlloader_impl.cc ('k') | webkit/tools/test_shell/test_shell.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 // This file contains an implementation of the ResourceLoaderBridge class. 5 // This file contains an implementation of the ResourceLoaderBridge class.
6 // The class is implemented using URLRequest, meaning it is a "simple" version 6 // The class is implemented using URLRequest, meaning it is a "simple" version
7 // that directly issues requests. The more complicated one used in the 7 // that directly issues requests. The more complicated one used in the
8 // browser uses IPC. 8 // browser uses IPC.
9 // 9 //
10 // Because URLRequest only provides an asynchronous resource loading API, this 10 // Because URLRequest only provides an asynchronous resource loading API, this
(...skipping 15 matching lines...) Expand all
26 // 26 //
27 // NOTE: The implementation in this file may be used to have WebKit fetch 27 // NOTE: The implementation in this file may be used to have WebKit fetch
28 // resources in-process. For example, it is handy for building a single- 28 // resources in-process. For example, it is handy for building a single-
29 // process WebKit embedding (e.g., test_shell) that can use URLRequest to 29 // process WebKit embedding (e.g., test_shell) that can use URLRequest to
30 // perform URL loads. See renderer/resource_dispatcher.h for details on an 30 // perform URL loads. See renderer/resource_dispatcher.h for details on an
31 // alternate implementation that defers fetching to another process. 31 // alternate implementation that defers fetching to another process.
32 32
33 #include "webkit/tools/test_shell/simple_resource_loader_bridge.h" 33 #include "webkit/tools/test_shell/simple_resource_loader_bridge.h"
34 34
35 #include "base/file_path.h" 35 #include "base/file_path.h"
36 #include "base/file_util.h"
37 #include "base/logging.h" 36 #include "base/logging.h"
38 #include "base/message_loop.h" 37 #include "base/message_loop.h"
39 #include "base/message_loop_proxy.h"
40 #if defined(OS_MACOSX) || defined(OS_WIN) 38 #if defined(OS_MACOSX) || defined(OS_WIN)
41 #include "base/nss_util.h" 39 #include "base/nss_util.h"
42 #endif 40 #endif
43 #include "base/ref_counted.h" 41 #include "base/ref_counted.h"
44 #include "base/time.h" 42 #include "base/time.h"
45 #include "base/timer.h" 43 #include "base/timer.h"
46 #include "base/thread.h" 44 #include "base/thread.h"
47 #include "base/waitable_event.h" 45 #include "base/waitable_event.h"
48 #include "net/base/cookie_store.h" 46 #include "net/base/cookie_store.h"
49 #include "net/base/file_stream.h"
50 #include "net/base/io_buffer.h" 47 #include "net/base/io_buffer.h"
51 #include "net/base/load_flags.h" 48 #include "net/base/load_flags.h"
52 #include "net/base/net_errors.h" 49 #include "net/base/net_errors.h"
53 #include "net/base/net_util.h" 50 #include "net/base/net_util.h"
54 #include "net/base/static_cookie_policy.h" 51 #include "net/base/static_cookie_policy.h"
55 #include "net/base/upload_data.h" 52 #include "net/base/upload_data.h"
56 #include "net/http/http_cache.h" 53 #include "net/http/http_cache.h"
57 #include "net/http/http_request_headers.h" 54 #include "net/http/http_request_headers.h"
58 #include "net/http/http_response_headers.h" 55 #include "net/http/http_response_headers.h"
59 #include "net/proxy/proxy_service.h" 56 #include "net/proxy/proxy_service.h"
60 #if defined(OS_WIN) 57 #if defined(OS_WIN)
61 #include "net/socket/ssl_client_socket_nss_factory.h" 58 #include "net/socket/ssl_client_socket_nss_factory.h"
62 #endif 59 #endif
63 #include "net/url_request/url_request.h" 60 #include "net/url_request/url_request.h"
64 #include "net/url_request/url_request_job.h" 61 #include "net/url_request/url_request_job.h"
65 #include "webkit/appcache/appcache_interfaces.h" 62 #include "webkit/appcache/appcache_interfaces.h"
66 #include "webkit/blob/blob_storage_controller.h" 63 #include "webkit/blob/blob_storage_controller.h"
67 #include "webkit/blob/blob_url_request_job.h" 64 #include "webkit/blob/blob_url_request_job.h"
68 #include "webkit/blob/deletable_file_reference.h"
69 #include "webkit/glue/resource_loader_bridge.h" 65 #include "webkit/glue/resource_loader_bridge.h"
70 #include "webkit/tools/test_shell/simple_appcache_system.h" 66 #include "webkit/tools/test_shell/simple_appcache_system.h"
71 #include "webkit/tools/test_shell/simple_socket_stream_bridge.h" 67 #include "webkit/tools/test_shell/simple_socket_stream_bridge.h"
72 #include "webkit/tools/test_shell/test_shell_request_context.h" 68 #include "webkit/tools/test_shell/test_shell_request_context.h"
73 #include "webkit/tools/test_shell/test_shell_webblobregistry_impl.h" 69 #include "webkit/tools/test_shell/test_shell_webblobregistry_impl.h"
74 70
75 using webkit_glue::ResourceLoaderBridge; 71 using webkit_glue::ResourceLoaderBridge;
76 using net::StaticCookiePolicy; 72 using net::StaticCookiePolicy;
77 using net::HttpResponseHeaders; 73 using net::HttpResponseHeaders;
78 using webkit_blob::DeletableFileReference;
79 74
80 namespace { 75 namespace {
81 76
82 struct TestShellRequestContextParams { 77 struct TestShellRequestContextParams {
83 TestShellRequestContextParams( 78 TestShellRequestContextParams(
84 const FilePath& in_cache_path, 79 const FilePath& in_cache_path,
85 net::HttpCache::Mode in_cache_mode, 80 net::HttpCache::Mode in_cache_mode,
86 bool in_no_proxy) 81 bool in_no_proxy)
87 : cache_path(in_cache_path), 82 : cache_path(in_cache_path),
88 cache_mode(in_cache_mode), 83 cache_mode(in_cache_mode),
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 167
173 struct RequestParams { 168 struct RequestParams {
174 std::string method; 169 std::string method;
175 GURL url; 170 GURL url;
176 GURL first_party_for_cookies; 171 GURL first_party_for_cookies;
177 GURL referrer; 172 GURL referrer;
178 std::string headers; 173 std::string headers;
179 int load_flags; 174 int load_flags;
180 ResourceType::Type request_type; 175 ResourceType::Type request_type;
181 int appcache_host_id; 176 int appcache_host_id;
182 bool download_to_file;
183 scoped_refptr<net::UploadData> upload; 177 scoped_refptr<net::UploadData> upload;
184 }; 178 };
185 179
186 // The interval for calls to RequestProxy::MaybeUpdateUploadProgress 180 // The interval for calls to RequestProxy::MaybeUpdateUploadProgress
187 static const int kUpdateUploadProgressIntervalMsec = 100; 181 static const int kUpdateUploadProgressIntervalMsec = 100;
188 182
189 // The RequestProxy does most of its work on the IO thread. The Start and 183 // The RequestProxy does most of its work on the IO thread. The Start and
190 // Cancel methods are proxied over to the IO thread, where an URLRequest object 184 // Cancel methods are proxied over to the IO thread, where an URLRequest object
191 // is instantiated. 185 // is instantiated.
192 class RequestProxy : public URLRequest::Delegate, 186 class RequestProxy : public URLRequest::Delegate,
193 public base::RefCountedThreadSafe<RequestProxy> { 187 public base::RefCountedThreadSafe<RequestProxy> {
194 public: 188 public:
195 // Takes ownership of the params. 189 // Takes ownership of the params.
196 RequestProxy() 190 RequestProxy()
197 : download_to_file_(false), 191 : buf_(new net::IOBuffer(kDataSize)),
198 buf_(new net::IOBuffer(kDataSize)),
199 last_upload_position_(0) { 192 last_upload_position_(0) {
200 } 193 }
201 194
202 void DropPeer() { 195 void DropPeer() {
203 peer_ = NULL; 196 peer_ = NULL;
204 } 197 }
205 198
206 void Start(ResourceLoaderBridge::Peer* peer, RequestParams* params) { 199 void Start(ResourceLoaderBridge::Peer* peer, RequestParams* params) {
207 peer_ = peer; 200 peer_ = peer;
208 owner_loop_ = MessageLoop::current(); 201 owner_loop_ = MessageLoop::current();
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 // race condition). If the order of the next 2 functions were reversed, the 260 // race condition). If the order of the next 2 functions were reversed, the
268 // peer could generate new requests in reponse to the received data, which 261 // peer could generate new requests in reponse to the received data, which
269 // when run on the io thread, could race against this function in doing 262 // when run on the io thread, could race against this function in doing
270 // another InvokeLater. See bug 769249. 263 // another InvokeLater. See bug 769249.
271 g_io_thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( 264 g_io_thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(
272 this, &RequestProxy::AsyncReadData)); 265 this, &RequestProxy::AsyncReadData));
273 266
274 peer_->OnReceivedData(buf_copy.get(), bytes_read); 267 peer_->OnReceivedData(buf_copy.get(), bytes_read);
275 } 268 }
276 269
277 void NotifyDownloadedData(int bytes_read) {
278 if (!peer_)
279 return;
280
281 // Continue reading more data, see the comment in NotifyReceivedData.
282 g_io_thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(
283 this, &RequestProxy::AsyncReadData));
284
285 peer_->OnDownloadedData(bytes_read);
286 }
287
288 void NotifyCompletedRequest(const URLRequestStatus& status, 270 void NotifyCompletedRequest(const URLRequestStatus& status,
289 const std::string& security_info, 271 const std::string& security_info,
290 const base::Time& complete_time) { 272 const base::Time& complete_time) {
291 if (peer_) { 273 if (peer_) {
292 peer_->OnCompletedRequest(status, security_info, complete_time); 274 peer_->OnCompletedRequest(status, security_info, complete_time);
293 DropPeer(); // ensure no further notifications 275 DropPeer(); // ensure no further notifications
294 } 276 }
295 } 277 }
296 278
297 void NotifyUploadProgress(uint64 position, uint64 size) { 279 void NotifyUploadProgress(uint64 position, uint64 size) {
(...skipping 19 matching lines...) Expand all
317 request_->set_referrer(params->referrer.spec()); 299 request_->set_referrer(params->referrer.spec());
318 net::HttpRequestHeaders headers; 300 net::HttpRequestHeaders headers;
319 headers.AddHeadersFromString(params->headers); 301 headers.AddHeadersFromString(params->headers);
320 request_->SetExtraRequestHeaders(headers); 302 request_->SetExtraRequestHeaders(headers);
321 request_->set_load_flags(params->load_flags); 303 request_->set_load_flags(params->load_flags);
322 request_->set_upload(params->upload.get()); 304 request_->set_upload(params->upload.get());
323 request_->set_context(g_request_context); 305 request_->set_context(g_request_context);
324 SimpleAppCacheSystem::SetExtraRequestInfo( 306 SimpleAppCacheSystem::SetExtraRequestInfo(
325 request_.get(), params->appcache_host_id, params->request_type); 307 request_.get(), params->appcache_host_id, params->request_type);
326 308
327 download_to_file_ = params->download_to_file;
328 if (download_to_file_) {
329 FilePath path;
330 if (file_util::CreateTemporaryFile(&path)) {
331 downloaded_file_ = DeletableFileReference::GetOrCreate(
332 path, base::MessageLoopProxy::CreateForCurrentThread());
333 file_stream_.Open(
334 path, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE);
335 }
336 }
337
338 request_->Start(); 309 request_->Start();
339 310
340 if (request_->has_upload() && 311 if (request_->has_upload() &&
341 params->load_flags & net::LOAD_ENABLE_UPLOAD_PROGRESS) { 312 params->load_flags & net::LOAD_ENABLE_UPLOAD_PROGRESS) {
342 upload_progress_timer_.Start( 313 upload_progress_timer_.Start(
343 base::TimeDelta::FromMilliseconds(kUpdateUploadProgressIntervalMsec), 314 base::TimeDelta::FromMilliseconds(kUpdateUploadProgressIntervalMsec),
344 this, &RequestProxy::MaybeUpdateUploadProgress); 315 this, &RequestProxy::MaybeUpdateUploadProgress);
345 } 316 }
346 317
347 delete params; 318 delete params;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 } 370 }
400 371
401 virtual void OnReceivedResponse( 372 virtual void OnReceivedResponse(
402 const ResourceLoaderBridge::ResponseInfo& info, 373 const ResourceLoaderBridge::ResponseInfo& info,
403 bool content_filtered) { 374 bool content_filtered) {
404 owner_loop_->PostTask(FROM_HERE, NewRunnableMethod( 375 owner_loop_->PostTask(FROM_HERE, NewRunnableMethod(
405 this, &RequestProxy::NotifyReceivedResponse, info, content_filtered)); 376 this, &RequestProxy::NotifyReceivedResponse, info, content_filtered));
406 } 377 }
407 378
408 virtual void OnReceivedData(int bytes_read) { 379 virtual void OnReceivedData(int bytes_read) {
409 if (download_to_file_) {
410 file_stream_.Write(buf_->data(), bytes_read, NULL);
411 owner_loop_->PostTask(FROM_HERE, NewRunnableMethod(
412 this, &RequestProxy::NotifyDownloadedData, bytes_read));
413 return;
414 }
415
416 owner_loop_->PostTask(FROM_HERE, NewRunnableMethod( 380 owner_loop_->PostTask(FROM_HERE, NewRunnableMethod(
417 this, &RequestProxy::NotifyReceivedData, bytes_read)); 381 this, &RequestProxy::NotifyReceivedData, bytes_read));
418 } 382 }
419 383
420 virtual void OnCompletedRequest(const URLRequestStatus& status, 384 virtual void OnCompletedRequest(const URLRequestStatus& status,
421 const std::string& security_info, 385 const std::string& security_info,
422 const base::Time& complete_time) { 386 const base::Time& complete_time) {
423 if (download_to_file_)
424 file_stream_.Close();
425 owner_loop_->PostTask(FROM_HERE, NewRunnableMethod( 387 owner_loop_->PostTask(FROM_HERE, NewRunnableMethod(
426 this, 388 this,
427 &RequestProxy::NotifyCompletedRequest, 389 &RequestProxy::NotifyCompletedRequest,
428 status, 390 status,
429 security_info, 391 security_info,
430 complete_time)); 392 complete_time));
431 } 393 }
432 394
433 // -------------------------------------------------------------------------- 395 // --------------------------------------------------------------------------
434 // URLRequest::Delegate implementation: 396 // URLRequest::Delegate implementation:
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 } 479 }
518 480
519 void PopulateResponseInfo(URLRequest* request, 481 void PopulateResponseInfo(URLRequest* request,
520 ResourceLoaderBridge::ResponseInfo* info) const { 482 ResourceLoaderBridge::ResponseInfo* info) const {
521 info->request_time = request->request_time(); 483 info->request_time = request->request_time();
522 info->response_time = request->response_time(); 484 info->response_time = request->response_time();
523 info->headers = request->response_headers(); 485 info->headers = request->response_headers();
524 request->GetMimeType(&info->mime_type); 486 request->GetMimeType(&info->mime_type);
525 request->GetCharset(&info->charset); 487 request->GetCharset(&info->charset);
526 info->content_length = request->GetExpectedContentSize(); 488 info->content_length = request->GetExpectedContentSize();
527 if (downloaded_file_)
528 info->download_file_path = downloaded_file_->path();
529 SimpleAppCacheSystem::GetExtraResponseInfo( 489 SimpleAppCacheSystem::GetExtraResponseInfo(
530 request, 490 request,
531 &info->appcache_id, 491 &info->appcache_id,
532 &info->appcache_manifest_url); 492 &info->appcache_manifest_url);
533 } 493 }
534 494
535 scoped_ptr<URLRequest> request_; 495 scoped_ptr<URLRequest> request_;
536 496
537 // Support for request.download_to_file behavior.
538 bool download_to_file_;
539 net::FileStream file_stream_;
540 scoped_refptr<DeletableFileReference> downloaded_file_;
541
542 // Size of our async IO data buffers 497 // Size of our async IO data buffers
543 static const int kDataSize = 16*1024; 498 static const int kDataSize = 16*1024;
544 499
545 // read buffer for async IO 500 // read buffer for async IO
546 scoped_refptr<net::IOBuffer> buf_; 501 scoped_refptr<net::IOBuffer> buf_;
547 502
548 MessageLoop* owner_loop_; 503 MessageLoop* owner_loop_;
549 504
550 // This is our peer in WebKit (implemented as ResourceHandleInternal). We do 505 // This is our peer in WebKit (implemented as ResourceHandleInternal). We do
551 // not manage its lifetime, and we may only access it from the owner's 506 // not manage its lifetime, and we may only access it from the owner's
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 result_->url = new_url; 546 result_->url = new_url;
592 } 547 }
593 548
594 virtual void OnReceivedResponse( 549 virtual void OnReceivedResponse(
595 const ResourceLoaderBridge::ResponseInfo& info, 550 const ResourceLoaderBridge::ResponseInfo& info,
596 bool content_filtered) { 551 bool content_filtered) {
597 *static_cast<ResourceLoaderBridge::ResponseInfo*>(result_) = info; 552 *static_cast<ResourceLoaderBridge::ResponseInfo*>(result_) = info;
598 } 553 }
599 554
600 virtual void OnReceivedData(int bytes_read) { 555 virtual void OnReceivedData(int bytes_read) {
601 if (download_to_file_) 556 result_->data.append(buf_->data(), bytes_read);
602 file_stream_.Write(buf_->data(), bytes_read, NULL);
603 else
604 result_->data.append(buf_->data(), bytes_read);
605 AsyncReadData(); // read more (may recurse) 557 AsyncReadData(); // read more (may recurse)
606 } 558 }
607 559
608 virtual void OnCompletedRequest(const URLRequestStatus& status, 560 virtual void OnCompletedRequest(const URLRequestStatus& status,
609 const std::string& security_info, 561 const std::string& security_info,
610 const base::Time& complete_time) { 562 const base::Time& complete_time) {
611 if (download_to_file_)
612 file_stream_.Close();
613 result_->status = status; 563 result_->status = status;
614 event_.Signal(); 564 event_.Signal();
615 } 565 }
616 566
617 private: 567 private:
618 ResourceLoaderBridge::SyncLoadResponse* result_; 568 ResourceLoaderBridge::SyncLoadResponse* result_;
619 base::WaitableEvent event_; 569 base::WaitableEvent event_;
620 }; 570 };
621 571
622 //----------------------------------------------------------------------------- 572 //-----------------------------------------------------------------------------
623 573
624 class ResourceLoaderBridgeImpl : public ResourceLoaderBridge { 574 class ResourceLoaderBridgeImpl : public ResourceLoaderBridge {
625 public: 575 public:
626 ResourceLoaderBridgeImpl( 576 ResourceLoaderBridgeImpl(
627 const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) 577 const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info)
628 : params_(new RequestParams), 578 : params_(new RequestParams),
629 proxy_(NULL) { 579 proxy_(NULL) {
580 DCHECK(!request_info.download_to_file); // Not implemented yet!
630 params_->method = request_info.method; 581 params_->method = request_info.method;
631 params_->url = request_info.url; 582 params_->url = request_info.url;
632 params_->first_party_for_cookies = request_info.first_party_for_cookies; 583 params_->first_party_for_cookies = request_info.first_party_for_cookies;
633 params_->referrer = request_info.referrer; 584 params_->referrer = request_info.referrer;
634 params_->headers = request_info.headers; 585 params_->headers = request_info.headers;
635 params_->load_flags = request_info.load_flags; 586 params_->load_flags = request_info.load_flags;
636 params_->request_type = request_info.request_type; 587 params_->request_type = request_info.request_type;
637 params_->appcache_host_id = request_info.appcache_host_id; 588 params_->appcache_host_id = request_info.appcache_host_id;
638 params_->download_to_file = request_info.download_to_file;
639 } 589 }
640 590
641 virtual ~ResourceLoaderBridgeImpl() { 591 virtual ~ResourceLoaderBridgeImpl() {
642 if (proxy_) { 592 if (proxy_) {
643 proxy_->DropPeer(); 593 proxy_->DropPeer();
644 // Let the proxy die on the IO thread 594 // Let the proxy die on the IO thread
645 g_io_thread->message_loop()->ReleaseSoon(FROM_HERE, proxy_); 595 g_io_thread->message_loop()->ReleaseSoon(FROM_HERE, proxy_);
646 } 596 }
647 } 597 }
648 598
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 872
923 // static 873 // static
924 scoped_refptr<base::MessageLoopProxy> 874 scoped_refptr<base::MessageLoopProxy>
925 SimpleResourceLoaderBridge::GetIoThread() { 875 SimpleResourceLoaderBridge::GetIoThread() {
926 if (!EnsureIOThread()) { 876 if (!EnsureIOThread()) {
927 LOG(DFATAL) << "Failed to create IO thread."; 877 LOG(DFATAL) << "Failed to create IO thread.";
928 return NULL; 878 return NULL;
929 } 879 }
930 return g_io_thread->message_loop_proxy(); 880 return g_io_thread->message_loop_proxy();
931 } 881 }
OLDNEW
« no previous file with comments | « webkit/glue/weburlloader_impl.cc ('k') | webkit/tools/test_shell/test_shell.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698