diff --git a/framework/autotest/test-widget-loader.cpp b/framework/autotest/test-widget-loader.cpp index d50862e95038c555eddef6ab9ef8b740871ac3b6..aaf6cddace8d57fc258abc209cf95eb020f34753 100644 --- a/framework/autotest/test-widget-loader.cpp +++ b/framework/autotest/test-widget-loader.cpp @@ -14,14 +14,15 @@ using namespace UkuiQuick; namespace { QString createWidgetPackage(const QString &basePath, const QString &id, WidgetMetadata::Hosts hosts, - const QStringList &applicationIds = {}, bool isContainer = false) + const QStringList &applicationIds = {}, bool isContainer = false, + const QString &name = QString()) { const QString root = QDir(basePath).filePath(id); QDir().mkpath(root); QJsonObject object{ {QStringLiteral("Id"), id}, - {QStringLiteral("Name"), id}, + {QStringLiteral("Name"), name.isEmpty() ? id : name}, {QStringLiteral("ShowIn"), hosts.testFlag(WidgetMetadata::All) ? QStringLiteral("All") : QString(hosts.testFlag(WidgetMetadata::Panel) ? QStringLiteral("Panel") : QStringLiteral("SideBar"))}, {QStringLiteral("Contents"), QJsonObject{ @@ -57,6 +58,7 @@ class widget_loader_test : public QObject private slots: void metadataAndWidgetCanBeLoadedFromCustomPath(); + void searchPathPriorityInvalidatesMetadataCache(); void widgetsAreFilteredByHostAndApplication(); void widgetsMetadataKeepsUniqueEntries(); }; @@ -84,6 +86,35 @@ void widget_loader_test::metadataAndWidgetCanBeLoadedFromCustomPath() QVERIFY(qobject_cast(container.get()) != nullptr); } +void widget_loader_test::searchPathPriorityInvalidatesMetadataCache() +{ + QTemporaryDir lowerPriorityDir; + QTemporaryDir higherPriorityDir; + QVERIFY(lowerPriorityDir.isValid()); + QVERIFY(higherPriorityDir.isValid()); + + const QString id = QStringLiteral("priority-widget"); + createWidgetPackage(lowerPriorityDir.path(), id, WidgetMetadata::All, {}, false, + QStringLiteral("Lower priority")); + createWidgetPackage(higherPriorityDir.path(), id, WidgetMetadata::All, {}, false, + QStringLiteral("Higher priority")); + + WidgetLoader loader; + loader.addWidgetSearchPath(lowerPriorityDir.path()); + + const WidgetMetadata initialMetadata = loader.loadMetadata(id); + QVERIFY(initialMetadata.isValid()); + QCOMPARE(initialMetadata.name(), QStringLiteral("Lower priority")); + + loader.addWidgetSearchPath(higherPriorityDir.path()); + + const WidgetMetadata updatedMetadata = loader.loadMetadata(id); + QVERIFY(updatedMetadata.isValid()); + QCOMPARE(updatedMetadata.name(), QStringLiteral("Higher priority")); + QCOMPARE(updatedMetadata.root().absolutePath(), + QDir(higherPriorityDir.path()).absoluteFilePath(id)); +} + void widget_loader_test::widgetsAreFilteredByHostAndApplication() { QTemporaryDir dir; diff --git a/framework/widget/widget-loader.cpp b/framework/widget/widget-loader.cpp index 3fc7973b4798ffd3eec7e25671d868276404ab8d..eb4f51da7d1ec328cbe81fc8e6f2d1809d935c4d 100644 --- a/framework/widget/widget-loader.cpp +++ b/framework/widget/widget-loader.cpp @@ -68,6 +68,7 @@ public: if (!widgetSearchPath.contains(path)) { // 添加的自定义搜索路径优先级最高 widgetSearchPath.prepend(path); + m_metadataCache.clear(); } }