OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/ppapi_plugin_process_host.h" | 5 #include "content/browser/ppapi_plugin_process_host.h" |
6 | 6 |
7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
12 #include "content/browser/plugin_service.h" | 12 #include "content/browser/plugin_service.h" |
13 #include "content/browser/renderer_host/render_message_filter.h" | 13 #include "content/browser/renderer_host/render_message_filter.h" |
| 14 #include "content/common/child_process_host.h" |
14 #include "content/common/child_process_messages.h" | 15 #include "content/common/child_process_messages.h" |
15 #include "content/public/common/content_switches.h" | 16 #include "content/public/common/content_switches.h" |
16 #include "content/public/common/pepper_plugin_info.h" | 17 #include "content/public/common/pepper_plugin_info.h" |
17 #include "content/public/common/process_type.h" | 18 #include "content/public/common/process_type.h" |
18 #include "ipc/ipc_switches.h" | 19 #include "ipc/ipc_switches.h" |
19 #include "net/base/network_change_notifier.h" | 20 #include "net/base/network_change_notifier.h" |
20 #include "ppapi/proxy/ppapi_messages.h" | 21 #include "ppapi/proxy/ppapi_messages.h" |
21 | 22 |
22 class PpapiPluginProcessHost::PluginNetworkObserver | 23 class PpapiPluginProcessHost::PluginNetworkObserver |
23 : public net::NetworkChangeNotifier::IPAddressObserver, | 24 : public net::NetworkChangeNotifier::IPAddressObserver, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 PpapiPluginProcessHost* plugin_host = | 78 PpapiPluginProcessHost* plugin_host = |
78 new PpapiPluginProcessHost(); | 79 new PpapiPluginProcessHost(); |
79 if(plugin_host->Init(info)) | 80 if(plugin_host->Init(info)) |
80 return plugin_host; | 81 return plugin_host; |
81 | 82 |
82 NOTREACHED(); // Init is not expected to fail. | 83 NOTREACHED(); // Init is not expected to fail. |
83 return NULL; | 84 return NULL; |
84 } | 85 } |
85 | 86 |
86 void PpapiPluginProcessHost::OpenChannelToPlugin(Client* client) { | 87 void PpapiPluginProcessHost::OpenChannelToPlugin(Client* client) { |
87 if (opening_channel()) { | 88 if (child_process_host()->opening_channel()) { |
88 // The channel is already in the process of being opened. Put | 89 // The channel is already in the process of being opened. Put |
89 // this "open channel" request into a queue of requests that will | 90 // this "open channel" request into a queue of requests that will |
90 // be run once the channel is open. | 91 // be run once the channel is open. |
91 pending_requests_.push_back(client); | 92 pending_requests_.push_back(client); |
92 return; | 93 return; |
93 } | 94 } |
94 | 95 |
95 // We already have an open channel, send a request right away to plugin. | 96 // We already have an open channel, send a request right away to plugin. |
96 RequestPluginChannel(client); | 97 RequestPluginChannel(client); |
97 } | 98 } |
98 | 99 |
99 PpapiPluginProcessHost::PpapiPluginProcessHost(net::HostResolver* host_resolver) | 100 PpapiPluginProcessHost::PpapiPluginProcessHost(net::HostResolver* host_resolver) |
100 : BrowserChildProcessHost(content::PROCESS_TYPE_PPAPI_PLUGIN), | 101 : BrowserChildProcessHost(content::PROCESS_TYPE_PPAPI_PLUGIN), |
101 filter_(new PepperMessageFilter(host_resolver)), | 102 filter_(new PepperMessageFilter(host_resolver)), |
102 network_observer_(new PluginNetworkObserver(this)), | 103 network_observer_(new PluginNetworkObserver(this)), |
103 is_broker_(false), | 104 is_broker_(false), |
104 process_id_(ChildProcessHost::GenerateChildProcessUniqueId()) { | 105 process_id_(ChildProcessHost::GenerateChildProcessUniqueId()) { |
105 AddFilter(filter_.get()); | 106 child_process_host()->AddFilter(filter_.get()); |
106 } | 107 } |
107 | 108 |
108 PpapiPluginProcessHost::PpapiPluginProcessHost() | 109 PpapiPluginProcessHost::PpapiPluginProcessHost() |
109 : BrowserChildProcessHost(content::PROCESS_TYPE_PPAPI_BROKER), | 110 : BrowserChildProcessHost(content::PROCESS_TYPE_PPAPI_BROKER), |
110 is_broker_(true), | 111 is_broker_(true), |
111 process_id_(ChildProcessHost::GenerateChildProcessUniqueId()) { | 112 process_id_(ChildProcessHost::GenerateChildProcessUniqueId()) { |
112 } | 113 } |
113 | 114 |
114 bool PpapiPluginProcessHost::Init(const content::PepperPluginInfo& info) { | 115 bool PpapiPluginProcessHost::Init(const content::PepperPluginInfo& info) { |
115 plugin_path_ = info.path; | 116 plugin_path_ = info.path; |
116 if (info.name.empty()) { | 117 if (info.name.empty()) { |
117 set_name(plugin_path_.BaseName().LossyDisplayName()); | 118 set_name(plugin_path_.BaseName().LossyDisplayName()); |
118 } else { | 119 } else { |
119 set_name(UTF8ToUTF16(info.name)); | 120 set_name(UTF8ToUTF16(info.name)); |
120 } | 121 } |
121 | 122 |
122 if (!CreateChannel()) | 123 if (!child_process_host()->CreateChannel()) |
123 return false; | 124 return false; |
124 | 125 |
125 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); | 126 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); |
126 CommandLine::StringType plugin_launcher = | 127 CommandLine::StringType plugin_launcher = |
127 browser_command_line.GetSwitchValueNative(switches::kPpapiPluginLauncher); | 128 browser_command_line.GetSwitchValueNative(switches::kPpapiPluginLauncher); |
128 | 129 |
129 #if defined(OS_LINUX) | 130 #if defined(OS_LINUX) |
130 int flags = plugin_launcher.empty() ? ChildProcessHost::CHILD_ALLOW_SELF : | 131 int flags = plugin_launcher.empty() ? ChildProcessHost::CHILD_ALLOW_SELF : |
131 ChildProcessHost::CHILD_NORMAL; | 132 ChildProcessHost::CHILD_NORMAL; |
132 #else | 133 #else |
133 int flags = ChildProcessHost::CHILD_NORMAL; | 134 int flags = ChildProcessHost::CHILD_NORMAL; |
134 #endif | 135 #endif |
135 FilePath exe_path = ChildProcessHost::GetChildPath(flags); | 136 FilePath exe_path = ChildProcessHost::GetChildPath(flags); |
136 if (exe_path.empty()) | 137 if (exe_path.empty()) |
137 return false; | 138 return false; |
138 | 139 |
139 CommandLine* cmd_line = new CommandLine(exe_path); | 140 CommandLine* cmd_line = new CommandLine(exe_path); |
140 cmd_line->AppendSwitchASCII(switches::kProcessType, | 141 cmd_line->AppendSwitchASCII(switches::kProcessType, |
141 is_broker_ ? switches::kPpapiBrokerProcess | 142 is_broker_ ? switches::kPpapiBrokerProcess |
142 : switches::kPpapiPluginProcess); | 143 : switches::kPpapiPluginProcess); |
143 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id()); | 144 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, |
| 145 child_process_host()->channel_id()); |
144 | 146 |
145 // These switches are forwarded to both plugin and broker pocesses. | 147 // These switches are forwarded to both plugin and broker pocesses. |
146 static const char* kCommonForwardSwitches[] = { | 148 static const char* kCommonForwardSwitches[] = { |
147 switches::kVModule | 149 switches::kVModule |
148 }; | 150 }; |
149 cmd_line->CopySwitchesFrom(browser_command_line, kCommonForwardSwitches, | 151 cmd_line->CopySwitchesFrom(browser_command_line, kCommonForwardSwitches, |
150 arraysize(kCommonForwardSwitches)); | 152 arraysize(kCommonForwardSwitches)); |
151 | 153 |
152 if (!is_broker_) { | 154 if (!is_broker_) { |
153 // TODO(vtl): Stop passing flash args in the command line, on windows is | 155 // TODO(vtl): Stop passing flash args in the command line, on windows is |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 // a hang. See the similar code in PluginProcessHost for more description. | 193 // a hang. See the similar code in PluginProcessHost for more description. |
192 PpapiMsg_CreateChannel* msg = new PpapiMsg_CreateChannel(process_handle, | 194 PpapiMsg_CreateChannel* msg = new PpapiMsg_CreateChannel(process_handle, |
193 renderer_id); | 195 renderer_id); |
194 msg->set_unblock(true); | 196 msg->set_unblock(true); |
195 if (Send(msg)) | 197 if (Send(msg)) |
196 sent_requests_.push(client); | 198 sent_requests_.push(client); |
197 else | 199 else |
198 client->OnChannelOpened(base::kNullProcessHandle, IPC::ChannelHandle()); | 200 client->OnChannelOpened(base::kNullProcessHandle, IPC::ChannelHandle()); |
199 } | 201 } |
200 | 202 |
201 bool PpapiPluginProcessHost::CanShutdown() { | |
202 return true; | |
203 } | |
204 | |
205 void PpapiPluginProcessHost::OnProcessLaunched() { | 203 void PpapiPluginProcessHost::OnProcessLaunched() { |
206 } | 204 } |
207 | 205 |
208 bool PpapiPluginProcessHost::OnMessageReceived(const IPC::Message& msg) { | 206 bool PpapiPluginProcessHost::OnMessageReceived(const IPC::Message& msg) { |
209 bool handled = true; | 207 bool handled = true; |
210 IPC_BEGIN_MESSAGE_MAP(PpapiPluginProcessHost, msg) | 208 IPC_BEGIN_MESSAGE_MAP(PpapiPluginProcessHost, msg) |
211 IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated, | 209 IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated, |
212 OnRendererPluginChannelCreated) | 210 OnRendererPluginChannelCreated) |
213 IPC_MESSAGE_UNHANDLED(handled = false) | 211 IPC_MESSAGE_UNHANDLED(handled = false) |
214 IPC_END_MESSAGE_MAP() | 212 IPC_END_MESSAGE_MAP() |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 ::DuplicateHandle(::GetCurrentProcess(), plugin_process, | 278 ::DuplicateHandle(::GetCurrentProcess(), plugin_process, |
281 renderer_process, &renderers_plugin_handle, | 279 renderer_process, &renderers_plugin_handle, |
282 0, FALSE, DUPLICATE_SAME_ACCESS); | 280 0, FALSE, DUPLICATE_SAME_ACCESS); |
283 #elif defined(OS_POSIX) | 281 #elif defined(OS_POSIX) |
284 // Don't need to duplicate anything on POSIX since it's just a PID. | 282 // Don't need to duplicate anything on POSIX since it's just a PID. |
285 base::ProcessHandle renderers_plugin_handle = plugin_process; | 283 base::ProcessHandle renderers_plugin_handle = plugin_process; |
286 #endif | 284 #endif |
287 | 285 |
288 client->OnChannelOpened(renderers_plugin_handle, channel_handle); | 286 client->OnChannelOpened(renderers_plugin_handle, channel_handle); |
289 } | 287 } |
OLD | NEW |