OLD | NEW |
---|---|
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 "content/browser/loader/navigation_url_loader_network_service.h" | 5 #include "content/browser/loader/navigation_url_loader_network_service.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
11 #include "content/browser/appcache/appcache_navigation_handle.h" | 11 #include "content/browser/appcache/appcache_navigation_handle.h" |
12 #include "content/browser/appcache/appcache_request_handler.h" | 12 #include "content/browser/appcache/appcache_request_handler.h" |
13 #include "content/browser/blob_storage/chrome_blob_storage_context.h" | 13 #include "content/browser/blob_storage/chrome_blob_storage_context.h" |
14 #include "content/browser/frame_host/frame_tree_node.h" | 14 #include "content/browser/frame_host/frame_tree_node.h" |
15 #include "content/browser/frame_host/navigation_request_info.h" | 15 #include "content/browser/frame_host/navigation_request_info.h" |
16 #include "content/browser/loader/navigation_resource_handler.h" | 16 #include "content/browser/loader/navigation_resource_handler.h" |
17 #include "content/browser/loader/navigation_resource_throttle.h" | 17 #include "content/browser/loader/navigation_resource_throttle.h" |
18 #include "content/browser/loader/navigation_url_loader_delegate.h" | 18 #include "content/browser/loader/navigation_url_loader_delegate.h" |
19 #include "content/browser/loader/url_loader_request_handler.h" | 19 #include "content/browser/loader/url_loader_request_handler.h" |
20 #include "content/browser/resource_context_impl.h" | 20 #include "content/browser/resource_context_impl.h" |
21 #include "content/browser/service_worker/service_worker_navigation_handle.h" | 21 #include "content/browser/service_worker/service_worker_navigation_handle.h" |
22 #include "content/browser/service_worker/service_worker_navigation_handle_core.h " | 22 #include "content/browser/service_worker/service_worker_navigation_handle_core.h " |
23 #include "content/browser/service_worker/service_worker_request_handler.h" | 23 #include "content/browser/service_worker/service_worker_request_handler.h" |
24 #include "content/browser/storage_partition_impl.h" | 24 #include "content/browser/storage_partition_impl.h" |
25 #include "content/browser/url_loader_factory_getter.h" | 25 #include "content/browser/url_loader_factory_getter.h" |
26 #include "content/browser/web_contents/web_contents_impl.h" | 26 #include "content/browser/web_contents/web_contents_impl.h" |
27 #include "content/browser/webui/url_data_manager_backend.h" | 27 #include "content/browser/webui/url_data_manager_backend.h" |
28 #include "content/browser/webui/web_ui_url_loader_factory.h" | 28 #include "content/browser/webui/web_ui_url_loader_factory.h" |
29 #include "content/common/throttling_url_loader.h" | |
30 #include "content/common/url_loader_factory.mojom.h" | |
29 #include "content/public/browser/browser_context.h" | 31 #include "content/public/browser/browser_context.h" |
30 #include "content/public/browser/browser_thread.h" | 32 #include "content/public/browser/browser_thread.h" |
33 #include "content/public/browser/content_browser_client.h" | |
31 #include "content/public/browser/global_request_id.h" | 34 #include "content/public/browser/global_request_id.h" |
32 #include "content/public/browser/navigation_data.h" | 35 #include "content/public/browser/navigation_data.h" |
33 #include "content/public/browser/navigation_ui_data.h" | 36 #include "content/public/browser/navigation_ui_data.h" |
34 #include "content/public/browser/ssl_status.h" | 37 #include "content/public/browser/ssl_status.h" |
35 #include "content/public/browser/stream_handle.h" | 38 #include "content/public/browser/stream_handle.h" |
36 #include "content/public/common/referrer.h" | 39 #include "content/public/common/referrer.h" |
37 #include "content/public/common/url_constants.h" | 40 #include "content/public/common/url_constants.h" |
38 #include "mojo/public/cpp/bindings/strong_binding.h" | |
39 #include "net/base/load_flags.h" | 41 #include "net/base/load_flags.h" |
40 #include "net/url_request/url_request_context.h" | 42 #include "net/url_request/url_request_context.h" |
43 #include "services/service_manager/public/cpp/connector.h" | |
41 | 44 |
42 namespace content { | 45 namespace content { |
43 | 46 |
44 namespace { | 47 namespace { |
45 | 48 |
46 // Request ID for browser initiated requests. We start at -2 on the same lines | 49 // Request ID for browser initiated requests. We start at -2 on the same lines |
47 // as ResourceDispatcherHostImpl. | 50 // as ResourceDispatcherHostImpl. |
48 int g_next_request_id = -2; | 51 int g_next_request_id = -2; |
49 | 52 |
50 WebContents* GetWebContentsFromFrameTreeNodeID(int frame_tree_node_id) { | 53 WebContents* GetWebContentsFromFrameTreeNodeID(int frame_tree_node_id) { |
51 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 54 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
52 FrameTreeNode* frame_tree_node = | 55 FrameTreeNode* frame_tree_node = |
53 FrameTreeNode::GloballyFindByID(frame_tree_node_id); | 56 FrameTreeNode::GloballyFindByID(frame_tree_node_id); |
54 if (!frame_tree_node) | 57 if (!frame_tree_node) |
55 return nullptr; | 58 return nullptr; |
56 | 59 |
57 return WebContentsImpl::FromFrameTreeNode(frame_tree_node); | 60 return WebContentsImpl::FromFrameTreeNode(frame_tree_node); |
58 } | 61 } |
59 | 62 |
60 class AssociatedURLLoaderWrapper final : public mojom::URLLoader { | |
61 public: | |
62 static void CreateLoaderAndStart(mojom::URLLoaderFactory* factory, | |
63 mojom::URLLoaderRequest request, | |
64 uint32_t options, | |
65 const ResourceRequest& resource_request, | |
66 mojom::URLLoaderClientPtr client) { | |
67 mojom::URLLoaderAssociatedPtr associated_ptr; | |
68 mojom::URLLoaderAssociatedRequest associated_request = | |
69 mojo::MakeRequest(&associated_ptr); | |
70 factory->CreateLoaderAndStart(std::move(associated_request), | |
71 0 /* routing_id */, 0 /* request_id */, | |
72 options, resource_request, std::move(client)); | |
73 mojo::MakeStrongBinding( | |
74 base::MakeUnique<AssociatedURLLoaderWrapper>(std::move(associated_ptr)), | |
75 std::move(request)); | |
76 } | |
77 | |
78 explicit AssociatedURLLoaderWrapper( | |
79 mojom::URLLoaderAssociatedPtr associated_ptr) | |
80 : associated_ptr_(std::move(associated_ptr)) {} | |
81 ~AssociatedURLLoaderWrapper() override {} | |
82 | |
83 void FollowRedirect() override { associated_ptr_->FollowRedirect(); } | |
84 | |
85 void SetPriority(net::RequestPriority priority, | |
86 int intra_priority_value) override { | |
87 associated_ptr_->SetPriority(priority, intra_priority_value); | |
88 } | |
89 | |
90 private: | |
91 mojom::URLLoaderAssociatedPtr associated_ptr_; | |
92 DISALLOW_COPY_AND_ASSIGN(AssociatedURLLoaderWrapper); | |
93 }; | |
94 | |
95 } // namespace | 63 } // namespace |
96 | 64 |
97 // Kept around during the lifetime of the navigation request, and is | 65 // Kept around during the lifetime of the navigation request, and is |
98 // responsible for dispatching a ResourceRequest to the appropriate | 66 // responsible for dispatching a ResourceRequest to the appropriate |
99 // URLLoader. In order to get the right URLLoader it builds a vector | 67 // URLLoader. In order to get the right URLLoader it builds a vector |
100 // of URLLoaderRequestHandler's and successively calls MaybeCreateLoader | 68 // of URLLoaderRequestHandler's and successively calls MaybeCreateLoader |
101 // on each until the request is successfully handled. The same sequence | 69 // on each until the request is successfully handled. The same sequence |
102 // may be performed multiple times when redirects happen. | 70 // may be performed multiple times when redirects happen. |
103 class NavigationURLLoaderNetworkService::URLLoaderRequestController { | 71 class NavigationURLLoaderNetworkService::URLLoaderRequestController |
72 : public mojom::URLLoaderClient { | |
104 public: | 73 public: |
105 URLLoaderRequestController( | 74 URLLoaderRequestController( |
106 std::unique_ptr<ResourceRequest> resource_request, | 75 std::unique_ptr<ResourceRequest> resource_request, |
107 ResourceContext* resource_context, | 76 ResourceContext* resource_context, |
108 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) | 77 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter, |
78 const base::WeakPtr<NavigationURLLoaderNetworkService>& owner) | |
109 : resource_request_(std::move(resource_request)), | 79 : resource_request_(std::move(resource_request)), |
110 resource_context_(resource_context), | 80 resource_context_(resource_context), |
111 url_loader_factory_getter_(url_loader_factory_getter) {} | 81 url_loader_factory_getter_(url_loader_factory_getter), |
82 owner_(owner) {} | |
112 | 83 |
113 virtual ~URLLoaderRequestController() { | 84 ~URLLoaderRequestController() override { |
114 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 85 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
115 } | 86 } |
116 | 87 |
117 void Start( | 88 void Start( |
118 ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core, | 89 ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core, |
119 AppCacheNavigationHandleCore* appcache_handle_core, | 90 AppCacheNavigationHandleCore* appcache_handle_core, |
120 std::unique_ptr<NavigationRequestInfo> request_info, | 91 std::unique_ptr<NavigationRequestInfo> request_info, |
121 mojom::URLLoaderFactoryPtrInfo factory_for_webui, | 92 mojom::URLLoaderFactoryPtrInfo factory_for_webui, |
122 const base::Callback<WebContents*(void)>& web_contents_getter, | 93 const base::Callback<WebContents*(void)>& web_contents_getter, |
123 mojom::URLLoaderRequest url_loader_request, | |
124 mojom::URLLoaderClientPtrInfo url_loader_client_ptr_info, | |
125 std::unique_ptr<service_manager::Connector> connector) { | 94 std::unique_ptr<service_manager::Connector> connector) { |
126 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 95 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
127 url_loader_client_ptr_.Bind(std::move(url_loader_client_ptr_info)); | 96 web_contents_getter_ = web_contents_getter; |
128 const ResourceType resource_type = request_info->is_main_frame | 97 const ResourceType resource_type = request_info->is_main_frame |
129 ? RESOURCE_TYPE_MAIN_FRAME | 98 ? RESOURCE_TYPE_MAIN_FRAME |
130 : RESOURCE_TYPE_SUB_FRAME; | 99 : RESOURCE_TYPE_SUB_FRAME; |
131 | 100 |
132 if (resource_request_->request_body) { | 101 if (resource_request_->request_body) { |
133 AttachRequestBodyBlobDataHandles(resource_request_->request_body.get(), | 102 AttachRequestBodyBlobDataHandles(resource_request_->request_body.get(), |
134 resource_context_); | 103 resource_context_); |
135 } | 104 } |
136 | 105 |
137 // Requests to WebUI scheme won't get redirected to/from other schemes | 106 // Requests to WebUI scheme won't get redirected to/from other schemes |
138 // or be intercepted, so we just let it go here. | 107 // or be intercepted, so we just let it go here. |
139 if (factory_for_webui.is_valid()) { | 108 if (factory_for_webui.is_valid()) { |
140 mojom::URLLoaderFactoryPtr factory_ptr; | 109 webui_factory_ptr_.Bind(std::move(factory_for_webui)); |
141 factory_ptr.Bind(std::move(factory_for_webui)); | 110 url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( |
142 AssociatedURLLoaderWrapper::CreateLoaderAndStart( | 111 webui_factory_ptr_.get(), |
143 factory_ptr.get(), std::move(url_loader_request), | 112 GetContentClient()->browser()->CreateURLLoaderThrottles( |
144 mojom::kURLLoadOptionSendSSLInfo, *resource_request_, | 113 web_contents_getter_), |
145 std::move(url_loader_client_ptr_)); | 114 0 /* routing_id? */, 0 /* request_id? */, |
115 mojom::kURLLoadOptionSendSSLInfo, *resource_request_, this); | |
146 return; | 116 return; |
147 } | 117 } |
148 | 118 |
149 DCHECK(handlers_.empty()); | 119 DCHECK(handlers_.empty()); |
150 if (service_worker_navigation_handle_core) { | 120 if (service_worker_navigation_handle_core) { |
151 RequestContextFrameType frame_type = | 121 RequestContextFrameType frame_type = |
152 request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL | 122 request_info->is_main_frame ? REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL |
153 : REQUEST_CONTEXT_FRAME_TYPE_NESTED; | 123 : REQUEST_CONTEXT_FRAME_TYPE_NESTED; |
154 | 124 |
155 storage::BlobStorageContext* blob_storage_context = GetBlobStorageContext( | 125 storage::BlobStorageContext* blob_storage_context = GetBlobStorageContext( |
(...skipping 11 matching lines...) Expand all Loading... | |
167 } | 137 } |
168 | 138 |
169 if (appcache_handle_core) { | 139 if (appcache_handle_core) { |
170 std::unique_ptr<URLLoaderRequestHandler> appcache_handler = | 140 std::unique_ptr<URLLoaderRequestHandler> appcache_handler = |
171 AppCacheRequestHandler::InitializeForNavigationNetworkService( | 141 AppCacheRequestHandler::InitializeForNavigationNetworkService( |
172 *resource_request_, appcache_handle_core); | 142 *resource_request_, appcache_handle_core); |
173 if (appcache_handler) | 143 if (appcache_handler) |
174 handlers_.push_back(std::move(appcache_handler)); | 144 handlers_.push_back(std::move(appcache_handler)); |
175 } | 145 } |
176 | 146 |
177 Restart(std::move(url_loader_request), std::move(url_loader_client_ptr_)); | 147 Restart(); |
178 } | 148 } |
179 | 149 |
180 // This could be called multiple times. | 150 // This could be called multiple times. |
181 void Restart(mojom::URLLoaderRequest url_loader_request, | 151 void Restart() { |
182 mojom::URLLoaderClientPtr url_loader_client_ptr) { | |
183 url_loader_request_ = std::move(url_loader_request); | |
184 url_loader_client_ptr_ = std::move(url_loader_client_ptr); | |
185 handler_index_ = 0; | 152 handler_index_ = 0; |
186 MaybeStartLoader(StartLoaderCallback()); | 153 MaybeStartLoader(StartLoaderCallback()); |
187 } | 154 } |
188 | 155 |
189 void MaybeStartLoader(StartLoaderCallback start_loader_callback) { | 156 void MaybeStartLoader(StartLoaderCallback start_loader_callback) { |
190 DCHECK(url_loader_client_ptr_.is_bound()); | |
191 | |
192 if (start_loader_callback) { | 157 if (start_loader_callback) { |
193 std::move(start_loader_callback) | 158 url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( |
194 .Run(std::move(url_loader_request_), | 159 std::move(start_loader_callback), |
195 std::move(url_loader_client_ptr_)); | 160 GetContentClient()->browser()->CreateURLLoaderThrottles( |
161 web_contents_getter_), | |
162 *resource_request_, this); | |
196 return; | 163 return; |
197 } | 164 } |
198 | 165 |
199 if (handler_index_ < handlers_.size()) { | 166 if (handler_index_ < handlers_.size()) { |
200 handlers_[handler_index_++]->MaybeCreateLoader( | 167 handlers_[handler_index_++]->MaybeCreateLoader( |
201 *resource_request_, resource_context_, | 168 *resource_request_, resource_context_, |
202 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader, | 169 base::BindOnce(&URLLoaderRequestController::MaybeStartLoader, |
203 base::Unretained(this))); | 170 base::Unretained(this))); |
204 return; | 171 return; |
205 } | 172 } |
206 | 173 |
207 mojom::URLLoaderFactory* factory = nullptr; | 174 mojom::URLLoaderFactory* factory = nullptr; |
208 DCHECK_EQ(handlers_.size(), handler_index_); | 175 DCHECK_EQ(handlers_.size(), handler_index_); |
209 if (resource_request_->url.SchemeIs(url::kBlobScheme)) { | 176 if (resource_request_->url.SchemeIs(url::kBlobScheme)) { |
210 factory = url_loader_factory_getter_->GetBlobFactory()->get(); | 177 factory = url_loader_factory_getter_->GetBlobFactory()->get(); |
211 } else { | 178 } else { |
212 factory = url_loader_factory_getter_->GetNetworkFactory()->get(); | 179 factory = url_loader_factory_getter_->GetNetworkFactory()->get(); |
213 } | 180 } |
214 AssociatedURLLoaderWrapper::CreateLoaderAndStart( | 181 url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( |
215 factory, std::move(url_loader_request_), | 182 factory, |
216 mojom::kURLLoadOptionSendSSLInfo, *resource_request_, | 183 GetContentClient()->browser()->CreateURLLoaderThrottles( |
217 std::move(url_loader_client_ptr_)); | 184 web_contents_getter_), |
185 0 /* routing_id? */, 0 /* request_id? */, | |
186 mojom::kURLLoadOptionSendSSLInfo, *resource_request_, this); | |
187 } | |
188 | |
189 void FollowRedirect() { | |
190 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
191 DCHECK(url_loader_); | |
192 | |
193 url_loader_->FollowRedirect(); | |
218 } | 194 } |
219 | 195 |
220 private: | 196 private: |
197 // mojom::URLLoaderClient implementation: | |
198 void OnReceiveResponse( | |
199 const ResourceResponseHead& head, | |
200 const base::Optional<net::SSLInfo>& ssl_info, | |
201 mojom::DownloadedTempFilePtr downloaded_file) override { | |
202 BrowserThread::PostTask( | |
203 BrowserThread::UI, FROM_HERE, | |
204 base::Bind(&NavigationURLLoaderNetworkService::OnReceiveResponse, | |
205 owner_, head, ssl_info, base::Passed(&downloaded_file))); | |
206 } | |
207 | |
208 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, | |
209 const ResourceResponseHead& head) override { | |
210 BrowserThread::PostTask( | |
211 BrowserThread::UI, FROM_HERE, | |
212 base::Bind(&NavigationURLLoaderNetworkService::OnReceiveRedirect, | |
213 owner_, redirect_info, head)); | |
214 } | |
215 | |
216 void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override {} | |
217 | |
218 void OnUploadProgress(int64_t current_position, | |
219 int64_t total_size, | |
220 OnUploadProgressCallback callback) override {} | |
221 | |
222 void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {} | |
223 | |
224 void OnTransferSizeUpdated(int32_t transfer_size_diff) override {} | |
225 | |
226 void OnStartLoadingResponseBody( | |
227 mojo::ScopedDataPipeConsumerHandle body) override { | |
228 BrowserThread::PostTask( | |
229 BrowserThread::UI, FROM_HERE, | |
230 base::Bind( | |
231 &NavigationURLLoaderNetworkService::OnStartLoadingResponseBody, | |
232 owner_, base::Passed(&body))); | |
233 } | |
234 | |
235 void OnComplete( | |
236 const ResourceRequestCompletionStatus& completion_status) override { | |
237 BrowserThread::PostTask( | |
238 BrowserThread::UI, FROM_HERE, | |
239 base::Bind(&NavigationURLLoaderNetworkService::OnComplete, owner_, | |
240 completion_status)); | |
241 } | |
242 | |
221 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_; | 243 std::vector<std::unique_ptr<URLLoaderRequestHandler>> handlers_; |
222 size_t handler_index_ = 0; | 244 size_t handler_index_ = 0; |
223 | 245 |
224 std::unique_ptr<ResourceRequest> resource_request_; | 246 std::unique_ptr<ResourceRequest> resource_request_; |
225 ResourceContext* resource_context_; | 247 ResourceContext* resource_context_; |
248 base::Callback<WebContents*()> web_contents_getter_; | |
226 | 249 |
227 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; | 250 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; |
228 | 251 |
229 // Kept around until we create a loader. | 252 mojom::URLLoaderFactoryPtr webui_factory_ptr_; |
230 mojom::URLLoaderRequest url_loader_request_; | 253 |
231 mojom::URLLoaderClientPtr url_loader_client_ptr_; | 254 std::unique_ptr<ThrottlingURLLoader> url_loader_; |
255 | |
256 base::WeakPtr<NavigationURLLoaderNetworkService> owner_; | |
kinuko
2017/06/12 12:39:19
Please comment that this is referenced only on UI
yzshen1
2017/06/12 20:12:31
Done.
| |
232 | 257 |
233 DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController); | 258 DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController); |
234 }; | 259 }; |
235 | 260 |
236 NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( | 261 NavigationURLLoaderNetworkService::NavigationURLLoaderNetworkService( |
237 ResourceContext* resource_context, | 262 ResourceContext* resource_context, |
238 StoragePartition* storage_partition, | 263 StoragePartition* storage_partition, |
239 std::unique_ptr<NavigationRequestInfo> request_info, | 264 std::unique_ptr<NavigationRequestInfo> request_info, |
240 std::unique_ptr<NavigationUIData> navigation_ui_data, | 265 std::unique_ptr<NavigationUIData> navigation_ui_data, |
241 ServiceWorkerNavigationHandle* service_worker_navigation_handle, | 266 ServiceWorkerNavigationHandle* service_worker_navigation_handle, |
242 AppCacheNavigationHandle* appcache_handle, | 267 AppCacheNavigationHandle* appcache_handle, |
243 NavigationURLLoaderDelegate* delegate) | 268 NavigationURLLoaderDelegate* delegate) |
244 : delegate_(delegate), binding_(this) { | 269 : delegate_(delegate), weak_factory_(this) { |
245 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 270 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
246 | 271 |
247 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( | 272 TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1( |
248 "navigation", "Navigation timeToResponseStarted", this, | 273 "navigation", "Navigation timeToResponseStarted", this, |
249 request_info->common_params.navigation_start, "FrameTreeNode id", | 274 request_info->common_params.navigation_start, "FrameTreeNode id", |
250 request_info->frame_tree_node_id); | 275 request_info->frame_tree_node_id); |
251 | 276 |
252 // TODO(scottmg): Port over stuff from RDHI::BeginNavigationRequest() here. | 277 // TODO(scottmg): Port over stuff from RDHI::BeginNavigationRequest() here. |
253 auto new_request = base::MakeUnique<ResourceRequest>(); | 278 auto new_request = base::MakeUnique<ResourceRequest>(); |
254 | 279 |
(...skipping 19 matching lines...) Expand all Loading... | |
274 // Sync loads should have maximum priority and should be the only | 299 // Sync loads should have maximum priority and should be the only |
275 // requests that have the ignore limits flag set. | 300 // requests that have the ignore limits flag set. |
276 DCHECK(!(load_flags & net::LOAD_IGNORE_LIMITS)); | 301 DCHECK(!(load_flags & net::LOAD_IGNORE_LIMITS)); |
277 | 302 |
278 new_request->load_flags = load_flags; | 303 new_request->load_flags = load_flags; |
279 | 304 |
280 new_request->request_body = request_info->common_params.post_data.get(); | 305 new_request->request_body = request_info->common_params.post_data.get(); |
281 | 306 |
282 int frame_tree_node_id = request_info->frame_tree_node_id; | 307 int frame_tree_node_id = request_info->frame_tree_node_id; |
283 | 308 |
284 mojom::URLLoaderRequest loader_request = mojo::MakeRequest(&url_loader_ptr_); | |
285 mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; | |
286 binding_.Bind(mojo::MakeRequest(&url_loader_client_ptr_to_pass)); | |
287 | |
288 // Check if a web UI scheme wants to handle this request. | 309 // Check if a web UI scheme wants to handle this request. |
289 mojom::URLLoaderFactoryPtrInfo factory_for_webui; | 310 mojom::URLLoaderFactoryPtrInfo factory_for_webui; |
290 const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); | 311 const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); |
291 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) != | 312 if (std::find(schemes.begin(), schemes.end(), new_request->url.scheme()) != |
292 schemes.end()) { | 313 schemes.end()) { |
293 FrameTreeNode* frame_tree_node = | 314 FrameTreeNode* frame_tree_node = |
294 FrameTreeNode::GloballyFindByID(frame_tree_node_id); | 315 FrameTreeNode::GloballyFindByID(frame_tree_node_id); |
295 factory_for_webui = CreateWebUIURLLoader(frame_tree_node).PassInterface(); | 316 factory_for_webui = CreateWebUIURLLoader(frame_tree_node).PassInterface(); |
296 } | 317 } |
297 | 318 |
298 g_next_request_id--; | 319 g_next_request_id--; |
299 | 320 |
300 DCHECK(!request_controller_); | 321 DCHECK(!request_controller_); |
301 request_controller_ = base::MakeUnique<URLLoaderRequestController>( | 322 request_controller_ = base::MakeUnique<URLLoaderRequestController>( |
302 std::move(new_request), resource_context, | 323 std::move(new_request), resource_context, |
303 static_cast<StoragePartitionImpl*>(storage_partition) | 324 static_cast<StoragePartitionImpl*>(storage_partition) |
304 ->url_loader_factory_getter()); | 325 ->url_loader_factory_getter(), |
326 weak_factory_.GetWeakPtr()); | |
305 BrowserThread::PostTask( | 327 BrowserThread::PostTask( |
306 BrowserThread::IO, FROM_HERE, | 328 BrowserThread::IO, FROM_HERE, |
307 base::Bind( | 329 base::Bind( |
308 &URLLoaderRequestController::Start, | 330 &URLLoaderRequestController::Start, |
309 base::Unretained(request_controller_.get()), | 331 base::Unretained(request_controller_.get()), |
310 service_worker_navigation_handle | 332 service_worker_navigation_handle |
311 ? service_worker_navigation_handle->core() | 333 ? service_worker_navigation_handle->core() |
312 : nullptr, | 334 : nullptr, |
313 appcache_handle ? appcache_handle->core() : nullptr, | 335 appcache_handle ? appcache_handle->core() : nullptr, |
314 base::Passed(std::move(request_info)), | 336 base::Passed(std::move(request_info)), |
315 base::Passed(std::move(factory_for_webui)), | 337 base::Passed(std::move(factory_for_webui)), |
316 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id), | 338 base::Bind(&GetWebContentsFromFrameTreeNodeID, frame_tree_node_id), |
317 base::Passed(std::move(loader_request)), | |
318 base::Passed(url_loader_client_ptr_to_pass.PassInterface()), | |
319 base::Passed(ServiceManagerConnection::GetForProcess() | 339 base::Passed(ServiceManagerConnection::GetForProcess() |
320 ->GetConnector() | 340 ->GetConnector() |
321 ->Clone()))); | 341 ->Clone()))); |
322 } | 342 } |
323 | 343 |
324 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() { | 344 NavigationURLLoaderNetworkService::~NavigationURLLoaderNetworkService() { |
325 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, | 345 BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, |
326 request_controller_.release()); | 346 request_controller_.release()); |
327 } | 347 } |
328 | 348 |
329 void NavigationURLLoaderNetworkService::FollowRedirect() { | 349 void NavigationURLLoaderNetworkService::FollowRedirect() { |
330 url_loader_ptr_->FollowRedirect(); | 350 BrowserThread::PostTask( |
351 BrowserThread::IO, FROM_HERE, | |
352 base::Bind(&URLLoaderRequestController::FollowRedirect, | |
353 base::Unretained(request_controller_.get()))); | |
331 } | 354 } |
332 | 355 |
333 void NavigationURLLoaderNetworkService::ProceedWithResponse() {} | 356 void NavigationURLLoaderNetworkService::ProceedWithResponse() {} |
334 | 357 |
335 void NavigationURLLoaderNetworkService::OnReceiveResponse( | 358 void NavigationURLLoaderNetworkService::OnReceiveResponse( |
336 const ResourceResponseHead& head, | 359 const ResourceResponseHead& head, |
337 const base::Optional<net::SSLInfo>& ssl_info, | 360 const base::Optional<net::SSLInfo>& ssl_info, |
338 mojom::DownloadedTempFilePtr downloaded_file) { | 361 mojom::DownloadedTempFilePtr downloaded_file) { |
339 // TODO(scottmg): This needs to do more of what | 362 // TODO(scottmg): This needs to do more of what |
340 // NavigationResourceHandler::OnReponseStarted() does. Or maybe in | 363 // NavigationResourceHandler::OnReponseStarted() does. Or maybe in |
341 // OnStartLoadingResponseBody(). | 364 // OnStartLoadingResponseBody(). |
342 if (ssl_info && ssl_info->cert) | 365 if (ssl_info && ssl_info->cert) |
343 NavigationResourceHandler::GetSSLStatusForRequest(*ssl_info, &ssl_status_); | 366 NavigationResourceHandler::GetSSLStatusForRequest(*ssl_info, &ssl_status_); |
344 response_ = base::MakeRefCounted<ResourceResponse>(); | 367 response_ = base::MakeRefCounted<ResourceResponse>(); |
345 response_->head = head; | 368 response_->head = head; |
346 } | 369 } |
347 | 370 |
348 void NavigationURLLoaderNetworkService::OnReceiveRedirect( | 371 void NavigationURLLoaderNetworkService::OnReceiveRedirect( |
349 const net::RedirectInfo& redirect_info, | 372 const net::RedirectInfo& redirect_info, |
350 const ResourceResponseHead& head) { | 373 const ResourceResponseHead& head) { |
351 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 374 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
352 // TODO(kinuko): Perform the necessary check and call | 375 // TODO(kinuko): Perform the necessary check and call |
353 // URLLoaderRequestController::Restart with the new URL?? | 376 // URLLoaderRequestController::Restart with the new URL?? |
354 scoped_refptr<ResourceResponse> response(new ResourceResponse()); | 377 scoped_refptr<ResourceResponse> response(new ResourceResponse()); |
355 response->head = head; | 378 response->head = head; |
356 delegate_->OnRequestRedirected(redirect_info, response); | 379 delegate_->OnRequestRedirected(redirect_info, response); |
357 } | 380 } |
358 | 381 |
359 void NavigationURLLoaderNetworkService::OnDataDownloaded( | |
360 int64_t data_length, | |
361 int64_t encoded_length) {} | |
362 | |
363 void NavigationURLLoaderNetworkService::OnUploadProgress( | |
364 int64_t current_position, | |
365 int64_t total_size, | |
366 OnUploadProgressCallback callback) {} | |
367 | |
368 void NavigationURLLoaderNetworkService::OnReceiveCachedMetadata( | |
369 const std::vector<uint8_t>& data) {} | |
370 | |
371 void NavigationURLLoaderNetworkService::OnTransferSizeUpdated( | |
372 int32_t transfer_size_diff) {} | |
373 | |
374 void NavigationURLLoaderNetworkService::OnStartLoadingResponseBody( | 382 void NavigationURLLoaderNetworkService::OnStartLoadingResponseBody( |
375 mojo::ScopedDataPipeConsumerHandle body) { | 383 mojo::ScopedDataPipeConsumerHandle body) { |
376 DCHECK(response_); | 384 DCHECK(response_); |
377 | 385 |
378 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", this, | 386 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", this, |
379 "&NavigationURLLoaderNetworkService", this, "success", | 387 "&NavigationURLLoaderNetworkService", this, "success", |
380 true); | 388 true); |
381 | 389 |
382 // Temporarily, we pass both a stream (null) and the data pipe to the | 390 // Temporarily, we pass both a stream (null) and the data pipe to the |
383 // delegate until PlzNavigate has shipped and we can be comfortable fully | 391 // delegate until PlzNavigate has shipped and we can be comfortable fully |
(...skipping 10 matching lines...) Expand all Loading... | |
394 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", | 402 TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", |
395 this, "&NavigationURLLoaderNetworkService", this, | 403 this, "&NavigationURLLoaderNetworkService", this, |
396 "success", false); | 404 "success", false); |
397 | 405 |
398 delegate_->OnRequestFailed(completion_status.exists_in_cache, | 406 delegate_->OnRequestFailed(completion_status.exists_in_cache, |
399 completion_status.error_code); | 407 completion_status.error_code); |
400 } | 408 } |
401 } | 409 } |
402 | 410 |
403 } // namespace content | 411 } // namespace content |
OLD | NEW |