diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/chromium_gpu_helper.cpp | 2 | ||||
-rw-r--r-- | src/core/config/linux.pri | 2 | ||||
-rw-r--r-- | src/core/configure.json | 14 | ||||
-rw-r--r-- | src/core/delegated_frame_node.cpp | 13 | ||||
-rw-r--r-- | src/core/doc/src/qtwebenginecore-module.qdoc | 2 | ||||
-rw-r--r-- | src/core/gl_context_qt.cpp | 22 | ||||
-rw-r--r-- | src/core/gl_context_qt.h | 3 | ||||
-rw-r--r-- | src/core/gl_surface_qt.cpp | 21 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 29 | ||||
-rw-r--r-- | src/webengine/api/qtwebengineglobal.cpp | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 101 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qtwebenginewidgets-module.qdoc | 2 |
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 |