[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

andersca at apple.com andersca at apple.com
Wed Dec 22 11:48:48 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 0fca1e0cc16cbad3a63f6751cbbaa6c48aa435e3
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Aug 7 20:54:38 2010 +0000

    CA drawing model support for Mac Plugins
    https://bugs.webkit.org/show_bug.cgi?id=43678
    <rdar://problem/7929701>
    
    Reviewed by Sam Weinig.
    
    * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
    (WebKit::NPN_GetValue):
    Handle WKNVSupportsCompositingCoreAnimationPluginsBool and
    NPNVsupportsCoreAnimationBool and return true if accelerated compositing is enabled.
    
    * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
    (WebKit::NetscapePlugin::isAcceleratedCompositingEnabled):
    Call PluginController::isAcceleratedCompositingEnabled.
    
    * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm:
    (WebKit::NetscapePlugin::platformPostInitialize):
    If the plug-in uses the Core Animation drawing model, ask it for its layer.
    
    (WebKit::NetscapePlugin::platformPaint):
    Don't send draw events if the Core Animation drawing model is used.
    
    (WebKit::NetscapePlugin::pluginLayer):
    Return the plug-in layer.
    
    * WebProcess/Plugins/Plugin.h:
    Add a pluginLayer pure virtual member function.
    
    * WebProcess/Plugins/PluginController.h:
    Add an isAcceleratedCompositingEnabled pure virtual member function.
    
    * WebProcess/Plugins/PluginView.cpp:
    (WebKit::PluginView::initializePlugin):
    If the plug-in has a layer, enter compositing mode.
    
    (WebKit::PluginView::platformLayer):
    Ask the plug-in for its layer.
    
    (WebKit::PluginView::isAcceleratedCompositingEnabled):
    Call Settings::acceleratedCompositingEnabled.
    
    * WebProcess/Plugins/PluginView.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64919 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index a3e81cb..aa5b2b9 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,48 @@
+2010-08-07  Anders Carlsson  <andersca at apple.com>
+
+        Reviewed by Sam Weinig.
+
+        CA drawing model support for Mac Plugins
+        https://bugs.webkit.org/show_bug.cgi?id=43678
+        <rdar://problem/7929701>
+
+        * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
+        (WebKit::NPN_GetValue):
+        Handle WKNVSupportsCompositingCoreAnimationPluginsBool and 
+        NPNVsupportsCoreAnimationBool and return true if accelerated compositing is enabled.
+
+        * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
+        (WebKit::NetscapePlugin::isAcceleratedCompositingEnabled):
+        Call PluginController::isAcceleratedCompositingEnabled.
+
+        * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm:
+        (WebKit::NetscapePlugin::platformPostInitialize):
+        If the plug-in uses the Core Animation drawing model, ask it for its layer.
+
+        (WebKit::NetscapePlugin::platformPaint):
+        Don't send draw events if the Core Animation drawing model is used.
+
+        (WebKit::NetscapePlugin::pluginLayer):
+        Return the plug-in layer.
+
+        * WebProcess/Plugins/Plugin.h:
+        Add a pluginLayer pure virtual member function.
+
+        * WebProcess/Plugins/PluginController.h:
+        Add an isAcceleratedCompositingEnabled pure virtual member function.
+
+        * WebProcess/Plugins/PluginView.cpp:
+        (WebKit::PluginView::initializePlugin):
+        If the plug-in has a layer, enter compositing mode.
+
+        (WebKit::PluginView::platformLayer):
+        Ask the plug-in for its layer.
+
+        (WebKit::PluginView::isAcceleratedCompositingEnabled):
+        Call Settings::acceleratedCompositingEnabled.
+
+        * WebProcess/Plugins/PluginView.h:
+
 2010-08-06  Sam Weinig  <sam at webkit.org>
 
         Reviewed by Anders Carlsson.
diff --git a/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp b/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp
index 187fbae..1aae066 100644
--- a/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp
+++ b/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp
@@ -394,6 +394,11 @@ static NPError NPN_PostURLNotify(NPP npp, const char* url, const char* target, u
     return NPERR_NO_ERROR;
 }
 
+#if PLATFORM(MAC)
+/* TRUE if the browser supports hardware compositing of Core Animation plug-ins  */
+static const unsigned WKNVSupportsCompositingCoreAnimationPluginsBool = 74656;
+#endif
+
 static NPError NPN_GetValue(NPP npp, NPNVariable variable, void *value)
 {
     switch (variable) {
@@ -417,11 +422,13 @@ static NPError NPN_GetValue(NPP npp, NPNVariable variable, void *value)
             *(NPBool*)value = true;
             break;
 
-        case NPNVsupportsCoreAnimationBool:
-            // FIXME: We should support the Core Animation drawing model.
-            *(NPBool*)value = false;
+        case WKNVSupportsCompositingCoreAnimationPluginsBool:
+        case NPNVsupportsCoreAnimationBool: {
+            RefPtr<NetscapePlugin> plugin = NetscapePlugin::fromNPP(npp);
+            
+            *(NPBool*)value = plugin->isAcceleratedCompositingEnabled();
             break;
-
+        }
         case NPNVsupportsCocoaBool:
             // Always claim to support the Cocoa event model.
             *(NPBool*)value = true;
@@ -433,7 +440,6 @@ static NPError NPN_GetValue(NPP npp, NPNVariable variable, void *value)
             *(NPBool*)value = false;
             break;
 #endif
-
 #endif
         default:
             notImplemented();
diff --git a/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp b/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp
index bc25d8b..6e7adc1 100644
--- a/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp
+++ b/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp
@@ -194,6 +194,11 @@ void NetscapePlugin::removePluginStream(NetscapePluginStream* pluginStream)
     m_streams.remove(pluginStream->streamID());
 }
 
+bool NetscapePlugin::isAcceleratedCompositingEnabled()
+{
+    return m_pluginController->isAcceleratedCompositingEnabled();
+}
+
 NPError NetscapePlugin::NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* savedData)
 {
     return m_pluginModule->pluginFuncs().newp(pluginType, &m_npp, mode, argc, argn, argv, savedData);
diff --git a/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h b/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h
index 42269c8..ace2f9c 100644
--- a/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h
+++ b/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h
@@ -28,6 +28,7 @@
 
 #include "NetscapePluginModule.h"
 #include "Plugin.h"
+#include <WebCore/GraphicsLayer.h>
 #include <WebCore/IntRect.h>
 #include <WebCore/StringHash.h>
 
@@ -70,6 +71,8 @@ public:
     void cancelStreamLoad(NetscapePluginStream*);
     void removePluginStream(NetscapePluginStream*);
 
+    bool isAcceleratedCompositingEnabled();
+
     // Member functions for calling into the plug-in.
     NPError NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData*);
     NPError NPP_Destroy(NPSavedData**);
@@ -105,6 +108,9 @@ private:
     virtual bool initialize(PluginController*, const Parameters&);
     virtual void destroy();
     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect);
+#if PLATFORM(MAC)
+    virtual PlatformLayer* pluginLayer();
+#endif
     virtual void geometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect);
     virtual void frameDidFinishLoading(uint64_t requestID);
     virtual void frameDidFail(uint64_t requestID, bool wasCancelled);
@@ -155,6 +161,7 @@ private:
 #if PLATFORM(MAC)
     NPDrawingModel m_drawingModel;
     NPEventModel m_eventModel;
+    RetainPtr<PlatformLayer> m_pluginLayer;
 #endif
 };
 
diff --git a/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm b/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm
index 0ada8ac..5acb8ed 100644
--- a/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm
+++ b/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm
@@ -113,6 +113,15 @@ bool NetscapePlugin::platformPostInitialize()
         return false;
 #endif
 
+    if (m_drawingModel == NPDrawingModelCoreAnimation) {
+        void* value = 0;
+        // Get the Core Animation layer.
+        if (NPP_GetValue(NPPVpluginCoreAnimationLayer, &value) == NPERR_NO_ERROR && value) {
+            ASSERT(!m_pluginLayer);
+            m_pluginLayer = reinterpret_cast<CALayer*>(value);
+        }
+    }
+
     return true;
 }
 
@@ -130,6 +139,10 @@ void NetscapePlugin::platformPaint(GraphicsContext* context, const IntRect& dirt
 {
     switch (m_eventModel) {
         case NPEventModelCocoa: {
+            // Don't send draw events when we're using the Core Animation drawing model.
+            if (m_drawingModel == NPDrawingModelCoreAnimation)
+                return;
+
             NPCocoaEvent event = initializeEvent(NPCocoaEventDrawRect);
 
             event.data.draw.context = context->platformContext();
@@ -308,4 +321,9 @@ void NetscapePlugin::platformSetFocus(bool hasFocus)
     }
 }
 
+PlatformLayer* NetscapePlugin::pluginLayer()
+{
+    return static_cast<PlatformLayer*>(m_pluginLayer.get());
+}
+
 } // namespace WebKit
diff --git a/WebKit2/WebProcess/Plugins/Plugin.h b/WebKit2/WebProcess/Plugins/Plugin.h
index a353ff1..b827fe7 100644
--- a/WebKit2/WebProcess/Plugins/Plugin.h
+++ b/WebKit2/WebProcess/Plugins/Plugin.h
@@ -26,6 +26,7 @@
 #ifndef Plugin_h
 #define Plugin_h
 
+#include <WebCore/GraphicsLayer.h>
 #include <WebCore/KURL.h>
 #include <wtf/RefCounted.h>
 #include <wtf/Vector.h>
@@ -65,6 +66,11 @@ public:
     // Tells the plug-in to paint itself into the given graphics context. The passed in dirty rect is in window coordinates.
     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect) = 0;
 
+#if PLATFORM(MAC)
+    // If a plug-in is using the Core Animation drawing model, this returns its plug-in layer.
+    virtual PlatformLayer* pluginLayer() = 0;
+#endif
+
     // Tells the plug-in that either the plug-ins frame rect or its clip rect has changed. Both rects are in window coordinates.
     virtual void geometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect) = 0;
 
diff --git a/WebKit2/WebProcess/Plugins/PluginController.h b/WebKit2/WebProcess/Plugins/PluginController.h
index 9e9ed12..0ffce18 100644
--- a/WebKit2/WebProcess/Plugins/PluginController.h
+++ b/WebKit2/WebProcess/Plugins/PluginController.h
@@ -74,6 +74,11 @@ public:
     // Set the statusbar text.
     virtual void setStatusbarText(const WebCore::String&) = 0;
 
+#if USE(ACCELERATED_COMPOSITING)
+    // Return whether accelerated compositing is enabled.
+    virtual bool isAcceleratedCompositingEnabled() = 0;
+#endif
+
 protected:
     virtual ~PluginController() { }
 };
diff --git a/WebKit2/WebProcess/Plugins/PluginView.cpp b/WebKit2/WebProcess/Plugins/PluginView.cpp
index f2b674b..1eaeb20 100644
--- a/WebKit2/WebProcess/Plugins/PluginView.cpp
+++ b/WebKit2/WebProcess/Plugins/PluginView.cpp
@@ -42,6 +42,7 @@
 #include <WebCore/NetscapePlugInStreamLoader.h>
 #include <WebCore/RenderLayer.h>
 #include <WebCore/ScrollView.h>
+#include <WebCore/Settings.h>
 
 using namespace JSC;
 using namespace WebCore;
@@ -327,6 +328,26 @@ void PluginView::initializePlugin()
     }
     
     m_isInitialized = true;
+
+#if PLATFORM(MAC)
+    if (!m_plugin->pluginLayer())
+        return;
+
+    if (!frame())
+        return;
+
+    frame()->view()->enterCompositingMode();
+    m_pluginElement->setNeedsStyleRecalc(SyntheticStyleChange);
+#endif
+}
+
+PlatformLayer* PluginView::platformLayer() const
+{
+#if PLATFORM(MAC)
+    return m_plugin->pluginLayer();
+#endif
+
+    return 0;
 }
 
 JSObject* PluginView::scriptObject(JSGlobalObject* globalObject)
@@ -726,6 +747,18 @@ void PluginView::setStatusbarText(const String& statusbarText)
     page->chrome()->setStatusbarText(frame(), statusbarText);
 }
 
+bool PluginView::isAcceleratedCompositingEnabled()
+{
+    if (!frame())
+        return false;
+    
+    Settings* settings = frame()->settings();
+    if (!settings)
+        return false;
+
+    return settings->acceleratedCompositingEnabled();
+}
+
 void PluginView::didFinishLoad(WebFrame* webFrame)
 {
     RefPtr<URLRequest> request = m_pendingFrameLoads.take(webFrame);
diff --git a/WebKit2/WebProcess/Plugins/PluginView.h b/WebKit2/WebProcess/Plugins/PluginView.h
index 21af4e6..6a4a460 100644
--- a/WebKit2/WebProcess/Plugins/PluginView.h
+++ b/WebKit2/WebProcess/Plugins/PluginView.h
@@ -88,6 +88,7 @@ private:
     void cancelAllStreams();
 
     // WebCore::PluginViewBase
+    virtual PlatformLayer* platformLayer() const;
     virtual JSC::JSObject* scriptObject(JSC::JSGlobalObject*);
     
     // WebCore::Widget
@@ -113,6 +114,7 @@ private:
     virtual NPObject* pluginElementNPObject();
     virtual bool evaluate(NPObject*, const WebCore::String&scriptString, NPVariant* result, bool allowPopups);
     virtual void setStatusbarText(const WebCore::String&);
+    virtual bool isAcceleratedCompositingEnabled();
 
     // WebFrame::LoadListener
     virtual void didFinishLoad(WebFrame*);

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list