Chromium Code Reviews| Index: content/browser/frame_host/render_frame_message_filter.cc | 
| diff --git a/content/browser/frame_host/render_frame_message_filter.cc b/content/browser/frame_host/render_frame_message_filter.cc | 
| index 98bd0fd5e3783c7150b678adff464706a4864953..a3e897d6d4cdbe7c9afa2d27c93c22cd24244ba3 100644 | 
| --- a/content/browser/frame_host/render_frame_message_filter.cc | 
| +++ b/content/browser/frame_host/render_frame_message_filter.cc | 
| @@ -11,13 +11,19 @@ | 
| #include "build/build_config.h" | 
| #include "content/browser/bad_message.h" | 
| #include "content/browser/child_process_security_policy_impl.h" | 
| +#include "content/browser/download/download_stats.h" | 
| +#include "content/browser/fileapi/chrome_blob_storage_context.h" | 
| #include "content/browser/frame_host/render_frame_host_impl.h" | 
| #include "content/browser/gpu/gpu_data_manager_impl.h" | 
| #include "content/browser/renderer_host/render_widget_helper.h" | 
| +#include "content/browser/resource_context_impl.h" | 
| +#include "content/common/content_constants_internal.h" | 
| #include "content/common/frame_messages.h" | 
| #include "content/common/view_messages.h" | 
| #include "content/public/browser/browser_context.h" | 
| #include "content/public/browser/browser_thread.h" | 
| +#include "content/public/browser/download_manager.h" | 
| +#include "content/public/browser/download_url_parameters.h" | 
| #include "content/public/common/content_constants.h" | 
| #include "content/public/common/content_switches.h" | 
| #include "gpu/GLES2/gl2extchromium.h" | 
| @@ -26,6 +32,7 @@ | 
| #include "net/cookies/cookie_store.h" | 
| #include "net/url_request/url_request_context.h" | 
| #include "net/url_request/url_request_context_getter.h" | 
| +#include "storage/browser/blob/blob_storage_context.h" | 
| #include "url/gurl.h" | 
| #if !defined(OS_MACOSX) | 
| @@ -70,6 +77,21 @@ void CreateChildFrameOnUI( | 
| } | 
| } | 
| +void DownloadUrlOnUIThread(std::unique_ptr<DownloadUrlParameters> parameters) { | 
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| + | 
| + RenderProcessHost* render_process_host = | 
| + RenderProcessHost::FromID(parameters->render_process_host_id()); | 
| + if (!render_process_host) | 
| + return; | 
| + | 
| + BrowserContext* browser_context = render_process_host->GetBrowserContext(); | 
| + DownloadManager* download_manager = | 
| + BrowserContext::GetDownloadManager(browser_context); | 
| + RecordDownloadSource(INITIATED_BY_RENDERER); | 
| + download_manager->DownloadUrl(std::move(parameters)); | 
| +} | 
| + | 
| // Common functionality for converting a sync renderer message to a callback | 
| // function in the browser. Derive from this, create it on the heap when | 
| // issuing your callback. When done, write your reply parameters into | 
| @@ -207,6 +229,9 @@ bool RenderFrameMessageFilter::OnMessageReceived(const IPC::Message& message) { | 
| IPC_MESSAGE_HANDLER(FrameHostMsg_SetCookie, OnSetCookie) | 
| IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_GetCookies, OnGetCookies) | 
| IPC_MESSAGE_HANDLER(FrameHostMsg_CookiesEnabled, OnCookiesEnabled) | 
| + IPC_MESSAGE_HANDLER(FrameHostMsg_DownloadUrl, OnDownloadUrl) | 
| + IPC_MESSAGE_HANDLER(FrameHostMsg_SaveImageFromDataURL, | 
| + OnSaveImageFromDataURL) | 
| IPC_MESSAGE_HANDLER(FrameHostMsg_Are3DAPIsBlocked, OnAre3DAPIsBlocked) | 
| IPC_MESSAGE_HANDLER_GENERIC(FrameHostMsg_RenderProcessGone, | 
| OnRenderProcessGone()) | 
| @@ -230,6 +255,37 @@ bool RenderFrameMessageFilter::OnMessageReceived(const IPC::Message& message) { | 
| return handled; | 
| } | 
| +void RenderFrameMessageFilter::DownloadUrl(int render_view_id, | 
| + int render_frame_id, | 
| + const GURL& url, | 
| + const Referrer& referrer, | 
| + const base::string16& suggested_name, | 
| + const bool use_prompt) const { | 
| + if (!resource_context_) | 
| + return; | 
| + | 
| + std::unique_ptr<DownloadUrlParameters> parameters( | 
| + new DownloadUrlParameters(url, render_process_id_, render_view_id, | 
| 
 
Charlie Reis
2016/05/13 21:50:22
Someday we should remove the use of RenderView ID
 
 | 
| + render_frame_id, request_context_.get())); | 
| + parameters->set_content_initiated(true); | 
| + parameters->set_suggested_name(suggested_name); | 
| + parameters->set_prompt(use_prompt); | 
| + parameters->set_referrer(referrer); | 
| + | 
| + if (url.SchemeIsBlob()) { | 
| + ChromeBlobStorageContext* blob_context = | 
| + GetChromeBlobStorageContextForResourceContext(resource_context_); | 
| + parameters->set_blob_data_handle( | 
| + blob_context->context()->GetBlobDataFromPublicURL(url)); | 
| + // Don't care if the above fails. We are going to let the download go | 
| + // through and allow it to be interrupted so that the embedder can deal. | 
| + } | 
| + | 
| + BrowserThread::PostTask( | 
| + BrowserThread::UI, FROM_HERE, | 
| + base::Bind(&DownloadUrlOnUIThread, base::Passed(¶meters))); | 
| +} | 
| + | 
| void RenderFrameMessageFilter::OnCreateChildFrame( | 
| const FrameHostMsg_CreateChildFrame_Params& params, | 
| int* new_routing_id) { | 
| @@ -355,6 +411,32 @@ void RenderFrameMessageFilter::SendGetCookiesResponse( | 
| Send(reply_msg); | 
| } | 
| +void RenderFrameMessageFilter::OnDownloadUrl( | 
| + int render_view_id, | 
| + int render_frame_id, | 
| + const GURL& url, | 
| + const Referrer& referrer, | 
| + const base::string16& suggested_name) { | 
| + DownloadUrl(render_view_id, render_frame_id, url, referrer, suggested_name, | 
| + false); | 
| +} | 
| + | 
| +void RenderFrameMessageFilter::OnSaveImageFromDataURL( | 
| + int render_view_id, | 
| + int render_frame_id, | 
| + const std::string& url_str) { | 
| + // Please refer to RenderViewImpl::saveImageFromDataURL(). | 
| + if (url_str.length() >= kMaxLengthOfDataURLString) | 
| + return; | 
| + | 
| + GURL data_url(url_str); | 
| + if (!data_url.is_valid() || !data_url.SchemeIs(url::kDataScheme)) | 
| + return; | 
| + | 
| + DownloadUrl(render_view_id, render_frame_id, data_url, Referrer(), | 
| + base::string16(), true); | 
| +} | 
| + | 
| void RenderFrameMessageFilter::OnAre3DAPIsBlocked(int render_frame_id, | 
| const GURL& top_origin_url, | 
| ThreeDAPIType requester, |