summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/chromium_gpu_helper.cpp2
-rw-r--r--src/core/config/linux.pri2
-rw-r--r--src/core/configure.json14
-rw-r--r--src/core/delegated_frame_node.cpp13
-rw-r--r--src/core/doc/src/qtwebenginecore-module.qdoc2
-rw-r--r--src/core/gl_context_qt.cpp22
-rw-r--r--src/core/gl_context_qt.h3
-rw-r--r--src/core/gl_surface_qt.cpp21
-rw-r--r--src/core/render_widget_host_view_qt.cpp29
-rw-r--r--src/webengine/api/qtwebengineglobal.cpp2
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp101
-rw-r--r--src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc2
12 files changed, 136 insertions, 77 deletions
diff --git a/src/core/chromium_gpu_helper.cpp b/src/core/chromium_gpu_helper.cpp
index 73a4da70f..547fbc45c 100644
--- a/src/core/chromium_gpu_helper.cpp
+++ b/src/core/chromium_gpu_helper.cpp
@@ -48,7 +48,7 @@
// GL typedefs cascading through content header includes.
#include "gpu/command_buffer/service/sync_point_manager.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
-#include "gpu/command_buffer/service/texture_manager.h"
+#include "gpu/command_buffer/service/texture_base.h"
#include "content/gpu/gpu_child_thread.h"
#include "gpu/ipc/service/gpu_channel_manager.h"
diff --git a/src/core/config/linux.pri b/src/core/config/linux.pri
index 02040122b..7299819a6 100644
--- a/src/core/config/linux.pri
+++ b/src/core/config/linux.pri
@@ -130,7 +130,7 @@ host_build {
}
qtConfig(webengine-system-png): gn_args += use_system_libpng=true
qtConfig(webengine-system-jpeg): gn_args += use_system_libjpeg=true
- qtConfig(system-freetype): gn_args += use_system_freetype=true
+ qtConfig(webengine-system-freetype): gn_args += use_system_freetype=true
qtConfig(webengine-system-harfbuzz): gn_args += use_system_harfbuzz=true
!qtConfig(webengine-system-glib): gn_args += use_glib=false
qtConfig(webengine-pulseaudio) {
diff --git a/src/core/configure.json b/src/core/configure.json
index 778daf320..b1182e789 100644
--- a/src/core/configure.json
+++ b/src/core/configure.json
@@ -202,6 +202,12 @@
"sources": [
{ "type": "pkgConfig", "args": "lcms2" }
]
+ },
+ "webengine-freetype": {
+ "label": "freetype >= 2.4.2",
+ "sources": [
+ { "type": "pkgConfig", "args": "freetype2 >= 2.4.2" }
+ ]
}
},
@@ -593,6 +599,11 @@
"condition": "config.unix && libs.webengine-lcms2",
"output": [ "privateFeature" ]
},
+ "webengine-system-freetype" : {
+ "label": "freetype",
+ "condition": "config.unix && features.system-freetype && libs.webengine-freetype",
+ "output": [ "privateFeature" ]
+ },
"webengine-sanitizer" : {
"label": "Sanitizer",
"autoDetect": "config.sanitizer && tests.webengine-sanitizer",
@@ -690,7 +701,8 @@
"webengine-system-lcms2",
"webengine-system-png",
"webengine-system-jpeg",
- "webengine-system-harfbuzz"
+ "webengine-system-harfbuzz",
+ "webengine-system-freetype"
]
},
{
diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp
index f829813ff..5b0983924 100644
--- a/src/core/delegated_frame_node.cpp
+++ b/src/core/delegated_frame_node.cpp
@@ -815,6 +815,16 @@ static bool areRenderPassStructuresEqual(viz::CompositorFrame *frameData,
#endif // QT_NO_OPENGL
if (!areSharedQuadStatesEqual(quad->shared_quad_state, prevQuad->shared_quad_state))
return false;
+ if (quad->shared_quad_state->is_clipped && quad->visible_rect != prevQuad->visible_rect) {
+ gfx::Rect targetRect1 =
+ cc::MathUtil::MapEnclosingClippedRect(quad->shared_quad_state->quad_to_target_transform, quad->visible_rect);
+ gfx::Rect targetRect2 =
+ cc::MathUtil::MapEnclosingClippedRect(quad->shared_quad_state->quad_to_target_transform, prevQuad->visible_rect);
+ targetRect1.Intersect(quad->shared_quad_state->clip_rect);
+ targetRect2.Intersect(quad->shared_quad_state->clip_rect);
+ if (targetRect1.IsEmpty() != targetRect2.IsEmpty())
+ return false;
+ }
}
}
return true;
@@ -857,7 +867,8 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData,
QScopedPointer<DelegatedNodeTreeHandler> nodeHandler;
const QSizeF viewportSizeInPt = apiDelegate->screenRect().size();
- const QSize viewportSize = (viewportSizeInPt * devicePixelRatio).toSize();
+ const QSizeF viewportSizeF = viewportSizeInPt * devicePixelRatio;
+ const QSize viewportSize(std::ceil(viewportSizeF.width()), std::ceil(viewportSizeF.height()));
// We first compare if the render passes from the previous frame data are structurally
// equivalent to the render passes in the current frame data. If they are, we are going
diff --git a/src/core/doc/src/qtwebenginecore-module.qdoc b/src/core/doc/src/qtwebenginecore-module.qdoc
index 0ac20a794..2ed0a4c06 100644
--- a/src/core/doc/src/qtwebenginecore-module.qdoc
+++ b/src/core/doc/src/qtwebenginecore-module.qdoc
@@ -29,7 +29,7 @@
/*!
\module QtWebEngineCore
\title Qt WebEngine Core C++ Classes
- \brief Provides public API shared by both QtWebEngine and QtWebEngineWidgets
+ \brief Provides public API shared by both QtWebEngine and QtWebEngineWidgets.
\since 5.6
\ingroup qtwebengine-modules
\ingroup modules
diff --git a/src/core/gl_context_qt.cpp b/src/core/gl_context_qt.cpp
index cd82b1069..954917094 100644
--- a/src/core/gl_context_qt.cpp
+++ b/src/core/gl_context_qt.cpp
@@ -144,6 +144,28 @@ void* GLContextHelper::getNativeDisplay()
return resourceForIntegration(QByteArrayLiteral("nativedisplay"));
}
+QFunctionPointer GLContextHelper::getGlXGetProcAddress()
+{
+ QFunctionPointer get_proc_address = nullptr;
+#ifndef QT_NO_OPENGL
+ if (QOpenGLContext *context = qt_gl_global_share_context()) {
+ get_proc_address = context->getProcAddress("glXGetProcAddress");
+ }
+#endif
+ return get_proc_address;
+}
+
+QFunctionPointer GLContextHelper::getEglGetProcAddress()
+{
+ QFunctionPointer get_proc_address = nullptr;
+#ifndef QT_NO_OPENGL
+ if (QOpenGLContext *context = qt_gl_global_share_context()) {
+ get_proc_address = context->getProcAddress("eglGetProcAddress");
+ }
+#endif
+ return get_proc_address;
+}
+
QT_END_NAMESPACE
#if defined(USE_OZONE) || defined(OS_WIN)
diff --git a/src/core/gl_context_qt.h b/src/core/gl_context_qt.h
index 9c8a43a0a..cecceabc9 100644
--- a/src/core/gl_context_qt.h
+++ b/src/core/gl_context_qt.h
@@ -62,7 +62,8 @@ public:
static void* getEGLDisplay();
static void* getXDisplay();
static void* getNativeDisplay();
-
+ static QFunctionPointer getGlXGetProcAddress();
+ static QFunctionPointer getEglGetProcAddress();
private:
Q_INVOKABLE bool initializeContextOnBrowserThread(gl::GLContext* context, gl::GLSurface* surface, gl::GLContextAttribs attribs);
diff --git a/src/core/gl_surface_qt.cpp b/src/core/gl_surface_qt.cpp
index 0d143ee18..4d38d7c25 100644
--- a/src/core/gl_surface_qt.cpp
+++ b/src/core/gl_surface_qt.cpp
@@ -73,13 +73,6 @@
#include "ui/gl/gl_glx_api_implementation.h"
#include <dlfcn.h>
-#ifndef QT_NO_OPENGL
-#include <QOpenGLContext>
-QT_BEGIN_NAMESPACE
-Q_GUI_EXPORT QOpenGLContext *qt_gl_global_share_context();
-QT_END_NAMESPACE
-#endif
-
#endif
#include "ozone/gl_surface_egl_qt.h"
@@ -203,16 +196,10 @@ bool InitializeStaticGLBindings(GLImplementation implementation) {
reinterpret_cast<GLGetProcAddressProc>(
base::GetFunctionPointerFromNativeLibrary(library,
"glXGetProcAddress"));
-
-#ifndef QT_NO_OPENGL
if (!get_proc_address) {
- // glx handle not loaded , fallback to qpa
- if (QOpenGLContext *context = qt_gl_global_share_context()) {
- get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(
- context->getProcAddress("glXGetProcAddress"));
- }
+ QFunctionPointer address = GLContextHelper::getGlXGetProcAddress();
+ get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(address);
}
-#endif
if (!get_proc_address) {
LOG(ERROR) << "glxGetProcAddress not found.";
base::UnloadNativeLibrary(library);
@@ -240,6 +227,10 @@ bool InitializeStaticGLBindings(GLImplementation implementation) {
base::GetFunctionPointerFromNativeLibrary(library,
"eglGetProcAddress"));
if (!get_proc_address) {
+ QFunctionPointer address = GLContextHelper::getEglGetProcAddress();
+ get_proc_address = reinterpret_cast<gl::GLGetProcAddressProc>(address);
+ }
+ if (!get_proc_address) {
LOG(ERROR) << "eglGetProcAddress not found.";
base::UnloadNativeLibrary(library);
return false;
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index c2fa7d30a..695e9cc74 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -69,12 +69,14 @@
#include "third_party/blink/public/platform/web_color.h"
#include "third_party/blink/public/platform/web_cursor_info.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
+#include "ui/base/resource/resource_bundle.h"
#include "ui/events/blink/blink_event_util.h"
#include "ui/events/event.h"
#include "ui/events/gesture_detection/gesture_provider_config_helper.h"
#include "ui/events/gesture_detection/motion_event.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/gfx/geometry/size_conversions.h"
+#include "ui/gfx/image/image_skia.h"
#if defined(USE_AURA)
#include "ui/base/cursor/cursor.h"
@@ -670,11 +672,30 @@ void RenderWidgetHostViewQt::UpdateCursor(const content::WebCursor &webCursor)
}
#if defined(USE_AURA)
if (auraType != ui::CursorType::kNull) {
- SkBitmap bitmap;
+ QWindow *window = m_delegate->window();
+ qreal windowDpr = window ? window->devicePixelRatio() : 1.0f;
+ int resourceId;
gfx::Point hotspot;
- if (ui::GetCursorBitmap(auraType, &bitmap, &hotspot)) {
- m_delegate->updateCursor(QCursor(QPixmap::fromImage(toQImage(bitmap)), hotspot.x(), hotspot.y()));
- return;
+ // GetCursorDataFor only knows hotspots for 1x and 2x cursor images, in physical pixels.
+ qreal hotspotDpr = windowDpr <= 1.0f ? 1.0f : 2.0f;
+ if (ui::GetCursorDataFor(ui::CursorSize::kNormal, auraType, hotspotDpr, &resourceId, &hotspot)) {
+ if (const gfx::ImageSkia *imageSkia = ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resourceId)) {
+ QImage imageQt = toQImage(imageSkia->GetRepresentation(windowDpr));
+
+ // Convert hotspot coordinates into device-independent pixels.
+ qreal hotX = hotspot.x() / hotspotDpr;
+ qreal hotY = hotspot.y() / hotspotDpr;
+
+#if defined(Q_OS_LINUX)
+ // QTBUG-68571: On Linux (xcb, wayland, eglfs), hotspot coordinates must be in physical pixels.
+ qreal imageDpr = imageQt.devicePixelRatio();
+ hotX *= imageDpr;
+ hotY *= imageDpr;
+#endif
+
+ m_delegate->updateCursor(QCursor(QPixmap::fromImage(std::move(imageQt)), qRound(hotX), qRound(hotY)));
+ return;
+ }
}
}
#endif
diff --git a/src/webengine/api/qtwebengineglobal.cpp b/src/webengine/api/qtwebengineglobal.cpp
index a242fc6aa..d181f44aa 100644
--- a/src/webengine/api/qtwebengineglobal.cpp
+++ b/src/webengine/api/qtwebengineglobal.cpp
@@ -54,7 +54,7 @@ namespace QtWebEngine {
\ingroup qtwebengine-namespaces
\keyword QtWebEngine Namespace
- \brief Helper functions for the Qt WebEngine (Qt Quick) module
+ \brief Helper functions for the Qt WebEngine (Qt Quick) module.
The \l[CPP]{QtWebEngine} namespace is part of the Qt WebEngine module.
*/
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 66a84e677..2c8f8de90 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -1243,7 +1243,7 @@ void QWebEnginePage::triggerAction(WebAction action, bool)
{
Q_D(QWebEnginePage);
d->ensureInitialized();
- const QtWebEngineCore::WebEngineContextMenuData &menuData = *d->contextData.d;
+ const QtWebEngineCore::WebEngineContextMenuData *menuData = d->contextData.d;
switch (action) {
case Back:
d->adapter->navigateToOffset(-1);
@@ -1285,125 +1285,126 @@ void QWebEnginePage::triggerAction(WebAction action, bool)
d->adapter->unselect();
break;
case OpenLinkInThisWindow:
- if (menuData.linkUrl().isValid())
- setUrl(menuData.linkUrl());
+ if (menuData && menuData->linkUrl().isValid())
+ setUrl(menuData->linkUrl());
break;
case OpenLinkInNewWindow:
- if (menuData.linkUrl().isValid()) {
+ if (menuData && menuData->linkUrl().isValid()) {
QWebEnginePage *newPage = createWindow(WebBrowserWindow);
if (newPage)
- newPage->setUrl(menuData.linkUrl());
+ newPage->setUrl(menuData->linkUrl());
}
break;
case OpenLinkInNewTab:
- if (menuData.linkUrl().isValid()) {
+ if (menuData && menuData->linkUrl().isValid()) {
QWebEnginePage *newPage = createWindow(WebBrowserTab);
if (newPage)
- newPage->setUrl(menuData.linkUrl());
+ newPage->setUrl(menuData->linkUrl());
}
break;
case OpenLinkInNewBackgroundTab:
- if (menuData.linkUrl().isValid()) {
+ if (menuData && menuData->linkUrl().isValid()) {
QWebEnginePage *newPage = createWindow(WebBrowserBackgroundTab);
if (newPage)
- newPage->setUrl(menuData.linkUrl());
+ newPage->setUrl(menuData->linkUrl());
}
break;
case CopyLinkToClipboard:
- if (!menuData.unfilteredLinkUrl().isEmpty()) {
- QString urlString = menuData.unfilteredLinkUrl().toString(QUrl::FullyEncoded);
- QString title = menuData.linkText().toHtmlEscaped();
+ if (menuData && !menuData->unfilteredLinkUrl().isEmpty()) {
+ QString urlString = menuData->unfilteredLinkUrl().toString(QUrl::FullyEncoded);
+ QString title = menuData->linkText().toHtmlEscaped();
QMimeData *data = new QMimeData();
data->setText(urlString);
QString html = QStringLiteral("<a href=\"") + urlString + QStringLiteral("\">") + title + QStringLiteral("</a>");
data->setHtml(html);
- data->setUrls(QList<QUrl>() << menuData.unfilteredLinkUrl());
+ data->setUrls(QList<QUrl>() << menuData->unfilteredLinkUrl());
qApp->clipboard()->setMimeData(data);
}
break;
case DownloadLinkToDisk:
- if (menuData.linkUrl().isValid())
- d->adapter->download(menuData.linkUrl(), menuData.suggestedFileName(),
- menuData.referrerUrl(), menuData.referrerPolicy());
+ if (menuData && menuData->linkUrl().isValid())
+ d->adapter->download(menuData->linkUrl(), menuData->suggestedFileName(),
+ menuData->referrerUrl(), menuData->referrerPolicy());
break;
case CopyImageToClipboard:
- if (menuData.hasImageContent() &&
- (menuData.mediaType() == WebEngineContextMenuData::MediaTypeImage ||
- menuData.mediaType() == WebEngineContextMenuData::MediaTypeCanvas))
+ if (menuData && menuData->hasImageContent() &&
+ (menuData->mediaType() == WebEngineContextMenuData::MediaTypeImage ||
+ menuData->mediaType() == WebEngineContextMenuData::MediaTypeCanvas))
{
- d->adapter->copyImageAt(menuData.position());
+ d->adapter->copyImageAt(menuData->position());
}
break;
case CopyImageUrlToClipboard:
- if (menuData.mediaUrl().isValid() && menuData.mediaType() == WebEngineContextMenuData::MediaTypeImage) {
- QString urlString = menuData.mediaUrl().toString(QUrl::FullyEncoded);
- QString title = menuData.linkText();
+ if (menuData && menuData->mediaUrl().isValid() && menuData->mediaType() == WebEngineContextMenuData::MediaTypeImage) {
+ QString urlString = menuData->mediaUrl().toString(QUrl::FullyEncoded);
+ QString title = menuData->linkText();
if (!title.isEmpty())
title = QStringLiteral(" alt=\"%1\"").arg(title.toHtmlEscaped());
QMimeData *data = new QMimeData();
data->setText(urlString);
QString html = QStringLiteral("<img src=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral("></img>");
data->setHtml(html);
- data->setUrls(QList<QUrl>() << menuData.mediaUrl());
+ data->setUrls(QList<QUrl>() << menuData->mediaUrl());
qApp->clipboard()->setMimeData(data);
}
break;
case DownloadImageToDisk:
case DownloadMediaToDisk:
- if (menuData.mediaUrl().isValid())
- d->adapter->download(menuData.mediaUrl(), menuData.suggestedFileName(),
- menuData.referrerUrl(), menuData.referrerPolicy());
+ if (menuData && menuData->mediaUrl().isValid())
+ d->adapter->download(menuData->mediaUrl(), menuData->suggestedFileName(),
+ menuData->referrerUrl(), menuData->referrerPolicy());
break;
case CopyMediaUrlToClipboard:
- if (menuData.mediaUrl().isValid() &&
- (menuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
- menuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo))
+ if (menuData && menuData->mediaUrl().isValid() &&
+ (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
+ menuData->mediaType() == WebEngineContextMenuData::MediaTypeVideo))
{
- QString urlString = menuData.mediaUrl().toString(QUrl::FullyEncoded);
+ QString urlString = menuData->mediaUrl().toString(QUrl::FullyEncoded);
QMimeData *data = new QMimeData();
data->setText(urlString);
- if (menuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio)
+ if (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio)
data->setHtml(QStringLiteral("<audio src=\"") + urlString + QStringLiteral("\"></audio>"));
else
data->setHtml(QStringLiteral("<video src=\"") + urlString + QStringLiteral("\"></video>"));
- data->setUrls(QList<QUrl>() << menuData.mediaUrl());
+ data->setUrls(QList<QUrl>() << menuData->mediaUrl());
qApp->clipboard()->setMimeData(data);
}
break;
case ToggleMediaControls:
- if (menuData.mediaUrl().isValid() && menuData.mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) {
- bool enable = !(menuData.mediaFlags() & WebEngineContextMenuData::MediaControls);
- d->adapter->executeMediaPlayerActionAt(menuData.position(), WebContentsAdapter::MediaPlayerControls, enable);
+ if (menuData && menuData->mediaUrl().isValid() && menuData->mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) {
+ bool enable = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaControls);
+ d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerControls, enable);
}
break;
case ToggleMediaLoop:
- if (menuData.mediaUrl().isValid() &&
- (menuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
- menuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo))
+ if (menuData && menuData->mediaUrl().isValid() &&
+ (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
+ menuData->mediaType() == WebEngineContextMenuData::MediaTypeVideo))
{
- bool enable = !(menuData.mediaFlags() & WebEngineContextMenuData::MediaLoop);
- d->adapter->executeMediaPlayerActionAt(menuData.position(), WebContentsAdapter::MediaPlayerLoop, enable);
+ bool enable = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaLoop);
+ d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerLoop, enable);
}
break;
case ToggleMediaPlayPause:
- if (menuData.mediaUrl().isValid() &&
- (menuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
- menuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo))
+ if (menuData && menuData->mediaUrl().isValid() &&
+ (menuData->mediaType() == WebEngineContextMenuData::MediaTypeAudio ||
+ menuData->mediaType() == WebEngineContextMenuData::MediaTypeVideo))
{
- bool enable = (menuData.mediaFlags() & WebEngineContextMenuData::MediaPaused);
- d->adapter->executeMediaPlayerActionAt(menuData.position(), WebContentsAdapter::MediaPlayerPlay, enable);
+ bool enable = (menuData->mediaFlags() & WebEngineContextMenuData::MediaPaused);
+ d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerPlay, enable);
}
break;
case ToggleMediaMute:
- if (menuData.mediaUrl().isValid() && menuData.mediaFlags() & WebEngineContextMenuData::MediaHasAudio) {
+ if (menuData && menuData->mediaUrl().isValid() && menuData->mediaFlags() & WebEngineContextMenuData::MediaHasAudio) {
// Make sure to negate the value, so that toggling actually works.
- bool enable = !(menuData.mediaFlags() & WebEngineContextMenuData::MediaMuted);
- d->adapter->executeMediaPlayerActionAt(menuData.position(), WebContentsAdapter::MediaPlayerMute, enable);
+ bool enable = !(menuData->mediaFlags() & WebEngineContextMenuData::MediaMuted);
+ d->adapter->executeMediaPlayerActionAt(menuData->position(), WebContentsAdapter::MediaPlayerMute, enable);
}
break;
case InspectElement:
- d->adapter->inspectElementAt(menuData.position());
+ if (menuData)
+ d->adapter->inspectElementAt(menuData->position());
break;
case ExitFullScreen:
// See under ViewSource, anything that can trigger a delete of the current view is dangerous to call directly here.
diff --git a/src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc b/src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc
index 3da554a81..e4f259882 100644
--- a/src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc
+++ b/src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc
@@ -28,7 +28,7 @@
/*!
\module QtWebEngineWidgets
\title Qt WebEngine Widgets C++ Classes
- \brief Provides C++ classes for rendering web content in a QWidget based application
+ \brief Provides C++ classes for rendering web content in a QWidget based application.
\ingroup modules
\ingroup qtwebengine-modules
\qtvariable webenginewidgets