Index: chrome/plugin/plugin_thread.cc |
=================================================================== |
--- chrome/plugin/plugin_thread.cc (revision 21215) |
+++ chrome/plugin/plugin_thread.cc (working copy) |
@@ -6,6 +6,11 @@ |
#include "build/build_config.h" |
+#if defined(OS_WIN) |
+#include <windows.h> |
+#include <objbase.h> |
+#endif |
+ |
#include "base/command_line.h" |
#include "base/lazy_instance.h" |
#include "base/process_util.h" |
@@ -13,6 +18,7 @@ |
#include "chrome/common/child_process.h" |
#include "chrome/common/chrome_plugin_lib.h" |
#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/notification_service.h" |
#include "chrome/common/plugin_messages.h" |
#include "chrome/common/render_messages.h" |
#include "chrome/plugin/chrome_plugin_host.h" |
@@ -26,10 +32,27 @@ |
base::LINKER_INITIALIZED); |
PluginThread::PluginThread() |
- : preloaded_plugin_module_(NULL) { |
+ : ChildThread(base::Thread::Options(MessageLoop::TYPE_UI, 0)), |
+ preloaded_plugin_module_(NULL) { |
plugin_path_ = FilePath::FromWStringHack( |
CommandLine::ForCurrentProcess()->GetSwitchValue(switches::kPluginPath)); |
+} |
+PluginThread::~PluginThread() { |
+} |
+ |
+PluginThread* PluginThread::current() { |
+ return lazy_tls.Pointer()->Get(); |
+} |
+ |
+void PluginThread::OnControlMessageReceived(const IPC::Message& msg) { |
+ IPC_BEGIN_MESSAGE_MAP(PluginThread, msg) |
+ IPC_MESSAGE_HANDLER(PluginProcessMsg_CreateChannel, OnCreateChannel) |
+ IPC_MESSAGE_HANDLER(PluginProcessMsg_PluginMessage, OnPluginMessage) |
+ IPC_END_MESSAGE_MAP() |
+} |
+ |
+void PluginThread::Init() { |
lazy_tls.Pointer()->Set(this); |
#if defined(OS_LINUX) |
{ |
@@ -52,9 +75,15 @@ |
} |
} |
#endif |
+ ChildThread::Init(); |
PatchNPNFunctions(); |
+#if defined(OS_WIN) |
+ CoInitialize(NULL); |
+#endif |
+ notification_service_.reset(new NotificationService); |
+ |
// Preload the library to avoid loading, unloading then reloading |
preloaded_plugin_module_ = base::LoadNativeLibrary(plugin_path_); |
@@ -71,7 +100,7 @@ |
message_loop()->set_exception_restoration(true); |
} |
-PluginThread::~PluginThread() { |
+void PluginThread::CleanUp() { |
if (preloaded_plugin_module_) { |
base::UnloadNativeLibrary(preloaded_plugin_module_); |
preloaded_plugin_module_ = NULL; |
@@ -79,29 +108,26 @@ |
PluginChannelBase::CleanupChannels(); |
NPAPI::PluginLib::UnloadAllPlugins(); |
ChromePluginLib::UnloadAllPlugins(); |
+ notification_service_.reset(); |
+#if defined(OS_WIN) |
+ CoUninitialize(); |
+#endif |
if (webkit_glue::ShouldForcefullyTerminatePluginProcess()) |
base::KillProcess(base::GetCurrentProcessHandle(), 0, /* wait= */ false); |
+ // Call this last because it deletes the ResourceDispatcher, which is used |
+ // in some of the above cleanup. |
+ // See http://code.google.com/p/chromium/issues/detail?id=8980 |
+ ChildThread::CleanUp(); |
lazy_tls.Pointer()->Set(NULL); |
} |
-PluginThread* PluginThread::current() { |
- return lazy_tls.Pointer()->Get(); |
-} |
- |
-void PluginThread::OnControlMessageReceived(const IPC::Message& msg) { |
- IPC_BEGIN_MESSAGE_MAP(PluginThread, msg) |
- IPC_MESSAGE_HANDLER(PluginProcessMsg_CreateChannel, OnCreateChannel) |
- IPC_MESSAGE_HANDLER(PluginProcessMsg_PluginMessage, OnPluginMessage) |
- IPC_END_MESSAGE_MAP() |
-} |
- |
void PluginThread::OnCreateChannel( |
int process_id, |
bool off_the_record) { |
- scoped_refptr<PluginChannel> channel = PluginChannel::GetPluginChannel( |
- process_id, ChildProcess::current()->io_message_loop()); |
+ scoped_refptr<PluginChannel> channel = |
+ PluginChannel::GetPluginChannel(process_id, owner_loop()); |
IPC::ChannelHandle channel_handle; |
if (channel.get()) { |
channel_handle.name = channel->channel_name(); |