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

Side by Side Diff: content/browser/download/download_manager_impl.cc

Issue 9314037: Save As for content retrieved via POST works in most circumstances. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 8 years, 10 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 | Annotate | Revision Log
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/download/download_manager_impl.h" 5 #include "content/browser/download/download_manager_impl.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 16 matching lines...) Expand all
27 #include "content/browser/renderer_host/resource_dispatcher_host.h" 27 #include "content/browser/renderer_host/resource_dispatcher_host.h"
28 #include "content/browser/tab_contents/tab_contents.h" 28 #include "content/browser/tab_contents/tab_contents.h"
29 #include "content/public/browser/browser_context.h" 29 #include "content/public/browser/browser_context.h"
30 #include "content/public/browser/browser_thread.h" 30 #include "content/public/browser/browser_thread.h"
31 #include "content/public/browser/content_browser_client.h" 31 #include "content/public/browser/content_browser_client.h"
32 #include "content/public/browser/download_manager_delegate.h" 32 #include "content/public/browser/download_manager_delegate.h"
33 #include "content/public/browser/notification_service.h" 33 #include "content/public/browser/notification_service.h"
34 #include "content/public/browser/notification_types.h" 34 #include "content/public/browser/notification_types.h"
35 #include "content/public/browser/render_process_host.h" 35 #include "content/public/browser/render_process_host.h"
36 #include "content/public/browser/web_contents_delegate.h" 36 #include "content/public/browser/web_contents_delegate.h"
37 #include "net/base/upload_data.h"
37 38
38 // TODO(benjhayden): Change this to DCHECK when we have more debugging 39 // TODO(benjhayden): Change this to DCHECK when we have more debugging
39 // information from the next dev cycle, before the next stable/beta branch is 40 // information from the next dev cycle, before the next stable/beta branch is
40 // cut, in order to prevent unnecessary crashes on those channels. If we still 41 // cut, in order to prevent unnecessary crashes on those channels. If we still
41 // don't have root cause before the dev cycle after the next stable/beta 42 // don't have root cause before the dev cycle after the next stable/beta
42 // releases, uncomment it out to re-enable debugging checks. Whenever this macro 43 // releases, uncomment it out to re-enable debugging checks. Whenever this macro
43 // is toggled, the corresponding macro in download_database.cc should also 44 // is toggled, the corresponding macro in download_database.cc should also
44 // be toggled. When 96627 is fixed, this macro and all its usages can be 45 // be toggled. When 96627 is fixed, this macro and all its usages can be
45 // deleted or permanently changed to DCHECK as appropriate. 46 // deleted or permanently changed to DCHECK as appropriate.
46 #define CHECK_96627 CHECK 47 #define CHECK_96627 CHECK
47 48
48 using content::BrowserThread; 49 using content::BrowserThread;
49 using content::DownloadId; 50 using content::DownloadId;
50 using content::DownloadItem; 51 using content::DownloadItem;
51 using content::WebContents; 52 using content::WebContents;
52 53
53 namespace { 54 namespace {
54 55
55 // Param structs exist because base::Bind can only handle 6 args. 56 // Param structs exist because base::Bind can only handle 6 args.
56 struct URLParams { 57 struct URLParams {
57 URLParams(const GURL& url, const GURL& referrer) 58 URLParams(const GURL& url, const GURL& referrer, int64 post_id)
58 : url_(url), referrer_(referrer) {} 59 : url_(url), referrer_(referrer), post_id_(post_id) {}
59 GURL url_; 60 GURL url_;
60 GURL referrer_; 61 GURL referrer_;
62 int64 post_id_;
61 }; 63 };
62 64
63 struct RenderParams { 65 struct RenderParams {
64 RenderParams(int rpi, int rvi) 66 RenderParams(int rpi, int rvi)
65 : render_process_id_(rpi), render_view_id_(rvi) {} 67 : render_process_id_(rpi), render_view_id_(rvi) {}
66 int render_process_id_; 68 int render_process_id_;
67 int render_view_id_; 69 int render_view_id_;
68 }; 70 };
69 71
70 void BeginDownload(const URLParams& url_params, 72 void BeginDownload(const URLParams& url_params,
71 bool prefer_cache, 73 bool prefer_cache,
72 const DownloadSaveInfo& save_info, 74 const DownloadSaveInfo& save_info,
73 ResourceDispatcherHost* resource_dispatcher_host, 75 ResourceDispatcherHost* resource_dispatcher_host,
74 const RenderParams& render_params, 76 const RenderParams& render_params,
75 const content::ResourceContext* context) { 77 const content::ResourceContext* context) {
76 scoped_ptr<net::URLRequest> request( 78 scoped_ptr<net::URLRequest> request(
77 new net::URLRequest(url_params.url_, resource_dispatcher_host)); 79 new net::URLRequest(url_params.url_, resource_dispatcher_host));
78 request->set_referrer(url_params.referrer_.spec()); 80 request->set_referrer(url_params.referrer_.spec());
81 if (url_params.post_id_ >= 0) {
82 // The POST in this case does not have an actual body, and only works
83 // when retrieving data from cache. This is done because we don't want
84 // to do a re-POST without user consent, and currently don't have a good
85 // plan on how to display the UI for that.
86 DCHECK(prefer_cache);
87 request->set_method("POST");
88 scoped_refptr<net::UploadData> upload_data = new net::UploadData();
89 upload_data->set_identifier(url_params.post_id_);
90 request->set_upload(upload_data);
91 }
79 resource_dispatcher_host->BeginDownload( 92 resource_dispatcher_host->BeginDownload(
80 request.Pass(), prefer_cache, save_info, 93 request.Pass(), prefer_cache, save_info,
81 DownloadResourceHandler::OnStartedCallback(), 94 DownloadResourceHandler::OnStartedCallback(),
82 render_params.render_process_id_, 95 render_params.render_process_id_,
83 render_params.render_view_id_, 96 render_params.render_view_id_,
84 *context); 97 *context);
85 } 98 }
86 99
87 class MapValueIteratorAdapter { 100 class MapValueIteratorAdapter {
88 public: 101 public:
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 } 820 }
808 821
809 // Initiate a download of a specific URL. We send the request to the 822 // Initiate a download of a specific URL. We send the request to the
810 // ResourceDispatcherHost, and let it send us responses like a regular 823 // ResourceDispatcherHost, and let it send us responses like a regular
811 // download. 824 // download.
812 void DownloadManagerImpl::DownloadUrl( 825 void DownloadManagerImpl::DownloadUrl(
813 const GURL& url, 826 const GURL& url,
814 const GURL& referrer, 827 const GURL& referrer,
815 const std::string& referrer_charset, 828 const std::string& referrer_charset,
816 bool prefer_cache, 829 bool prefer_cache,
830 int64 post_id,
817 const DownloadSaveInfo& save_info, 831 const DownloadSaveInfo& save_info,
818 WebContents* web_contents) { 832 WebContents* web_contents) {
819 ResourceDispatcherHost* resource_dispatcher_host = 833 ResourceDispatcherHost* resource_dispatcher_host =
820 ResourceDispatcherHost::Get(); 834 ResourceDispatcherHost::Get();
821 835
822 // We send a pointer to content::ResourceContext, instead of the usual 836 // We send a pointer to content::ResourceContext, instead of the usual
823 // reference, so that a copy of the object isn't made. 837 // reference, so that a copy of the object isn't made.
824 // base::Bind can't handle 7 args, so we use URLParams and RenderParams. 838 // base::Bind can't handle 7 args, so we use URLParams and RenderParams.
825 BrowserThread::PostTask( 839 BrowserThread::PostTask(
826 BrowserThread::IO, FROM_HERE, 840 BrowserThread::IO, FROM_HERE,
827 base::Bind( 841 base::Bind(
828 &BeginDownload, 842 &BeginDownload,
829 URLParams(url, referrer), 843 URLParams(url, referrer, post_id),
830 prefer_cache, 844 prefer_cache,
831 save_info, 845 save_info,
832 resource_dispatcher_host, 846 resource_dispatcher_host,
833 RenderParams(web_contents->GetRenderProcessHost()->GetID(), 847 RenderParams(web_contents->GetRenderProcessHost()->GetID(),
834 web_contents->GetRenderViewHost()->routing_id()), 848 web_contents->GetRenderViewHost()->routing_id()),
835 &web_contents->GetBrowserContext()->GetResourceContext())); 849 &web_contents->GetBrowserContext()->GetResourceContext()));
836 } 850 }
837 851
838 void DownloadManagerImpl::AddObserver(Observer* observer) { 852 void DownloadManagerImpl::AddObserver(Observer* observer) {
839 observers_.AddObserver(observer); 853 observers_.AddObserver(observer);
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 it != history_downloads_.end(); ++it) { 1166 it != history_downloads_.end(); ++it) {
1153 if (it->second->IsComplete() && !it->second->GetOpened()) 1167 if (it->second->IsComplete() && !it->second->GetOpened())
1154 ++num_unopened; 1168 ++num_unopened;
1155 } 1169 }
1156 download_stats::RecordOpensOutstanding(num_unopened); 1170 download_stats::RecordOpensOutstanding(num_unopened);
1157 } 1171 }
1158 1172
1159 void DownloadManagerImpl::SetFileManager(DownloadFileManager* file_manager) { 1173 void DownloadManagerImpl::SetFileManager(DownloadFileManager* file_manager) {
1160 file_manager_ = file_manager; 1174 file_manager_ = file_manager;
1161 } 1175 }
OLDNEW
« no previous file with comments | « content/browser/download/download_manager_impl.h ('k') | content/browser/download/drag_download_file.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698