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..cf639787a8538cad72048dd196c77eedb4b4f5df 100644 |
--- a/content/browser/frame_host/render_frame_message_filter.cc |
+++ b/content/browser/frame_host/render_frame_message_filter.cc |
@@ -10,14 +10,20 @@ |
#include "base/strings/string_util.h" |
#include "build/build_config.h" |
#include "content/browser/bad_message.h" |
+#include "content/browser/blob_storage/chrome_blob_storage_context.h" |
#include "content/browser/child_process_security_policy_impl.h" |
+#include "content/browser/download/download_stats.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, |
+ 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 RenderFrameImpl::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, |