Index: webkit/browser/blob/blob_url_request_job_factory.cc |
diff --git a/webkit/browser/blob/blob_url_request_job_factory.cc b/webkit/browser/blob/blob_url_request_job_factory.cc |
index cc600d1c228aa0d7ce467d5dd2160df67f939b0a..18198383c6e3eeb85801722b0821341ad2dcab54 100644 |
--- a/webkit/browser/blob/blob_url_request_job_factory.cc |
+++ b/webkit/browser/blob/blob_url_request_job_factory.cc |
@@ -7,44 +7,65 @@ |
#include "base/basictypes.h" |
#include "base/compiler_specific.h" |
#include "base/message_loop/message_loop_proxy.h" |
-#include "net/url_request/url_request.h" |
+#include "net/url_request/url_request_context.h" |
#include "net/url_request/url_request_job_factory.h" |
-#include "webkit/browser/blob/blob_storage_controller.h" |
+#include "webkit/browser/blob/blob_data_handle.h" |
#include "webkit/browser/blob/blob_url_request_job.h" |
#include "webkit/browser/fileapi/file_system_context.h" |
namespace webkit_blob { |
+namespace { |
+ |
+int kUserDataKey; // The value is not important, the addr is a key. |
+ |
+BlobDataHandle* GetRequestedBlobDataHandle(net::URLRequest* request) { |
+ return static_cast<BlobDataHandle*>(request->GetUserData(&kUserDataKey)); |
+} |
+ |
+} // namespace |
+ |
+// static |
+net::URLRequest* BlobProtocolHandler::CreateBlobRequest( |
+ scoped_ptr<BlobDataHandle> blob_data_handle, |
+ const net::URLRequestContext* request_context, |
+ net::URLRequest::Delegate* request_delegate) { |
+ const GURL kBlobUrl("blob://see_user_data/"); |
+ net::URLRequest* request = request_context->CreateRequest( |
+ kBlobUrl, request_delegate); |
+ SetRequestedBlobDataHandle(request, blob_data_handle.Pass()); |
+ return request; |
+} |
+ |
+// static |
+void BlobProtocolHandler::SetRequestedBlobDataHandle( |
+ net::URLRequest* request, |
+ scoped_ptr<BlobDataHandle> blob_data_handle) { |
+ request->SetUserData(&kUserDataKey, blob_data_handle.release()); |
+} |
+ |
BlobProtocolHandler::BlobProtocolHandler( |
- webkit_blob::BlobStorageController* blob_storage_controller, |
fileapi::FileSystemContext* file_system_context, |
base::MessageLoopProxy* loop_proxy) |
- : blob_storage_controller_(blob_storage_controller), |
- file_system_context_(file_system_context), |
+ : file_system_context_(file_system_context), |
file_loop_proxy_(loop_proxy) { |
- DCHECK(blob_storage_controller_); |
- DCHECK(file_system_context_.get()); |
- DCHECK(file_loop_proxy_.get()); |
} |
-BlobProtocolHandler::~BlobProtocolHandler() {} |
+BlobProtocolHandler::~BlobProtocolHandler() { |
+} |
net::URLRequestJob* BlobProtocolHandler::MaybeCreateJob( |
net::URLRequest* request, net::NetworkDelegate* network_delegate) const { |
- scoped_refptr<webkit_blob::BlobData> data = LookupBlobData(request); |
- if (!data.get()) { |
- // This request is not coming through resource dispatcher host. |
- data = blob_storage_controller_->GetBlobDataFromUrl(request->url()); |
- } |
- return new webkit_blob::BlobURLRequestJob(request, |
- network_delegate, |
- data.get(), |
- file_system_context_.get(), |
- file_loop_proxy_.get()); |
+ return new webkit_blob::BlobURLRequestJob( |
+ request, network_delegate, LookupBlobData(request), |
+ file_system_context_, file_loop_proxy_); |
} |
scoped_refptr<webkit_blob::BlobData> |
BlobProtocolHandler::LookupBlobData(net::URLRequest* request) const { |
+ BlobDataHandle* blob_data_handle = GetRequestedBlobDataHandle(request); |
+ if (blob_data_handle) |
+ return blob_data_handle->data(); |
return NULL; |
} |