[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373

hausmann at webkit.org hausmann at webkit.org
Wed Apr 7 23:31:14 UTC 2010


The following commit has been merged in the webkit-1.2 branch:
commit 79a558a4cf9563b1458e52ee834a8e7de34bcc6c
Author: hausmann at webkit.org <hausmann at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Nov 11 18:31:33 2009 +0000

    [Qt] Regression: Preserve the parent of plugin objects when using
    QtWebKit with only a QWebPage.
    
    Reviewed by Tor Arne Vestbø.
    
    * WebCoreSupport/FrameLoaderClientQt.cpp:
    (WebCore::FrameLoaderClientQt::createPlugin): Don't reparent
    plugins to 0.
    * tests/qwebpage/tst_qwebpage.cpp:
    (PluginCounterPage::PluginCounterPage): Initialize m_pluginParent to 0.
    (PluginCounterPage::~PluginCounterPage): Delete the plugin parent later
    (after the page)
    (PluginTracerPage::createPlugin): Assign a dummy parent to the plugin.
    (PluginTracerPage::PluginTracerPage): Set up the plugin parent.
    (tst_QWebPage::createViewlessPlugin): Verify that for viewless pages the
    plugin parent remains unchanged.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@50818 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index 61736d1..c80d87a 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -1,3 +1,22 @@
+2009-11-11  Warwick Allison  <warwick.allison at nokia.com>, Simon Hausmann  <simon.hausmann at nokia.com>
+
+        Reviewed by Tor Arne Vestbø.
+
+        [Qt] Regression: Preserve the parent of plugin objects when using
+        QtWebKit with only a QWebPage.
+
+        * WebCoreSupport/FrameLoaderClientQt.cpp:
+        (WebCore::FrameLoaderClientQt::createPlugin): Don't reparent
+        plugins to 0.
+        * tests/qwebpage/tst_qwebpage.cpp:
+        (PluginCounterPage::PluginCounterPage): Initialize m_pluginParent to 0.
+        (PluginCounterPage::~PluginCounterPage): Delete the plugin parent later
+        (after the page)
+        (PluginTracerPage::createPlugin): Assign a dummy parent to the plugin.
+        (PluginTracerPage::PluginTracerPage): Set up the plugin parent.
+        (tst_QWebPage::createViewlessPlugin): Verify that for viewless pages the
+        plugin parent remains unchanged.
+
 2009-11-11  David Boddie  <dboddie at trolltech.com>
 
         [Qt] Doc: Added internal or hidden placeholder documentation.
diff --git a/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp b/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
index 278dba9..d9396e9 100644
--- a/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
+++ b/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
@@ -1233,12 +1233,11 @@ PassRefPtr<Widget> FrameLoaderClientQt::createPlugin(const IntSize& pluginSize,
         if (object) {
             QWidget* widget = qobject_cast<QWidget*>(object);
             if (widget) {
-                QWidget* parentWidget;
+                QWidget* parentWidget = 0;
                 if (m_webFrame->page()->d->client)
                     parentWidget = qobject_cast<QWidget*>(m_webFrame->page()->d->client->pluginParent());
-                else
-                    parentWidget = 0;  // The plug-in won't be fully functional because the QWebView doesn't exist.
-                widget->setParent(parentWidget);
+                if (parentWidget) // don't reparent to nothing (i.e. keep whatever parent QWebPage::createPlugin() chose.
+                    widget->setParent(parentWidget);
                 RefPtr<QtPluginWidget> w = adoptRef(new QtPluginWidget());
                 w->setPlatformWidget(widget);
                 // Make sure it's invisible until properly placed into the layout
@@ -1248,13 +1247,12 @@ PassRefPtr<Widget> FrameLoaderClientQt::createPlugin(const IntSize& pluginSize,
 #if QT_VERSION >= 0x040600
             QGraphicsWidget* graphicsWidget = qobject_cast<QGraphicsWidget*>(object);
             if (graphicsWidget) {
-                QGraphicsObject* parentWidget;
+                QGraphicsObject* parentWidget = 0;
                 if (m_webFrame->page()->d->client)
                     parentWidget = qobject_cast<QGraphicsObject*>(m_webFrame->page()->d->client->pluginParent());
-                else
-                    parentWidget = 0;  // The plug-in won't be fully functional because the QWebView doesn't exist.
                 graphicsWidget->hide();
-                graphicsWidget->setParentItem(parentWidget);
+                if (parentWidget) // don't reparent to nothing (i.e. keep whatever parent QWebPage::createPlugin() chose.
+                    graphicsWidget->setParentItem(parentWidget);
                 RefPtr<QtPluginGraphicsWidget> w = QtPluginGraphicsWidget::create(graphicsWidget);
                 // Make sure it's invisible until properly placed into the layout
                 w->setFrameRect(IntRect(0, 0, 0, 0));
diff --git a/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp b/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp
index ca5dfb6..fbd55b1 100644
--- a/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp
+++ b/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp
@@ -658,20 +658,41 @@ class PluginCounterPage : public QWebPage {
 public:
     int m_count;
     QPointer<QObject> m_widget;
-    PluginCounterPage(QObject* parent = 0) : QWebPage(parent), m_count(0), m_widget(0)
+    QObject* m_pluginParent;
+    PluginCounterPage(QObject* parent = 0)
+        : QWebPage(parent)
+        , m_count(0)
+        , m_widget(0)
+        , m_pluginParent(0)
     {
        settings()->setAttribute(QWebSettings::PluginsEnabled, true);
     }
+    ~PluginCounterPage()
+    {
+        if (m_pluginParent)
+            m_pluginParent->deleteLater();
+    }
 };
 
 template<class T>
 class PluginTracerPage : public PluginCounterPage {
 public:
-    PluginTracerPage(QObject* parent = 0) : PluginCounterPage(parent) {}
+    PluginTracerPage(QObject* parent = 0)
+        : PluginCounterPage(parent)
+    {
+        // this is a dummy parent object for the created plugin
+        m_pluginParent = new T;
+    }
     virtual QObject* createPlugin(const QString&, const QUrl&, const QStringList&, const QStringList&)
     {
         m_count++;
-        return m_widget = new T();
+        m_widget = new T;
+        // need a cast to the specific type, as QObject::setParent cannot be called,
+        // because it is not virtual. Instead it is necesary to call QWidget::setParent,
+        // which also takes a QWidget* instead of a QObject*. Therefore we need to
+        // upcast to T*, which is a QWidget.
+        static_cast<T*>(m_widget.data())->setParent(static_cast<T*>(m_pluginParent));
+        return m_widget;
     }
 };
 
@@ -737,6 +758,8 @@ void tst_QWebPage::createViewlessPlugin()
     page->mainFrame()->setHtml(content);
     QCOMPARE(page->m_count, 1);
     QVERIFY(page->m_widget);
+    QVERIFY(page->m_pluginParent);
+    QVERIFY(page->m_widget->parent() == page->m_pluginParent);
     delete page;
 
 }

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list