Reviewed by Zack
authorlars <lars@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Jan 2007 09:24:46 +0000 (09:24 +0000)
committerlars <lars@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Jan 2007 09:24:46 +0000 (09:24 +0000)
        Fix the way we handle native widgets (QWidget) inside
        WebCore. Now WebCore::Widget owns the QWidget in all
        cases. This is the only way to get well defined semantics
        for all teh native widgets we have (currently ScrollView
        and ScrollBar, but plugins will follow).

        This has the side effect that one cannot rely on a defined
        lifetime of a QWebFrame when using the API.

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

WebCore/ChangeLog
WebCore/platform/Widget.h
WebCore/platform/qt/PlatformScrollBarQt.cpp
WebCore/platform/qt/ScrollViewQt.cpp
WebCore/platform/qt/WidgetQt.cpp
WebKitQt/Api/qwebframe.cpp
WebKitQt/Api/qwebpage.cpp
WebKitQt/Api/qwebpage_p.h
WebKitQt/ChangeLog
WebKitQt/WebCoreSupport/FrameLoaderClientQt.cpp
WebKitQt/WebCoreSupport/FrameLoaderClientQt.h

index c843071..b4542f4 100644 (file)
@@ -1,3 +1,27 @@
+2007-01-29  Lars Knoll <lars@trolltech.com>
+
+        Reviewed by Zack
+
+        Fix the way we handle native widgets (QWidget) inside
+        WebCore. Now WebCore::Widget owns the QWidget in all
+        cases. This is the only way to get well defined semantics
+        for all teh native widgets we have (currently ScrollView
+        and ScrollBar, but plugins will follow).
+
+        This has the side effect that one cannot rely on a defined 
+        lifetime of a QWebFrame when using the API. 
+
+        * platform/Widget.h:
+        * platform/qt/PlatformScrollBarQt.cpp:
+        (WebCore::PlatformScrollbar::PlatformScrollbar):
+        * platform/qt/ScrollViewQt.cpp:
+        (WebCore::ScrollView::addChild):
+        (WebCore::ScrollView::removeChild):
+        * platform/qt/WidgetQt.cpp:
+        (WebCore::WidgetPrivate::WidgetPrivate):
+        (WebCore::WidgetPrivate::~WidgetPrivate):
+        (WebCore::Widget::qwidget):
+
 2007-01-28  George Staikos  <staikos@kde.org>
 
         Reviewed by Maciej.
index 80be871..564c92c 100644 (file)
@@ -149,7 +149,7 @@ namespace WebCore {
 #endif
 
 #if PLATFORM(QT)
-        QWidget* qwidget();
+        QWidget* qwidget() const;
         void setQWidget(QWidget*);
 #endif
 
index 96f8898..1ff6919 100644 (file)
@@ -57,15 +57,8 @@ PlatformScrollbar::PlatformScrollbar(ScrollbarClient* client, ScrollbarOrientati
                                      ScrollbarControlSize controlSize)
     : Scrollbar(client, orientation, controlSize)
 {
-#if 0
-    QScrollBar *bar = 0;
-    if (orientation == HorizontalScrollbar)
-        bar = new QScrollBar(Qt::Horizontal);
-    else
-        bar = new QScrollBar(Qt::Vertical);
-    
+    QScrollBar* bar = new QScrollBar(orientation == HorizontalScrollbar ? Qt::Horizontal : Qt::Vertical);
     setQWidget(bar);
-#endif
 }
 
 PlatformScrollbar::~PlatformScrollbar()
index 2dfe67a..9481c6e 100644 (file)
@@ -256,31 +256,13 @@ void ScrollView::setStaticBackground(bool flag)
 
 void ScrollView::addChild(Widget* child)
 {
-//     Q_ASSERT(child != 0);
-//     Q_ASSERT(m_area && m_area->widget());
-#if 0
-    if (child && child->qwidget()) {
-        QWidget* w = child->qwidget();
-        QScrollBar *bar = qobject_cast<QScrollBar*>(w);
-        if (bar) {
-            if (bar->orientation() == Qt::Horizontal)
-                m_area->setHorizontalScrollBar(bar);
-            else
-                m_area->setVerticalScrollBar(bar);
-
-            return;//done
-        }
-    }
-#endif
-    //anything but the scrollbar is currently a noop
-    notImplemented();
-        
-    //child->setParentWidget(m_area->widget());
+    QWidget* w = child->qwidget();
+    w->setParent(m_area->widget());
 }
 
-void ScrollView::removeChild(Widget*)
-{ 
-    // no-op
+void ScrollView::removeChild(Widget* child)
+{
+    child->hide();
 }
 
 void ScrollView::scrollPointRecursively(int x, int y)
index 4a691cf..20b6a21 100644 (file)
@@ -46,12 +46,11 @@ namespace WebCore {
 
 struct WidgetPrivate
 {
-    WidgetPrivate() : m_parent(0), m_widget(0), m_client(0) { }
-    ~WidgetPrivate() { }
+    WidgetPrivate() : m_widget(0), m_client(0) { }
+    ~WidgetPrivate() { delete m_widget; }
 
-    WidgetClient *m_client;
+    WidgetClientm_client;
 
-    QWidget* m_parent;
     QWidget* m_widget;
 
     Font     m_font;
@@ -143,7 +142,7 @@ void Widget::setQWidget(QWidget* child)
     data->m_widget = child;
 }
 
-QWidget* Widget::qwidget()
+QWidget* Widget::qwidget() const
 {
     return data->m_widget;
 }
index 541caa7..16cfa09 100644 (file)
@@ -89,8 +89,8 @@ QWebFrame::QWebFrame(QWebFrame *parent, QWebFrameData *frameData)
 
 QWebFrame::~QWebFrame()
 {
-    if (d->frameView)
-        d->frameView->setScrollArea(0);
+    Q_ASSERT(d->frame == 0);
+    Q_ASSERT(d->frameView == 0);
     delete d;
 }
 
index 9193afd..1d7103f 100644 (file)
@@ -101,6 +101,9 @@ QWebPage::QWebPage(QWidget *parent)
 
 QWebPage::~QWebPage()
 {
+    FrameLoader *loader = d->mainFrame->d->frame->loader();
+    if (loader)
+        loader->detachFromParent();
     delete d;
 }
 
index 0c222ed..becc51e 100644 (file)
@@ -22,6 +22,8 @@
 #ifndef QWEBPAGE_P_H
 #define QWEBPAGE_P_H
 
+#include <qpointer.h>
+
 #include "qwebpage.h"
 #include "qwebframe.h"
 
@@ -47,7 +49,7 @@ public:
     WebCore::EditorClientQt *editorClient;
     WebCore::Page *page;
 
-    QWebFrame *mainFrame;
+    QPointer<QWebFrame> mainFrame;
     QVBoxLayout *layout;
 
     QWebPage *q;
index 71f7d5b..bf8f555 100644 (file)
@@ -1,3 +1,27 @@
+2007-01-29  Lars Knoll <lars@trolltech.com>
+
+        Reviewed by Zack
+
+        Fix the way we handle native widgets (QWidget) inside
+        WebCore. Now WebCore::Widget owns the QWidget in all
+        cases. This is the only way to get well defined semantics
+        for all teh native widgets we have (currently ScrollView
+        and ScrollBar, but plugins will follow).
+
+        This has the side effect that one cannot rely on a defined 
+        lifetime of a QWebFrame when using the API. 
+
+        * Api/qwebframe.cpp:
+        (QWebFrame::~QWebFrame):
+        * Api/qwebpage.cpp:
+        (QWebPage::~QWebPage):
+        * Api/qwebpage_p.h:
+        * WebCoreSupport/FrameLoaderClientQt.cpp:
+        (WebCore::FrameLoaderClientQt::detachedFromParent3):
+        (WebCore::FrameLoaderClientQt::detachedFromParent4):
+        (WebCore::FrameLoaderClientQt::frameLoaderDestroyed):
+        * WebCoreSupport/FrameLoaderClientQt.h:
+
 2007-01-29  George Staikos  <staikos@kde.org>
 
         Reviewed by Zack.
index 9ffdc1a..f75e76f 100644 (file)
@@ -82,16 +82,6 @@ void FrameLoaderClientQt::setFrame(QWebFrame *webFrame, FrameQt *frame)
             m_webFrame, SIGNAL(titleChanged(const QString&)));
 }
 
-void FrameLoaderClientQt::detachFrameLoader()
-{
-    disconnect(this, SIGNAL(loadStarted(QWebFrame*)));
-    disconnect(this, SIGNAL(loadProgressChanged(double)));
-    disconnect(this, SIGNAL(loadFinished(QWebFrame*)));
-    disconnect(this, SIGNAL(titleChanged(const QString&)));
-    m_webFrame = 0;
-    m_frame = 0;
-}
-
 void FrameLoaderClientQt::callPolicyFunction(FramePolicyFunction function, PolicyAction action)
 {
     qDebug() << "FrameLoaderClientQt::callPolicyFunction";
@@ -265,17 +255,15 @@ void FrameLoaderClientQt::detachedFromParent2()
 
 void FrameLoaderClientQt::detachedFromParent3()
 {
-    if (!m_webFrame)
-        return;
-    if (m_webFrame->d->frameView)
-        m_webFrame->d->frameView->setScrollArea(0);
-    m_webFrame->d->frameView = 0;
 }
 
 
 void FrameLoaderClientQt::detachedFromParent4()
 {
-    delete m_webFrame;
+    if (!m_webFrame)
+        return;
+    m_webFrame->d->frame = 0;
+    m_webFrame->d->frameView = 0;
     m_webFrame = 0;
     m_frame = 0;
 }
@@ -583,8 +571,8 @@ void FrameLoaderClientQt::dispatchDidReceiveIcon()
 
 void FrameLoaderClientQt::frameLoaderDestroyed()
 {
-    m_webFrame = 0;
-    m_frame = 0;
+    Q_ASSERT(m_webFrame == 0);
+    Q_ASSERT(m_frame == 0);
     delete this;
 }
 
index f666467..08744f1 100644 (file)
@@ -68,7 +68,6 @@ namespace WebCore {
         FrameLoaderClientQt();
         ~FrameLoaderClientQt();
         void setFrame(QWebFrame *webFrame, FrameQt *frame);
-        virtual void detachFrameLoader();
 
         virtual bool hasWebView() const; // mainly for assertions
         virtual bool hasFrameView() const; // ditto