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 |