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