Holger Hans Peter Freyther <holger.freyther@trolltech.com>
authorhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Apr 2008 08:47:04 +0000 (08:47 +0000)
committerhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Apr 2008 08:47:04 +0000 (08:47 +0000)
* Get the RefCounting of WebCore::Frame right and make sure that both QWebFrame
  and WebCore::Frame get destroyed if we leave site with subframes and on the
  end of the application.
* Use adoptRef in FrameLoaderClientQt::createFrame to get the refs right for subframes. We
  do not want to add an extra reference. Without this we are leaking subframes.
* Assume that the lifetime of a Frame and FrameLoader are the same, when the Frame is gone
  we want to destroy the QWebFrame (e.g. on a page with subframes). Add delete m_webFrame
  in the frameLoaderDestroyed method to do that.
* If we happen to delete the QWebFrame before the FrameLoaderClientQt we set m_webFrame to
  zero in the FrameLoaderClientQt to avoid bad things.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@31521 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/qt/Api/qwebframe.cpp
WebKit/qt/ChangeLog
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h

index 8d9752b..333d53b 100644 (file)
@@ -153,7 +153,9 @@ QWebFrame::QWebFrame(QWebFrame *parent, QWebFrameData *frameData)
 
 QWebFrame::~QWebFrame()
 {
-    Q_ASSERT(d->frame == 0);
+    if (d->frame && d->frame->loader() && d->frame->loader()->client())
+        static_cast<FrameLoaderClientQt*>(d->frame->loader()->client())->m_webFrame = 0;
+        
     delete d;
 }
 
index 0aa1745..de47596 100644 (file)
@@ -2,6 +2,29 @@
 
         Reviewed by Simon.
 
+        * Get the RefCounting of WebCore::Frame right and make sure that both QWebFrame
+        and WebCore::Frame get destroyed if we leave site with subframes and on the
+        end of the application.
+        * Use adoptRef in FrameLoaderClientQt::createFrame to get the refs right for subframes. We
+        do not want to add an extra reference. Without this we are leaking subframes.
+        * Assume that the lifetime of a Frame and FrameLoader are the same, when the Frame is gone
+        we want to destroy the QWebFrame (e.g. on a page with subframes). Add delete m_webFrame
+        in the frameLoaderDestroyed method to do that.
+        * If we happen to delete the QWebFrame before the FrameLoaderClientQt we set m_webFrame to
+        zero in the FrameLoaderClientQt to avoid bad things.
+        
+
+        * Api/qwebframe.cpp:
+        (QWebFrame::~QWebFrame):
+        * WebCoreSupport/FrameLoaderClientQt.cpp:
+        (WebCore::FrameLoaderClientQt::shouldGoToHistoryItem):
+        (WebCore::FrameLoaderClientQt::objectContentType):
+        * WebCoreSupport/FrameLoaderClientQt.h:
+
+2008-04-01  Holger Hans Peter Freyther  <holger.freyther@trolltech.com>
+
+        Reviewed by Simon.
+
         * Do not save a RefPtr to the frame. The FrameLoaderClient, Frame and
         QWebFrame should have the same lifetime everything else is a leak
         or issue.
index 82766a6..4d70d25 100644 (file)
@@ -190,11 +190,6 @@ void FrameLoaderClientQt::detachedFromParent3()
 
 void FrameLoaderClientQt::detachedFromParent4()
 {
-    if (!m_webFrame)
-        return;
-    m_webFrame->d->frame = 0;
-    m_webFrame = 0;
-    m_frame = 0;
 }
 
 void FrameLoaderClientQt::dispatchDidHandleOnloadEvents()
@@ -444,8 +439,10 @@ void FrameLoaderClientQt::dispatchDidReceiveIcon()
 
 void FrameLoaderClientQt::frameLoaderDestroyed()
 {
-    Q_ASSERT(m_webFrame == 0);
-    Q_ASSERT(m_frame == 0);
+    delete m_webFrame;
+    m_frame = 0;
+    m_webFrame = 0;
+
     delete this;
 }
 
@@ -734,7 +731,7 @@ PassRefPtr<Frame> FrameLoaderClientQt::createFrame(const KURL& url, const String
     QWebFrame* webFrame = new QWebFrame(m_webFrame, &frameData);
     emit m_webFrame->page()->frameCreated(webFrame);
 
-    RefPtr<Frame> childFrame = adoptRef(webFrame->d->frame.get());
+    RefPtr<Frame> childFrame = adoptRef(webFrame->d->frame);
 
     // FIXME: All of the below should probably be moved over into WebCore
     childFrame->tree()->setName(name);
index e4af56b..1ede942 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2006 Zack Rusin <zack@kde.org>
  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2007-2008 Trolltech ASA
  *
  * All rights reserved.
  *
@@ -54,6 +55,7 @@ namespace WebCore {
     class FrameLoaderClientQt : public QObject, public FrameLoaderClient {
         Q_OBJECT
 
+        friend class ::QWebFrame;
         void callPolicyFunction(FramePolicyFunction function, PolicyAction action);
     private slots:
         void slotCallPolicyFunction(int);