diff options
| author | Michal Klocek <michal.klocek@qt.io> | 2025-09-15 13:49:30 +0200 |
|---|---|---|
| committer | Michal Klocek <michal.klocek@qt.io> | 2025-10-28 12:59:04 +0200 |
| commit | 0e40da3e1bbb558f1c416f0965502e42919db7da (patch) | |
| tree | 1da93bee20068a292dfbf9d0611b0e241faa07b3 | |
| parent | 21ca55da00e7c4f1cf85f96b4e75085032241f56 (diff) | |
Add chlid frame to qml api of webengineframe
It seems that children property was overlooked.
Add it so it is posible to crawl the frame tree.
Pick-to: 6.10
Change-Id: Ie4e13ccbc695a4db3782ce2c993c74ebb3d1cc9a
Reviewed-by: Moss Heim <moss.heim@qt.io>
| -rw-r--r-- | src/core/api/qwebengineframe.h | 1 | ||||
| -rw-r--r-- | src/webenginequick/api/qquickwebengineframe.cpp | 11 | ||||
| -rw-r--r-- | src/webenginequick/api/qquickwebengineframe_p.h | 2 | ||||
| -rw-r--r-- | src/webenginequick/doc/src/webengineframe.qdoc | 8 | ||||
| -rw-r--r-- | tests/auto/quick/publicapi/tst_publicapi.cpp | 4 | ||||
| -rw-r--r-- | tests/auto/quick/qmltests/data/tst_frames.qml | 26 |
6 files changed, 47 insertions, 5 deletions
diff --git a/src/core/api/qwebengineframe.h b/src/core/api/qwebengineframe.h index fa277c44f..126b8320b 100644 --- a/src/core/api/qwebengineframe.h +++ b/src/core/api/qwebengineframe.h @@ -30,6 +30,7 @@ class QWebEngineFrame Q_PROPERTY(QUrl url READ url FINAL) Q_PROPERTY(QSizeF size READ size FINAL) Q_PROPERTY(bool isMainFrame READ isMainFrame FINAL) + Q_PROPERTY(QList<QWebEngineFrame> children READ children) public: QWebEngineFrame() = default; diff --git a/src/webenginequick/api/qquickwebengineframe.cpp b/src/webenginequick/api/qquickwebengineframe.cpp index 44476e31b..8bab7952e 100644 --- a/src/webenginequick/api/qquickwebengineframe.cpp +++ b/src/webenginequick/api/qquickwebengineframe.cpp @@ -23,6 +23,17 @@ QQuickWebEngineFrame::QQuickWebEngineFrame( { } +QList<QQuickWebEngineFrame> QQuickWebEngineFrame::children() const +{ + auto adapter = m_adapter.lock(); + if (!adapter) + return QList<QQuickWebEngineFrame>(); + QList<QQuickWebEngineFrame> result; + for (auto childId : adapter->frameChildren(m_id)) + result.push_back(QQuickWebEngineFrame{ m_adapter, childId }); + return result; +} + void QQuickWebEngineFrame::runJavaScript(const QString &script, const QJSValue &callback) { QWebEngineFrame::runJavaScript(script, QWebEngineScript::MainWorld, callback); diff --git a/src/webenginequick/api/qquickwebengineframe_p.h b/src/webenginequick/api/qquickwebengineframe_p.h index a4fb64ecc..9d7173e1e 100644 --- a/src/webenginequick/api/qquickwebengineframe_p.h +++ b/src/webenginequick/api/qquickwebengineframe_p.h @@ -26,6 +26,7 @@ QT_BEGIN_NAMESPACE class QQuickWebEngineFrame : public QWebEngineFrame { Q_GADGET_EXPORT(Q_WEBENGINEQUICK_EXPORT) + Q_PROPERTY(QList<QQuickWebEngineFrame> children READ children CONSTANT REVISION(6, 10) FINAL) QML_VALUE_TYPE(webEngineFrame) QML_ADDED_IN_VERSION(6, 8) QML_FOREIGN(QWebEngineFrame) @@ -38,6 +39,7 @@ public: Q_WEBENGINEQUICK_EXPORT Q_INVOKABLE void runJavaScript(const QString &script, quint32 worldId, const QJSValue &callback); Q_WEBENGINEQUICK_EXPORT Q_INVOKABLE void printToPdf(const QJSValue &callback); + QList<QQuickWebEngineFrame> children() const; private: friend class QQuickWebEngineView; diff --git a/src/webenginequick/doc/src/webengineframe.qdoc b/src/webenginequick/doc/src/webengineframe.qdoc index daa6aad23..eae2aa6f8 100644 --- a/src/webenginequick/doc/src/webengineframe.qdoc +++ b/src/webenginequick/doc/src/webengineframe.qdoc @@ -73,6 +73,14 @@ */ /*! + \qmlproperty list<webEngineFrame> webEngineFrame::children + \since QtWebEngine 6.10 + Returns a list of the frame's children in an arbitrary order. + + If the frame could not be found, returns an empty list. +*/ + +/*! \qmlmethod void webEngineFrame::runJavaScript(string script, variant callback) \qmlmethod void webEngineFrame::runJavaScript(string script, uint worldId, variant callback) diff --git a/tests/auto/quick/publicapi/tst_publicapi.cpp b/tests/auto/quick/publicapi/tst_publicapi.cpp index 98bc442e9..7aef6d3a3 100644 --- a/tests/auto/quick/publicapi/tst_publicapi.cpp +++ b/tests/auto/quick/publicapi/tst_publicapi.cpp @@ -111,6 +111,8 @@ static const QStringList hardcodedTypes = QStringList() << "QQmlComponent*" << "QMultiMap<QByteArray,QByteArray>" << "QList<QWebEnginePermission>" + << "QList<QWebEngineFrame>" + << "QList<QQuickWebEngineFrame>" #if QT_CONFIG(webengine_extensions) << "QList<QWebEngineExtensionInfo>" #endif @@ -998,6 +1000,7 @@ static const QStringList expectedAPI = QStringList() << "QWebEngineFrame.isValid --> bool" << "QWebEngineFrame.name --> QString" << "QWebEngineFrame.printToPdf(QJSValue) --> void" + << "QWebEngineFrame.children --> QList<QWebEngineFrame>" << "QWebEngineFrame.printToPdf(QString) --> void" << "QWebEngineFrame.runJavaScript(QString) --> void" << "QWebEngineFrame.runJavaScript(QString,uint) --> void" @@ -1005,6 +1008,7 @@ static const QStringList expectedAPI = QStringList() << "QWebEngineFrame.runJavaScript(QString,uint,QJSValue) --> void" << "QWebEngineFrame.size --> QSizeF" << "QWebEngineFrame.url --> QUrl" + << "QQuickWebEngineFrame.children --> QList<QQuickWebEngineFrame>" << "QQuickWebEngineFrame.printToPdf(QJSValue) --> void" << "QQuickWebEngineFrame.runJavaScript(QString,QJSValue) --> void" << "QQuickWebEngineFrame.runJavaScript(QString,uint,QJSValue) --> void" diff --git a/tests/auto/quick/qmltests/data/tst_frames.qml b/tests/auto/quick/qmltests/data/tst_frames.qml index b09016e8c..e3bc345ec 100644 --- a/tests/auto/quick/qmltests/data/tst_frames.qml +++ b/tests/auto/quick/qmltests/data/tst_frames.qml @@ -19,7 +19,7 @@ TestWebEngineView { verify(webEngineView.mainFrame.isValid); compare(webEngineView.mainFrame.name,""); compare(webEngineView.mainFrame.htmlName,""); - //compare(webEngineView.mainFrame.children().size(), 0) // TODO: broken + compare(webEngineView.mainFrame.children.length, 0); compare(webEngineView.mainFrame.url,""); compare(webEngineView.mainFrame.size, Qt.size(-1,-1)); verify(webEngineView.mainFrame.isMainFrame); @@ -31,22 +31,38 @@ TestWebEngineView { verify(webEngineView.mainFrame.isValid); compare(webEngineView.mainFrame.name,"test-main-frame"); compare(webEngineView.mainFrame.htmlName,""); - //compare(webEngineView.mainFrame.children().size(), 0) // TODO: broken compare(webEngineView.mainFrame.url,Qt.resolvedUrl("iframes.html")); //compare(webEngineView.mainFrame.size, Qt.size(200,400)); // TODO: broken verify(webEngineView.mainFrame.isMainFrame); - } + compare(webEngineView.mainFrame.children.length, 2); + var subFrame = webEngineView.mainFrame.children[0]; + compare(subFrame.name,"test-subframe1"); + verify(subFrame.isValid); + compare(subFrame.htmlName,"iframe1-300x200"); + compare(subFrame.children.length, 0); + compare(subFrame.url,Qt.url("about:blank")); + compare(subFrame.size, Qt.size(300,200)); + subFrame = webEngineView.mainFrame.children[1]; + compare(subFrame.name,"test-subframe2"); + verify(subFrame.isValid); + compare(subFrame.htmlName,"iframe2-350x250"); + compare(subFrame.children.length, 0); + compare(subFrame.url,Qt.url("about:blank")); + compare(subFrame.size, Qt.size(350,250)); + verify(!subFrame.isMainFrame); + } function test_findFrame() { webEngineView.url = Qt.resolvedUrl("iframes.html"); verify(webEngineView.waitForLoadSucceeded()); verify(webEngineView.mainFrame.isValid); compare(webEngineView.mainFrame.name,"test-main-frame"); + compare(webEngineView.mainFrame.children.length, 2); var subFrame = webEngineView.findFrameByName("test-subframe1"); compare(subFrame.name,"test-subframe1"); verify(subFrame.isValid); compare(subFrame.htmlName,"iframe1-300x200"); - //compare(subFrame.children().size(), 0) // TODO: broken + compare(subFrame.children.length, 0); compare(subFrame.url,Qt.url("about:blank")); compare(subFrame.size, Qt.size(300,200)); verify(!subFrame.isMainFrame); @@ -54,7 +70,7 @@ TestWebEngineView { compare(subFrame.name,"test-subframe2"); verify(subFrame.isValid); compare(subFrame.htmlName,"iframe2-350x250"); - //compare(subFrame.children().size(), 0) // TODO: broken + compare(subFrame.children.length, 0); compare(subFrame.url,Qt.url("about:blank")); compare(subFrame.size, Qt.size(350,250)); verify(!subFrame.isMainFrame); |
