Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base_switches.h" | 9 #include "base/base_switches.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 104 } | 104 } |
| 105 | 105 |
| 106 // We already have an open channel, send a request right away to plugin. | 106 // We already have an open channel, send a request right away to plugin. |
| 107 RequestPluginChannel(client); | 107 RequestPluginChannel(client); |
| 108 } | 108 } |
| 109 | 109 |
| 110 PpapiPluginProcessHost::PpapiPluginProcessHost(net::HostResolver* host_resolver) | 110 PpapiPluginProcessHost::PpapiPluginProcessHost(net::HostResolver* host_resolver) |
| 111 : filter_(new PepperMessageFilter(PepperMessageFilter::PLUGIN, | 111 : filter_(new PepperMessageFilter(PepperMessageFilter::PLUGIN, |
| 112 host_resolver)), | 112 host_resolver)), |
| 113 network_observer_(new PluginNetworkObserver(this)), | 113 network_observer_(new PluginNetworkObserver(this)), |
| 114 is_broker_(false), | 114 is_broker_(false) { |
| 115 process_id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()) { | |
| 116 process_.reset(new BrowserChildProcessHostImpl( | 115 process_.reset(new BrowserChildProcessHostImpl( |
| 117 content::PROCESS_TYPE_PPAPI_PLUGIN, this)); | 116 content::PROCESS_TYPE_PPAPI_PLUGIN, this)); |
| 118 process_->GetHost()->AddFilter(filter_.get()); | 117 process_->GetHost()->AddFilter(filter_.get()); |
| 119 } | 118 } |
| 120 | 119 |
| 121 PpapiPluginProcessHost::PpapiPluginProcessHost() | 120 PpapiPluginProcessHost::PpapiPluginProcessHost() |
| 122 : is_broker_(true), | 121 : is_broker_(true) { |
| 123 process_id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()) { | |
| 124 process_.reset(new BrowserChildProcessHostImpl( | 122 process_.reset(new BrowserChildProcessHostImpl( |
| 125 content::PROCESS_TYPE_PPAPI_BROKER, this)); | 123 content::PROCESS_TYPE_PPAPI_BROKER, this)); |
| 126 } | 124 } |
| 127 | 125 |
| 128 bool PpapiPluginProcessHost::Init(const content::PepperPluginInfo& info) { | 126 bool PpapiPluginProcessHost::Init(const content::PepperPluginInfo& info) { |
| 129 plugin_path_ = info.path; | 127 plugin_path_ = info.path; |
| 130 if (info.name.empty()) { | 128 if (info.name.empty()) { |
| 131 process_->SetName(plugin_path_.BaseName().LossyDisplayName()); | 129 process_->SetName(plugin_path_.BaseName().LossyDisplayName()); |
| 132 } else { | 130 } else { |
| 133 process_->SetName(UTF8ToUTF16(info.name)); | 131 process_->SetName(UTF8ToUTF16(info.name)); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 200 void PpapiPluginProcessHost::RequestPluginChannel(Client* client) { | 198 void PpapiPluginProcessHost::RequestPluginChannel(Client* client) { |
| 201 base::ProcessHandle process_handle; | 199 base::ProcessHandle process_handle; |
| 202 int renderer_id; | 200 int renderer_id; |
| 203 client->GetChannelInfo(&process_handle, &renderer_id); | 201 client->GetChannelInfo(&process_handle, &renderer_id); |
| 204 | 202 |
| 205 // We can't send any sync messages from the browser because it might lead to | 203 // We can't send any sync messages from the browser because it might lead to |
| 206 // a hang. See the similar code in PluginProcessHost for more description. | 204 // a hang. See the similar code in PluginProcessHost for more description. |
| 207 PpapiMsg_CreateChannel* msg = new PpapiMsg_CreateChannel(process_handle, | 205 PpapiMsg_CreateChannel* msg = new PpapiMsg_CreateChannel(process_handle, |
| 208 renderer_id); | 206 renderer_id); |
| 209 msg->set_unblock(true); | 207 msg->set_unblock(true); |
| 210 if (Send(msg)) | 208 if (Send(msg)) { |
| 211 sent_requests_.push(client); | 209 sent_requests_.push(client); |
| 212 else | 210 } else { |
| 213 client->OnChannelOpened(base::kNullProcessHandle, IPC::ChannelHandle()); | 211 client->OnChannelOpened(base::kNullProcessHandle, IPC::ChannelHandle(), |
| 212 process_->GetData().id); | |
|
yzshen1
2012/04/11 18:30:46
Should it be 0?
| |
| 213 } | |
| 214 } | 214 } |
| 215 | 215 |
| 216 void PpapiPluginProcessHost::OnProcessLaunched() { | 216 void PpapiPluginProcessHost::OnProcessLaunched() { |
| 217 } | 217 } |
| 218 | 218 |
| 219 bool PpapiPluginProcessHost::OnMessageReceived(const IPC::Message& msg) { | 219 bool PpapiPluginProcessHost::OnMessageReceived(const IPC::Message& msg) { |
| 220 bool handled = true; | 220 bool handled = true; |
| 221 IPC_BEGIN_MESSAGE_MAP(PpapiPluginProcessHost, msg) | 221 IPC_BEGIN_MESSAGE_MAP(PpapiPluginProcessHost, msg) |
| 222 IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated, | 222 IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated, |
| 223 OnRendererPluginChannelCreated) | 223 OnRendererPluginChannelCreated) |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 250 // state at the same time. Instead, we just need to notify any renderers | 250 // state at the same time. Instead, we just need to notify any renderers |
| 251 // that have requested a connection but have not yet received one. | 251 // that have requested a connection but have not yet received one. |
| 252 CancelRequests(); | 252 CancelRequests(); |
| 253 } | 253 } |
| 254 | 254 |
| 255 void PpapiPluginProcessHost::CancelRequests() { | 255 void PpapiPluginProcessHost::CancelRequests() { |
| 256 DVLOG(1) << "PpapiPluginProcessHost" << (is_broker_ ? "[broker]" : "") | 256 DVLOG(1) << "PpapiPluginProcessHost" << (is_broker_ ? "[broker]" : "") |
| 257 << "CancelRequests()"; | 257 << "CancelRequests()"; |
| 258 for (size_t i = 0; i < pending_requests_.size(); i++) { | 258 for (size_t i = 0; i < pending_requests_.size(); i++) { |
| 259 pending_requests_[i]->OnChannelOpened(base::kNullProcessHandle, | 259 pending_requests_[i]->OnChannelOpened(base::kNullProcessHandle, |
| 260 IPC::ChannelHandle()); | 260 IPC::ChannelHandle(), 0); |
| 261 } | 261 } |
| 262 pending_requests_.clear(); | 262 pending_requests_.clear(); |
| 263 | 263 |
| 264 while (!sent_requests_.empty()) { | 264 while (!sent_requests_.empty()) { |
| 265 sent_requests_.front()->OnChannelOpened(base::kNullProcessHandle, | 265 sent_requests_.front()->OnChannelOpened(base::kNullProcessHandle, |
| 266 IPC::ChannelHandle()); | 266 IPC::ChannelHandle(), 0); |
| 267 sent_requests_.pop(); | 267 sent_requests_.pop(); |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 | 270 |
| 271 // Called when a new plugin <--> renderer channel has been created. | 271 // Called when a new plugin <--> renderer channel has been created. |
| 272 void PpapiPluginProcessHost::OnRendererPluginChannelCreated( | 272 void PpapiPluginProcessHost::OnRendererPluginChannelCreated( |
| 273 const IPC::ChannelHandle& channel_handle) { | 273 const IPC::ChannelHandle& channel_handle) { |
| 274 if (sent_requests_.empty()) | 274 if (sent_requests_.empty()) |
| 275 return; | 275 return; |
| 276 | 276 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 288 | 288 |
| 289 base::ProcessHandle renderers_plugin_handle = NULL; | 289 base::ProcessHandle renderers_plugin_handle = NULL; |
| 290 ::DuplicateHandle(::GetCurrentProcess(), plugin_process, | 290 ::DuplicateHandle(::GetCurrentProcess(), plugin_process, |
| 291 renderer_process, &renderers_plugin_handle, | 291 renderer_process, &renderers_plugin_handle, |
| 292 0, FALSE, DUPLICATE_SAME_ACCESS); | 292 0, FALSE, DUPLICATE_SAME_ACCESS); |
| 293 #elif defined(OS_POSIX) | 293 #elif defined(OS_POSIX) |
| 294 // Don't need to duplicate anything on POSIX since it's just a PID. | 294 // Don't need to duplicate anything on POSIX since it's just a PID. |
| 295 base::ProcessHandle renderers_plugin_handle = plugin_process; | 295 base::ProcessHandle renderers_plugin_handle = plugin_process; |
| 296 #endif | 296 #endif |
| 297 | 297 |
| 298 client->OnChannelOpened(renderers_plugin_handle, channel_handle); | 298 client->OnChannelOpened(renderers_plugin_handle, channel_handle, |
| 299 process_->GetData().id); | |
| 299 } | 300 } |
| OLD | NEW |