[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:40:46 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit a43e92a8153964a4e4a8554a4acee4188553b6ce
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Aug 3 18:12:38 2010 +0000

    2010-08-03  Simon Fraser  <simon.fraser at apple.com>
    
            Reviewed by Sam Weinig.
    
            Compositing iframe layout test crashes in WebKit2
            https://bugs.webkit.org/show_bug.cgi?id=42860
    
            Part one of the fix: make DrawingArea ref-counted, so that the object
            can survide a swap in drawing areas inside the run loop observer callback.
    
            * WebProcess/WebPage/DrawingArea.cpp:
            (WebKit::DrawingArea::create):
            * WebProcess/WebPage/DrawingArea.h:
            * WebProcess/WebPage/WebPage.h:
            * WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm:
            (WebKit::LayerBackedDrawingArea::platformClear):
            (WebKit::LayerBackedDrawingArea::updateLayoutRunLoopObserverCallback):
            (WebKit::LayerBackedDrawingArea::updateLayoutRunLoopObserverFired):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64569 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 2f3da91..1f9ed5a 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,22 @@
+2010-08-03  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Compositing iframe layout test crashes in WebKit2
+        https://bugs.webkit.org/show_bug.cgi?id=42860
+        
+        Part one of the fix: make DrawingArea ref-counted, so that the object
+        can survide a swap in drawing areas inside the run loop observer callback.
+
+        * WebProcess/WebPage/DrawingArea.cpp:
+        (WebKit::DrawingArea::create):
+        * WebProcess/WebPage/DrawingArea.h:
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm:
+        (WebKit::LayerBackedDrawingArea::platformClear):
+        (WebKit::LayerBackedDrawingArea::updateLayoutRunLoopObserverCallback):
+        (WebKit::LayerBackedDrawingArea::updateLayoutRunLoopObserverFired):
+
 2010-08-03  Anders Carlsson  <andersca at apple.com>
 
         Reviewed by Adam Roben.
diff --git a/WebKit2/WebProcess/WebPage/DrawingArea.cpp b/WebKit2/WebProcess/WebPage/DrawingArea.cpp
index 9be6b4f..0406767 100644
--- a/WebKit2/WebProcess/WebPage/DrawingArea.cpp
+++ b/WebKit2/WebProcess/WebPage/DrawingArea.cpp
@@ -33,24 +33,23 @@
 
 namespace WebKit {
 
-DrawingArea* DrawingArea::create(Type type, WebPage* webPage)
+PassRefPtr<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;
+            return adoptRef(new ChunkedUpdateDrawingArea(webPage));
+
 #if USE(ACCELERATED_COMPOSITING) && PLATFORM(MAC)
         case LayerBackedDrawingAreaType:
-            drawingArea = new LayerBackedDrawingArea(webPage);
-            break;
+            return adoptRef(new LayerBackedDrawingArea(webPage));
 #endif
     }
 
-    return drawingArea;
+    return 0;
 }
 
 DrawingArea::DrawingArea(Type type, WebPage* webPage)
diff --git a/WebKit2/WebProcess/WebPage/DrawingArea.h b/WebKit2/WebProcess/WebPage/DrawingArea.h
index cd46188..a180e14 100644
--- a/WebKit2/WebProcess/WebPage/DrawingArea.h
+++ b/WebKit2/WebProcess/WebPage/DrawingArea.h
@@ -27,6 +27,8 @@
 #define DrawingArea_h
 
 #include <WebCore/IntRect.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
 
 namespace WebCore {
     class IntRect;
@@ -46,7 +48,7 @@ namespace WebKit {
 
 class WebPage;
 
-class DrawingArea {
+class DrawingArea : public RefCounted<DrawingArea> {
 public:
     // This has to match DrawingAreaProxy::Type.
     enum Type {
@@ -58,7 +60,8 @@ public:
     };
 
     // FIXME: It might make sense to move this create function into a factory style class. 
-    static DrawingArea* create(Type, WebPage*);
+    static PassRefPtr<DrawingArea> create(Type, WebPage*);
+
     virtual ~DrawingArea();
     
     Type type() const { return m_type; }
diff --git a/WebKit2/WebProcess/WebPage/WebPage.h b/WebKit2/WebProcess/WebPage/WebPage.h
index a5d9557..35cbc18 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.h
+++ b/WebKit2/WebProcess/WebPage/WebPage.h
@@ -152,7 +152,7 @@ private:
     HashMap<uint64_t, WebFrame*> m_frameMap;
 
     WebCore::IntSize m_viewSize;
-    OwnPtr<DrawingArea> m_drawingArea;
+    RefPtr<DrawingArea> m_drawingArea;
 
     InjectedBundlePageEditorClient m_editorClient;
     InjectedBundlePageLoaderClient m_loaderClient;
diff --git a/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm b/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
index ca99377..0c644f4 100644
--- a/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
+++ b/WebKit2/WebProcess/WebPage/mac/LayerBackedDrawingAreaMac.mm
@@ -60,6 +60,8 @@ void LayerBackedDrawingArea::platformClear()
     WKCARemoteLayerClientInvalidate(m_remoteLayerRef.get());
     m_remoteLayerRef = 0;
 #endif
+
+    m_attached = false;
 }
 
 void LayerBackedDrawingArea::attachCompositingContext()
@@ -143,14 +145,18 @@ void LayerBackedDrawingArea::removeUpdateLayoutRunLoopObserver()
 
 void LayerBackedDrawingArea::updateLayoutRunLoopObserverCallback(CFRunLoopObserverRef, CFRunLoopActivity, void* info)
 {
-    LayerBackedDrawingArea* drawingArea = reinterpret_cast<LayerBackedDrawingArea*>(info);
+    // Keep the drawing area alive while running the callback, since that does layout,
+    // which might replace this drawing area with one of another type.
+    RefPtr<LayerBackedDrawingArea> drawingArea = reinterpret_cast<LayerBackedDrawingArea*>(info);
     drawingArea->updateLayoutRunLoopObserverFired();
 }
 
 void LayerBackedDrawingArea::updateLayoutRunLoopObserverFired()
 {
     m_webPage->layoutIfNeeded();
-    syncCompositingLayers();
+    
+    if (m_attached)
+        syncCompositingLayers();
 }
 
 } // namespace WebKit

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list