summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host
diff options
context:
space:
mode:
authorevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-15 00:43:08 +0000
committerevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-15 00:43:08 +0000
commitfb4663463c33d39b591a159b22e84d3c5d81ea62 (patch)
tree404f931268587d6063601b0a52a75d655cd71904 /chrome/browser/renderer_host
parentacb7d597819483d8db4b28fdf42b3e9d07182b5b (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc5
-rw-r--r--chrome/browser/renderer_host/render_view_host.h2
-rw-r--r--chrome/browser/renderer_host/render_widget_host.cc5
-rw-r--r--chrome/browser/renderer_host/render_widget_host.h4
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view.h5
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.cc25
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.h9
-rw-r--r--chrome/browser/renderer_host/test/test_render_view_host.h4
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