Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(799)

Side by Side Diff: content/browser/android/download_controller_android_impl.cc

Issue 1229933010: move file access permission logic to DownloadResourceThrottle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "content/browser/android/download_controller_android_impl.h" 5 #include "content/browser/android/download_controller_android_impl.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 8 #include "base/android/jni_string.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 25 matching lines...) Expand all
36 #include "net/http/http_response_headers.h" 36 #include "net/http/http_response_headers.h"
37 #include "net/url_request/url_request.h" 37 #include "net/url_request/url_request.h"
38 #include "net/url_request/url_request_context.h" 38 #include "net/url_request/url_request_context.h"
39 39
40 using base::android::ConvertUTF8ToJavaString; 40 using base::android::ConvertUTF8ToJavaString;
41 using base::android::ScopedJavaLocalRef; 41 using base::android::ScopedJavaLocalRef;
42 42
43 namespace { 43 namespace {
44 // Guards download_controller_ 44 // Guards download_controller_
45 base::LazyInstance<base::Lock> g_download_controller_lock_; 45 base::LazyInstance<base::Lock> g_download_controller_lock_;
46
47 content::WebContents* GetWebContents(int render_process_id,
48 int render_view_id) {
49 content::RenderViewHost* render_view_host =
50 content::RenderViewHost::FromID(render_process_id, render_view_id);
51
52 if (!render_view_host)
53 return nullptr;
54
55 return content::WebContents::FromRenderViewHost(render_view_host);
46 } 56 }
47 57
58 void CreateContextMenuDownload(int render_process_id,
59 int render_view_id,
60 const content::ContextMenuParams& params,
61 bool is_link,
62 const std::string& extra_headers,
63 bool granted) {
64 if (!granted)
65 return;
66
67 content::WebContents* web_contents =
68 GetWebContents(render_process_id, render_view_id);
69 if (!web_contents)
70 return;
71
72 const GURL& url = is_link ? params.link_url : params.src_url;
73 const GURL& referring_url =
74 params.frame_url.is_empty() ? params.page_url : params.frame_url;
75 content::DownloadManagerImpl* dlm =
76 static_cast<content::DownloadManagerImpl*>(
77 content::BrowserContext::GetDownloadManager(
78 web_contents->GetBrowserContext()));
79 scoped_ptr<content::DownloadUrlParameters> dl_params(
80 content::DownloadUrlParameters::FromWebContents(web_contents, url));
81 content::Referrer referrer = content::Referrer::SanitizeForRequest(
82 url,
83 content::Referrer(referring_url.GetAsReferrer(), params.referrer_policy));
84 dl_params->set_referrer(referrer);
85 if (is_link)
86 dl_params->set_referrer_encoding(params.frame_charset);
87 net::HttpRequestHeaders headers;
88 headers.AddHeadersFromString(extra_headers);
89 for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext();)
90 dl_params->add_request_header(it.name(), it.value());
91 if (!is_link && extra_headers.empty())
92 dl_params->set_prefer_cache(true);
93 dl_params->set_prompt(false);
94 dlm->DownloadUrl(dl_params.Pass());
95 }
96
97 } // namespace
98
48 namespace content { 99 namespace content {
49 100
50 // JNI methods 101 // JNI methods
51 static void Init(JNIEnv* env, jobject obj) { 102 static void Init(JNIEnv* env, jobject obj) {
52 DownloadControllerAndroidImpl::GetInstance()->Init(env, obj); 103 DownloadControllerAndroidImpl::GetInstance()->Init(env, obj);
53 } 104 }
54 105
55 static void OnRequestFileAccessResult( 106 static void OnRequestFileAccessResult(
56 JNIEnv* env, jobject obj, jlong callback_id, jboolean granted) { 107 JNIEnv* env, jobject obj, jlong callback_id, jboolean granted) {
57 DCHECK_CURRENTLY_ON(BrowserThread::UI); 108 DCHECK_CURRENTLY_ON(BrowserThread::UI);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 for (auto iter = deferred_downloads_.begin(); 172 for (auto iter = deferred_downloads_.begin();
122 iter != deferred_downloads_.end(); ++iter) { 173 iter != deferred_downloads_.end(); ++iter) {
123 if (*iter == observer) { 174 if (*iter == observer) {
124 deferred_downloads_.erase(iter); 175 deferred_downloads_.erase(iter);
125 return; 176 return;
126 } 177 }
127 } 178 }
128 } 179 }
129 180
130 void DownloadControllerAndroidImpl::AcquireFileAccessPermission( 181 void DownloadControllerAndroidImpl::AcquireFileAccessPermission(
131 WebContents* web_contents, 182 int render_process_id,
183 int render_view_id,
132 const DownloadControllerAndroid::AcquireFileAccessPermissionCallback& cb) { 184 const DownloadControllerAndroid::AcquireFileAccessPermissionCallback& cb) {
133 DCHECK_CURRENTLY_ON(BrowserThread::UI); 185 DCHECK_CURRENTLY_ON(BrowserThread::UI);
186 WebContents* web_contents = GetWebContents(render_process_id, render_view_id);
134 if (!web_contents) { 187 if (!web_contents) {
135 BrowserThread::PostTask( 188 BrowserThread::PostTask(
136 BrowserThread::UI, FROM_HERE, base::Bind(cb, false)); 189 BrowserThread::UI, FROM_HERE, base::Bind(cb, false));
137 return; 190 return;
138 } 191 }
139 192
140 ScopedJavaLocalRef<jobject> view = 193 ScopedJavaLocalRef<jobject> view =
141 GetContentViewCoreFromWebContents(web_contents); 194 GetContentViewCoreFromWebContents(web_contents);
142 if (view.is_null()) { 195 if (view.is_null()) {
143 BrowserThread::PostTask( 196 BrowserThread::PostTask(
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 // ContentViewCore is created. 351 // ContentViewCore is created.
299 deferred_downloads_.push_back(new DeferredDownloadObserver( 352 deferred_downloads_.push_back(new DeferredDownloadObserver(
300 web_contents, 353 web_contents,
301 base::Bind(&DownloadControllerAndroidImpl::StartAndroidDownload, 354 base::Bind(&DownloadControllerAndroidImpl::StartAndroidDownload,
302 base::Unretained(this), render_process_id, render_view_id, 355 base::Unretained(this), render_process_id, render_view_id,
303 info))); 356 info)));
304 return; 357 return;
305 } 358 }
306 359
307 AcquireFileAccessPermission( 360 AcquireFileAccessPermission(
308 web_contents, 361 render_process_id, render_view_id,
309 base::Bind(&DownloadControllerAndroidImpl::StartAndroidDownloadInternal, 362 base::Bind(&DownloadControllerAndroidImpl::StartAndroidDownloadInternal,
310 base::Unretained(this), render_process_id, render_view_id, 363 base::Unretained(this), render_process_id, render_view_id,
311 info)); 364 info));
312 } 365 }
313 366
314 void DownloadControllerAndroidImpl::StartAndroidDownloadInternal( 367 void DownloadControllerAndroidImpl::StartAndroidDownloadInternal(
315 int render_process_id, int render_view_id, 368 int render_process_id, int render_view_id,
316 const DownloadInfoAndroid& info, bool allowed) { 369 const DownloadInfoAndroid& info, bool allowed) {
317 DCHECK_CURRENTLY_ON(BrowserThread::UI); 370 DCHECK_CURRENTLY_ON(BrowserThread::UI);
318 if (!allowed) 371 if (!allowed)
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 env, item->GetTargetFilePath().BaseName().value()); 495 env, item->GetTargetFilePath().BaseName().value());
443 ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents( 496 ScopedJavaLocalRef<jobject> view_core = GetContentViewCoreFromWebContents(
444 item->GetWebContents()); 497 item->GetWebContents());
445 if (!view_core.is_null()) { 498 if (!view_core.is_null()) {
446 Java_DownloadController_onDangerousDownload( 499 Java_DownloadController_onDangerousDownload(
447 env, GetJavaObject()->Controller(env).obj(), view_core.obj(), 500 env, GetJavaObject()->Controller(env).obj(), view_core.obj(),
448 jfilename.obj(), item->GetId()); 501 jfilename.obj(), item->GetId());
449 } 502 }
450 } 503 }
451 504
452 WebContents* DownloadControllerAndroidImpl::GetWebContents(
453 int render_process_id, int render_view_id) {
454 RenderViewHost* render_view_host =
455 RenderViewHost::FromID(render_process_id, render_view_id);
456
457 if (!render_view_host)
458 return NULL;
459
460 return render_view_host->GetDelegate()->GetAsWebContents();
461 }
462
463 ScopedJavaLocalRef<jobject> 505 ScopedJavaLocalRef<jobject>
464 DownloadControllerAndroidImpl::GetContentViewCoreFromWebContents( 506 DownloadControllerAndroidImpl::GetContentViewCoreFromWebContents(
465 WebContents* web_contents) { 507 WebContents* web_contents) {
466 if (!web_contents) 508 if (!web_contents)
467 return ScopedJavaLocalRef<jobject>(); 509 return ScopedJavaLocalRef<jobject>();
468 510
469 ContentViewCore* view_core = ContentViewCore::FromWebContents(web_contents); 511 ContentViewCore* view_core = ContentViewCore::FromWebContents(web_contents);
470 return view_core ? view_core->GetJavaObject() : 512 return view_core ? view_core->GetJavaObject() :
471 ScopedJavaLocalRef<jobject>(); 513 ScopedJavaLocalRef<jobject>();
472 } 514 }
473 515
474 DownloadControllerAndroidImpl::JavaObject* 516 DownloadControllerAndroidImpl::JavaObject*
475 DownloadControllerAndroidImpl::GetJavaObject() { 517 DownloadControllerAndroidImpl::GetJavaObject() {
476 if (!java_object_) { 518 if (!java_object_) {
477 // Initialize Java DownloadController by calling 519 // Initialize Java DownloadController by calling
478 // DownloadController.getInstance(), which will call Init() 520 // DownloadController.getInstance(), which will call Init()
479 // if Java DownloadController is not instantiated already. 521 // if Java DownloadController is not instantiated already.
480 JNIEnv* env = base::android::AttachCurrentThread(); 522 JNIEnv* env = base::android::AttachCurrentThread();
481 Java_DownloadController_getInstance(env); 523 Java_DownloadController_getInstance(env);
482 } 524 }
483 525
484 DCHECK(java_object_); 526 DCHECK(java_object_);
485 return java_object_; 527 return java_object_;
486 } 528 }
487 529
488 void DownloadControllerAndroidImpl::StartContextMenuDownload( 530 void DownloadControllerAndroidImpl::StartContextMenuDownload(
489 const ContextMenuParams& params, WebContents* web_contents, bool is_link, 531 const ContextMenuParams& params, WebContents* web_contents, bool is_link,
490 const std::string& extra_headers) { 532 const std::string& extra_headers) {
491 const GURL& url = is_link ? params.link_url : params.src_url; 533 int process_id = web_contents->GetRenderProcessHost()->GetID();
492 const GURL& referring_url = params.frame_url.is_empty() ? 534 int routing_id = web_contents->GetRoutingID();
493 params.page_url : params.frame_url; 535 AcquireFileAccessPermission(
494 DownloadManagerImpl* dlm = static_cast<DownloadManagerImpl*>( 536 process_id, routing_id,
495 BrowserContext::GetDownloadManager(web_contents->GetBrowserContext())); 537 base::Bind(&CreateContextMenuDownload, process_id, routing_id, params,
496 scoped_ptr<DownloadUrlParameters> dl_params( 538 is_link, extra_headers));
497 DownloadUrlParameters::FromWebContents(web_contents, url));
498 content::Referrer referrer = content::Referrer::SanitizeForRequest(
499 url,
500 content::Referrer(referring_url.GetAsReferrer(),
501 params.referrer_policy));
502 dl_params->set_referrer(referrer);
503 if (is_link)
504 dl_params->set_referrer_encoding(params.frame_charset);
505 net::HttpRequestHeaders headers;
506 headers.AddHeadersFromString(extra_headers);
507 for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext();)
508 dl_params->add_request_header(it.name(), it.value());
509 if (!is_link && extra_headers.empty())
510 dl_params->set_prefer_cache(true);
511 dl_params->set_prompt(false);
512 dlm->DownloadUrl(dl_params.Pass());
513 } 539 }
514 540
515 void DownloadControllerAndroidImpl::DangerousDownloadValidated( 541 void DownloadControllerAndroidImpl::DangerousDownloadValidated(
516 WebContents* web_contents, int download_id, bool accept) { 542 WebContents* web_contents, int download_id, bool accept) {
517 if (!web_contents) 543 if (!web_contents)
518 return; 544 return;
519 DownloadManagerImpl* dlm = static_cast<DownloadManagerImpl*>( 545 DownloadManagerImpl* dlm = static_cast<DownloadManagerImpl*>(
520 BrowserContext::GetDownloadManager(web_contents->GetBrowserContext())); 546 BrowserContext::GetDownloadManager(web_contents->GetBrowserContext()));
521 DownloadItem* item = dlm->GetDownload(download_id); 547 DownloadItem* item = dlm->GetDownload(download_id);
522 if (!item) 548 if (!item)
(...skipping 17 matching lines...) Expand all
540 if (user_agent.empty()) 566 if (user_agent.empty())
541 user_agent = GetContentClient()->GetUserAgent(); 567 user_agent = GetContentClient()->GetUserAgent();
542 GURL referer_url(request->referrer()); 568 GURL referer_url(request->referrer());
543 if (referer_url.is_valid()) 569 if (referer_url.is_valid())
544 referer = referer_url.spec(); 570 referer = referer_url.spec();
545 if (!request->url_chain().empty()) { 571 if (!request->url_chain().empty()) {
546 original_url = request->url_chain().front(); 572 original_url = request->url_chain().front();
547 url = request->url_chain().back(); 573 url = request->url_chain().back();
548 } 574 }
549 575
550 const content::ResourceRequestInfo* info = 576 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
551 content::ResourceRequestInfo::ForRequest(request);
552 if (info) 577 if (info)
553 has_user_gesture = info->HasUserGesture(); 578 has_user_gesture = info->HasUserGesture();
554 } 579 }
555 580
556 DownloadControllerAndroidImpl::DownloadInfoAndroid::~DownloadInfoAndroid() {} 581 DownloadControllerAndroidImpl::DownloadInfoAndroid::~DownloadInfoAndroid() {}
557 582
558 } // namespace content 583 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698