diff options
author | ddorwin@chromium.org <ddorwin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-14 02:45:42 +0000 |
---|---|---|
committer | ddorwin@chromium.org <ddorwin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-14 02:45:42 +0000 |
commit | eb415bf0e3fa41131a0f1f706e4f377d86206556 (patch) | |
tree | 0d9ea90ce1bbae21a4c64181eb130fd1f37073bd /content/browser/plugin_service.cc | |
parent | 6407f289f81ac09476e66c59fc4887eb46112981 (diff) | |
download | chromium_src-eb415bf0e3fa41131a0f1f706e4f377d86206556.zip chromium_src-eb415bf0e3fa41131a0f1f706e4f377d86206556.tar.gz chromium_src-eb415bf0e3fa41131a0f1f706e4f377d86206556.tar.bz2 |
Asynchronously create the ppapi broker.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/6822012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81525 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/plugin_service.cc')
-rw-r--r-- | content/browser/plugin_service.cc | 76 |
1 files changed, 67 insertions, 9 deletions
diff --git a/content/browser/plugin_service.cc b/content/browser/plugin_service.cc index 409bd67..1a12a36 100644 --- a/content/browser/plugin_service.cc +++ b/content/browser/plugin_service.cc @@ -223,6 +223,22 @@ PpapiPluginProcessHost* PluginService::FindPpapiPluginProcess( return NULL; } +PpapiBrokerProcessHost* PluginService::FindPpapiBrokerProcess( + const FilePath& broker_path) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + + for (BrowserChildProcessHost::Iterator iter( + ChildProcessInfo::PPAPI_BROKER_PROCESS); + !iter.Done(); ++iter) { + PpapiBrokerProcessHost* broker = + static_cast<PpapiBrokerProcessHost*>(*iter); + if (broker->broker_path() == broker_path) + return broker; + } + + return NULL; +} + PluginProcessHost* PluginService::FindOrStartNpapiPluginProcess( const FilePath& plugin_path) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); @@ -254,15 +270,8 @@ PpapiPluginProcessHost* PluginService::FindOrStartPpapiPluginProcess( if (plugin_host) return plugin_host; - // Validate that the plugin is actually registered. There should generally - // be very few plugins so a brute-force search is fine. - PepperPluginInfo* info = NULL; - for (size_t i = 0; i < ppapi_plugins_.size(); i++) { - if (ppapi_plugins_[i].path == plugin_path) { - info = &ppapi_plugins_[i]; - break; - } - } + // Validate that the plugin is actually registered. + PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); if (!info) return NULL; @@ -275,6 +284,32 @@ PpapiPluginProcessHost* PluginService::FindOrStartPpapiPluginProcess( return new_host.release(); } +PpapiBrokerProcessHost* PluginService::FindOrStartPpapiBrokerProcess( + const FilePath& plugin_path) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + + PpapiBrokerProcessHost* plugin_host = FindPpapiBrokerProcess(plugin_path); + if (plugin_host) + return plugin_host; + + // Validate that the plugin is actually registered. + PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); + if (!info) + return NULL; + + // TODO(ddorwin): Uncomment once out of process is supported. + // DCHECK(info->is_out_of_process); + + // This broker isn't loaded by any broker process, so create a new process. + scoped_ptr<PpapiBrokerProcessHost> new_host( + new PpapiBrokerProcessHost); + if (!new_host->Init(*info)) { + NOTREACHED(); // Init is not expected to fail. + return NULL; + } + return new_host.release(); +} + void PluginService::OpenChannelToNpapiPlugin( int render_process_id, int render_view_id, @@ -300,6 +335,16 @@ void PluginService::OpenChannelToPpapiPlugin( client->OnChannelOpened(base::kNullProcessHandle, IPC::ChannelHandle()); } +void PluginService::OpenChannelToPpapiBroker( + const FilePath& path, + PpapiBrokerProcessHost::Client* client) { + PpapiBrokerProcessHost* plugin_host = FindOrStartPpapiBrokerProcess(path); + if (plugin_host) + plugin_host->OpenChannelToPpapiBroker(client); + else // Send error. + client->OnChannelOpened(base::kNullProcessHandle, IPC::ChannelHandle()); +} + void PluginService::GetAllowedPluginForOpenChannelToPlugin( int render_process_id, int render_view_id, @@ -503,6 +548,19 @@ void PluginService::RegisterPepperPlugins() { } } +// There should generally be very few plugins so a brute-force search is fine. +PepperPluginInfo* PluginService::GetRegisteredPpapiPluginInfo( + const FilePath& plugin_path) { + PepperPluginInfo* info = NULL; + for (size_t i = 0; i < ppapi_plugins_.size(); i++) { + if (ppapi_plugins_[i].path == plugin_path) { + info = &ppapi_plugins_[i]; + break; + } + } + return info; +} + #if defined(OS_LINUX) // static void PluginService::RegisterFilePathWatcher( |