blob: 641c7bcbf1b81affeab4e8f374e6b0a7adac9b5b [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_MESSAGE_FILTER_H_
#define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_MESSAGE_FILTER_H_
#include <stdint.h>
#include <set>
#include "base/optional.h"
#include "content/common/frame_replication_state.h"
#include "content/common/render_frame_message_filter.mojom.h"
#include "content/public/browser/browser_associated_interface.h"
#include "content/public/browser/browser_message_filter.h"
#include "content/public/common/three_d_api_types.h"
#include "net/cookies/canonical_cookie.h"
#include "ppapi/buildflags/buildflags.h"
#include "services/network/public/mojom/network_service.mojom.h"
#include "third_party/blink/public/mojom/blob/blob_url_store.mojom.h"
#include "third_party/blink/public/web/web_tree_scope_type.h"
#include "url/origin.h"
#if BUILDFLAG(ENABLE_PLUGINS)
#include "content/common/pepper_renderer_instance_data.h"
#endif
struct FrameHostMsg_CreateChildFrame_Params;
struct FrameHostMsg_CreateChildFrame_Params_Reply;
struct FrameHostMsg_DownloadUrl_Params;
class GURL;
namespace net {
class URLRequestContextGetter;
}
namespace url {
class Origin;
}
namespace content {
class BrowserContext;
class PluginServiceImpl;
struct Referrer;
class RenderWidgetHelper;
class ResourceContext;
class StoragePartition;
struct WebPluginInfo;
// RenderFrameMessageFilter intercepts FrameHost messages on the IO thread
// that require low-latency processing. The canonical example of this is
// child-frame creation which is a sync IPC that provides the renderer
// with the routing id for a newly created RenderFrame.
//
// This object is created on the UI thread and used on the IO thread.
class CONTENT_EXPORT RenderFrameMessageFilter
: public BrowserMessageFilter,
public BrowserAssociatedInterface<mojom::RenderFrameMessageFilter>,
public mojom::RenderFrameMessageFilter {
public:
RenderFrameMessageFilter(int render_process_id,
PluginServiceImpl* plugin_service,
BrowserContext* browser_context,
StoragePartition* storage_partition,
RenderWidgetHelper* render_widget_helper);
// BrowserMessageFilter methods:
bool OnMessageReceived(const IPC::Message& message) override;
void OnDestruct() const override;
network::mojom::CookieManagerPtr* GetCookieManager();
// Clears |resource_context_| to prevent accessing it after deletion.
void ClearResourceContext();
protected:
friend class TestSaveImageFromDataURL;
// This method will be overridden by TestSaveImageFromDataURL class for test.
virtual void DownloadUrl(
int render_view_id,
int render_frame_id,
const GURL& url,
const Referrer& referrer,
const url::Origin& initiator,
const base::string16& suggested_name,
const bool use_prompt,
const bool follow_cross_origin_redirects,
blink::mojom::BlobURLTokenPtrInfo blob_url_token) const;
private:
friend class BrowserThread;
friend class base::DeleteHelper<RenderFrameMessageFilter>;
class OpenChannelToPpapiPluginCallback;
class OpenChannelToPpapiBrokerCallback;
~RenderFrameMessageFilter() override;
void InitializeCookieManager(
network::mojom::CookieManagerRequest cookie_manager_request);
// |params_reply| is an out parameter. Browser process defines it for the
// renderer process.
void OnCreateChildFrame(
const FrameHostMsg_CreateChildFrame_Params& params,
FrameHostMsg_CreateChildFrame_Params_Reply* params_reply);
void OnCookiesEnabled(int render_frame_id,
const GURL& url,
const GURL& site_for_cookies,
bool* cookies_enabled);
// Check the policy for getting cookies. Gets the cookies if allowed.
void CheckPolicyForCookies(int render_frame_id,
const GURL& url,
const GURL& site_for_cookies,
GetCookiesCallback callback,
const net::CookieList& cookie_list,
const net::CookieStatusList& excluded_cookies);
void OnDownloadUrl(const FrameHostMsg_DownloadUrl_Params& params);
void OnSaveImageFromDataURL(int render_view_id,
int render_frame_id,
const std::string& url_str);
void OnAre3DAPIsBlocked(int render_frame_id,
const GURL& top_origin_url,
ThreeDAPIType requester,
bool* blocked);
void OnRenderProcessGone();
// mojom::RenderFrameMessageFilter:
void SetCookie(int32_t render_frame_id,
const GURL& url,
const GURL& site_for_cookies,
const std::string& cookie_line,
SetCookieCallback callback) override;
void GetCookies(int render_frame_id,
const GURL& url,
const GURL& site_for_cookies,
GetCookiesCallback callback) override;
#if BUILDFLAG(ENABLE_PLUGINS)
void OnGetPluginInfo(int render_frame_id,
const GURL& url,
const url::Origin& main_frame_origin,
const std::string& mime_type,
bool* found,
WebPluginInfo* info,
std::string* actual_mime_type);
void OnOpenChannelToPepperPlugin(
const base::FilePath& path,
const base::Optional<url::Origin>& origin_lock,
IPC::Message* reply_msg);
void OnDidCreateOutOfProcessPepperInstance(
int plugin_child_id,
int32_t pp_instance,
PepperRendererInstanceData instance_data,
bool is_external);
void OnDidDeleteOutOfProcessPepperInstance(int plugin_child_id,
int32_t pp_instance,
bool is_external);
void OnOpenChannelToPpapiBroker(int routing_id,
const base::FilePath& path);
void OnPluginInstanceThrottleStateChange(int plugin_child_id,
int32_t pp_instance,
bool is_throttled);
#endif // ENABLE_PLUGINS
#if BUILDFLAG(ENABLE_PLUGINS)
PluginServiceImpl* plugin_service_;
base::FilePath profile_data_directory_;
// Initialized to 0, accessed on FILE thread only.
base::TimeTicks last_plugin_refresh_time_;
#endif // ENABLE_PLUGINS
// Contextual information to be used for requests created here.
scoped_refptr<net::URLRequestContextGetter> request_context_;
// The ResourceContext which is to be used on the IO thread.
ResourceContext* resource_context_;
network::mojom::CookieManagerPtr cookie_manager_;
// Needed for issuing routing ids and surface ids.
scoped_refptr<RenderWidgetHelper> render_widget_helper_;
// Whether this process is used for incognito contents.
bool incognito_;
const int render_process_id_;
};
} // namespace content
#endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_MESSAGE_FILTER_H_