diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-15 00:43:08 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-15 00:43:08 +0000 |
commit | fb4663463c33d39b591a159b22e84d3c5d81ea62 (patch) | |
tree | 404f931268587d6063601b0a52a75d655cd71904 /chrome/browser/renderer_host | |
parent | acb7d597819483d8db4b28fdf42b3e9d07182b5b (diff) | |
download | chromium_src-fb4663463c33d39b591a159b22e84d3c5d81ea62.zip chromium_src-fb4663463c33d39b591a159b22e84d3c5d81ea62.tar.gz chromium_src-fb4663463c33d39b591a159b22e84d3c5d81ea62.tar.bz2 |
linux: destroy browser-side plugin windows on plugin crash
Because the plugin windows must be destroyed by the UI thread,
we store the map of plugin PID -> plugin windows there,
on the RenderWidgetHostView.
This differs slightly from Windows, where the map is stored
on the PluginProcessHost, but is otherwise pretty similar.
TEST=crash a windowed plugin; you should see a sad plugin
icon in the place of the plugin
Review URL: http://codereview.chromium.org/155517
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20693 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host')
8 files changed, 49 insertions, 10 deletions
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index b41c04c..ff6b8e3 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -1361,7 +1361,10 @@ void RenderViewHost::OnMissingPluginStatus(int status) { integration_delegate->OnMissingPluginStatus(status); } -void RenderViewHost::OnCrashedPlugin(const FilePath& plugin_path) { +void RenderViewHost::OnCrashedPlugin(base::ProcessId pid, + const FilePath& plugin_path) { + view()->PluginProcessCrashed(pid); + RenderViewHostDelegate::BrowserIntegration* integration_delegate = delegate_->GetBrowserIntegrationDelegate(); if (integration_delegate) diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index a43c5a2..90a4d53 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -525,7 +525,7 @@ class RenderViewHost : public RenderWidgetHost, void OnUserMetricsRecordAction(const std::wstring& action); void OnMissingPluginStatus(int status); - void OnCrashedPlugin(const FilePath& plugin_path); + void OnCrashedPlugin(base::ProcessId pid, const FilePath& plugin_path); void OnMessageReceived(IPC::Message* msg) { } void OnReceivedSavableResourceLinksForCurrentPage( diff --git a/chrome/browser/renderer_host/render_widget_host.cc b/chrome/browser/renderer_host/render_widget_host.cc index cdadd9e..b6369d8 100644 --- a/chrome/browser/renderer_host/render_widget_host.cc +++ b/chrome/browser/renderer_host/render_widget_host.cc @@ -754,8 +754,9 @@ void RenderWidgetHost::OnMsgImeUpdateStatus(int control, #if defined(OS_LINUX) void RenderWidgetHost::OnMsgCreatePluginContainer( - gfx::PluginWindowHandle *container) { - *container = view_->CreatePluginContainer(); + base::ProcessId pid, + gfx::PluginWindowHandle* container) { + *container = view_->CreatePluginContainer(pid); } void RenderWidgetHost::OnMsgDestroyPluginContainer( diff --git a/chrome/browser/renderer_host/render_widget_host.h b/chrome/browser/renderer_host/render_widget_host.h index e133670..88bcf18 100644 --- a/chrome/browser/renderer_host/render_widget_host.h +++ b/chrome/browser/renderer_host/render_widget_host.h @@ -8,6 +8,7 @@ #include <queue> #include <vector> +#include "base/process.h" #include "base/gfx/native_widget_types.h" #include "base/gfx/size.h" #include "base/scoped_ptr.h" @@ -394,7 +395,8 @@ class RenderWidgetHost : public IPC::Channel::Listener { // having to bring in render_messages.h in a header file. void OnMsgImeUpdateStatus(int control, const gfx::Rect& caret_rect); #if defined(OS_LINUX) - void OnMsgCreatePluginContainer(gfx::PluginWindowHandle *container); + void OnMsgCreatePluginContainer(base::ProcessId pid, + gfx::PluginWindowHandle* container); void OnMsgDestroyPluginContainer(gfx::PluginWindowHandle container); #elif defined(OS_MACOSX) void OnMsgShowPopup(const ViewHostMsg_ShowPopup_Params& params); diff --git a/chrome/browser/renderer_host/render_widget_host_view.h b/chrome/browser/renderer_host/render_widget_host_view.h index 0837bc7..b5609e2 100644 --- a/chrome/browser/renderer_host/render_widget_host_view.h +++ b/chrome/browser/renderer_host/render_widget_host_view.h @@ -159,10 +159,13 @@ class RenderWidgetHostView { #endif #if defined(OS_LINUX) - virtual gfx::PluginWindowHandle CreatePluginContainer() = 0; + virtual gfx::PluginWindowHandle CreatePluginContainer( + base::ProcessId plugin_process_id) = 0; virtual void DestroyPluginContainer(gfx::PluginWindowHandle container) = 0; #endif + virtual void PluginProcessCrashed(base::ProcessId pid) { } + void set_activatable(bool activatable) { activatable_ = activatable; } diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc index 2693be6..3bb7425 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc @@ -16,6 +16,7 @@ #include "base/string_util.h" #include "base/task.h" #include "base/time.h" +#include "chrome/browser/plugin_process_host.h" #include "chrome/common/native_web_keyboard_event.h" #include "chrome/common/render_messages.h" #include "chrome/common/x11_util.h" @@ -725,11 +726,31 @@ void RenderWidgetHostViewGtk::ReceivedSelectionText(GtkClipboard* clipboard, UTF8ToUTF16(text))); } -gfx::PluginWindowHandle RenderWidgetHostViewGtk::CreatePluginContainer() { - return plugin_container_manager_.CreatePluginContainer(); +gfx::PluginWindowHandle RenderWidgetHostViewGtk::CreatePluginContainer( + base::ProcessId plugin_process_id) { + gfx::PluginWindowHandle handle = + plugin_container_manager_.CreatePluginContainer(); + plugin_pid_map_.insert(std::make_pair(plugin_process_id, handle)); + return handle; } void RenderWidgetHostViewGtk::DestroyPluginContainer( gfx::PluginWindowHandle container) { plugin_container_manager_.DestroyPluginContainer(container); + + for (PluginPidMap::iterator i = plugin_pid_map_.begin(); + i != plugin_pid_map_.end(); ++i) { + if (i->second == container) { + plugin_pid_map_.erase(i); + break; + } + } +} + +void RenderWidgetHostViewGtk::PluginProcessCrashed(base::ProcessId pid) { + for (PluginPidMap::iterator i = plugin_pid_map_.find(pid); + i != plugin_pid_map_.end() && i->first == pid; ++i) { + plugin_container_manager_.DestroyPluginContainer(i->second); + } + plugin_pid_map_.erase(pid); } diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.h b/chrome/browser/renderer_host/render_widget_host_view_gtk.h index 1caa1ac..d4a40ef 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.h +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.h @@ -60,8 +60,10 @@ class RenderWidgetHostViewGtk : public RenderWidgetHostView { virtual void PasteFromSelectionClipboard(); virtual void ShowingContextMenu(bool showing); virtual BackingStore* AllocBackingStore(const gfx::Size& size); - virtual gfx::PluginWindowHandle CreatePluginContainer(); + virtual gfx::PluginWindowHandle CreatePluginContainer( + base::ProcessId plugin_process_id); virtual void DestroyPluginContainer(gfx::PluginWindowHandle container); + virtual void PluginProcessCrashed(base::ProcessId pid); gfx::NativeView native_view() const { return view_.get(); } @@ -143,6 +145,11 @@ class RenderWidgetHostViewGtk : public RenderWidgetHostView { // Helper class that lets us allocate plugin containers and move them. GtkPluginContainerManager plugin_container_manager_; + + // A map of plugin process id -> windows related to that process. + // Lets us clean up immediately when a plugin process crashes. + typedef std::multimap<base::ProcessId, gfx::PluginWindowHandle> PluginPidMap; + PluginPidMap plugin_pid_map_; }; #endif // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_GTK_H_ diff --git a/chrome/browser/renderer_host/test/test_render_view_host.h b/chrome/browser/renderer_host/test/test_render_view_host.h index dcc3e1a..aa24b0c 100644 --- a/chrome/browser/renderer_host/test/test_render_view_host.h +++ b/chrome/browser/renderer_host/test/test_render_view_host.h @@ -82,7 +82,9 @@ class TestRenderWidgetHostView : public RenderWidgetHostView { #endif #if defined(OS_LINUX) - virtual gfx::PluginWindowHandle CreatePluginContainer() { return 0; } + virtual gfx::PluginWindowHandle CreatePluginContainer(base::ProcessId) { + return 0; + } virtual void DestroyPluginContainer(gfx::PluginWindowHandle container) { } #endif |