diff options
author | Tasuku Suzuki <stasuku@gmail.com> | 2014-09-11 12:31:18 +0900 |
---|---|---|
committer | Tasuku Suzuki <stasuku@gmail.com> | 2014-09-12 01:16:46 +0200 |
commit | 97594aa3d82618c64f57e96116f39a59ab3bb029 (patch) | |
tree | 7db50c4e46b55689fab1327fc3ddbb2350550b24 | |
parent | 26aed3d930ef96ed214ccaf18a234ef3cb8730e4 (diff) |
prevent crash when set ShaderEffectSource::sourceItem null
Regression introduced in 81ba77d736f07efac37d284cd741d71f9dad4149
Task-number: QTBUG-41241
Change-Id: I9a65af6915325e1cbf9205c7da94273d5b91b310
Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
-rw-r--r-- | src/quick/items/qquickshadereffectsource.cpp | 32 | ||||
-rw-r--r-- | tests/auto/qmltest/shadersource/tst_SourceItem.qml | 57 |
2 files changed, 73 insertions, 16 deletions
diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp index 80be283443..120a8956eb 100644 --- a/src/quick/items/qquickshadereffectsource.cpp +++ b/src/quick/items/qquickshadereffectsource.cpp @@ -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 index 0000000000..822b53d6fa --- /dev/null +++ b/tests/auto/qmltest/shadersource/tst_SourceItem.qml @@ -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... + } + } +} |