1// Copyright 2013 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 COMPONENTS_NACL_BROWSER_NACL_HOST_MESSAGE_FILTER_H_
6#define COMPONENTS_NACL_BROWSER_NACL_HOST_MESSAGE_FILTER_H_
7
8#include "base/files/file.h"
9#include "base/files/file_path.h"
10#include "base/memory/weak_ptr.h"
11#include "content/public/browser/browser_message_filter.h"
12#include "ppapi/shared_impl/ppapi_permissions.h"
13
14class GURL;
15
16namespace nacl {
17struct NaClLaunchParams;
18struct PnaclCacheInfo;
19}
20
21namespace net {
22class HostResolver;
23class URLRequestContextGetter;
24}
25
26namespace nacl {
27
28// This class filters out incoming Chrome-specific IPC messages for the renderer
29// process on the IPC thread.
30class NaClHostMessageFilter : public content::BrowserMessageFilter {
31 public:
32  NaClHostMessageFilter(int render_process_id,
33                        bool is_off_the_record,
34                        const base::FilePath& profile_directory,
35                        net::URLRequestContextGetter* request_context);
36
37  // content::BrowserMessageFilter methods:
38  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
39  virtual void OnChannelClosing() OVERRIDE;
40
41  int render_process_id() { return render_process_id_; }
42  bool off_the_record() { return off_the_record_; }
43  const base::FilePath& profile_directory() const { return profile_directory_; }
44  net::HostResolver* GetHostResolver();
45
46 private:
47  friend class content::BrowserThread;
48  friend class base::DeleteHelper<NaClHostMessageFilter>;
49
50  virtual ~NaClHostMessageFilter();
51
52  void OnLaunchNaCl(const NaClLaunchParams& launch_params,
53                    IPC::Message* reply_msg);
54  void LaunchNaClContinuation(const nacl::NaClLaunchParams& launch_params,
55                              IPC::Message* reply_msg,
56                              ppapi::PpapiPermissions permissions);
57  void OnGetReadonlyPnaclFd(const std::string& filename,
58                            bool is_executable,
59                            IPC::Message* reply_msg);
60  void OnNaClCreateTemporaryFile(IPC::Message* reply_msg);
61  void OnNaClGetNumProcessors(int* num_processors);
62  void OnGetNexeFd(int render_view_id,
63                   int pp_instance,
64                   const PnaclCacheInfo& cache_info);
65  void OnTranslationFinished(int instance, bool success);
66  void OnMissingArchError(int render_view_id);
67  void OnOpenNaClExecutable(int render_view_id,
68                            const GURL& file_url,
69                            IPC::Message* reply_msg);
70  void SyncReturnTemporaryFile(IPC::Message* reply_msg,
71                               base::File file);
72  void AsyncReturnTemporaryFile(int pp_instance,
73                                const base::File& file,
74                                bool is_hit);
75  void OnNaClDebugEnabledForURL(const GURL& nmf_url, bool* should_debug);
76
77  int render_process_id_;
78
79  // off_the_record_ is copied from the profile partly so that it can be
80  // read on the IO thread.
81  bool off_the_record_;
82  base::FilePath profile_directory_;
83  scoped_refptr<net::URLRequestContextGetter> request_context_;
84
85  base::WeakPtrFactory<NaClHostMessageFilter> weak_ptr_factory_;
86
87  DISALLOW_COPY_AND_ASSIGN(NaClHostMessageFilter);
88};
89
90}  // namespace nacl
91
92#endif  // COMPONENTS_NACL_BROWSER_NACL_HOST_MESSAGE_FILTER_H_
93