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

simon.fraser at apple.com simon.fraser at apple.com
Wed Dec 22 11:23:41 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 675a76fed1c0229d4822f864a2a7872b79986251
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Jul 21 17:51:25 2010 +0000

    2010-07-21  Simon Fraser  <simon.fraser at apple.com>
    
            Reviewed by Anders Carlsson.
    
            Get accelerated compositing working with webkit2
            https://bugs.webkit.org/show_bug.cgi?id=41084
    
            Hook up dynamic DrawingArea switching, so that when the WebProcess hits a page
            that requires accelerated compositing, we switch to the LayerBackedDrawingArea.
    
            * Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h:
            (DrawingAreaProxyMessage::):
            * Shared/CoreIPCSupport/WebPageProxyMessageKinds.h:
            (WebPageProxyMessage::):
            * UIProcess/API/mac/PageClientImpl.h:
            * UIProcess/API/mac/PageClientImpl.mm:
            (WebKit::PageClientImpl::pageDidEnterAcceleratedCompositing):
            (WebKit::PageClientImpl::pageDidLeaveAcceleratedCompositing):
            * UIProcess/API/mac/WKView.mm:
            (-[WKView _startAcceleratedCompositing:]):
            (-[WKView _switchToDrawingAreaTypeIfNecessary:DrawingAreaProxy::]):
            (-[WKView _pageDidEnterAcceleratedCompositing]):
            (-[WKView _pageDidLeaveAcceleratedCompositing]):
            * UIProcess/API/mac/WKViewInternal.h:
            * UIProcess/ChunkedUpdateDrawingAreaProxy.cpp:
            (WebKit::ChunkedUpdateDrawingAreaProxy::didReceiveSyncMessage):
            * UIProcess/ChunkedUpdateDrawingAreaProxy.h:
            * UIProcess/DrawingAreaProxy.h:
            (WebKit::DrawingAreaProxy::):
            (WebKit::DrawingAreaProxy::type):
            * UIProcess/LayerBackedDrawingAreaProxy.cpp:
            (WebKit::LayerBackedDrawingAreaProxy::didSetSize):
            (WebKit::LayerBackedDrawingAreaProxy::didReceiveMessage):
            (WebKit::LayerBackedDrawingAreaProxy::didReceiveSyncMessage):
            * UIProcess/LayerBackedDrawingAreaProxy.h:
            * UIProcess/PageClient.h:
            * UIProcess/WebPageProxy.cpp:
            (WebKit::WebPageProxy::setDrawingArea):
            (WebKit::WebPageProxy::didReceiveSyncMessage):
            (WebKit::WebPageProxy::didEnterAcceleratedCompositing):
            (WebKit::WebPageProxy::didLeaveAcceleratedCompositing):
            * UIProcess/WebPageProxy.h:
            * UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm:
            (WebKit::LayerBackedDrawingAreaProxy::attachCompositingContext):
            * WebProcess/WebCoreSupport/WebChromeClient.cpp:
            (WebKit::WebChromeClient::attachRootGraphicsLayer):
            * WebProcess/WebPage/ChunkedUpdateDrawingArea.h:
            (WebKit::ChunkedUpdateDrawingArea::attachCompositingContext):
            (WebKit::ChunkedUpdateDrawingArea::setRootCompositingLayer):
            * WebProcess/WebPage/DrawingArea.cpp:
            (WebKit::DrawingArea::create):
            * WebProcess/WebPage/DrawingArea.h:
            (WebKit::DrawingArea::):
            (WebKit::DrawingArea::type):
            * WebProcess/WebPage/LayerBackedDrawingArea.cpp:
            (WebKit::LayerBackedDrawingArea::LayerBackedDrawingArea):
            (WebKit::LayerBackedDrawingArea::setNeedsDisplay):
            (WebKit::LayerBackedDrawingArea::setSize):
            (WebKit::LayerBackedDrawingArea::didUpdate):
            (WebKit::LayerBackedDrawingArea::setRootCompositingLayer):
            * WebProcess/WebPage/LayerBackedDrawingArea.h:
            * WebProcess/WebPage/WebPage.cpp:
            (WebKit::WebPage::changeAcceleratedCompositingMode):
            (WebKit::WebPage::enterAcceleratedCompositingMode):
            (WebKit::WebPage::exitAcceleratedCompositingMode):
            * WebProcess/WebPage/WebPage.h:
            * WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm:
            (WebKit::LayerBackedDrawingArea::platformInit):
            (WebKit::LayerBackedDrawingArea::attachCompositingContext):
            (WebKit::LayerBackedDrawingArea::detachCompositingContext):
            (WebKit::LayerBackedDrawingArea::setRootCompositingLayer):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@63843 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index ce01314..d8e7d9b 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,75 @@
+2010-07-21  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        Get accelerated compositing working with webkit2
+        https://bugs.webkit.org/show_bug.cgi?id=41084
+        
+        Hook up dynamic DrawingArea switching, so that when the WebProcess hits a page
+        that requires accelerated compositing, we switch to the LayerBackedDrawingArea.
+        
+        * Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h:
+        (DrawingAreaProxyMessage::):
+        * Shared/CoreIPCSupport/WebPageProxyMessageKinds.h:
+        (WebPageProxyMessage::):
+        * UIProcess/API/mac/PageClientImpl.h:
+        * UIProcess/API/mac/PageClientImpl.mm:
+        (WebKit::PageClientImpl::pageDidEnterAcceleratedCompositing):
+        (WebKit::PageClientImpl::pageDidLeaveAcceleratedCompositing):
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView _startAcceleratedCompositing:]):
+        (-[WKView _switchToDrawingAreaTypeIfNecessary:DrawingAreaProxy::]):
+        (-[WKView _pageDidEnterAcceleratedCompositing]):
+        (-[WKView _pageDidLeaveAcceleratedCompositing]):
+        * UIProcess/API/mac/WKViewInternal.h:
+        * UIProcess/ChunkedUpdateDrawingAreaProxy.cpp:
+        (WebKit::ChunkedUpdateDrawingAreaProxy::didReceiveSyncMessage):
+        * UIProcess/ChunkedUpdateDrawingAreaProxy.h:
+        * UIProcess/DrawingAreaProxy.h:
+        (WebKit::DrawingAreaProxy::):
+        (WebKit::DrawingAreaProxy::type):
+        * UIProcess/LayerBackedDrawingAreaProxy.cpp:
+        (WebKit::LayerBackedDrawingAreaProxy::didSetSize):
+        (WebKit::LayerBackedDrawingAreaProxy::didReceiveMessage):
+        (WebKit::LayerBackedDrawingAreaProxy::didReceiveSyncMessage):
+        * UIProcess/LayerBackedDrawingAreaProxy.h:
+        * UIProcess/PageClient.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::setDrawingArea):
+        (WebKit::WebPageProxy::didReceiveSyncMessage):
+        (WebKit::WebPageProxy::didEnterAcceleratedCompositing):
+        (WebKit::WebPageProxy::didLeaveAcceleratedCompositing):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm:
+        (WebKit::LayerBackedDrawingAreaProxy::attachCompositingContext):
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::attachRootGraphicsLayer):
+        * WebProcess/WebPage/ChunkedUpdateDrawingArea.h:
+        (WebKit::ChunkedUpdateDrawingArea::attachCompositingContext):
+        (WebKit::ChunkedUpdateDrawingArea::setRootCompositingLayer):
+        * WebProcess/WebPage/DrawingArea.cpp:
+        (WebKit::DrawingArea::create):
+        * WebProcess/WebPage/DrawingArea.h:
+        (WebKit::DrawingArea::):
+        (WebKit::DrawingArea::type):
+        * WebProcess/WebPage/LayerBackedDrawingArea.cpp:
+        (WebKit::LayerBackedDrawingArea::LayerBackedDrawingArea):
+        (WebKit::LayerBackedDrawingArea::setNeedsDisplay):
+        (WebKit::LayerBackedDrawingArea::setSize):
+        (WebKit::LayerBackedDrawingArea::didUpdate):
+        (WebKit::LayerBackedDrawingArea::setRootCompositingLayer):
+        * WebProcess/WebPage/LayerBackedDrawingArea.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::changeAcceleratedCompositingMode):
+        (WebKit::WebPage::enterAcceleratedCompositingMode):
+        (WebKit::WebPage::exitAcceleratedCompositingMode):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm:
+        (WebKit::LayerBackedDrawingArea::platformInit):
+        (WebKit::LayerBackedDrawingArea::attachCompositingContext):
+        (WebKit::LayerBackedDrawingArea::detachCompositingContext):
+        (WebKit::LayerBackedDrawingArea::setRootCompositingLayer):
+
 2010-07-20  Steve Falkenburg  <sfalken at apple.com>
 
         Reviewed by Adam Roben.
diff --git a/WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h b/WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h
index eb17043..8b29ed1 100644
--- a/WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h
+++ b/WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h
@@ -37,7 +37,6 @@ enum Kind {
     DidSetSize,
 #if USE(ACCELERATED_COMPOSITING)
     AttachCompositingContext,
-    DetachCompositingContext,
 #endif
 };
 
diff --git a/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h b/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
index 2c95624..8aced4d 100644
--- a/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
+++ b/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
@@ -73,6 +73,10 @@ enum Kind {
     BackForwardItemAtIndex,
     BackForwardBackListCount,
     BackForwardForwardListCount,
+
+#if USE(ACCELERATED_COMPOSITING)
+    DidChangeAcceleratedCompositing,
+#endif
 };
 
 }
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.h b/WebKit2/UIProcess/API/mac/PageClientImpl.h
index 65ba0df..910a0e8 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.h
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.h
@@ -48,6 +48,11 @@ private:
     virtual void toolTipChanged(const WebCore::String& oldToolTip, const WebCore::String& newToolTip);
     virtual void setCursor(const WebCore::Cursor&);
 
+#if USE(ACCELERATED_COMPOSITING)
+    void pageDidEnterAcceleratedCompositing();
+    void pageDidLeaveAcceleratedCompositing();
+#endif
+
     WKView* m_wkView;
 };
 
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.mm b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
index 24cb721..7664a04 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.mm
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
@@ -75,4 +75,16 @@ void PageClientImpl::setCursor(const WebCore::Cursor& cursor)
     [m_wkView _setCursor:cursor.platformCursor()];
 }
 
+#if USE(ACCELERATED_COMPOSITING)
+void PageClientImpl::pageDidEnterAcceleratedCompositing()
+{
+    [m_wkView _pageDidEnterAcceleratedCompositing];
+}
+
+void PageClientImpl::pageDidLeaveAcceleratedCompositing()
+{
+    [m_wkView _pageDidLeaveAcceleratedCompositing];
+}
+#endif // USE(ACCELERATED_COMPOSITING)
+
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/API/mac/WKView.mm b/WebKit2/UIProcess/API/mac/WKView.mm
index 2b7740b..642d67e 100644
--- a/WebKit2/UIProcess/API/mac/WKView.mm
+++ b/WebKit2/UIProcess/API/mac/WKView.mm
@@ -465,6 +465,10 @@ static bool isViewVisible(NSView *view)
     // Make a container layer, which will get sized/positioned by AppKit and CA.
     CALayer *viewLayer = [CALayer layer];
 
+#ifndef NDEBUG
+    [viewLayer setName:@"hosting layer"];
+#endif
+
 #if defined(BUILDING_ON_LEOPARD)
     // Turn off default animations.
     NSNull *nullValue = [NSNull null];
@@ -505,6 +509,43 @@ static bool isViewVisible(NSView *view)
         _data->_layerHostingView = nil;
     }
 }
+
+- (void)_switchToDrawingAreaTypeIfNecessary:(DrawingAreaProxy::Type)type
+{
+    DrawingAreaProxy::Type existingDrawingAreaType = _data->_page->drawingArea() ? _data->_page->drawingArea()->type() : DrawingAreaProxy::None;
+    if (existingDrawingAreaType == type)
+        return;
+
+    OwnPtr<DrawingAreaProxy> newDrawingArea;
+    switch (type) {
+        case DrawingAreaProxy::None:
+            break;
+        case DrawingAreaProxy::ChunkedUpdateDrawingAreaType: {
+            newDrawingArea = new ChunkedUpdateDrawingAreaProxy(self);
+            break;
+        }
+        case DrawingAreaProxy::LayerBackedDrawingAreaType: {
+            newDrawingArea = new LayerBackedDrawingAreaProxy(self);
+            break;
+        }
+    }
+
+    newDrawingArea->setSize(IntSize([self frame].size));
+
+    _data->_page->drawingArea()->detachCompositingContext();
+    _data->_page->setDrawingArea(newDrawingArea.release());
+}
+
+- (void)_pageDidEnterAcceleratedCompositing
+{
+    [self _switchToDrawingAreaTypeIfNecessary:DrawingAreaProxy::LayerBackedDrawingAreaType];
+}
+
+- (void)_pageDidLeaveAcceleratedCompositing
+{
+    // FIXME: we may want to avoid flipping back to the non-layer-backed drawing area until the next page load, to avoid thrashing.
+    [self _switchToDrawingAreaTypeIfNecessary:DrawingAreaProxy::ChunkedUpdateDrawingAreaType];
+}
 #endif // USE(ACCELERATED_COMPOSITING)
 
 @end
diff --git a/WebKit2/UIProcess/API/mac/WKViewInternal.h b/WebKit2/UIProcess/API/mac/WKViewInternal.h
index 1e882af..3172788 100644
--- a/WebKit2/UIProcess/API/mac/WKViewInternal.h
+++ b/WebKit2/UIProcess/API/mac/WKViewInternal.h
@@ -35,5 +35,7 @@
 #if USE(ACCELERATED_COMPOSITING)
 - (void)_startAcceleratedCompositing:(CALayer *)rootLayer;
 - (void)_stopAcceleratedCompositing;
+- (void)_pageDidEnterAcceleratedCompositing;
+- (void)_pageDidLeaveAcceleratedCompositing;
 #endif
 @end
diff --git a/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.cpp b/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.cpp
index 5a0145f..1ed6e2b 100644
--- a/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.cpp
+++ b/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.cpp
@@ -168,4 +168,9 @@ void ChunkedUpdateDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, Core
     }
 }
 
+void ChunkedUpdateDrawingAreaProxy::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&, CoreIPC::ArgumentEncoder&)
+{
+    ASSERT_NOT_REACHED();
+}
+
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.h b/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.h
index 58ccaca..af8aafa 100644
--- a/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.h
+++ b/WebKit2/UIProcess/ChunkedUpdateDrawingAreaProxy.h
@@ -71,6 +71,7 @@ private:
 
     // DrawingAreaProxy
     virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&);
+    virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&, CoreIPC::ArgumentEncoder&);
     virtual void paint(const WebCore::IntRect&, PlatformDrawingContext);
     virtual void setSize(const WebCore::IntSize&);
     virtual void setPageIsVisible(bool isVisible);
diff --git a/WebKit2/UIProcess/DrawingAreaProxy.h b/WebKit2/UIProcess/DrawingAreaProxy.h
index 1bd7da3..3817eb1 100644
--- a/WebKit2/UIProcess/DrawingAreaProxy.h
+++ b/WebKit2/UIProcess/DrawingAreaProxy.h
@@ -55,7 +55,9 @@ typedef QPainter* PlatformDrawingContext;
 
 class DrawingAreaProxy {
 public:
+    // This has to match DrawingArea::Type.
     enum Type {
+        None,
         ChunkedUpdateDrawingAreaType,
 #if USE(ACCELERATED_COMPOSITING)
         LayerBackedDrawingAreaType,
@@ -64,7 +66,10 @@ public:
 
     virtual ~DrawingAreaProxy();
 
+    Type type() const { return m_type; }
+
     virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&) = 0;
+    virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&, CoreIPC::ArgumentEncoder&) = 0;
 
     virtual void paint(const WebCore::IntRect&, PlatformDrawingContext) = 0;
     virtual void setSize(const WebCore::IntSize&) = 0;
diff --git a/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.cpp b/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.cpp
index fb87f39..abd0b2b 100644
--- a/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.cpp
+++ b/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.cpp
@@ -107,6 +107,9 @@ void LayerBackedDrawingAreaProxy::setPageIsVisible(bool isVisible)
 void LayerBackedDrawingAreaProxy::didSetSize()
 {
     m_isWaitingForDidSetFrameNotification = false;
+
+    WebPageProxy* page = this->page();
+    page->process()->responsivenessTimer()->stop();
 }
 
 void LayerBackedDrawingAreaProxy::update()
@@ -126,6 +129,14 @@ void LayerBackedDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, CoreIP
             didSetSize();
             break;
         }
+        default:
+            ASSERT_NOT_REACHED();
+    }
+}
+
+void LayerBackedDrawingAreaProxy::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder& arguments, CoreIPC::ArgumentEncoder&)
+{
+    switch (messageID.get<DrawingAreaProxyMessage::Kind>()) {
 #if USE(ACCELERATED_COMPOSITING)
         case DrawingAreaProxyMessage::AttachCompositingContext: {
             uint32_t contextID;
@@ -134,10 +145,6 @@ void LayerBackedDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, CoreIP
             attachCompositingContext(contextID);
             break;
         }
-        case DrawingAreaProxyMessage::DetachCompositingContext: {
-            detachCompositingContext();
-            break;
-        }
 #endif
         default:
             ASSERT_NOT_REACHED();
diff --git a/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.h b/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.h
index c5fe67a..80f3cab 100644
--- a/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.h
+++ b/WebKit2/UIProcess/LayerBackedDrawingAreaProxy.h
@@ -69,6 +69,8 @@ private:
 
     // DrawingAreaProxy
     virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&);
+    virtual void didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder&, CoreIPC::ArgumentEncoder&);
+
     virtual void paint(const WebCore::IntRect&, PlatformDrawingContext);
     virtual void setSize(const WebCore::IntSize&);
     virtual void setPageIsVisible(bool isVisible);
diff --git a/WebKit2/UIProcess/PageClient.h b/WebKit2/UIProcess/PageClient.h
index 0dbd20e..fc4bbcf 100644
--- a/WebKit2/UIProcess/PageClient.h
+++ b/WebKit2/UIProcess/PageClient.h
@@ -44,6 +44,11 @@ public:
     virtual void toolTipChanged(const WebCore::String&, const WebCore::String&) = 0;
 
     virtual void setCursor(const WebCore::Cursor&) = 0;
+
+#if USE(ACCELERATED_COMPOSITING)
+    virtual void pageDidEnterAcceleratedCompositing() = 0;
+    virtual void pageDidLeaveAcceleratedCompositing() = 0;
+#endif
 };
 
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index e49e76e..010f993 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -104,6 +104,14 @@ void WebPageProxy::setPageClient(PageClient* pageClient)
 #endif
 }
 
+void WebPageProxy::setDrawingArea(PassOwnPtr<DrawingAreaProxy> drawingArea)
+{
+    if (drawingArea == m_drawingArea)
+        return;
+
+    m_drawingArea = drawingArea;
+}
+
 void WebPageProxy::initializeLoaderClient(WKPageLoaderClient* loadClient)
 {
     m_loaderClient.initialize(loadClient);
@@ -616,8 +624,13 @@ void WebPageProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::M
     }
 }
 
-void WebPageProxy::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder& arguments, CoreIPC::ArgumentEncoder& reply)
+void WebPageProxy::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder& arguments, CoreIPC::ArgumentEncoder& reply)
 {
+    if (messageID.is<CoreIPC::MessageClassDrawingAreaProxy>()) {
+        m_drawingArea->didReceiveSyncMessage(connection, messageID, arguments, reply);
+        return;
+    }
+
     switch (messageID.get<WebPageProxyMessage::Kind>()) {
         case WebPageProxyMessage::CreateNewPage: {
             WebPageProxy* newPage = createNewPage();
@@ -667,6 +680,17 @@ void WebPageProxy::didReceiveSyncMessage(CoreIPC::Connection*, CoreIPC::MessageI
             reply.encode(CoreIPC::In(forwardListCount));
             break;
         }
+#if USE(ACCELERATED_COMPOSITING)
+        case WebPageProxyMessage::DidChangeAcceleratedCompositing: {
+            bool compositing;
+            if (!arguments.decode(CoreIPC::Out(compositing)))
+                return;
+
+            didChangeAcceleratedCompositing(compositing);
+            reply.encode(CoreIPC::In(static_cast<uint32_t>(drawingArea()->type())));
+            break;
+        }
+#endif // USE(ACCELERATED_COMPOSITING)
 
         default:
             ASSERT_NOT_REACHED();
@@ -905,6 +929,16 @@ void WebPageProxy::didGetRenderTreeExternalRepresentation(const String& resultSt
     callback->performCallbackWithReturnValue(resultString.impl());
 }
 
+#if USE(ACCELERATED_COMPOSITING)
+void WebPageProxy::didChangeAcceleratedCompositing(bool compositing)
+{
+    if (compositing)
+        didEnterAcceleratedCompositing();
+    else
+        didLeaveAcceleratedCompositing();
+}
+#endif
+
 void WebPageProxy::processDidBecomeUnresponsive()
 {
     m_loaderClient.didBecomeUnresponsive(this);
@@ -957,4 +991,16 @@ void WebPageProxy::processDidRevive()
     m_pageClient->processDidRevive();
 }
 
+#if USE(ACCELERATED_COMPOSITING)
+void WebPageProxy::didEnterAcceleratedCompositing()
+{
+    m_pageClient->pageDidEnterAcceleratedCompositing();
+}
+
+void WebPageProxy::didLeaveAcceleratedCompositing()
+{
+    m_pageClient->pageDidLeaveAcceleratedCompositing();
+}
+#endif // USE(ACCELERATED_COMPOSITING)
+
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/WebPageProxy.h b/WebKit2/UIProcess/WebPageProxy.h
index 454d2ac..0bfdef0 100644
--- a/WebKit2/UIProcess/WebPageProxy.h
+++ b/WebKit2/UIProcess/WebPageProxy.h
@@ -84,6 +84,7 @@ public:
     WebFrameProxy* mainFrame() const { return m_mainFrame.get(); }
 
     DrawingAreaProxy* drawingArea() { return m_drawingArea.get(); }
+    void setDrawingArea(PassOwnPtr<DrawingAreaProxy>);
 
     WebBackForwardList* backForwardList() { return m_backForwardList.get(); }
 
@@ -142,6 +143,11 @@ public:
     void processDidExit();
     void processDidRevive();
 
+#if USE(ACCELERATED_COMPOSITING)
+    void didEnterAcceleratedCompositing();
+    void didLeaveAcceleratedCompositing();
+#endif
+
     WebProcessProxy* process() const;
     WebPageNamespace* pageNamespace() const { return m_pageNamespace.get(); }
 
@@ -198,6 +204,9 @@ private:
     void didRunJavaScriptInMainFrame(const WebCore::String&, uint64_t);
     void didGetRenderTreeExternalRepresentation(const WebCore::String&, uint64_t);
 
+#if USE(ACCELERATED_COMPOSITING)
+    void didChangeAcceleratedCompositing(bool compositing);
+#endif    
 
 #if PLATFORM(WIN)
     PageClient* m_pageClient;
diff --git a/WebKit2/UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm b/WebKit2/UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm
index 9b039bc..7f70de1 100644
--- a/WebKit2/UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm
+++ b/WebKit2/UIProcess/mac/LayerBackedDrawingAreaProxyMac.mm
@@ -71,8 +71,13 @@ void LayerBackedDrawingAreaProxy::attachCompositingContext(uint32_t contextID)
     [m_compositingRootLayer.get() setAnchorPoint:CGPointZero];
     [m_compositingRootLayer.get() setBounds:CGRectMake(0, 0, m_viewSize.width(), m_viewSize.height())];
     
-    // This is required to anchor the layer at the top, to avoid jiggle during window resize.
-    [m_compositingRootLayer.get() setGeometryFlipped:YES];
+    // FIXME: this fixes the layer jiggle when resizing the window, but breaks layer flipping because
+    // CA doesn't propagate the kCALayerFlagFlippedAbove through the remote layer.
+    // [m_compositingRootLayer.get() setGeometryFlipped:YES];
+
+#ifndef NDEBUG
+    [m_compositingRootLayer.get() setName:@"Compositing root layer"];
+#endif
 
     [m_webView _startAcceleratedCompositing:m_compositingRootLayer.get()];
 #endif
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
index 8328a6a..0816de9 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
@@ -449,9 +449,9 @@ PassOwnPtr<HTMLParserQuirks> WebChromeClient::createHTMLParserQuirks()
 void WebChromeClient::attachRootGraphicsLayer(Frame*, GraphicsLayer* layer)
 {
     if (layer)
-        m_page->drawingArea()->attachCompositingContext(layer);
+        m_page->enterAcceleratedCompositingMode(layer);
     else
-        m_page->drawingArea()->detachCompositingContext();
+        m_page->exitAcceleratedCompositingMode();
 }
 
 void WebChromeClient::setNeedsOneShotDrawingSynchronization()
diff --git a/WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.h b/WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.h
index 9b2e33c..a5bafc2 100644
--- a/WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.h
+++ b/WebKit2/WebProcess/WebPage/ChunkedUpdateDrawingArea.h
@@ -47,8 +47,9 @@ public:
     virtual void display();
 
 #if USE(ACCELERATED_COMPOSITING)
-    virtual void attachCompositingContext(WebCore::GraphicsLayer*) { }
+    virtual void attachCompositingContext() { }
     virtual void detachCompositingContext() { }
+    virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) { }
     virtual void scheduleCompositingLayerSync() { }
     virtual void syncCompositingLayers() { }
 #endif
diff --git a/WebKit2/WebProcess/WebPage/DrawingArea.cpp b/WebKit2/WebProcess/WebPage/DrawingArea.cpp
index c553964..9be6b4f 100644
--- a/WebKit2/WebProcess/WebPage/DrawingArea.cpp
+++ b/WebKit2/WebProcess/WebPage/DrawingArea.cpp
@@ -37,6 +37,9 @@ DrawingArea* DrawingArea::create(Type type, WebPage* webPage)
 {
     DrawingArea* drawingArea = 0;
     switch (type) {
+        case None:
+            ASSERT_NOT_REACHED();
+            break;
         case ChunkedUpdateDrawingAreaType:
             drawingArea = new ChunkedUpdateDrawingArea(webPage);
             break;
diff --git a/WebKit2/WebProcess/WebPage/DrawingArea.h b/WebKit2/WebProcess/WebPage/DrawingArea.h
index 9494249..cd46188 100644
--- a/WebKit2/WebProcess/WebPage/DrawingArea.h
+++ b/WebKit2/WebProcess/WebPage/DrawingArea.h
@@ -48,7 +48,9 @@ class WebPage;
 
 class DrawingArea {
 public:
+    // This has to match DrawingAreaProxy::Type.
     enum Type {
+        None,
         ChunkedUpdateDrawingAreaType,
 #if USE(ACCELERATED_COMPOSITING)
         LayerBackedDrawingAreaType,
@@ -59,6 +61,8 @@ public:
     static DrawingArea* create(Type, WebPage*);
     virtual ~DrawingArea();
     
+    Type type() const { return m_type; }
+    
     virtual void invalidateWindow(const WebCore::IntRect& rect, bool immediate) = 0;
     virtual void invalidateContentsAndWindow(const WebCore::IntRect& rect, bool immediate) = 0;
     virtual void invalidateContentsForSlowScroll(const WebCore::IntRect& rect, bool immediate) = 0;
@@ -68,8 +72,9 @@ public:
     virtual void display() = 0;
 
 #if USE(ACCELERATED_COMPOSITING)
-    virtual void attachCompositingContext(WebCore::GraphicsLayer*) = 0;
+    virtual void attachCompositingContext() = 0;
     virtual void detachCompositingContext() = 0;
+    virtual void setRootCompositingLayer(WebCore::GraphicsLayer*) = 0;
     virtual void scheduleCompositingLayerSync() = 0;
     virtual void syncCompositingLayers() = 0;
 #endif
diff --git a/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.cpp b/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.cpp
index df3dff9..f3fcdda 100644
--- a/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.cpp
+++ b/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.cpp
@@ -54,6 +54,7 @@ LayerBackedDrawingArea::LayerBackedDrawingArea(WebPage* webPage)
     m_backingLayer->setName("DrawingArea backing layer");
 #endif
     m_backingLayer->syncCompositingStateForThisLayerOnly();
+    m_backingLayer->setContentsOrientation(GraphicsLayer::CompositingCoordinatesBottomUp);
     
     platformInit();
 }
@@ -86,11 +87,6 @@ void LayerBackedDrawingArea::scroll(const IntSize& scrollDelta, const IntRect& r
 
 void LayerBackedDrawingArea::setNeedsDisplay(const IntRect& rect)
 {
-#if PLATFORM(MAC) && HAVE(HOSTED_CORE_ANIMATION)
-    if (!m_remoteLayerRef)
-        attachCompositingContext(0);
-#endif
-
     m_backingLayer->setNeedsDisplayInRect(rect);
     m_backingLayer->syncCompositingStateForThisLayerOnly();
 
@@ -122,7 +118,7 @@ void LayerBackedDrawingArea::setSize(const IntSize& viewSize)
     // Layout if necessary.
     m_webPage->layoutIfNeeded();
 
-    WebProcess::shared().connection()->send(DrawingAreaProxyMessage::DidSetSize, m_webPage->pageID(), CoreIPC::In(0));
+    WebProcess::shared().connection()->send(DrawingAreaProxyMessage::DidSetSize, m_webPage->pageID(), CoreIPC::In());
 }
 
 void LayerBackedDrawingArea::suspendPainting()
@@ -144,7 +140,6 @@ void LayerBackedDrawingArea::resumePainting()
 
 void LayerBackedDrawingArea::didUpdate()
 {
-
     // Display if needed.
     display();
 }
@@ -206,6 +201,12 @@ void LayerBackedDrawingArea::detachCompositingContext()
 {
 }
 
+#if !PLATFORM(MAC)
+void LayerBackedDrawingArea::setRootCompositingLayer(WebCore::GraphicsLayer*)
+{
+}
+#endif
+
 void LayerBackedDrawingArea::scheduleCompositingLayerSync()
 {
 }
diff --git a/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.h b/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.h
index 381f5f1..b446741 100644
--- a/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.h
+++ b/WebKit2/WebProcess/WebPage/LayerBackedDrawingArea.h
@@ -63,8 +63,9 @@ public:
     virtual void setNeedsDisplay(const WebCore::IntRect&);
     virtual void display();
 
-    virtual void attachCompositingContext(WebCore::GraphicsLayer*);
+    virtual void attachCompositingContext();
     virtual void detachCompositingContext();
+    virtual void setRootCompositingLayer(WebCore::GraphicsLayer*);
     virtual void scheduleCompositingLayerSync();
     virtual void syncCompositingLayers();
 
diff --git a/WebKit2/WebProcess/WebPage/WebPage.cpp b/WebKit2/WebProcess/WebPage/WebPage.cpp
index 3e26fc3..c1c402e 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.cpp
+++ b/WebKit2/WebProcess/WebPage/WebPage.cpp
@@ -138,6 +138,41 @@ String WebPage::renderTreeExternalRepresentation() const
     return externalRepresentation(m_mainFrame->coreFrame(), RenderAsTextBehaviorNormal);
 }
 
+#if USE(ACCELERATED_COMPOSITING)
+void WebPage::changeAcceleratedCompositingMode(WebCore::GraphicsLayer* layer)
+{
+    bool compositing = layer;
+    
+    // Tell the UI process that accelerated compositing changed. It may respond by changing
+    // drawing area types.
+    uint32_t newDrawingAreaType;
+    WebProcess::shared().connection()->sendSync(WebPageProxyMessage::DidChangeAcceleratedCompositing,
+                                                m_pageID, CoreIPC::In(compositing),
+                                                CoreIPC::Out(newDrawingAreaType),
+                                                CoreIPC::Connection::NoTimeout);
+    
+    DrawingArea::Type newType = static_cast<DrawingArea::Type>(newDrawingAreaType);
+    if (newType != drawingArea()->type()) {
+        m_drawingArea = DrawingArea::create(newType, this);
+        m_drawingArea->setNeedsDisplay(IntRect(IntPoint(0, 0), m_viewSize));
+    }
+}
+
+void WebPage::enterAcceleratedCompositingMode(GraphicsLayer* layer)
+{
+    changeAcceleratedCompositingMode(layer);
+    
+#if USE(ACCELERATED_COMPOSITING)
+    m_drawingArea->setRootCompositingLayer(layer);
+#endif
+}
+
+void WebPage::exitAcceleratedCompositingMode()
+{
+    changeAcceleratedCompositingMode(0);
+}
+#endif
+
 WebFrame* WebPage::webFrame(uint64_t frameID) const
 {
     return m_frameMap.get(frameID);
diff --git a/WebKit2/WebProcess/WebPage/WebPage.h b/WebKit2/WebProcess/WebPage/WebPage.h
index cafef39..a8df1e5 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.h
+++ b/WebKit2/WebProcess/WebPage/WebPage.h
@@ -100,6 +100,12 @@ public:
     WebFrame* mainFrame() const { return m_mainFrame.get(); }
     WebCore::String renderTreeExternalRepresentation() const;
 
+#if USE(ACCELERATED_COMPOSITING)
+    void changeAcceleratedCompositingMode(WebCore::GraphicsLayer*);
+    void enterAcceleratedCompositingMode(WebCore::GraphicsLayer*);
+    void exitAcceleratedCompositingMode();
+#endif
+
 private:
     WebPage(uint64_t pageID, const WebCore::IntSize& viewSize, const WebPreferencesStore&, DrawingArea::Type);
 
diff --git a/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm b/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
index 72088c6..ca99377 100644
--- a/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
+++ b/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
@@ -42,6 +42,10 @@ namespace WebKit {
 
 void LayerBackedDrawingArea::platformInit()
 {
+#if HAVE(HOSTED_CORE_ANIMATION)
+    attachCompositingContext();
+#endif
+
     setUpUpdateLayoutRunLoopObserver();
 }
 
@@ -58,18 +62,12 @@ void LayerBackedDrawingArea::platformClear()
 #endif
 }
 
-void LayerBackedDrawingArea::attachCompositingContext(GraphicsLayer* layer)
+void LayerBackedDrawingArea::attachCompositingContext()
 {
-    m_backingLayer->removeAllChildren();
-    if (layer)
-        m_backingLayer->addChild(layer);
-
-    m_backingLayer->syncCompositingState();     // FIXME: hack
-    
-    m_backingLayer->setDebugBorder(Color(0, 0, 255, 0.6), 4);
-    
     if (m_attached)
         return;
+
+    m_backingLayer->syncCompositingStateForThisLayerOnly();
         
     m_attached = true;
 
@@ -79,14 +77,22 @@ void LayerBackedDrawingArea::attachCompositingContext(GraphicsLayer* layer)
     WKCARemoteLayerClientSetLayer(m_remoteLayerRef.get(), m_backingLayer->platformLayer());
     
     uint32_t contextID = WKCARemoteLayerClientGetClientId(m_remoteLayerRef.get());
-    WebProcess::shared().connection()->send(DrawingAreaProxyMessage::AttachCompositingContext, m_webPage->pageID(), CoreIPC::In(contextID));
+    WebProcess::shared().connection()->sendSync(DrawingAreaProxyMessage::AttachCompositingContext, m_webPage->pageID(), CoreIPC::In(contextID), CoreIPC::Out(), CoreIPC::Connection::NoTimeout);
 #endif
 }
 
 void LayerBackedDrawingArea::detachCompositingContext()
 {
     m_backingLayer->removeAllChildren();
-    m_backingLayer->syncCompositingState();     // FIXME: hack
+    m_backingLayer->syncCompositingStateForThisLayerOnly();
+}
+
+void LayerBackedDrawingArea::setRootCompositingLayer(WebCore::GraphicsLayer* layer)
+{
+    m_backingLayer->removeAllChildren();
+    if (layer)
+        m_backingLayer->addChild(layer);
+    m_backingLayer->syncCompositingStateForThisLayerOnly();
 }
 
 void LayerBackedDrawingArea::scheduleCompositingLayerSync()

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list