prevent crash when set ShaderEffectSource::sourceItem null
authorTasuku Suzuki <stasuku@gmail.com>
Thu, 11 Sep 2014 03:31:18 +0000 (12:31 +0900)
committerTasuku Suzuki <stasuku@gmail.com>
Thu, 11 Sep 2014 23:16:46 +0000 (01:16 +0200)
Regression introduced in 81ba77d736f07efac37d284cd741d71f9dad4149

Task-number: QTBUG-41241
Change-Id: I9a65af6915325e1cbf9205c7da94273d5b91b310
Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
src/quick/items/qquickshadereffectsource.cpp
tests/auto/qmltest/shadersource/tst_SourceItem.qml [new file with mode: 0644]

index 80be283..120a895 100644 (file)
@@ -322,24 +322,24 @@ void QQuickShaderEffectSource::setSourceItem(QQuickItem *item)
             d->derefWindow();
     }
 
-    if (window() == item->window()) {
-        m_sourceItem = item;
-    } else {
-        qWarning("ShaderEffectSource: sourceItem and ShaderEffectSource must both be children of the same window.");
-        m_sourceItem = 0;
-    }
+    m_sourceItem = item;
 
     if (m_sourceItem) {
-        QQuickItemPrivate *d = QQuickItemPrivate::get(item);
-        // 'item' needs a window to get a scene graph node. It usually gets one through its
-        // parent, but if the source item is "inline" rather than a reference -- i.e.
-        // "sourceItem: Item { }" instead of "sourceItem: foo" -- it will not get a parent.
-        // In those cases, 'item' should get the window from 'this'.
-        if (window())
-            d->refWindow(window());
-        d->refFromEffectItem(m_hideSource);
-        d->addItemChangeListener(this, QQuickItemPrivate::Geometry);
-        connect(m_sourceItem, SIGNAL(destroyed(QObject*)), this, SLOT(sourceItemDestroyed(QObject*)));
+        if (window() == m_sourceItem->window()) {
+            QQuickItemPrivate *d = QQuickItemPrivate::get(item);
+            // 'item' needs a window to get a scene graph node. It usually gets one through its
+            // parent, but if the source item is "inline" rather than a reference -- i.e.
+            // "sourceItem: Item { }" instead of "sourceItem: foo" -- it will not get a parent.
+            // In those cases, 'item' should get the window from 'this'.
+            if (window())
+                d->refWindow(window());
+            d->refFromEffectItem(m_hideSource);
+            d->addItemChangeListener(this, QQuickItemPrivate::Geometry);
+            connect(m_sourceItem, SIGNAL(destroyed(QObject*)), this, SLOT(sourceItemDestroyed(QObject*)));
+        } else {
+            qWarning("ShaderEffectSource: sourceItem and ShaderEffectSource must both be children of the same window.");
+            m_sourceItem = 0;
+        }
     }
     update();
     emit sourceItemChanged();
diff --git a/tests/auto/qmltest/shadersource/tst_SourceItem.qml b/tests/auto/qmltest/shadersource/tst_SourceItem.qml
new file mode 100644 (file)
index 0000000..822b53d
--- /dev/null
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtTest 1.0
+
+Item {
+    id: root
+
+    Rectangle {
+        id: box
+        color: "red"
+    }
+
+    ShaderEffectSource {
+        id: theSource
+    }
+
+    TestCase {
+        name: "shadersource-something-to-null"
+        function test_null() {
+            theSource.sourceItem = box
+            theSource.sourceItem = null
+            verify(true); // that we got here without problems...
+        }
+    }
+}