| Index: content/browser/plugin_service.cc | 
| diff --git a/content/browser/plugin_service.cc b/content/browser/plugin_service.cc | 
| index 97a90c4243d14c1334675707eff6847739c5df27..394c81d84bf0e4c0b2eb3deabd6de072a544d3b6 100644 | 
| --- a/content/browser/plugin_service.cc | 
| +++ b/content/browser/plugin_service.cc | 
| @@ -23,19 +23,21 @@ | 
| #include "content/browser/renderer_host/render_process_host.h" | 
| #include "content/browser/renderer_host/render_view_host.h" | 
| #include "content/browser/resource_context.h" | 
| -#include "content/browser/utility_process_host.h" | 
| #include "content/common/content_notification_types.h" | 
| #include "content/common/content_switches.h" | 
| #include "content/common/notification_service.h" | 
| #include "content/common/pepper_plugin_registry.h" | 
| #include "content/common/plugin_messages.h" | 
| -#include "content/common/utility_messages.h" | 
| #include "content/common/view_messages.h" | 
| #include "webkit/plugins/npapi/plugin_constants_win.h" | 
| #include "webkit/plugins/npapi/plugin_group.h" | 
| #include "webkit/plugins/npapi/plugin_list.h" | 
| #include "webkit/plugins/webplugininfo.h" | 
|  | 
| +#if defined(OS_POSIX) | 
| +#include "content/browser/plugin_loader.h" | 
| +#endif | 
| + | 
| #if defined(OS_POSIX) && !defined(OS_MACOSX) | 
| using ::base::files::FilePathWatcher; | 
| #endif | 
| @@ -73,72 +75,6 @@ void WillLoadPluginsCallback() { | 
| #endif | 
| } | 
|  | 
| -#if defined(OS_POSIX) | 
| -// Utility child process client that manages the IPC for loading plugins out of | 
| -// process. | 
| -class PluginLoaderClient : public UtilityProcessHost::Client { | 
| - public: | 
| -  // Meant to be called on the IO thread. Will invoke the callback on the target | 
| -  // loop when the plugins have been loaded. | 
| -  static void LoadPluginsOutOfProcess( | 
| -      base::MessageLoopProxy* target_loop, | 
| -      const PluginService::GetPluginsCallback& callback) { | 
| -    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| - | 
| -    PluginLoaderClient* client = new PluginLoaderClient(target_loop, callback); | 
| -    UtilityProcessHost* process_host = | 
| -        new UtilityProcessHost(client, BrowserThread::IO); | 
| -    process_host->set_no_sandbox(true); | 
| -#if defined(OS_MACOSX) | 
| -    process_host->set_child_flags(ChildProcessHost::CHILD_ALLOW_HEAP_EXECUTION); | 
| -#endif | 
| - | 
| -    std::vector<FilePath> extra_plugin_paths; | 
| -    std::vector<FilePath> extra_plugin_dirs; | 
| -    std::vector<webkit::WebPluginInfo> internal_plugins; | 
| -    webkit::npapi::PluginList::Singleton()->GetPluginPathListsToLoad( | 
| -        &extra_plugin_paths, &extra_plugin_dirs, &internal_plugins); | 
| - | 
| -    process_host->Send(new UtilityMsg_LoadPlugins( | 
| -        extra_plugin_paths, extra_plugin_dirs, internal_plugins)); | 
| -  } | 
| - | 
| -  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { | 
| -    bool handled = true; | 
| -    IPC_BEGIN_MESSAGE_MAP(PluginLoaderClient, message) | 
| -      IPC_MESSAGE_HANDLER(UtilityHostMsg_LoadedPlugins, OnGotPlugins) | 
| -      IPC_MESSAGE_UNHANDLED(handled = false) | 
| -    IPC_END_MESSAGE_MAP() | 
| -    return handled; | 
| -  } | 
| - | 
| -  virtual void OnProcessCrashed(int exit_code) OVERRIDE { | 
| -    LOG(ERROR) << "Out-of-process plugin loader crashed with code " << exit_code | 
| -               << ". You will have no plugins!"; | 
| -    // Don't leave callers hanging. | 
| -    OnGotPlugins(std::vector<webkit::WebPluginInfo>()); | 
| -  } | 
| - | 
| -  virtual void OnGotPlugins(const std::vector<webkit::WebPluginInfo>& plugins) { | 
| -    webkit::npapi::PluginList::Singleton()->SetPlugins(plugins); | 
| -    target_loop_->PostTask(FROM_HERE, | 
| -        base::Bind(&RunGetPluginsCallback, callback_, plugins)); | 
| -  } | 
| - | 
| - private: | 
| -  PluginLoaderClient(base::MessageLoopProxy* target_loop, | 
| -                     const PluginService::GetPluginsCallback& callback) | 
| -      : target_loop_(target_loop), | 
| -        callback_(callback) { | 
| -  } | 
| - | 
| -  scoped_refptr<base::MessageLoopProxy> target_loop_; | 
| -  PluginService::GetPluginsCallback callback_; | 
| - | 
| -  DISALLOW_COPY_AND_ASSIGN(PluginLoaderClient); | 
| -}; | 
| -#endif  // OS_POSIX | 
| - | 
| }  // namespace | 
|  | 
| #if defined(OS_MACOSX) | 
| @@ -574,8 +510,8 @@ void PluginService::GetPlugins(const GetPluginsCallback& callback) { | 
| base::Bind(&RunGetPluginsCallback, callback, cached_plugins)); | 
| } else { | 
| BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 
| -        base::Bind(&PluginLoaderClient::LoadPluginsOutOfProcess, | 
| -            target_loop, callback)); | 
| +        base::Bind(&PluginService::LoadPluginsOutOfProcess, | 
| +                   base::Unretained(this), target_loop, callback)); | 
| } | 
| #endif | 
| } | 
| @@ -596,6 +532,17 @@ void PluginService::GetPluginsInternal( | 
| base::Bind(&RunGetPluginsCallback, callback, plugins)); | 
| } | 
|  | 
| +#if defined(OS_POSIX) | 
| +void PluginService::LoadPluginsOutOfProcess( | 
| +    base::MessageLoopProxy* target_loop, | 
| +    const PluginService::GetPluginsCallback& callback) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| +  if (!plugin_loader_) | 
| +    plugin_loader_ = new PluginLoader(); | 
| +  plugin_loader_->LoadPlugins(target_loop, callback); | 
| +} | 
| +#endif | 
| + | 
| void PluginService::OnWaitableEventSignaled( | 
| base::WaitableEvent* waitable_event) { | 
| #if defined(OS_WIN) | 
|  |