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

Unified Diff: content/browser/frame_host/render_frame_message_filter.cc

Issue 1836973003: Move download messages from Renderer to Frame filter. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review comments, merge Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
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(&parameters)));
+}
+
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,
« no previous file with comments | « content/browser/frame_host/render_frame_message_filter.h ('k') | content/browser/renderer_host/render_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698