| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/plugin/plugin_channel.h" | 5 #include "chrome/plugin/plugin_channel.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/lock.h" | 8 #include "base/lock.h" |
| 9 #include "base/process_util.h" | 9 #include "base/process_util.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 } | 155 } |
| 156 | 156 |
| 157 // static | 157 // static |
| 158 void PluginChannel::NotifyRenderersOfPendingShutdown() { | 158 void PluginChannel::NotifyRenderersOfPendingShutdown() { |
| 159 Broadcast(new PluginHostMsg_PluginShuttingDown()); | 159 Broadcast(new PluginHostMsg_PluginShuttingDown()); |
| 160 } | 160 } |
| 161 | 161 |
| 162 PluginChannel::PluginChannel() | 162 PluginChannel::PluginChannel() |
| 163 : renderer_handle_(0), | 163 : renderer_handle_(0), |
| 164 renderer_id_(-1), | 164 renderer_id_(-1), |
| 165 #if defined(OS_POSIX) | |
| 166 renderer_fd_(-1), | |
| 167 #endif | |
| 168 in_send_(0), | 165 in_send_(0), |
| 169 off_the_record_(false), | 166 off_the_record_(false), |
| 170 filter_(new MessageFilter()) { | 167 filter_(new MessageFilter()) { |
| 171 set_send_unblocking_only_during_unblock_dispatch(); | 168 set_send_unblocking_only_during_unblock_dispatch(); |
| 172 ChildProcess::current()->AddRefProcess(); | 169 ChildProcess::current()->AddRefProcess(); |
| 173 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | 170 const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 174 log_messages_ = command_line->HasSwitch(switches::kLogPluginMessages); | 171 log_messages_ = command_line->HasSwitch(switches::kLogPluginMessages); |
| 175 } | 172 } |
| 176 | 173 |
| 177 PluginChannel::~PluginChannel() { | 174 PluginChannel::~PluginChannel() { |
| 178 #if defined(OS_POSIX) | |
| 179 // Won't be needing this any more. | |
| 180 CloseRendererFD(); | |
| 181 #endif | |
| 182 | |
| 183 if (renderer_handle_) | 175 if (renderer_handle_) |
| 184 base::CloseProcessHandle(renderer_handle_); | 176 base::CloseProcessHandle(renderer_handle_); |
| 185 | 177 |
| 186 MessageLoop::current()->PostDelayedTask(FROM_HERE, new PluginReleaseTask(), | 178 MessageLoop::current()->PostDelayedTask(FROM_HERE, new PluginReleaseTask(), |
| 187 kPluginReleaseTimeMS); | 179 kPluginReleaseTimeMS); |
| 188 } | 180 } |
| 189 | 181 |
| 190 bool PluginChannel::Send(IPC::Message* msg) { | 182 bool PluginChannel::Send(IPC::Message* msg) { |
| 191 in_send_++; | 183 in_send_++; |
| 192 if (log_messages_) { | 184 if (log_messages_) { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 } | 278 } |
| 287 Send(new PluginHostMsg_ClearSiteDataResult(success)); | 279 Send(new PluginHostMsg_ClearSiteDataResult(success)); |
| 288 } | 280 } |
| 289 | 281 |
| 290 base::WaitableEvent* PluginChannel::GetModalDialogEvent( | 282 base::WaitableEvent* PluginChannel::GetModalDialogEvent( |
| 291 gfx::NativeViewId containing_window) { | 283 gfx::NativeViewId containing_window) { |
| 292 return filter_->GetModalDialogEvent(containing_window); | 284 return filter_->GetModalDialogEvent(containing_window); |
| 293 } | 285 } |
| 294 | 286 |
| 295 void PluginChannel::OnChannelConnected(int32 peer_pid) { | 287 void PluginChannel::OnChannelConnected(int32 peer_pid) { |
| 296 #if defined(OS_POSIX) | |
| 297 // By this point, the renderer must have its own copy of the plugin channel | |
| 298 // FD. | |
| 299 CloseRendererFD(); | |
| 300 #endif | |
| 301 | |
| 302 base::ProcessHandle handle; | 288 base::ProcessHandle handle; |
| 303 if (!base::OpenProcessHandle(peer_pid, &handle)) { | 289 if (!base::OpenProcessHandle(peer_pid, &handle)) { |
| 304 NOTREACHED(); | 290 NOTREACHED(); |
| 305 } | 291 } |
| 306 renderer_handle_ = handle; | 292 renderer_handle_ = handle; |
| 307 PluginChannelBase::OnChannelConnected(peer_pid); | 293 PluginChannelBase::OnChannelConnected(peer_pid); |
| 308 } | 294 } |
| 309 | 295 |
| 310 void PluginChannel::OnChannelError() { | 296 void PluginChannel::OnChannelError() { |
| 311 #if defined(OS_POSIX) | |
| 312 // Won't be needing this any more. | |
| 313 CloseRendererFD(); | |
| 314 #endif | |
| 315 | |
| 316 base::CloseProcessHandle(renderer_handle_); | 297 base::CloseProcessHandle(renderer_handle_); |
| 317 renderer_handle_ = 0; | 298 renderer_handle_ = 0; |
| 318 PluginChannelBase::OnChannelError(); | 299 PluginChannelBase::OnChannelError(); |
| 319 CleanUp(); | 300 CleanUp(); |
| 320 } | 301 } |
| 321 | 302 |
| 322 void PluginChannel::CleanUp() { | 303 void PluginChannel::CleanUp() { |
| 323 // We need to clean up the stubs so that they call NPPDestroy. This will | 304 // We need to clean up the stubs so that they call NPPDestroy. This will |
| 324 // also lead to them releasing their reference on this object so that it can | 305 // also lead to them releasing their reference on this object so that it can |
| 325 // be deleted. | 306 // be deleted. |
| 326 for (size_t i = 0; i < plugin_stubs_.size(); ++i) | 307 for (size_t i = 0; i < plugin_stubs_.size(); ++i) |
| 327 RemoveRoute(plugin_stubs_[i]->instance_id()); | 308 RemoveRoute(plugin_stubs_[i]->instance_id()); |
| 328 | 309 |
| 329 // Need to addref this object temporarily because otherwise removing the last | 310 // Need to addref this object temporarily because otherwise removing the last |
| 330 // stub will cause the destructor of this object to be called, however at | 311 // stub will cause the destructor of this object to be called, however at |
| 331 // that point plugin_stubs_ will have one element and its destructor will be | 312 // that point plugin_stubs_ will have one element and its destructor will be |
| 332 // called twice. | 313 // called twice. |
| 333 scoped_refptr<PluginChannel> me(this); | 314 scoped_refptr<PluginChannel> me(this); |
| 334 | 315 |
| 335 plugin_stubs_.clear(); | 316 plugin_stubs_.clear(); |
| 336 } | 317 } |
| 337 | 318 |
| 338 bool PluginChannel::Init(MessageLoop* ipc_message_loop, bool create_pipe_now) { | 319 bool PluginChannel::Init(MessageLoop* ipc_message_loop, bool create_pipe_now) { |
| 339 #if defined(OS_POSIX) | |
| 340 // This gets called when the PluginChannel is initially created. At this | |
| 341 // point, create the socketpair and assign the plugin side FD to the channel | |
| 342 // name. Keep the renderer side FD as a member variable in the PluginChannel | |
| 343 // to be able to transmit it through IPC. | |
| 344 int plugin_fd; | |
| 345 if (!IPC::SocketPair(&plugin_fd, &renderer_fd_)) | |
| 346 return false; | |
| 347 IPC::AddChannelSocket(channel_name(), plugin_fd); | |
| 348 #endif | |
| 349 | |
| 350 if (!PluginChannelBase::Init(ipc_message_loop, create_pipe_now)) | 320 if (!PluginChannelBase::Init(ipc_message_loop, create_pipe_now)) |
| 351 return false; | 321 return false; |
| 352 | 322 |
| 353 channel_->AddFilter(filter_.get()); | 323 channel_->AddFilter(filter_.get()); |
| 354 return true; | 324 return true; |
| 355 } | 325 } |
| 356 | 326 |
| 357 #if defined(OS_POSIX) | |
| 358 void PluginChannel::CloseRendererFD() { | |
| 359 if (renderer_fd_ != -1) { | |
| 360 if (HANDLE_EINTR(close(renderer_fd_)) < 0) | |
| 361 PLOG(ERROR) << "close"; | |
| 362 renderer_fd_ = -1; | |
| 363 } | |
| 364 } | |
| 365 #endif | |
| OLD | NEW |