diff options
| author | Michal Klocek <michal.klocek@qt.io> | 2025-11-24 15:59:17 +0100 |
|---|---|---|
| committer | Michal Klocek <michal.klocek@qt.io> | 2025-12-01 16:02:07 +0100 |
| commit | 3f93870ffdd4314023d5eb34fa4fd3b69fdd5f3c (patch) | |
| tree | 6d6ff189b5d2db19e1024a684177ea1b151d2465 | |
| parent | 04b4d00c59ff409b9a088a4db89ddb630e1bec90 (diff) | |
Add QQuickView as a backend view for qtwebengine
In case we want create to QWebView directly
(so no QQuickWebView), webengine backend should create
QQuickView (subclass of QQuickWindow) instead on QQuickWindow,
which will take care of creating QQmlEngine to display
the "WebView" quick item.
Use LoadFromModule() call to create WebEngineView.
Remove WebViewFactory workaround and run webview tests
without QQuickWebView to test new setup.
Note QWebEnginePrivate class most likely should
be split up into to two classes to make it nicer
and avoid branching in logic, so this should be
revisited after c++ API merge.
Change-Id: Id240efc794528cdbccd92751a370fef722b04703
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
| -rw-r--r-- | src/plugins/webengine/qwebenginewebview.cpp | 45 | ||||
| -rw-r--r-- | src/plugins/webengine/qwebenginewebview_p.h | 4 | ||||
| -rw-r--r-- | tests/auto/webview/qwebview/tst_qwebview.cpp | 46 |
3 files changed, 33 insertions, 62 deletions
diff --git a/src/plugins/webengine/qwebenginewebview.cpp b/src/plugins/webengine/qwebenginewebview.cpp index dda92cc..120d4df 100644 --- a/src/plugins/webengine/qwebenginewebview.cpp +++ b/src/plugins/webengine/qwebenginewebview.cpp @@ -18,6 +18,7 @@ #include <QtQuick/qquickwindow.h> #include <QtQuick/qquickview.h> #include <QtQuick/qquickitem.h> +#include <QtQuick/private/qquickitem_p.h> #include <QtWebEngineQuick/private/qquickwebengineview_p.h> #include <QtWebEngineCore/qwebengineloadinginfo.h> @@ -27,13 +28,7 @@ QT_BEGIN_NAMESPACE -static QByteArray qmlSource() -{ - return QByteArrayLiteral("import QtWebEngine 1.1\n" - " WebEngineView {\n" - " anchors.fill: parent" - "}\n"); -} +using namespace Qt::StringLiterals; QWebEngineWebViewPrivate::QWebEngineWebViewPrivate(QWebView *p) : QAbstractWebView(p), @@ -46,7 +41,7 @@ QWebEngineWebViewPrivate::QWebEngineWebViewPrivate(QWebView *p) m_webEngineView.m_parent = this; m_cookieStore.m_webEngineViewPtr = &m_webEngineView; if (m_ownsWindow) { - m_window = new QQuickWindow(p); + m_window = new QQuickView(p); connect(p, &QWindow::visibleChanged, m_window, &QWindow::setVisible); connect(p, &QWindow::widthChanged, m_window, &QWindow::setWidth); connect(p, &QWindow::heightChanged, m_window, &QWindow::setHeight); @@ -56,6 +51,8 @@ QWebEngineWebViewPrivate::QWebEngineWebViewPrivate(QWebView *p) QWebEngineWebViewPrivate::~QWebEngineWebViewPrivate() { if (m_ownsWindow) { + // quickview destructor deletes also webengieview item + m_webEngineView.m_webEngineView.release(); delete m_window; } } @@ -237,21 +234,30 @@ void QWebEngineWebViewPrivate::QQuickWebEngineViewPtr::init() const { Q_ASSERT(!m_webEngineView); Q_ASSERT(m_parent->m_window); + + QQuickWebEngineView *webEngineView = nullptr; QQuickItem *parentItem = m_parent->m_parentItem; if (!parentItem) { - qWarning("Could not find QQuickWebView"); - return; + // this is non qquickwebview initialization + // set the content for qquickview + QQuickView *view = qobject_cast<QQuickView *>(m_parent->m_window); + Q_ASSERT(view); + view->setResizeMode(QQuickView::SizeRootObjectToView); + view->loadFromModule("QtWebEngine"_L1, "WebEngineView"_L1); + webEngineView = qobject_cast<QQuickWebEngineView *>(view->rootObject()); + Q_ASSERT(webEngineView); + } else { + QQmlEngine *engine = qmlEngine(parentItem); + Q_ASSERT(engine); + QQmlComponent component(engine); + component.loadFromModule("QtWebEngine"_L1, "WebEngineView"_L1); + webEngineView = qobject_cast<QQuickWebEngineView *>(component.create()); + Q_ASSERT(webEngineView); + webEngineView->setParentItem(parentItem); + QQuickItemPrivate::get(webEngineView)->anchors()->setFill(parentItem); } - QQmlEngine *engine = qmlEngine(parentItem); - if (!engine) { - qWarning("Could not initialize qmlEngine"); - return; - } - QQmlComponent *component = new QQmlComponent(engine); - component->setData(qmlSource(), QUrl::fromLocalFile(QLatin1String(""))); - QQuickWebEngineView *webEngineView = qobject_cast<QQuickWebEngineView *>(component->create()); - Q_ASSERT(webEngineView); + QQuickWebEngineProfile *profile = webEngineView->profile(); Q_ASSERT(profile); QQuickWebEngineSettings *settings = webEngineView->settings(); @@ -275,7 +281,6 @@ void QWebEngineWebViewPrivate::QQuickWebEngineViewPtr::init() const QObject::connect(webEngineView, &QQuickWebEngineView::profileChanged,m_parent, &QWebEngineWebViewPrivate::q_profileChanged); QObject::connect(profile, &QQuickWebEngineProfile::httpUserAgentChanged, m_parent, &QWebEngineWebViewPrivate::q_httpUserAgentChanged); - webEngineView->setParentItem(parentItem); m_webEngineView.reset(webEngineView); if (!m_parent->m_cookieStore.m_cookieStore) diff --git a/src/plugins/webengine/qwebenginewebview_p.h b/src/plugins/webengine/qwebenginewebview_p.h index e4a0730..213ca2a 100644 --- a/src/plugins/webengine/qwebenginewebview_p.h +++ b/src/plugins/webengine/qwebenginewebview_p.h @@ -121,12 +121,12 @@ private: { if (!m_webEngineView) init(); - return m_webEngineView.data(); + return m_webEngineView.get(); } void init() const; QWebEngineWebViewPrivate *m_parent; - mutable QScopedPointer<QQuickWebEngineView> m_webEngineView; + mutable std::unique_ptr<QQuickWebEngineView> m_webEngineView; } m_webEngineView; struct QWebEngineCookieStorePtr { diff --git a/tests/auto/webview/qwebview/tst_qwebview.cpp b/tests/auto/webview/qwebview/tst_qwebview.cpp index 00e42a9..e65c076 100644 --- a/tests/auto/webview/qwebview/tst_qwebview.cpp +++ b/tests/auto/webview/qwebview/tst_qwebview.cpp @@ -25,30 +25,6 @@ #define ANDROID_REQUIRES_API_LEVEL(N) #endif -// TODO: remove when c++ apis come -class WebViewFactory -{ -public: - WebViewFactory() - : m_webengine(QWebViewFactory::loadedPluginHasKey("webengine")), - m_engine(m_webengine ? std::make_unique<QQmlEngine>() : nullptr), - m_quickView(m_webengine ? std::make_unique<QQuickWebView>() : nullptr), - m_view(m_webengine ? nullptr : std::make_unique<QWebView>()) - { - if (m_webengine) { - QQmlContext *rootContext = m_engine->rootContext(); - QQmlEngine::setContextForObject(m_quickView.get(), rootContext); - } - } - QWebView &webViewRef() { return m_webengine ? m_quickView->webView() : *(m_view.get()); } - -private: - bool m_webengine; - std::unique_ptr<QQmlEngine> m_engine; - std::unique_ptr<QQuickWebView> m_quickView; - std::unique_ptr<QWebView> m_view; -}; - class tst_QWebView : public QObject { Q_OBJECT @@ -72,10 +48,6 @@ void tst_QWebView::initTestCase() { if (!qEnvironmentVariableIsEmpty("QEMU_LD_PREFIX")) QSKIP("This test is unstable on QEMU, so it will be skipped."); -#if QT_CONFIG(webview_webengine_plugin) - if (QWebViewFactory::loadedPluginHasKey("webengine")) - QtWebEngineQuick::initialize(); -#endif if (!QFileInfo(m_cacheLocation).isDir()) { QDir dir; QVERIFY(dir.mkpath(m_cacheLocation)); @@ -92,8 +64,7 @@ void tst_QWebView::load() const QString fileName = file.fileName(); file.close(); - WebViewFactory factory; - QWebView &view = factory.webViewRef(); + QWebView view; view.settings()->setAllowFileAccess(true); view.settings()->setLocalContentCanAccessFileUrls(true); QCOMPARE(view.loadProgress(), 0); @@ -136,8 +107,7 @@ void tst_QWebView::loadHtml_data() QTest::addColumn<QByteArray>("content"); QTest::addColumn<QUrl>("loadUrl"); QTest::addColumn<QUrl>("resultUrl"); - WebViewFactory factory; - QWebView &view = factory.webViewRef(); + QWebView view; QCOMPARE(view.loadProgress(), 0); QSignalSpy loadChangedSingalSpy(&view, SIGNAL(loadingChanged(QWebViewLoadRequestPrivate))); const QByteArray content( @@ -168,8 +138,7 @@ void tst_QWebView::loadHtml() QFETCH(QUrl, loadUrl); QFETCH(QUrl, resultUrl); - WebViewFactory factory; - QWebView &view = factory.webViewRef(); + QWebView view; QCOMPARE(view.loadProgress(), 0); QSignalSpy loadChangedSingalSpy(&view, SIGNAL(loadingChanged(QWebViewLoadRequestPrivate))); QSignalSpy javaScriptResultSpy(&view, SIGNAL(javaScriptResult(int, QVariant))); @@ -207,8 +176,7 @@ void tst_QWebView::loadRequest() const QString fileName = file.fileName(); file.close(); - WebViewFactory factory; - QWebView &view = factory.webViewRef(); + QWebView view; view.settings()->setAllowFileAccess(true); view.settings()->setLocalContentCanAccessFileUrls(true); @@ -235,8 +203,7 @@ void tst_QWebView::loadRequest() // LoadFailed { - WebViewFactory factory; - QWebView &view = factory.webViewRef(); + QWebView view; view.settings()->setAllowFileAccess(true); view.settings()->setLocalContentCanAccessFileUrls(true); QCOMPARE(view.loadProgress(), 0); @@ -261,8 +228,7 @@ void tst_QWebView::loadRequest() void tst_QWebView::setAndDeleteCookie() { - WebViewFactory factory; - QWebView &view = factory.webViewRef(); + QWebView view; view.settings()->setLocalStorageEnabled(true); view.settings()->setAllowFileAccess(true); view.settings()->setLocalContentCanAccessFileUrls(true); |
