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, |