From c0478b0985b9893601125a88a32a648656a75948 Mon Sep 17 00:00:00 2001 From: "piman@chromium.org" Date: Tue, 25 Aug 2009 20:50:32 +0000 Subject: linux: new socket/plug code for windowed plugins This CL reworks the GtkSocket/GtkPlug code for windowed plugins on linux. Instead of having the plugin ask the browser to create a socket to plug into, it simply creates a plug and sends it to the browser. The browser creates a socket and attaches the plug when the socket becomes realized This fixes 2 main issues: - we can create windowed plugins in background tabs (Issue 16125) - we can detach tabs with windowed plugins and reattach them (Issue 17110) I reworked the IPCs, so it removes some amount of linux-specific things. We also need less synchronous IPCs to create/destroy plugins, so that should be a bit faster. In particular, I removed the plugin pid map, and instead made sure the renderer always destroys the plugin containers if the plugin process crashes - they will be destroyed if the renderer process crashes. Let me know if you have an issue with that. Also, the intermediate plug/socket creation now happens in webplugin_delegate_impl_gtk. That means test_shell uses it as well. It made the code a lot simpler, and means we're testing it as well, albeit with a bit of extra overhead. Bonus: I found a big bad bug in the GtkPluginContainer that made its width/height alias with some internal gtk structures. That was certainly causing some amounts of bugs. Bonus 2: scrolling now looks more in sync with the rest of the page, though I'm not exactly sure which part caused that. BUG=16125,17110 TEST=a lot of manual testing involving YouTube videos Review URL: http://codereview.chromium.org/174295 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24309 0039d316-1c4b-4281-b951-d872f2087c98 --- webkit/tools/test_shell/test_webview_delegate.h | 4 ++-- webkit/tools/test_shell/test_webview_delegate_gtk.cc | 8 ++++---- webkit/tools/test_shell/webview_host.h | 9 ++++----- webkit/tools/test_shell/webview_host_gtk.cc | 6 +++--- 4 files changed, 13 insertions(+), 14 deletions(-) (limited to 'webkit/tools/test_shell') diff --git a/webkit/tools/test_shell/test_webview_delegate.h b/webkit/tools/test_shell/test_webview_delegate.h index 6224b9c..971f199 100644 --- a/webkit/tools/test_shell/test_webview_delegate.h +++ b/webkit/tools/test_shell/test_webview_delegate.h @@ -77,8 +77,8 @@ class TestWebViewDelegate : public WebViewDelegate { const std::string& clsid, std::string* actual_mime_type); #if defined(OS_LINUX) - virtual gfx::PluginWindowHandle CreatePluginContainer(); - virtual void WillDestroyPluginWindow(gfx::PluginWindowHandle handle); + virtual void CreatedPluginWindow(gfx::PluginWindowHandle id); + virtual void WillDestroyPluginWindow(gfx::PluginWindowHandle id); #endif virtual WebKit::WebMediaPlayer* CreateWebMediaPlayer( WebKit::WebMediaPlayerClient* client); diff --git a/webkit/tools/test_shell/test_webview_delegate_gtk.cc b/webkit/tools/test_shell/test_webview_delegate_gtk.cc index 460dceb..461d1d3 100644 --- a/webkit/tools/test_shell/test_webview_delegate_gtk.cc +++ b/webkit/tools/test_shell/test_webview_delegate_gtk.cc @@ -108,12 +108,12 @@ WebPluginDelegate* TestWebViewDelegate::CreatePluginDelegate( return WebPluginDelegateImpl::Create(info.path, mtype, plugin_parent); } -gfx::PluginWindowHandle TestWebViewDelegate::CreatePluginContainer() { - return shell_->webViewHost()->CreatePluginContainer(); +void TestWebViewDelegate::CreatedPluginWindow(gfx::PluginWindowHandle id) { + shell_->webViewHost()->CreatePluginContainer(id); } -void TestWebViewDelegate::WillDestroyPluginWindow(unsigned long id) { - shell_->webViewHost()->OnPluginWindowDestroyed(id); +void TestWebViewDelegate::WillDestroyPluginWindow(gfx::PluginWindowHandle id) { + shell_->webViewHost()->DestroyPluginContainer(id); } void TestWebViewDelegate::ShowJavaScriptAlert(const std::wstring& message) { diff --git a/webkit/tools/test_shell/webview_host.h b/webkit/tools/test_shell/webview_host.h index 962633b..3c95e1d 100644 --- a/webkit/tools/test_shell/webview_host.h +++ b/webkit/tools/test_shell/webview_host.h @@ -32,12 +32,11 @@ class WebViewHost : public WebWidgetHost { WebView* webview() const; #if defined(OS_LINUX) - // Create a new plugin parent container, returning its X window id for - // embedders to use. - GdkNativeWindow CreatePluginContainer(); + // Create a new plugin parent container for a given plugin XID. + void CreatePluginContainer(gfx::PluginWindowHandle id); - // Called when a plugin has been destroyed. Lets us clean up our side. - void OnPluginWindowDestroyed(GdkNativeWindow id); + // Destroy the plugin parent container when a plugin has been destroyed. + void DestroyPluginContainer(gfx::PluginWindowHandle id); GtkPluginContainerManager* plugin_container_manager() { return &plugin_container_manager_; diff --git a/webkit/tools/test_shell/webview_host_gtk.cc b/webkit/tools/test_shell/webview_host_gtk.cc index 39a88ab..6554cc5 100644 --- a/webkit/tools/test_shell/webview_host_gtk.cc +++ b/webkit/tools/test_shell/webview_host_gtk.cc @@ -35,10 +35,10 @@ WebView* WebViewHost::webview() const { return static_cast(webwidget_); } -GdkNativeWindow WebViewHost::CreatePluginContainer() { - return plugin_container_manager_.CreatePluginContainer(); +void WebViewHost::CreatePluginContainer(gfx::PluginWindowHandle id) { + plugin_container_manager_.CreatePluginContainer(id); } -void WebViewHost::OnPluginWindowDestroyed(GdkNativeWindow id) { +void WebViewHost::DestroyPluginContainer(gfx::PluginWindowHandle id) { plugin_container_manager_.DestroyPluginContainer(id); } -- cgit v1.1