render_message_filter.h revision a36e5920737c6adbddd3e43b760e5de8431db6e0
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_MESSAGE_FILTER_H_
6#define CONTENT_BROWSER_RENDERER_HOST_RENDER_MESSAGE_FILTER_H_
7
8#if defined(OS_WIN)
9#include <windows.h>
10#endif
11
12#include <set>
13#include <string>
14#include <vector>
15
16#include "base/files/file_path.h"
17#include "base/memory/linked_ptr.h"
18#include "base/memory/shared_memory.h"
19#include "base/sequenced_task_runner_helpers.h"
20#include "base/strings/string16.h"
21#include "build/build_config.h"
22#include "content/common/pepper_renderer_instance_data.h"
23#include "content/public/browser/browser_message_filter.h"
24#include "content/public/common/three_d_api_types.h"
25#include "media/audio/audio_parameters.h"
26#include "media/base/channel_layout.h"
27#include "net/cookies/canonical_cookie.h"
28#include "third_party/WebKit/public/web/WebPopupType.h"
29#include "ui/gfx/native_widget_types.h"
30#include "ui/surface/transport_dib.h"
31
32#if defined(OS_MACOSX)
33#include "content/common/mac/font_loader.h"
34#endif
35
36#if defined(OS_ANDROID)
37#include "base/threading/worker_pool.h"
38#endif
39
40struct FontDescriptor;
41struct ViewHostMsg_CreateWindow_Params;
42
43namespace WebKit {
44struct WebScreenInfo;
45}
46
47namespace base {
48class ProcessMetrics;
49class SharedMemory;
50class TaskRunner;
51}
52
53namespace gfx {
54class Rect;
55}
56
57namespace media {
58class AudioManager;
59struct MediaLogEvent;
60}
61
62namespace net {
63class URLRequestContext;
64class URLRequestContextGetter;
65}
66
67namespace content {
68class BrowserContext;
69class DOMStorageContextImpl;
70class MediaInternals;
71class PluginServiceImpl;
72class RenderWidgetHelper;
73class ResourceContext;
74class ResourceDispatcherHostImpl;
75struct Referrer;
76struct WebPluginInfo;
77
78// This class filters out incoming IPC messages for the renderer process on the
79// IPC thread.
80class RenderMessageFilter : public BrowserMessageFilter {
81 public:
82  // Create the filter.
83  RenderMessageFilter(int render_process_id,
84                      bool is_guest,
85                      PluginServiceImpl * plugin_service,
86                      BrowserContext* browser_context,
87                      net::URLRequestContextGetter* request_context,
88                      RenderWidgetHelper* render_widget_helper,
89                      media::AudioManager* audio_manager,
90                      MediaInternals* media_internals,
91                      DOMStorageContextImpl* dom_storage_context);
92
93  // IPC::ChannelProxy::MessageFilter methods:
94  virtual void OnChannelClosing() OVERRIDE;
95  virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
96
97  // BrowserMessageFilter methods:
98  virtual bool OnMessageReceived(const IPC::Message& message,
99                                 bool* message_was_ok) OVERRIDE;
100  virtual void OnDestruct() const OVERRIDE;
101  virtual base::TaskRunner* OverrideTaskRunnerForMessage(
102      const IPC::Message& message) OVERRIDE;
103
104  bool OffTheRecord() const;
105
106  int render_process_id() const { return render_process_id_; }
107
108  // Returns the correct net::URLRequestContext depending on what type of url is
109  // given.
110  // Only call on the IO thread.
111  net::URLRequestContext* GetRequestContextForURL(const GURL& url);
112
113 private:
114  friend class BrowserThread;
115  friend class base::DeleteHelper<RenderMessageFilter>;
116
117  class OpenChannelToNpapiPluginCallback;
118
119  virtual ~RenderMessageFilter();
120
121  void OnGetProcessMemorySizes(size_t* private_bytes, size_t* shared_bytes);
122  void OnCreateWindow(const ViewHostMsg_CreateWindow_Params& params,
123                      int* route_id,
124                      int* main_frame_route_id,
125                      int* surface_id,
126                      int64* cloned_session_storage_namespace_id);
127  void OnCreateWidget(int opener_id,
128                      WebKit::WebPopupType popup_type,
129                      int* route_id,
130                      int* surface_id);
131  void OnCreateFullscreenWidget(int opener_id,
132                                int* route_id,
133                                int* surface_id);
134  void OnSetCookie(const IPC::Message& message,
135                   const GURL& url,
136                   const GURL& first_party_for_cookies,
137                   const std::string& cookie);
138  void OnGetCookies(const GURL& url,
139                    const GURL& first_party_for_cookies,
140                    IPC::Message* reply_msg);
141  void OnGetRawCookies(const GURL& url,
142                       const GURL& first_party_for_cookies,
143                       IPC::Message* reply_msg);
144  void OnDeleteCookie(const GURL& url,
145                      const std::string& cookieName);
146  void OnCookiesEnabled(const GURL& url,
147                        const GURL& first_party_for_cookies,
148                        bool* cookies_enabled);
149
150#if defined(OS_MACOSX)
151  // Messages for OOP font loading.
152  void OnLoadFont(const FontDescriptor& font, IPC::Message* reply_msg);
153  void SendLoadFontReply(IPC::Message* reply, FontLoader::Result* result);
154#endif
155
156#if defined(OS_WIN)
157  void OnPreCacheFontCharacters(const LOGFONT& log_font,
158                                const string16& characters);
159#endif
160
161  void OnGetPlugins(bool refresh, IPC::Message* reply_msg);
162  void GetPluginsCallback(IPC::Message* reply_msg,
163                          const std::vector<WebPluginInfo>& plugins);
164  void OnGetPluginInfo(int routing_id,
165                       const GURL& url,
166                       const GURL& policy_url,
167                       const std::string& mime_type,
168                       bool* found,
169                       WebPluginInfo* info,
170                       std::string* actual_mime_type);
171  void OnOpenChannelToPlugin(int routing_id,
172                             const GURL& url,
173                             const GURL& policy_url,
174                             const std::string& mime_type,
175                             IPC::Message* reply_msg);
176  void OnOpenChannelToPepperPlugin(const base::FilePath& path,
177                                   IPC::Message* reply_msg);
178  void OnDidCreateOutOfProcessPepperInstance(
179      int plugin_child_id,
180      int32 pp_instance,
181      PepperRendererInstanceData instance_data,
182      bool is_external);
183  void OnDidDeleteOutOfProcessPepperInstance(int plugin_child_id,
184                                             int32 pp_instance,
185                                             bool is_external);
186  void OnOpenChannelToPpapiBroker(int routing_id,
187                                  int request_id,
188                                  const base::FilePath& path);
189  void OnGenerateRoutingID(int* route_id);
190  void OnDownloadUrl(const IPC::Message& message,
191                     const GURL& url,
192                     const Referrer& referrer,
193                     const string16& suggested_name);
194  void OnCheckNotificationPermission(const GURL& source_origin,
195                                     int* permission_level);
196
197  void OnGetCPUUsage(int* cpu_usage);
198
199  void OnGetAudioHardwareConfig(media::AudioParameters* input_params,
200                                media::AudioParameters* output_params);
201
202  // Used to look up the monitor color profile.
203  void OnGetMonitorColorProfile(std::vector<char>* profile);
204
205  // Used to ask the browser to allocate a block of shared memory for the
206  // renderer to send back data in, since shared memory can't be created
207  // in the renderer on POSIX due to the sandbox.
208  void OnAllocateSharedMemory(uint32 buffer_size,
209                              base::SharedMemoryHandle* handle);
210  void OnResolveProxy(const GURL& url, IPC::Message* reply_msg);
211
212  // Browser side transport DIB allocation
213  void OnAllocTransportDIB(uint32 size,
214                           bool cache_in_browser,
215                           TransportDIB::Handle* result);
216  void OnFreeTransportDIB(TransportDIB::Id dib_id);
217  void OnCacheableMetadataAvailable(const GURL& url,
218                                    double expected_response_time,
219                                    const std::vector<char>& data);
220  void OnKeygen(uint32 key_size_index, const std::string& challenge_string,
221                const GURL& url, IPC::Message* reply_msg);
222  void OnKeygenOnWorkerThread(
223      int key_size_in_bits,
224      const std::string& challenge_string,
225      const GURL& url,
226      IPC::Message* reply_msg);
227  void OnAsyncOpenPepperFile(const IPC::Message& msg,
228                             const base::FilePath& path,
229                             int pp_open_flags,
230                             int message_id);
231  void AsyncOpenPepperFileOnFileThread(const base::FilePath& path,
232                                       int platform_file_flags,
233                                       int message_id,
234                                       int routing_id);
235  void OnMediaLogEvents(const std::vector<media::MediaLogEvent>&);
236
237  // Check the policy for getting cookies. Gets the cookies if allowed.
238  void CheckPolicyForCookies(const GURL& url,
239                             const GURL& first_party_for_cookies,
240                             IPC::Message* reply_msg,
241                             const net::CookieList& cookie_list);
242
243  // Writes the cookies to reply messages, and sends the message.
244  // Callback functions for getting cookies from cookie store.
245  void SendGetCookiesResponse(IPC::Message* reply_msg,
246                              const std::string& cookies);
247  void SendGetRawCookiesResponse(IPC::Message* reply_msg,
248                                 const net::CookieList& cookie_list);
249
250  bool CheckBenchmarkingEnabled() const;
251  bool CheckPreparsedJsCachingEnabled() const;
252  void OnCompletedOpenChannelToNpapiPlugin(
253      OpenChannelToNpapiPluginCallback* client);
254
255  void OnUpdateIsDelayed(const IPC::Message& msg);
256  void OnAre3DAPIsBlocked(int render_view_id,
257                          const GURL& top_origin_url,
258                          ThreeDAPIType requester,
259                          bool* blocked);
260  void OnDidLose3DContext(const GURL& top_origin_url,
261                          ThreeDAPIType context_type,
262                          int arb_robustness_status_code);
263
264#if defined(OS_ANDROID)
265  void OnWebAudioMediaCodec(base::SharedMemoryHandle encoded_data_handle,
266                            base::FileDescriptor pcm_output,
267                            uint32_t data_size);
268#endif
269
270  // Cached resource request dispatcher host and plugin service, guaranteed to
271  // be non-null if Init succeeds. We do not own the objects, they are managed
272  // by the BrowserProcess, which has a wider scope than we do.
273  ResourceDispatcherHostImpl* resource_dispatcher_host_;
274  PluginServiceImpl* plugin_service_;
275  base::FilePath profile_data_directory_;
276
277  // Contextual information to be used for requests created here.
278  scoped_refptr<net::URLRequestContextGetter> request_context_;
279
280  // The ResourceContext which is to be used on the IO thread.
281  ResourceContext* resource_context_;
282
283  scoped_refptr<RenderWidgetHelper> render_widget_helper_;
284
285  // Whether this process is used for incognito contents.
286  // This doesn't belong here; http://crbug.com/89628
287  bool incognito_;
288
289  // Initialized to 0, accessed on FILE thread only.
290  base::TimeTicks last_plugin_refresh_time_;
291
292  scoped_refptr<DOMStorageContextImpl> dom_storage_context_;
293
294  int render_process_id_;
295
296  bool is_guest_;
297
298  std::set<OpenChannelToNpapiPluginCallback*> plugin_host_clients_;
299
300  // Records the last time we sampled CPU usage of the renderer process.
301  base::TimeTicks cpu_usage_sample_time_;
302  // Records the last sampled CPU usage in percents.
303  int cpu_usage_;
304  // Used for sampling CPU usage of the renderer process.
305  scoped_ptr<base::ProcessMetrics> process_metrics_;
306
307  media::AudioManager* audio_manager_;
308  MediaInternals* media_internals_;
309
310  DISALLOW_COPY_AND_ASSIGN(RenderMessageFilter);
311};
312
313}  // namespace content
314
315#endif  // CONTENT_BROWSER_RENDERER_HOST_RENDER_MESSAGE_FILTER_H_
316