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 #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_dele gate.h" | 5 #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_dele gate.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "android_webview/browser/aw_browser_context.h" | 10 #include "android_webview/browser/aw_browser_context.h" |
11 #include "android_webview/browser/aw_contents_client_bridge_base.h" | |
11 #include "android_webview/browser/aw_contents_io_thread_client.h" | 12 #include "android_webview/browser/aw_contents_io_thread_client.h" |
12 #include "android_webview/browser/aw_login_delegate.h" | 13 #include "android_webview/browser/aw_login_delegate.h" |
13 #include "android_webview/browser/aw_resource_context.h" | 14 #include "android_webview/browser/aw_resource_context.h" |
14 #include "android_webview/browser/renderer_host/auto_login_parser.h" | 15 #include "android_webview/browser/renderer_host/auto_login_parser.h" |
15 #include "android_webview/common/url_constants.h" | 16 #include "android_webview/common/url_constants.h" |
16 #include "base/memory/scoped_vector.h" | 17 #include "base/memory/scoped_vector.h" |
17 #include "components/navigation_interception/intercept_navigation_delegate.h" | 18 #include "components/navigation_interception/intercept_navigation_delegate.h" |
18 #include "components/web_restrictions/browser/web_restrictions_resource_throttle .h" | 19 #include "components/web_restrictions/browser/web_restrictions_resource_throttle .h" |
19 #include "content/public/browser/browser_thread.h" | 20 #include "content/public/browser/browser_thread.h" |
20 #include "content/public/browser/resource_controller.h" | 21 #include "content/public/browser/resource_controller.h" |
21 #include "content/public/browser/resource_dispatcher_host.h" | 22 #include "content/public/browser/resource_dispatcher_host.h" |
22 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" | 23 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" |
23 #include "content/public/browser/resource_request_info.h" | 24 #include "content/public/browser/resource_request_info.h" |
24 #include "content/public/browser/resource_throttle.h" | 25 #include "content/public/browser/resource_throttle.h" |
25 #include "net/base/load_flags.h" | 26 #include "net/base/load_flags.h" |
26 #include "net/base/net_errors.h" | 27 #include "net/base/net_errors.h" |
27 #include "net/http/http_response_headers.h" | 28 #include "net/http/http_response_headers.h" |
28 #include "net/url_request/url_request.h" | 29 #include "net/url_request/url_request.h" |
29 #include "net/url_request/url_request_status.h" | 30 #include "net/url_request/url_request_status.h" |
30 #include "url/url_constants.h" | 31 #include "url/url_constants.h" |
31 | 32 |
32 using android_webview::AwContentsIoThreadClient; | 33 using android_webview::AwContentsIoThreadClient; |
34 using android_webview::AwContentsClientBridgeBase; | |
33 using content::BrowserThread; | 35 using content::BrowserThread; |
34 using content::ResourceType; | 36 using content::ResourceType; |
35 using navigation_interception::InterceptNavigationDelegate; | 37 using navigation_interception::InterceptNavigationDelegate; |
36 | 38 |
37 namespace { | 39 namespace { |
38 | 40 |
39 base::LazyInstance<android_webview::AwResourceDispatcherHostDelegate> | 41 base::LazyInstance<android_webview::AwResourceDispatcherHostDelegate> |
40 g_webview_resource_dispatcher_host_delegate = LAZY_INSTANCE_INITIALIZER; | 42 g_webview_resource_dispatcher_host_delegate = LAZY_INSTANCE_INITIALIZER; |
41 | 43 |
42 void SetCacheControlFlag( | 44 void SetCacheControlFlag( |
43 net::URLRequest* request, int flag) { | 45 net::URLRequest* request, int flag) { |
44 const int all_cache_control_flags = net::LOAD_BYPASS_CACHE | | 46 const int all_cache_control_flags = net::LOAD_BYPASS_CACHE | |
45 net::LOAD_VALIDATE_CACHE | | 47 net::LOAD_VALIDATE_CACHE | |
46 net::LOAD_PREFERRING_CACHE | | 48 net::LOAD_PREFERRING_CACHE | |
47 net::LOAD_ONLY_FROM_CACHE; | 49 net::LOAD_ONLY_FROM_CACHE; |
48 DCHECK_EQ((flag & all_cache_control_flags), flag); | 50 DCHECK_EQ((flag & all_cache_control_flags), flag); |
49 int load_flags = request->load_flags(); | 51 int load_flags = request->load_flags(); |
50 load_flags &= ~all_cache_control_flags; | 52 load_flags &= ~all_cache_control_flags; |
51 load_flags |= flag; | 53 load_flags |= flag; |
52 request->SetLoadFlags(load_flags); | 54 request->SetLoadFlags(load_flags); |
53 } | 55 } |
54 | 56 |
57 // Called when ResourceDispathcerHost detects a download request. | |
58 // The download is already cancelled when this is called, since | |
59 // relevant for DownloadListener is already extracted. | |
60 void DownloadStartingOnUIThread(int render_process_id, | |
61 int render_frame_id, | |
62 const GURL& url, | |
63 const std::string& user_agent, | |
64 const std::string& content_disposition, | |
65 const std::string& mime_type, | |
66 int64_t content_length) { | |
67 AwContentsClientBridgeBase* client = | |
68 AwContentsClientBridgeBase::FromID(render_process_id, render_frame_id); | |
69 if (!client) | |
70 return; | |
71 client->NewDownload(url, user_agent, content_disposition, mime_type, | |
72 content_length); | |
73 } | |
74 | |
55 } // namespace | 75 } // namespace |
56 | 76 |
57 namespace android_webview { | 77 namespace android_webview { |
58 | 78 |
59 // Calls through the IoThreadClient to check the embedders settings to determine | 79 // Calls through the IoThreadClient to check the embedders settings to determine |
60 // if the request should be cancelled. There may not always be an IoThreadClient | 80 // if the request should be cancelled. There may not always be an IoThreadClient |
61 // available for the |render_process_id|, |render_frame_id| pair (in the case of | 81 // available for the |render_process_id|, |render_frame_id| pair (in the case of |
62 // newly created pop up windows, for example) and in that case the request and | 82 // newly created pop up windows, for example) and in that case the request and |
63 // the client callbacks will be deferred the request until a client is ready. | 83 // the client callbacks will be deferred the request until a client is ready. |
64 class IoThreadClientThrottle : public content::ResourceThrottle { | 84 class IoThreadClientThrottle : public content::ResourceThrottle { |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
273 ScopedVector<content::ResourceThrottle>* throttles) { | 293 ScopedVector<content::ResourceThrottle>* throttles) { |
274 GURL url(request->url()); | 294 GURL url(request->url()); |
275 std::string user_agent; | 295 std::string user_agent; |
276 std::string content_disposition; | 296 std::string content_disposition; |
277 std::string mime_type; | 297 std::string mime_type; |
278 int64_t content_length = request->GetExpectedContentSize(); | 298 int64_t content_length = request->GetExpectedContentSize(); |
279 | 299 |
280 request->extra_request_headers().GetHeader( | 300 request->extra_request_headers().GetHeader( |
281 net::HttpRequestHeaders::kUserAgent, &user_agent); | 301 net::HttpRequestHeaders::kUserAgent, &user_agent); |
282 | 302 |
283 | |
284 net::HttpResponseHeaders* response_headers = request->response_headers(); | 303 net::HttpResponseHeaders* response_headers = request->response_headers(); |
285 if (response_headers) { | 304 if (response_headers) { |
286 response_headers->GetNormalizedHeader("content-disposition", | 305 response_headers->GetNormalizedHeader("content-disposition", |
287 &content_disposition); | 306 &content_disposition); |
288 response_headers->GetMimeType(&mime_type); | 307 response_headers->GetMimeType(&mime_type); |
289 } | 308 } |
290 | 309 |
291 request->Cancel(); | 310 request->Cancel(); |
292 | 311 |
312 // POST request cannot be repeated in general, so prevent client from | |
313 // retrying the same request, unless it is with a GET. | |
314 if ("GET" != request->method()) | |
315 return; | |
316 | |
293 const content::ResourceRequestInfo* request_info = | 317 const content::ResourceRequestInfo* request_info = |
294 content::ResourceRequestInfo::ForRequest(request); | 318 content::ResourceRequestInfo::ForRequest(request); |
295 | 319 |
296 // TODO(jam): http://crbug.com/645983 we will need to make this map work with | 320 BrowserThread::PostTask( |
297 // both RFH IDs and FTN IDs. | 321 BrowserThread::UI, FROM_HERE, |
298 std::unique_ptr<AwContentsIoThreadClient> io_client = | 322 base::Bind(&DownloadStartingOnUIThread, request_info->GetChildID(), |
299 AwContentsIoThreadClient::FromID(request_info->GetChildID(), | 323 request_info->GetRenderFrameID(), url, user_agent, |
jam
2016/10/20 18:15:22
To make this code work with PlzNavigate, use GetWe
sgurun-gerrit only
2016/10/20 18:33:26
will do, thanks!
| |
300 request_info->GetRenderFrameID()); | 324 content_disposition, mime_type, content_length)); |
301 | |
302 // POST request cannot be repeated in general, so prevent client from | |
303 // retrying the same request, even if it is with a GET. | |
304 if ("GET" == request->method() && io_client) { | |
305 io_client->NewDownload(url, | |
306 user_agent, | |
307 content_disposition, | |
308 mime_type, | |
309 content_length); | |
310 } | |
311 } | 325 } |
312 | 326 |
313 content::ResourceDispatcherHostLoginDelegate* | 327 content::ResourceDispatcherHostLoginDelegate* |
314 AwResourceDispatcherHostDelegate::CreateLoginDelegate( | 328 AwResourceDispatcherHostDelegate::CreateLoginDelegate( |
315 net::AuthChallengeInfo* auth_info, | 329 net::AuthChallengeInfo* auth_info, |
316 net::URLRequest* request) { | 330 net::URLRequest* request) { |
317 return new AwLoginDelegate(auth_info, request); | 331 return new AwLoginDelegate(auth_info, request); |
318 } | 332 } |
319 | 333 |
320 bool AwResourceDispatcherHostDelegate::HandleExternalProtocol( | 334 bool AwResourceDispatcherHostDelegate::HandleExternalProtocol( |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
438 net::HttpRequestHeaders headers; | 452 net::HttpRequestHeaders headers; |
439 headers.AddHeadersFromString(extra_headers); | 453 headers.AddHeadersFromString(extra_headers); |
440 for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext(); ) { | 454 for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext(); ) { |
441 request->SetExtraRequestHeaderByName(it.name(), it.value(), false); | 455 request->SetExtraRequestHeaderByName(it.name(), it.value(), false); |
442 } | 456 } |
443 } | 457 } |
444 } | 458 } |
445 } | 459 } |
446 | 460 |
447 } // namespace android_webview | 461 } // namespace android_webview |
OLD | NEW |