summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2025-11-24 15:59:17 +0100
committerMichal Klocek <michal.klocek@qt.io>2025-12-01 16:02:07 +0100
commit3f93870ffdd4314023d5eb34fa4fd3b69fdd5f3c (patch)
tree6d6ff189b5d2db19e1024a684177ea1b151d2465
parent04b4d00c59ff409b9a088a4db89ddb630e1bec90 (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.cpp45
-rw-r--r--src/plugins/webengine/qwebenginewebview_p.h4
-rw-r--r--tests/auto/webview/qwebview/tst_qwebview.cpp46
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);