| 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 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading | 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading |
| 6 | 6 |
| 7 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 7 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 8 | 8 |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 #include "ipc/ipc_message_start.h" | 70 #include "ipc/ipc_message_start.h" |
| 71 #include "net/base/auth.h" | 71 #include "net/base/auth.h" |
| 72 #include "net/base/load_flags.h" | 72 #include "net/base/load_flags.h" |
| 73 #include "net/base/mime_util.h" | 73 #include "net/base/mime_util.h" |
| 74 #include "net/base/net_errors.h" | 74 #include "net/base/net_errors.h" |
| 75 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 75 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
| 76 #include "net/base/request_priority.h" | 76 #include "net/base/request_priority.h" |
| 77 #include "net/base/upload_data_stream.h" | 77 #include "net/base/upload_data_stream.h" |
| 78 #include "net/cert/cert_status_flags.h" | 78 #include "net/cert/cert_status_flags.h" |
| 79 #include "net/cookies/cookie_monster.h" | 79 #include "net/cookies/cookie_monster.h" |
| 80 #include "net/http/http_cache.h" | |
| 81 #include "net/http/http_response_headers.h" | 80 #include "net/http/http_response_headers.h" |
| 82 #include "net/http/http_response_info.h" | 81 #include "net/http/http_response_info.h" |
| 83 #include "net/http/http_transaction_factory.h" | |
| 84 #include "net/ssl/ssl_cert_request_info.h" | 82 #include "net/ssl/ssl_cert_request_info.h" |
| 85 #include "net/url_request/url_request.h" | 83 #include "net/url_request/url_request.h" |
| 86 #include "net/url_request/url_request_context.h" | 84 #include "net/url_request/url_request_context.h" |
| 87 #include "net/url_request/url_request_job_factory.h" | 85 #include "net/url_request/url_request_job_factory.h" |
| 88 #include "webkit/browser/appcache/appcache_interceptor.h" | 86 #include "webkit/browser/appcache/appcache_interceptor.h" |
| 89 #include "webkit/common/blob/blob_data.h" | 87 #include "webkit/common/blob/blob_data.h" |
| 90 #include "webkit/browser/blob/blob_data_handle.h" | 88 #include "webkit/browser/blob/blob_data_handle.h" |
| 91 #include "webkit/browser/blob/blob_storage_context.h" | 89 #include "webkit/browser/blob/blob_storage_context.h" |
| 92 #include "webkit/browser/blob/blob_url_request_job_factory.h" | 90 #include "webkit/browser/blob/blob_url_request_job_factory.h" |
| 93 #include "webkit/browser/fileapi/file_permission_policy.h" | 91 #include "webkit/browser/fileapi/file_permission_policy.h" |
| (...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 filter_ = filter; | 826 filter_ = filter; |
| 829 bool handled = true; | 827 bool handled = true; |
| 830 IPC_BEGIN_MESSAGE_MAP_EX(ResourceDispatcherHostImpl, message, *message_was_ok) | 828 IPC_BEGIN_MESSAGE_MAP_EX(ResourceDispatcherHostImpl, message, *message_was_ok) |
| 831 IPC_MESSAGE_HANDLER(ResourceHostMsg_RequestResource, OnRequestResource) | 829 IPC_MESSAGE_HANDLER(ResourceHostMsg_RequestResource, OnRequestResource) |
| 832 IPC_MESSAGE_HANDLER_DELAY_REPLY(ResourceHostMsg_SyncLoad, OnSyncLoad) | 830 IPC_MESSAGE_HANDLER_DELAY_REPLY(ResourceHostMsg_SyncLoad, OnSyncLoad) |
| 833 IPC_MESSAGE_HANDLER(ResourceHostMsg_ReleaseDownloadedFile, | 831 IPC_MESSAGE_HANDLER(ResourceHostMsg_ReleaseDownloadedFile, |
| 834 OnReleaseDownloadedFile) | 832 OnReleaseDownloadedFile) |
| 835 IPC_MESSAGE_HANDLER(ResourceHostMsg_DataDownloaded_ACK, OnDataDownloadedACK) | 833 IPC_MESSAGE_HANDLER(ResourceHostMsg_DataDownloaded_ACK, OnDataDownloadedACK) |
| 836 IPC_MESSAGE_HANDLER(ResourceHostMsg_UploadProgress_ACK, OnUploadProgressACK) | 834 IPC_MESSAGE_HANDLER(ResourceHostMsg_UploadProgress_ACK, OnUploadProgressACK) |
| 837 IPC_MESSAGE_HANDLER(ResourceHostMsg_CancelRequest, OnCancelRequest) | 835 IPC_MESSAGE_HANDLER(ResourceHostMsg_CancelRequest, OnCancelRequest) |
| 838 IPC_MESSAGE_HANDLER(ViewHostMsg_DidLoadResourceFromMemoryCache, | |
| 839 OnDidLoadResourceFromMemoryCache) | |
| 840 IPC_MESSAGE_UNHANDLED(handled = false) | 836 IPC_MESSAGE_UNHANDLED(handled = false) |
| 841 IPC_END_MESSAGE_MAP_EX() | 837 IPC_END_MESSAGE_MAP_EX() |
| 842 | 838 |
| 843 if (!handled && IPC_MESSAGE_ID_CLASS(message.type()) == ResourceMsgStart) { | 839 if (!handled && IPC_MESSAGE_ID_CLASS(message.type()) == ResourceMsgStart) { |
| 844 PickleIterator iter(message); | 840 PickleIterator iter(message); |
| 845 int request_id = -1; | 841 int request_id = -1; |
| 846 bool ok = iter.ReadInt(&request_id); | 842 bool ok = iter.ReadInt(&request_id); |
| 847 DCHECK(ok); | 843 DCHECK(ok); |
| 848 GlobalRequestID id(filter_->child_id(), request_id); | 844 GlobalRequestID id(filter_->child_id(), request_id); |
| 849 DelegateMap::iterator it = delegate_map_.find(id); | 845 DelegateMap::iterator it = delegate_map_.find(id); |
| 850 if (it != delegate_map_.end()) { | 846 if (it != delegate_map_.end()) { |
| 851 ObserverList<ResourceMessageDelegate>::Iterator del_it(*it->second); | 847 ObserverList<ResourceMessageDelegate>::Iterator del_it(*it->second); |
| 852 ResourceMessageDelegate* delegate; | 848 ResourceMessageDelegate* delegate; |
| 853 while (!handled && (delegate = del_it.GetNext()) != NULL) { | 849 while (!handled && (delegate = del_it.GetNext()) != NULL) { |
| 854 handled = delegate->OnMessageReceived(message, message_was_ok); | 850 handled = delegate->OnMessageReceived(message, message_was_ok); |
| 855 } | 851 } |
| 856 } | 852 } |
| 857 } | 853 } |
| 858 | 854 |
| 859 if (message.type() == ViewHostMsg_DidLoadResourceFromMemoryCache::ID) { | |
| 860 // We just needed to peek at this message. We still want it to reach its | |
| 861 // normal destination. | |
| 862 handled = false; | |
| 863 } | |
| 864 | |
| 865 filter_ = NULL; | 855 filter_ = NULL; |
| 866 return handled; | 856 return handled; |
| 867 } | 857 } |
| 868 | 858 |
| 869 void ResourceDispatcherHostImpl::OnRequestResource( | 859 void ResourceDispatcherHostImpl::OnRequestResource( |
| 870 const IPC::Message& message, | 860 const IPC::Message& message, |
| 871 int request_id, | 861 int request_id, |
| 872 const ResourceHostMsg_Request& request_data) { | 862 const ResourceHostMsg_Request& request_data) { |
| 873 BeginRequest(request_id, request_data, NULL, message.routing_id()); | 863 BeginRequest(request_id, request_data, NULL, message.routing_id()); |
| 874 } | 864 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 925 *deferred_loader->GetRequestInfo()); | 915 *deferred_loader->GetRequestInfo()); |
| 926 pending_loaders_.erase(it); | 916 pending_loaders_.erase(it); |
| 927 } else { | 917 } else { |
| 928 RecordAction(UserMetricsAction("BadMessageTerminate_RDH")); | 918 RecordAction(UserMetricsAction("BadMessageTerminate_RDH")); |
| 929 filter_->BadMessageReceived(); | 919 filter_->BadMessageReceived(); |
| 930 return; | 920 return; |
| 931 } | 921 } |
| 932 } | 922 } |
| 933 } | 923 } |
| 934 | 924 |
| 935 ResourceContext* resource_context = filter_->resource_context(); | 925 ResourceContext* resource_context = NULL; |
| 926 net::URLRequestContext* request_context = NULL; |
| 927 filter_->GetContexts(request_data, &resource_context, &request_context); |
| 936 // http://crbug.com/90971 | 928 // http://crbug.com/90971 |
| 937 CHECK(ContainsKey(active_resource_contexts_, resource_context)); | 929 CHECK(ContainsKey(active_resource_contexts_, resource_context)); |
| 938 | 930 |
| 939 if (is_shutdown_ || | 931 if (is_shutdown_ || |
| 940 !ShouldServiceRequest(process_type, child_id, request_data, | 932 !ShouldServiceRequest(process_type, child_id, request_data, |
| 941 filter_->file_system_context())) { | 933 filter_->file_system_context())) { |
| 942 AbortRequestBeforeItStarts(filter_, sync_result, request_id); | 934 AbortRequestBeforeItStarts(filter_, sync_result, request_id); |
| 943 return; | 935 return; |
| 944 } | 936 } |
| 945 | 937 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 969 // Construct the request. | 961 // Construct the request. |
| 970 scoped_ptr<net::URLRequest> new_request; | 962 scoped_ptr<net::URLRequest> new_request; |
| 971 net::URLRequest* request; | 963 net::URLRequest* request; |
| 972 if (deferred_loader.get()) { | 964 if (deferred_loader.get()) { |
| 973 request = deferred_loader->request(); | 965 request = deferred_loader->request(); |
| 974 | 966 |
| 975 // Give the ResourceLoader (or any of the ResourceHandlers held by it) a | 967 // Give the ResourceLoader (or any of the ResourceHandlers held by it) a |
| 976 // chance to reset some state before we complete the transfer. | 968 // chance to reset some state before we complete the transfer. |
| 977 deferred_loader->WillCompleteTransfer(); | 969 deferred_loader->WillCompleteTransfer(); |
| 978 } else { | 970 } else { |
| 979 net::URLRequestContext* context = | 971 new_request.reset(request_context->CreateRequest(request_data.url, NULL)); |
| 980 filter_->GetURLRequestContext(request_data.resource_type); | |
| 981 new_request.reset(context->CreateRequest(request_data.url, NULL)); | |
| 982 request = new_request.get(); | 972 request = new_request.get(); |
| 983 | 973 |
| 984 request->set_method(request_data.method); | 974 request->set_method(request_data.method); |
| 985 request->set_first_party_for_cookies(request_data.first_party_for_cookies); | 975 request->set_first_party_for_cookies(request_data.first_party_for_cookies); |
| 986 SetReferrerForRequest(request, referrer); | 976 SetReferrerForRequest(request, referrer); |
| 987 | 977 |
| 988 net::HttpRequestHeaders headers; | 978 net::HttpRequestHeaders headers; |
| 989 headers.AddHeadersFromString(request_data.headers); | 979 headers.AddHeadersFromString(request_data.headers); |
| 990 request->SetExtraRequestHeaders(headers); | 980 request->SetExtraRequestHeaders(headers); |
| 991 } | 981 } |
| 992 | 982 |
| 993 // TODO(darin): Do we really need all of these URLRequest setters in the | 983 // TODO(darin): Do we really need all of these URLRequest setters in the |
| 994 // transferred navigation case? | 984 // transferred navigation case? |
| 995 | 985 |
| 996 request->set_load_flags(load_flags); | 986 request->set_load_flags(load_flags); |
| 997 request->SetPriority(request_data.priority); | 987 request->SetPriority(request_data.priority); |
| 998 | 988 |
| 999 // Resolve elements from request_body and prepare upload data. | 989 // Resolve elements from request_body and prepare upload data. |
| 1000 if (request_data.request_body.get()) { | 990 if (request_data.request_body.get()) { |
| 991 webkit_blob::BlobStorageContext* blob_context = NULL; |
| 992 if (filter_->blob_storage_context()) |
| 993 blob_context = filter_->blob_storage_context()->context(), |
| 1001 request->set_upload(UploadDataStreamBuilder::Build( | 994 request->set_upload(UploadDataStreamBuilder::Build( |
| 1002 request_data.request_body.get(), | 995 request_data.request_body.get(), |
| 1003 filter_->blob_storage_context()->context(), | 996 blob_context, |
| 1004 filter_->file_system_context(), | 997 filter_->file_system_context(), |
| 1005 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE) | 998 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE) |
| 1006 .get())); | 999 .get())); |
| 1007 } | 1000 } |
| 1008 | 1001 |
| 1009 bool allow_download = request_data.allow_download && | 1002 bool allow_download = request_data.allow_download && |
| 1010 ResourceType::IsFrame(request_data.resource_type); | 1003 ResourceType::IsFrame(request_data.resource_type); |
| 1011 | 1004 |
| 1012 // Make extra info and read footer (contains request ID). | 1005 // Make extra info and read footer (contains request ID). |
| 1013 ResourceRequestInfoImpl* extra_info = | 1006 ResourceRequestInfoImpl* extra_info = |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1043 | 1036 |
| 1044 // Have the appcache associate its extra info with the request. | 1037 // Have the appcache associate its extra info with the request. |
| 1045 appcache::AppCacheInterceptor::SetExtraRequestInfo( | 1038 appcache::AppCacheInterceptor::SetExtraRequestInfo( |
| 1046 request, filter_->appcache_service(), child_id, | 1039 request, filter_->appcache_service(), child_id, |
| 1047 request_data.appcache_host_id, request_data.resource_type); | 1040 request_data.appcache_host_id, request_data.resource_type); |
| 1048 | 1041 |
| 1049 // Construct the IPC resource handler. | 1042 // Construct the IPC resource handler. |
| 1050 scoped_ptr<ResourceHandler> handler; | 1043 scoped_ptr<ResourceHandler> handler; |
| 1051 if (sync_result) { | 1044 if (sync_result) { |
| 1052 handler.reset(new SyncResourceHandler( | 1045 handler.reset(new SyncResourceHandler( |
| 1053 filter_, request, sync_result, this)); | 1046 filter_, resource_context, request, sync_result, this)); |
| 1054 } else { | 1047 } else { |
| 1055 handler.reset(new AsyncResourceHandler(filter_, request, this)); | 1048 handler.reset(new AsyncResourceHandler( |
| 1049 filter_, resource_context, request, this)); |
| 1056 } | 1050 } |
| 1057 | 1051 |
| 1058 // The RedirectToFileResourceHandler depends on being next in the chain. | 1052 // The RedirectToFileResourceHandler depends on being next in the chain. |
| 1059 if (request_data.download_to_file) { | 1053 if (request_data.download_to_file) { |
| 1060 handler.reset( | 1054 handler.reset( |
| 1061 new RedirectToFileResourceHandler(handler.Pass(), child_id, this)); | 1055 new RedirectToFileResourceHandler(handler.Pass(), child_id, this)); |
| 1062 } | 1056 } |
| 1063 | 1057 |
| 1064 // Install a CrossSiteResourceHandler if this request is coming from a | 1058 // Install a CrossSiteResourceHandler if this request is coming from a |
| 1065 // RenderViewHost with a pending cross-site request. We only check this for | 1059 // RenderViewHost with a pending cross-site request. We only check this for |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 PAGE_TRANSITION_LINK, | 1189 PAGE_TRANSITION_LINK, |
| 1196 download, // is_download | 1190 download, // is_download |
| 1197 false, // is_stream | 1191 false, // is_stream |
| 1198 download, // allow_download | 1192 download, // allow_download |
| 1199 false, // has_user_gesture | 1193 false, // has_user_gesture |
| 1200 WebKit::WebReferrerPolicyDefault, | 1194 WebKit::WebReferrerPolicyDefault, |
| 1201 context, | 1195 context, |
| 1202 true); // is_async | 1196 true); // is_async |
| 1203 } | 1197 } |
| 1204 | 1198 |
| 1205 | |
| 1206 void ResourceDispatcherHostImpl::OnDidLoadResourceFromMemoryCache( | |
| 1207 const GURL& url, | |
| 1208 const std::string& security_info, | |
| 1209 const std::string& http_method, | |
| 1210 const std::string& mime_type, | |
| 1211 ResourceType::Type resource_type) { | |
| 1212 if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) | |
| 1213 return; | |
| 1214 | |
| 1215 filter_->GetURLRequestContext(resource_type)->http_transaction_factory()-> | |
| 1216 GetCache()->OnExternalCacheHit(url, http_method); | |
| 1217 } | |
| 1218 | |
| 1219 void ResourceDispatcherHostImpl::OnRenderViewHostCreated( | 1199 void ResourceDispatcherHostImpl::OnRenderViewHostCreated( |
| 1220 int child_id, | 1200 int child_id, |
| 1221 int route_id) { | 1201 int route_id) { |
| 1222 scheduler_->OnClientCreated(child_id, route_id); | 1202 scheduler_->OnClientCreated(child_id, route_id); |
| 1223 } | 1203 } |
| 1224 | 1204 |
| 1225 void ResourceDispatcherHostImpl::OnRenderViewHostDeleted( | 1205 void ResourceDispatcherHostImpl::OnRenderViewHostDeleted( |
| 1226 int child_id, | 1206 int child_id, |
| 1227 int route_id) { | 1207 int route_id) { |
| 1228 scheduler_->OnClientDeleted(child_id, route_id); | 1208 scheduler_->OnClientDeleted(child_id, route_id); |
| (...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1889 if ((load_flags & net::LOAD_REPORT_RAW_HEADERS) | 1869 if ((load_flags & net::LOAD_REPORT_RAW_HEADERS) |
| 1890 && !policy->CanReadRawCookies(child_id)) { | 1870 && !policy->CanReadRawCookies(child_id)) { |
| 1891 VLOG(1) << "Denied unauthorized request for raw headers"; | 1871 VLOG(1) << "Denied unauthorized request for raw headers"; |
| 1892 load_flags &= ~net::LOAD_REPORT_RAW_HEADERS; | 1872 load_flags &= ~net::LOAD_REPORT_RAW_HEADERS; |
| 1893 } | 1873 } |
| 1894 | 1874 |
| 1895 return load_flags; | 1875 return load_flags; |
| 1896 } | 1876 } |
| 1897 | 1877 |
| 1898 } // namespace content | 1878 } // namespace content |
| OLD | NEW |