summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2025-09-15 13:49:30 +0200
committerMichal Klocek <michal.klocek@qt.io>2025-10-28 12:59:04 +0200
commit0e40da3e1bbb558f1c416f0965502e42919db7da (patch)
tree1da93bee20068a292dfbf9d0611b0e241faa07b3
parent21ca55da00e7c4f1cf85f96b4e75085032241f56 (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.h1
-rw-r--r--src/webenginequick/api/qquickwebengineframe.cpp11
-rw-r--r--src/webenginequick/api/qquickwebengineframe_p.h2
-rw-r--r--src/webenginequick/doc/src/webengineframe.qdoc8
-rw-r--r--tests/auto/quick/publicapi/tst_publicapi.cpp4
-rw-r--r--tests/auto/quick/qmltests/data/tst_frames.qml26
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);