core/proxywindow: improve QsWindowAttached robustness

Can now track window parent window changes.
Added tests.
This commit is contained in:
outfoxxed 2024-11-27 23:30:38 -08:00
parent 539692bc11
commit b6a79fe99c
Signed by untrusted user: outfoxxed
GPG key ID: 4C88A185FB89301E
7 changed files with 145 additions and 36 deletions

View file

@ -5,3 +5,4 @@ function (qs_test name)
endfunction()
qs_test(popupwindow popupwindow.cpp)
qs_test(windowattached windowattached.cpp)

View file

@ -0,0 +1,73 @@
#include "windowattached.hpp"
#include <qobject.h>
#include <qquickitem.h>
#include <qsignalspy.h>
#include <qtest.h>
#include <qtestcase.h>
#include "../proxywindow.hpp"
#include "../windowinterface.hpp"
void TestWindowAttachment::attachedAfterReload() {
auto window = ProxyWindowBase();
auto item = QQuickItem();
item.setParentItem(window.contentItem());
window.reload(nullptr);
auto* attached = WindowInterface::qmlAttachedProperties(&item);
QCOMPARE_NE(attached, nullptr);
QCOMPARE(attached->window(), &window);
}
void TestWindowAttachment::attachedBeforeReload() {
auto window = ProxyWindowBase();
auto item = QQuickItem();
item.setParentItem(window.contentItem());
auto* attached = WindowInterface::qmlAttachedProperties(&item);
QCOMPARE_NE(attached, nullptr);
QCOMPARE(attached->window(), nullptr);
auto spy = QSignalSpy(attached, &QsWindowAttached::windowChanged);
window.reload(nullptr);
QCOMPARE(attached->window(), &window);
QCOMPARE(spy.length(), 1);
}
void TestWindowAttachment::owningWindowChanged() {
auto window1 = ProxyWindowBase();
auto window2 = ProxyWindowBase();
window1.reload(nullptr);
window2.reload(nullptr);
auto item = QQuickItem();
item.setParentItem(window1.contentItem());
auto* attached = WindowInterface::qmlAttachedProperties(&item);
QCOMPARE_NE(attached, nullptr);
QCOMPARE(attached->window(), &window1);
auto spy = QSignalSpy(attached, &QsWindowAttached::windowChanged);
item.setParentItem(window2.contentItem());
QCOMPARE(attached->window(), &window2);
// setParentItem changes the parent to nullptr before the new window.
QCOMPARE(spy.length(), 2);
}
void TestWindowAttachment::nonItemParents() {
auto window = ProxyWindowBase();
auto item = QQuickItem();
item.setParentItem(window.contentItem());
auto object = QObject(&item);
window.reload(nullptr);
auto* attached = WindowInterface::qmlAttachedProperties(&object);
QCOMPARE_NE(attached, nullptr);
QCOMPARE(attached->window(), &window);
}
QTEST_MAIN(TestWindowAttachment);

View file

@ -0,0 +1,14 @@
#pragma once
#include <qobject.h>
#include <qtmetamacros.h>
class TestWindowAttachment: public QObject {
Q_OBJECT;
private slots:
static void attachedAfterReload();
static void attachedBeforeReload();
static void owningWindowChanged();
static void nonItemParents();
};