Diff
Modified: trunk/Source/WebKit2/ChangeLog (170422 => 170423)
--- trunk/Source/WebKit2/ChangeLog 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/ChangeLog 2014-06-25 10:38:28 UTC (rev 170423)
@@ -1,3 +1,53 @@
+2014-06-24 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [GTK] Windowed plugins visibility doesn't work
+ https://bugs.webkit.org/show_bug.cgi?id=131487
+
+ Reviewed by Anders Carlsson.
+
+ Implement plugins visibility changes and add a new message to
+ notify the UI process when a windowed plugin is shown/hidden to
+ show/hide the plugin widget.
+
+ * PluginProcess/PluginControllerProxy.cpp:
+ (WebKit::PluginControllerProxy::visibilityDidChange): Add
+ implementation to notify the plugin about visibility change.
+ (WebKit::PluginControllerProxy::windowedPluginVisibilityDidChange):
+ Send WindowedPluginVisibilityDidChange to the plugin proxy.
+ * PluginProcess/PluginControllerProxy.h:
+ * PluginProcess/PluginControllerProxy.messages.in: Add VisibilityDidChange message.
+ * UIProcess/WebPageProxy.h: Add windowedPluginVisibilityDidChange
+ to handle WindowedPluginVisibilityDidChange message.
+ * UIProcess/WebPageProxy.messages.in: Add WindowedPluginVisibilityDidChange message.
+ * UIProcess/efl/WebPageProxyEfl.cpp:
+ (WebKit::WebPageProxy::windowedPluginVisibilityDidChange):
+ * UIProcess/gtk/WebPageProxyGtk.cpp:
+ (WebKit::WebPageProxy::createPluginContainer): Do not show the
+ plugins by default.
+ (WebKit::WebPageProxy::windowedPluginVisibilityDidChange): Show or hide the plugin widget.
+ * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
+ (WebKit::NetscapePlugin::NetscapePlugin): Initialize m_isVisible.
+ (WebKit::NetscapePlugin::visibilityDidChange): Add visible parameter and save it in m_isVisible
+ member, calling platformVisibilityDidChange() only when it has actually changed.
+ * WebProcess/Plugins/Netscape/NetscapePlugin.h:
+ * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
+ (WebKit::NetscapePlugin::platformVisibilityDidChange): Notify the controller about visibility change.
+ * WebProcess/Plugins/PDF/PDFPlugin.h:
+ * WebProcess/Plugins/Plugin.h:
+ * WebProcess/Plugins/PluginController.h:
+ * WebProcess/Plugins/PluginProxy.cpp:
+ (WebKit::PluginProxy::visibilityDidChange): Send VisibilityDidChange message to the plugin controller proxy.
+ (WebKit::PluginProxy::windowedPluginVisibilityDidChange): Notify the controller about visibility change.
+ * WebProcess/Plugins/PluginProxy.h:
+ * WebProcess/Plugins/PluginProxy.messages.in: Add WindowedPluginVisibilityDidChange message.
+ * WebProcess/Plugins/PluginView.cpp:
+ (WebKit::PluginView::didInitializePlugin): Also call viewVisibilityDidChange() when the plugin is initialized.
+ (WebKit::PluginView::setParentVisible): Override this Widget method to update the plugin visibility when parent
+ widget is shown/hidden.
+ (WebKit::PluginView::viewVisibilityDidChange): Pass visible parameter to visibilityDidChange().
+ (WebKit::PluginView::windowedPluginVisibilityDidChange): Send WindowedPluginVisibilityDidChange message to the UI process.
+ * WebProcess/Plugins/PluginView.h:
+
2014-06-24 Benjamin Poulain <bpoul...@apple.com>
[iOS][WK2] We should not start potential tap activation unless the tap gesture recognizer succeed
Modified: trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp (170422 => 170423)
--- trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp 2014-06-25 10:38:28 UTC (rev 170423)
@@ -427,6 +427,12 @@
m_plugin->geometryDidChange(pluginSize, clipRect, pluginToRootViewTransform);
}
+void PluginControllerProxy::visibilityDidChange(bool isVisible)
+{
+ ASSERT(m_plugin);
+ m_plugin->visibilityDidChange(isVisible);
+}
+
void PluginControllerProxy::didEvaluateJavaScript(uint64_t requestID, const String& result)
{
m_plugin->didEvaluateJavaScript(requestID, result);
@@ -611,6 +617,11 @@
{
m_connection->connection()->send(Messages::PluginProxy::WindowedPluginGeometryDidChange(frameRect, clipRect, windowID), m_pluginInstanceID);
}
+
+void PluginControllerProxy::windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
+{
+ m_connection->connection()->send(Messages::PluginProxy::WindowedPluginVisibilityDidChange(isVisible, windowID), m_pluginInstanceID);
+}
#endif
} // namespace WebKit
Modified: trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.h (170422 => 170423)
--- trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.h 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.h 2014-06-25 10:38:28 UTC (rev 170423)
@@ -116,12 +116,14 @@
#if PLUGIN_ARCHITECTURE(X11)
virtual uint64_t createPluginContainer() override;
virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) override;
+ virtual void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID) override;
#endif
// Message handlers.
void frameDidFinishLoading(uint64_t requestID);
void frameDidFail(uint64_t requestID, bool wasCancelled);
void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform, float contentsScaleFactor, const ShareableBitmap::Handle& backingStoreHandle);
+ void visibilityDidChange(bool isVisible);
void didEvaluateJavaScript(uint64_t requestID, const String& result);
void streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers);
void streamDidReceiveData(uint64_t streamID, const IPC::DataReference& data);
Modified: trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in (170422 => 170423)
--- trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in 2014-06-25 10:38:28 UTC (rev 170423)
@@ -26,6 +26,9 @@
# Sent when the plug-in geometry changes.
GeometryDidChange(WebCore::IntSize pluginSize, WebCore::IntRect clipRect, WebCore::AffineTransform pluginToRootViewTransform, float scaleFactor, WebKit::ShareableBitmap::Handle backingStoreHandle)
+ # Sent when the plug-in visibility changes.
+ VisibilityDidChange(bool isVisible)
+
# Sent when a frame has finished loading.
FrameDidFinishLoading(uint64_t requestID)
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (170422 => 170423)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2014-06-25 10:38:28 UTC (rev 170423)
@@ -1232,6 +1232,7 @@
#if PLUGIN_ARCHITECTURE(X11)
void createPluginContainer(uint64_t& windowID);
void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID);
+ void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID);
#endif
void processNextQueuedWheelEvent();
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (170422 => 170423)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in 2014-06-25 10:38:28 UTC (rev 170423)
@@ -328,6 +328,7 @@
# X11 windowed plugin messages
CreatePluginContainer() -> (uint64_t windowID)
WindowedPluginGeometryDidChange(WebCore::IntRect frameRect, WebCore::IntRect clipRect, uint64_t windowID)
+ WindowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
#endif
#if PLATFORM(IOS)
Modified: trunk/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp (170422 => 170423)
--- trunk/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp 2014-06-25 10:38:28 UTC (rev 170423)
@@ -97,6 +97,11 @@
notImplemented();
}
+void WebPageProxy::windowedPluginVisibilityDidChange(bool, uint64_t)
+{
+ notImplemented();
+}
+
void WebPageProxy::handleInputMethodKeydown(bool& handled)
{
handled = m_keyEventQueue.first().isFiltered();
Modified: trunk/Source/WebKit2/UIProcess/gtk/WebPageProxyGtk.cpp (170422 => 170423)
--- trunk/Source/WebKit2/UIProcess/gtk/WebPageProxyGtk.cpp 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebPageProxyGtk.cpp 2014-06-25 10:38:28 UTC (rev 170423)
@@ -96,7 +96,6 @@
GtkWidget* socket = gtk_socket_new();
g_signal_connect(socket, "plug-removed", G_CALLBACK(pluginContainerPlugRemoved), 0);
gtk_container_add(GTK_CONTAINER(viewWidget()), socket);
- gtk_widget_show(socket);
windowID = static_cast<uint64_t>(gtk_socket_get_id(GTK_SOCKET(socket)));
pluginWindowMap().set(windowID, socket);
@@ -117,6 +116,18 @@
webkitWebViewBaseChildMoveResize(WEBKIT_WEB_VIEW_BASE(viewWidget()), plugin, frameRect);
}
+
+void WebPageProxy::windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
+{
+ GtkWidget* plugin = pluginWindowMap().get(windowID);
+ if (!plugin)
+ return;
+
+ if (isVisible)
+ gtk_widget_show(plugin);
+ else
+ gtk_widget_hide(plugin);
+}
#endif // PLUGIN_ARCHITECTURE(X11)
void WebPageProxy::setInputMethodState(bool enabled)
Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp 2014-06-25 10:38:28 UTC (rev 170423)
@@ -71,6 +71,7 @@
, m_inNPPNew(false)
, m_shouldUseManualLoader(false)
, m_hasCalledSetWindow(false)
+ , m_isVisible(false)
, m_nextTimerID(0)
#if PLATFORM(COCOA)
, m_drawingModel(static_cast<NPDrawingModel>(-1))
@@ -760,10 +761,14 @@
callSetWindow();
}
-void NetscapePlugin::visibilityDidChange()
+void NetscapePlugin::visibilityDidChange(bool isVisible)
{
ASSERT(m_isStarted);
+ if (m_isVisible == isVisible)
+ return;
+
+ m_isVisible = isVisible;
platformVisibilityDidChange();
}
Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h 2014-06-25 10:38:28 UTC (rev 170423)
@@ -183,7 +183,7 @@
virtual bool isTransparent();
virtual bool wantsWheelEvents() override;
virtual void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform);
- virtual void visibilityDidChange();
+ virtual void visibilityDidChange(bool isVisible);
virtual void frameDidFinishLoading(uint64_t requestID);
virtual void frameDidFail(uint64_t requestID, bool wasCancelled);
virtual void didEvaluateJavaScript(uint64_t requestID, const String& result);
@@ -300,6 +300,7 @@
bool m_inNPPNew;
bool m_shouldUseManualLoader;
bool m_hasCalledSetWindow;
+ bool m_isVisible;
RefPtr<NetscapePluginStream> m_manualStream;
Vector<bool, 8> m_popupEnabledStates;
Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp 2014-06-25 10:38:28 UTC (rev 170423)
@@ -297,7 +297,15 @@
void NetscapePlugin::platformVisibilityDidChange()
{
- notImplemented();
+ if (!m_isWindowed)
+ return;
+
+ uint64_t windowID = 0;
+#if PLATFORM(GTK)
+ windowID = static_cast<uint64_t>(GDK_WINDOW_XID(gtk_plug_get_socket_window(GTK_PLUG(m_platformPluginWidget))));
+#endif
+ controller()->windowedPluginVisibilityDidChange(m_isVisible, windowID);
+ controller()->windowedPluginGeometryDidChange(m_frameRectInWindowCoordinates, m_clipRect, windowID);
}
void NetscapePlugin::platformPaint(GraphicsContext* context, const IntRect& dirtyRect, bool /*isSnapshot*/)
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h 2014-06-25 10:38:28 UTC (rev 170423)
@@ -118,7 +118,7 @@
virtual bool wantsWheelEvents() override { return true; }
virtual void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform) override;
virtual void contentsScaleFactorChanged(float) override;
- virtual void visibilityDidChange() override { }
+ virtual void visibilityDidChange(bool) override { }
virtual void frameDidFinishLoading(uint64_t requestID) override;
virtual void frameDidFail(uint64_t requestID, bool wasCancelled) override;
virtual void didEvaluateJavaScript(uint64_t requestID, const String& result) override;
Modified: trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h 2014-06-25 10:38:28 UTC (rev 170423)
@@ -142,7 +142,7 @@
virtual void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform) = 0;
// Tells the plug-in that it has been explicitly hidden or shown. (Note that this is not called when the plug-in becomes obscured from view on screen.)
- virtual void visibilityDidChange() = 0;
+ virtual void visibilityDidChange(bool isVisible) = 0;
// Tells the plug-in that a frame load request that the plug-in made by calling PluginController::loadURL has finished.
virtual void frameDidFinishLoading(uint64_t requestID) = 0;
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginController.h (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginController.h 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginController.h 2014-06-25 10:38:28 UTC (rev 170423)
@@ -146,6 +146,7 @@
// Create a plugin container for windowed plugins
virtual uint64_t createPluginContainer() = 0;
virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) = 0;
+ virtual void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID) = 0;
#endif
// Called when the a plug-in instance is successfully initialized, either synchronously or asynchronously.
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp 2014-06-25 10:38:28 UTC (rev 170423)
@@ -300,10 +300,10 @@
geometryDidChange();
}
-void PluginProxy::visibilityDidChange()
+void PluginProxy::visibilityDidChange(bool isVisible)
{
ASSERT(m_isStarted);
- notImplemented();
+ m_connection->connection()->send(Messages::PluginControllerProxy::VisibilityDidChange(isVisible), m_pluginInstanceID);
}
void PluginProxy::frameDidFinishLoading(uint64_t requestID)
@@ -680,6 +680,11 @@
{
controller()->windowedPluginGeometryDidChange(frameRect, clipRect, windowID);
}
+
+void PluginProxy::windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
+{
+ controller()->windowedPluginVisibilityDidChange(isVisible, windowID);
+}
#endif
void PluginProxy::update(const IntRect& paintedRect)
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h 2014-06-25 10:38:28 UTC (rev 170423)
@@ -85,7 +85,7 @@
virtual bool isTransparent();
virtual bool wantsWheelEvents() override;
virtual void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform);
- virtual void visibilityDidChange();
+ virtual void visibilityDidChange(bool isVisible);
virtual void frameDidFinishLoading(uint64_t requestID);
virtual void frameDidFail(uint64_t requestID, bool wasCancelled);
virtual void didEvaluateJavaScript(uint64_t requestID, const String& result);
@@ -172,6 +172,7 @@
#if PLUGIN_ARCHITECTURE(X11)
void createPluginContainer(uint64_t& windowID);
void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID);
+ void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID);
#endif
bool canInitializeAsynchronously() const;
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.messages.in (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.messages.in 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.messages.in 2014-06-25 10:38:28 UTC (rev 170423)
@@ -73,6 +73,9 @@
# Update geometry of windowed plugin widget
WindowedPluginGeometryDidChange(WebCore::IntRect frameRect, WebCore::IntRect clipRect, uint64_t windowID)
+
+ # Update visibility of windowed plugin widget
+ WindowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
#endif
# Tells the WebProcess that the plug-in was successfully initialized asynchronously
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp 2014-06-25 10:38:28 UTC (rev 170423)
@@ -615,6 +615,7 @@
windowAndViewFramesChanged(m_webPage->windowFrameInScreenCoordinates(), m_webPage->viewFrameInWindowCoordinates());
#endif
+ viewVisibilityDidChange();
viewGeometryDidChange();
if (m_pluginElement->document().focusedElement() == m_pluginElement)
@@ -1021,6 +1022,15 @@
Widget::hide();
}
+void PluginView::setParentVisible(bool isVisible)
+{
+ if (isParentVisible() == isVisible)
+ return;
+
+ Widget::setParentVisible(isVisible);
+ viewVisibilityDidChange();
+}
+
bool PluginView::transformsAffectFrameRect()
{
return false;
@@ -1063,7 +1073,7 @@
if (!m_isInitialized || !m_plugin || !parent())
return;
- m_plugin->visibilityDidChange();
+ m_plugin->visibilityDidChange(isVisible());
}
IntRect PluginView::clipRectInWindowCoordinates() const
@@ -1625,6 +1635,11 @@
{
m_webPage->send(Messages::WebPageProxy::WindowedPluginGeometryDidChange(frameRect, clipRect, windowID));
}
+
+void PluginView::windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID)
+{
+ m_webPage->send(Messages::WebPageProxy::WindowedPluginVisibilityDidChange(isVisible, windowID));
+}
#endif
#if PLATFORM(COCOA)
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h (170422 => 170423)
--- trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h 2014-06-25 06:54:48 UTC (rev 170422)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h 2014-06-25 10:38:28 UTC (rev 170423)
@@ -173,6 +173,7 @@
virtual void notifyWidget(WebCore::WidgetNotification) override;
virtual void show() override;
virtual void hide() override;
+ virtual void setParentVisible(bool) override;
virtual bool transformsAffectFrameRect() override;
virtual void clipRectChanged() override;
@@ -215,6 +216,7 @@
#if PLUGIN_ARCHITECTURE(X11)
virtual uint64_t createPluginContainer() override;
virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) override;
+ virtual void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID) override;
#endif
virtual void didInitializePlugin() override;