summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-26 00:33:37 +0000
committerevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-26 00:33:37 +0000
commit3b33faae96e4cf42ec6b0da5163668b1e482d821 (patch)
tree05bc5e540fdd3150cdc256d46b0602df0670c441 /chrome
parent5f1b0d6b9fb0b529202c63e99a67032cf1a306c9 (diff)
downloadchromium_src-3b33faae96e4cf42ec6b0da5163668b1e482d821.zip
chromium_src-3b33faae96e4cf42ec6b0da5163668b1e482d821.tar.gz
chromium_src-3b33faae96e4cf42ec6b0da5163668b1e482d821.tar.bz2
linux plugins: eliminate GtkWidget* from plugin process
GtkWidget* (and its wrapper, gfx::NativeView) only work within a single process. Plugins already work with a lower-level type that works across processes -- an X Window id. The parent of a plugin is an HWND on windows, but it's an X Window id on X. So we introduce a new typedef wrapping that and push it through all the places in the code that needs it. Since we no longer have a GtkSocket in the WebPluginDelegateImpl, we need to do a bit more work in the WebViewDelegate (aka the browser process in the multiproc world). We also need the plugin host (the browser) to track the GtkSockets that are hosting the plugin, as well as destroy them when necessary. To do this we require the plugin owner to grab the plug-removed signal rather than putting its handler in GtkPluginContainer; this is the way it worked before I'd refactored into GtkPluginContainer so it shouldn't be so bad. This change still only works in test_shell, but the refactoring should translate to the multiprocess case pretty easily. Review URL: http://codereview.chromium.org/146009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19320 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/common/ipc_message_utils.h19
-rw-r--r--chrome/plugin/webplugin_proxy.cc10
-rw-r--r--chrome/plugin/webplugin_proxy.h4
3 files changed, 29 insertions, 4 deletions
diff --git a/chrome/common/ipc_message_utils.h b/chrome/common/ipc_message_utils.h
index 2ae2ab5..8c50d6e 100644
--- a/chrome/common/ipc_message_utils.h
+++ b/chrome/common/ipc_message_utils.h
@@ -176,6 +176,25 @@ struct ParamTraits<long> {
}
};
+// unsigned long is used for serializing X window ids.
+template <>
+struct ParamTraits<unsigned long> {
+ typedef unsigned long param_type;
+ static void Write(Message* m, const param_type& p) {
+ m->WriteLong(p);
+ }
+ static bool Read(const Message* m, void** iter, param_type* r) {
+ long read_output;
+ if (!m->ReadLong(iter, &read_output))
+ return false;
+ *r = static_cast<unsigned long>(read_output);
+ return true;
+ }
+ static void Log(const param_type& p, std::wstring* l) {
+ l->append(StringPrintf(L"%ul", p));
+ }
+};
+
template <>
struct ParamTraits<size_t> {
typedef size_t param_type;
diff --git a/chrome/plugin/webplugin_proxy.cc b/chrome/plugin/webplugin_proxy.cc
index 286659b..57c07fc 100644
--- a/chrome/plugin/webplugin_proxy.cc
+++ b/chrome/plugin/webplugin_proxy.cc
@@ -56,15 +56,21 @@ bool WebPluginProxy::Send(IPC::Message* msg) {
return channel_->Send(msg);
}
-void WebPluginProxy::SetWindow(gfx::NativeView window) {
+void WebPluginProxy::SetWindow(gfx::PluginWindowHandle window) {
+#if defined(OS_WIN)
Send(new PluginHostMsg_SetWindow(route_id_, gfx::IdFromNativeView(window)));
+#else
+ NOTIMPLEMENTED();
+#endif
}
-void WebPluginProxy::WillDestroyWindow(gfx::NativeView window) {
+void WebPluginProxy::WillDestroyWindow(gfx::PluginWindowHandle window) {
#if defined(OS_WIN)
PluginThread::current()->Send(
new PluginProcessHostMsg_PluginWindowDestroyed(
window, ::GetParent(window)));
+#else
+ NOTIMPLEMENTED();
#endif
}
diff --git a/chrome/plugin/webplugin_proxy.h b/chrome/plugin/webplugin_proxy.h
index 46c16d1..e143297 100644
--- a/chrome/plugin/webplugin_proxy.h
+++ b/chrome/plugin/webplugin_proxy.h
@@ -37,8 +37,8 @@ class WebPluginProxy : public WebPlugin {
~WebPluginProxy();
// WebPlugin overrides
- void SetWindow(gfx::NativeView window);
- void WillDestroyWindow(gfx::NativeView window);
+ void SetWindow(gfx::PluginWindowHandle window);
+ void WillDestroyWindow(gfx::PluginWindowHandle window);
#if defined(OS_WIN)
void SetWindowlessPumpEvent(HANDLE pump_messages_event);
// Returns true on success.