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 c84307199f2f336ab271686cbe192463e7117824..b4542f4602d5f3f2242cd5cccaa558d6c8141091 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 80be871310ee6d625ce3f051b010a301e648ee6d..564c92cd7a4f8db115d843cda3ef567fe97a2103 100644 (file)
@@ -149,7 +149,7 @@ namespace WebCore {
 #endif
 
 #if PLATFORM(QT)
-        QWidget* qwidget();
+        QWidget* qwidget() const;
         void setQWidget(QWidget*);
 #endif
 
index 96f889833a15a611aa47324f496161ed1215118d..1ff6919681f27acac3f63ecd241aeb746b001fda 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 2dfe67acb16210f3fc1febd60091721a25f40630..9481c6e1f93ab2740320e33bd81da5c310daa998 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 4a691cf73e0b1710e311ef9d29db9e82c25be0e2..20b6a2176261849c84ed1f4bcae9eca271f0f101 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 541caa744240824749f0ac4ba6a8e00084f9c554..16cfa0970ce38b234d22d13b668465dfb765c121 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 9193afdd52055067ad2f83611d74504887482e6a..1d7103f256439b91417c1aa580c0f33262d134a7 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 0c222ed629747840dca8aca6a9f9f12e2ea8bf42..becc51e72c6b52342143997232692151c1e7c571 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 71f7d5b415c29393c1839c9370590d1998ba593d..bf8f5551246feb014605f8498f62b79177368e99 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 9ffdc1aab6c44a77f8703f79a1f49154c2e6ba3d..f75e76f2ec842ec4dd89dcf60626ec174e3e969e 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 f6664678eebdb71cab10cc324a1c25e748613efd..08744f1f78d07099ef56a7f26eeb48dfdff8a60b 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