1 // Copyright (c) 2013 Intel Corporation. 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.
5 #ifndef XWALK_EXTENSIONS_BROWSER_XWALK_EXTENSION_PROCESS_HOST_H_
6 #define XWALK_EXTENSIONS_BROWSER_XWALK_EXTENSION_PROCESS_HOST_H_
10 #include "base/files/file_path.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/values.h"
14 #include "content/public/browser/browser_child_process_host_delegate.h"
15 #include "ipc/ipc_channel_handle.h"
16 #include "ipc/ipc_channel_proxy.h"
17 #include "ipc/ipc_sender.h"
18 #include "xwalk/extensions/common/xwalk_extension_permission_types.h"
21 class BrowserChildProcessHost;
22 class RenderProcessHost;
26 namespace extensions {
28 // This class represents the browser side of the browser <-> extension process
29 // communication channel. It has to run some operations in IO thread for
30 // creating the extra process.
31 class XWalkExtensionProcessHost
32 : public content::BrowserChildProcessHostDelegate,
37 virtual void OnExtensionProcessDied(XWalkExtensionProcessHost* eph,
38 int render_process_id) {}
39 virtual void OnExtensionProcessCreated(int render_process_id,
40 const IPC::ChannelHandle handle) {}
41 virtual void OnCheckAPIAccessControl(int render_process_id,
42 const std::string& extension_name,
43 const std::string& api_name,
44 const PermissionCallback& callback) {}
45 virtual bool OnRegisterPermissions(int render_process_id,
46 const std::string& extension_name,
47 const std::string& perm_table);
52 XWalkExtensionProcessHost(content::RenderProcessHost* render_process_host,
53 const base::FilePath& external_extensions_path,
54 XWalkExtensionProcessHost::Delegate* delegate,
55 const base::ValueMap& runtime_variables);
56 virtual ~XWalkExtensionProcessHost();
58 // IPC::Sender implementation
59 virtual bool Send(IPC::Message* msg) OVERRIDE;
62 class RenderProcessMessageFilter;
67 // Handler for message from Render Process host, it is a synchronous message,
68 // that will be replied only when the extension process channel is created.
69 void OnGetExtensionProcessChannel(scoped_ptr<IPC::Message> reply);
71 // content::BrowserChildProcessHostDelegate implementation.
72 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
73 virtual void OnChannelError() OVERRIDE;
74 virtual void OnProcessLaunched() OVERRIDE;
77 void OnRenderChannelCreated(const IPC::ChannelHandle& channel_id);
79 void ReplyChannelHandleToRenderProcess();
81 void OnCheckAPIAccessControl(const std::string& extension_name,
82 const std::string& api_name, IPC::Message* reply_msg);
83 void ReplyAccessControlToExtension(IPC::Message* reply_msg,
84 RuntimePermission perm);
85 void OnRegisterPermissions(const std::string& extension_name,
86 const std::string& perm_table, bool* result);
88 scoped_ptr<content::BrowserChildProcessHost> process_;
89 IPC::ChannelHandle ep_rp_channel_handle_;
90 content::RenderProcessHost* render_process_host_;
91 scoped_ptr<IPC::Message> pending_reply_for_render_process_;
93 // We use this filter to know when RP asked for the extension process channel.
94 // We keep the reference to invalidate the filter once we don't need it
97 // TODO(cmarcelo): Avoid having an extra filter, see if we can embed this
98 // handling in the existing filter we have in ExtensionData struct.
99 scoped_refptr<RenderProcessMessageFilter> render_process_message_filter_;
101 base::FilePath external_extensions_path_;
103 bool is_extension_process_channel_ready_;
105 XWalkExtensionProcessHost::Delegate* delegate_;
107 base::ValueMap runtime_variables_;
109 // IPC channel for launcher to communicate with BP in service mode.
110 scoped_ptr<IPC::Channel> channel_;
113 } // namespace extensions
116 #endif // XWALK_EXTENSIONS_BROWSER_XWALK_EXTENSION_PROCESS_HOST_H_