From 17919588cfadd9dd249bf9eaf11c18e9a0d4436d Mon Sep 17 00:00:00 2001 From: John Date: Thu, 13 May 2021 13:06:13 +0200 Subject: [PATCH] qt5-webengine: update to 5.15.4. --- .../patches/0120-QTBUG-91773.patch | 372 ++++++++++++++++++ .../patches/0121-glibc-2.33.patch | 144 +++++++ .../qt5-webengine/patches/QTBUG-91715.patch | 124 ------ srcpkgs/qt5-webengine/template | 12 +- 4 files changed, 522 insertions(+), 130 deletions(-) create mode 100644 srcpkgs/qt5-webengine/patches/0120-QTBUG-91773.patch create mode 100644 srcpkgs/qt5-webengine/patches/0121-glibc-2.33.patch delete mode 100644 srcpkgs/qt5-webengine/patches/QTBUG-91715.patch diff --git a/srcpkgs/qt5-webengine/patches/0120-QTBUG-91773.patch b/srcpkgs/qt5-webengine/patches/0120-QTBUG-91773.patch new file mode 100644 index 0000000000..88e7b893e3 --- /dev/null +++ b/srcpkgs/qt5-webengine/patches/0120-QTBUG-91773.patch @@ -0,0 +1,372 @@ +diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp +index 5597c69f9..2cd48907b 100644 +--- a/src/core/web_contents_adapter.cpp ++++ b/src/core/web_contents_adapter.cpp +@@ -716,8 +716,7 @@ void WebContentsAdapter::load(const QWebEngineHttpRequest &request) + m_adapterClient->loadFinished(false, request.url(), false, + net::ERR_DISALLOWED_URL_SCHEME, + QCoreApplication::translate("WebContentsAdapter", +- "HTTP-POST data can only be sent over HTTP(S) protocol"), +- false); ++ "HTTP-POST data can only be sent over HTTP(S) protocol")); + return; + } + params.post_data = network::ResourceRequestBody::CreateFromBytes( +@@ -773,7 +772,7 @@ void WebContentsAdapter::setContent(const QByteArray &data, const QString &mimeT + + GURL dataUrlToLoad(urlString); + if (dataUrlToLoad.spec().size() > url::kMaxURLChars) { +- m_adapterClient->loadFinished(false, baseUrl, false, net::ERR_ABORTED, QString(), false); ++ m_adapterClient->loadFinished(false, baseUrl, false, net::ERR_ABORTED, QString()); + return; + } + content::NavigationController::LoadURLParams params((dataUrlToLoad)); +@@ -1995,6 +1994,7 @@ void WebContentsAdapter::discard() + if (m_webContents->IsLoading()) { + m_webContentsDelegate->didFailLoad(m_webContentsDelegate->url(webContents()), net::Error::ERR_ABORTED, + QStringLiteral("Discarded")); ++ m_webContentsDelegate->DidStopLoading(); + } + + content::WebContents::CreateParams createParams(m_profileAdapter->profile()); +diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h +index 267266d81..afc43806a 100644 +--- a/src/core/web_contents_adapter_client.h ++++ b/src/core/web_contents_adapter_client.h +@@ -466,8 +466,7 @@ public: + virtual void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) = 0; + virtual void loadCommitted() = 0; + virtual void loadVisuallyCommitted() = 0; +- virtual void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, +- const QString &errorDescription, bool triggersErrorPage) = 0; ++ virtual void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) = 0; + virtual void focusContainer() = 0; + virtual void unhandledKeyEvent(QKeyEvent *event) = 0; + virtual QSharedPointer +diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp +index 1e92a46f8..f0e4130e8 100644 +--- a/src/core/web_contents_delegate_qt.cpp ++++ b/src/core/web_contents_delegate_qt.cpp +@@ -259,14 +259,12 @@ void WebContentsDelegateQt::CloseContents(content::WebContents *source) + + void WebContentsDelegateQt::LoadProgressChanged(double progress) + { +- QUrl current_url(m_viewClient->webContentsAdapter()->getNavigationEntryOriginalUrl(m_viewClient->webContentsAdapter()->currentNavigationEntryIndex())); +- int p = qMin(qRound(progress * 100), 100); +- +- if (!m_loadingErrorFrameList.isEmpty() || !m_loadProgressMap.contains(current_url) || m_loadProgressMap[current_url] == 100 || p == 100) ++ if (!m_loadingErrorFrameList.isEmpty() || !m_loadingInfo.isLoading()) // suppress signals that aren't between loadStarted and loadFinished + return; + +- if (p > m_loadProgressMap[current_url]) { // ensure strict monotonic increase +- m_loadProgressMap[current_url] = p; ++ int p = qMin(qRound(progress * 100), 100); ++ if (p > m_loadingInfo.progress) { // ensure strict monotonic increase ++ m_loadingInfo.progress = p; + m_viewClient->loadProgressChanged(p); + } + } +@@ -339,35 +337,21 @@ void WebContentsDelegateQt::RenderViewHostChanged(content::RenderViewHost *, con + } + } + +-void WebContentsDelegateQt::EmitLoadStarted(const QUrl &url, bool isErrorPage) ++void WebContentsDelegateQt::emitLoadStarted(bool isErrorPage) + { +- m_isDocumentEmpty = true; +- m_viewClient->loadStarted(url, isErrorPage); +- m_viewClient->updateNavigationActions(); +- +- if ((url.hasFragment() || m_lastLoadedUrl.hasFragment()) +- && url.adjusted(QUrl::RemoveFragment) == m_lastLoadedUrl.adjusted(QUrl::RemoveFragment) +- && !m_isNavigationCommitted) { +- m_loadProgressMap.insert(url, 100); +- m_lastLoadedUrl = url; +- m_viewClient->loadProgressChanged(100); ++ // only report first ever load start or separate one for error page only ++ if (!isErrorPage && m_loadingInfo.isLoading()) // already running + return; +- } + +- if (!m_loadProgressMap.isEmpty()) { +- QMap::iterator it = m_loadProgressMap.begin(); +- while (it != m_loadProgressMap.end()) { +- if (it.value() == 100) { +- it = m_loadProgressMap.erase(it); +- continue; +- } +- ++it; +- } ++ m_isDocumentEmpty = true; // reset to default which may only be overridden on actual resource load complete ++ if (!isErrorPage) { ++ m_loadingInfo.progress = 0; ++ m_viewClient->loadStarted(m_loadingInfo.url, false); ++ m_viewClient->updateNavigationActions(); ++ m_viewClient->loadProgressChanged(0); ++ } else { ++ m_viewClient->loadStarted(toQt(GURL(content::kUnreachableWebDataURL)), true); + } +- +- m_lastLoadedUrl = url; +- m_loadProgressMap.insert(url, 0); +- m_viewClient->loadProgressChanged(0); + } + + void WebContentsDelegateQt::DidStartNavigation(content::NavigationHandle *navigation_handle) +@@ -375,34 +359,41 @@ void WebContentsDelegateQt::DidStartNavigation(content::NavigationHandle *naviga + if (!webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled)) + navigation_handle->SetSilentlyIgnoreErrors(); + +- if (!navigation_handle->IsInMainFrame()) ++ if (!navigation_handle->IsInMainFrame() || !web_contents()->IsLoadingToDifferentDocument()) + return; + + + m_loadingErrorFrameList.clear(); + m_faviconManager->resetCandidates(); +- EmitLoadStarted(toQt(navigation_handle->GetURL())); ++ ++ m_loadingInfo.url = toQt(navigation_handle->GetURL()); ++ // IsErrorPage is only set after navigation commit, so check it otherwise: error page shouldn't have navigation entry ++ bool isErrorPage = m_loadingInfo.triggersErrorPage && !navigation_handle->GetNavigationEntry(); ++ emitLoadStarted(isErrorPage); + } + +-void WebContentsDelegateQt::EmitLoadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription, bool triggersErrorPage) ++void WebContentsDelegateQt::emitLoadFinished(bool isErrorPage) + { +- Q_ASSERT(!isErrorPage || webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled)); +- Q_ASSERT((triggersErrorPage && webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled)) || !triggersErrorPage); +- +- // When error page enabled we don't need to send the error page load finished signal +- if (m_loadProgressMap[url] == 100) ++ if (!m_loadingInfo.isLoading()) // not currently running + return; + +- m_lastLoadedUrl = url; +- m_loadProgressMap[url] = 100; +- m_isNavigationCommitted = false; +- m_viewClient->loadProgressChanged(100); ++ Q_ASSERT(!isErrorPage || webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled)); ++ Q_ASSERT((m_loadingInfo.triggersErrorPage && webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled)) || !m_loadingInfo.triggersErrorPage); ++ ++ if (!isErrorPage) { ++ if (m_loadingInfo.progress < 100) { ++ m_loadingInfo.progress = 100; ++ m_viewClient->loadProgressChanged(100); ++ } + +- m_viewClient->loadFinished(success, url, isErrorPage, errorCode, errorDescription, triggersErrorPage); +- m_viewClient->updateNavigationActions(); ++ m_viewClient->loadFinished(m_loadingInfo.success, m_loadingInfo.url, false, m_loadingInfo.errorCode, m_loadingInfo.errorDescription); ++ m_viewClient->updateNavigationActions(); ++ } else { ++ m_viewClient->loadFinished(false, toQt(GURL(content::kUnreachableWebDataURL)), true, 0, QString()); ++ } + } + +-void WebContentsDelegateQt::EmitLoadCommitted() ++void WebContentsDelegateQt::emitLoadCommitted() + { + m_findTextHelper->handleLoadCommitted(); + m_viewClient->loadCommitted(); +@@ -422,8 +413,7 @@ void WebContentsDelegateQt::DidFinishNavigation(content::NavigationHandle *navig + profileAdapter->visitedLinksManager()->addUrl(url); + } + +- m_isNavigationCommitted = true; +- EmitLoadCommitted(); ++ emitLoadCommitted(); + } + + // Success is reported by DidFinishLoad, but DidFailLoad is now dead code and needs to be handled below +@@ -440,11 +430,11 @@ void WebContentsDelegateQt::DidFinishNavigation(content::NavigationHandle *navig + // Now report we are starting to load an error-page. + m_loadingErrorFrameList.append(navigation_handle->GetRenderFrameHost()->GetRoutingID()); + m_faviconManager->resetCandidates(); +- EmitLoadStarted(toQt(GURL(content::kUnreachableWebDataURL)), true); ++ emitLoadStarted(true); + + // If it is already committed we will not see another DidFinishNavigation call or a DidFinishLoad call. + if (navigation_handle->HasCommitted()) +- EmitLoadCommitted(); ++ emitLoadCommitted(); + } + } + +@@ -486,6 +476,9 @@ void WebContentsDelegateQt::DidStopLoading() + + if (m_loadingState == LoadingState::Loading) + setLoadingState(LoadingState::Loaded); ++ ++ emitLoadFinished(); ++ m_loadingInfo.clear(); + } + + void WebContentsDelegateQt::didFailLoad(const QUrl &url, int errorCode, const QString &errorDescription) +@@ -495,7 +488,11 @@ void WebContentsDelegateQt::didFailLoad(const QUrl &url, int errorCode, const QS + // Delay notifying failure until the error-page is done loading. + // Error-pages are not loaded on failures due to abort. + bool aborted = (errorCode == -3 /* ERR_ABORTED*/ ); +- EmitLoadFinished(false /* success */ , url, false /* isErrorPage */, errorCode, errorDescription, errorPageEnabled && !aborted); ++ m_loadingInfo.success = false; ++ m_loadingInfo.url = url; ++ m_loadingInfo.errorCode = errorCode; ++ m_loadingInfo.errorDescription = errorDescription; ++ m_loadingInfo.triggersErrorPage = errorPageEnabled && !aborted; + } + + void WebContentsDelegateQt::DidFailLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code) +@@ -511,8 +508,7 @@ void WebContentsDelegateQt::DidFailLoad(content::RenderFrameHost* render_frame_h + Q_ASSERT(error_code == -3 /* ERR_ABORTED */); + m_loadingErrorFrameList.removeOne(render_frame_host->GetRoutingID()); + m_viewClient->iconChanged(QUrl()); +- +- EmitLoadFinished(false /* success */, toQt(validated_url), true /* isErrorPage */); ++ emitLoadFinished(/* isErrorPage = */true); + return; + } + // Qt6: Consider getting rid of the error_description (Chromium already has) +@@ -532,7 +528,7 @@ void WebContentsDelegateQt::DidFinishLoad(content::RenderFrameHost* render_frame + // Trigger LoadFinished signal for main frame's error page only. + if (!render_frame_host->GetParent()) { + m_viewClient->iconChanged(QUrl()); +- EmitLoadFinished(true /* success */, toQt(validated_url), true /* isErrorPage */); ++ emitLoadFinished(/* isErrorPage = */true); + } + + return; +@@ -550,7 +546,11 @@ void WebContentsDelegateQt::DidFinishLoad(content::RenderFrameHost* render_frame + int http_statuscode = entry ? entry->GetHttpStatusCode() : 0; + bool errorPageEnabled = webEngineSettings()->testAttribute(WebEngineSettings::ErrorPageEnabled); + bool triggersErrorPage = errorPageEnabled && (http_statuscode >= 400) && m_isDocumentEmpty; +- EmitLoadFinished(http_statuscode < 400, toQt(validated_url), false /* isErrorPage */, http_statuscode, QString(), triggersErrorPage); ++ ++ m_loadingInfo.success = http_statuscode < 400; ++ m_loadingInfo.url = toQt(validated_url); ++ m_loadingInfo.errorCode = http_statuscode; ++ m_loadingInfo.triggersErrorPage = triggersErrorPage; + } + + void WebContentsDelegateQt::DidUpdateFaviconURL(content::RenderFrameHost *render_frame_host, const std::vector &candidates) +diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h +index 5a3dff6e9..7149f6bff 100644 +--- a/src/core/web_contents_delegate_qt.h ++++ b/src/core/web_contents_delegate_qt.h +@@ -216,9 +216,9 @@ private: + WindowOpenDisposition disposition, const gfx::Rect &initial_pos, + const QUrl &url, + bool user_gesture); +- void EmitLoadStarted(const QUrl &url, bool isErrorPage = false); +- void EmitLoadFinished(bool success, const QUrl &url, bool isErrorPage = false, int errorCode = 0, const QString &errorDescription = QString(), bool triggersErrorPage = false); +- void EmitLoadCommitted(); ++ void emitLoadStarted(bool isErrorPage = false); ++ void emitLoadFinished(bool isErrorPage = false); ++ void emitLoadCommitted(); + + LoadingState determineLoadingState(content::WebContents *contents); + void setLoadingState(LoadingState state); +@@ -242,9 +242,17 @@ private: + int m_desktopStreamCount = 0; + mutable bool m_pendingUrlUpdate = false; + +- QMap m_loadProgressMap; +- QUrl m_lastLoadedUrl; +- bool m_isNavigationCommitted = false; ++ struct LoadingInfo { ++ bool success = false; ++ int progress = -1; ++ bool isLoading() const { return progress >= 0; } ++ QUrl url; ++ int errorCode = 0; ++ QString errorDescription; ++ bool triggersErrorPage = false; ++ void clear() { *this = LoadingInfo(); } ++ } m_loadingInfo; ++ + bool m_isDocumentEmpty = true; + base::WeakPtrFactory m_weakPtrFactory { this }; + }; +diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp +index 6ab1c97cb..1de7f1c7f 100644 +--- a/src/webengine/api/qquickwebengineview.cpp ++++ b/src/webengine/api/qquickwebengineview.cpp +@@ -496,11 +496,9 @@ Q_STATIC_ASSERT(static_cast(WebEngineError::NoErrorDomain) == static_cast(WebEngineError::CertificateErrorDomain) == static_cast(QQuickWebEngineView::CertificateErrorDomain)); + Q_STATIC_ASSERT(static_cast(WebEngineError::DnsErrorDomain) == static_cast(QQuickWebEngineView::DnsErrorDomain)); + +-void QQuickWebEngineViewPrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, +- const QString &errorDescription, bool triggersErrorPage) ++void QQuickWebEngineViewPrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) + { + Q_Q(QQuickWebEngineView); +- Q_UNUSED(triggersErrorPage); + + if (isErrorPage) { + #if QT_CONFIG(webengine_testsupport) +diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h +index ebe55c345..ec535298b 100644 +--- a/src/webengine/api/qquickwebengineview_p_p.h ++++ b/src/webengine/api/qquickwebengineview_p_p.h +@@ -116,8 +116,7 @@ public: + void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) override; + void loadCommitted() override; + void loadVisuallyCommitted() override; +- void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, +- const QString &errorDescription, bool triggersErrorPage) override; ++ void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) override; + void focusContainer() override; + void unhandledKeyEvent(QKeyEvent *event) override; + QSharedPointer +diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp +index e08afed44..b32c15039 100644 +--- a/src/webenginewidgets/api/qwebenginepage.cpp ++++ b/src/webenginewidgets/api/qwebenginepage.cpp +@@ -282,28 +282,20 @@ void QWebEnginePagePrivate::loadStarted(const QUrl &provisionalUrl, bool isError + QTimer::singleShot(0, q, &QWebEnginePage::loadStarted); + } + +-void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, +- const QString &errorDescription, bool triggersErrorPage) ++void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) + { + Q_Q(QWebEnginePage); + Q_UNUSED(url); + Q_UNUSED(errorCode); + Q_UNUSED(errorDescription); + +- if (isErrorPage) { +- QTimer::singleShot(0, q, [q](){ +- emit q->loadFinished(false); +- }); ++ if (isErrorPage) + return; +- } + + isLoading = false; +- Q_ASSERT((success && !triggersErrorPage) || !success); +- if (!triggersErrorPage) { +- QTimer::singleShot(0, q, [q, success](){ +- emit q->loadFinished(success); +- }); +- } ++ QTimer::singleShot(0, q, [q, success](){ ++ emit q->loadFinished(success); ++ }); + } + + void QWebEnginePagePrivate::didPrintPageToPdf(const QString &filePath, bool success) +diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h +index 82ce99503..ae3ab5d25 100644 +--- a/src/webenginewidgets/api/qwebenginepage_p.h ++++ b/src/webenginewidgets/api/qwebenginepage_p.h +@@ -107,8 +107,7 @@ public: + void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) override; + void loadCommitted() override { } + void loadVisuallyCommitted() override { } +- void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, +- const QString &errorDescription, bool triggersErrorPage) override; ++ void loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) override; + void focusContainer() override; + void unhandledKeyEvent(QKeyEvent *event) override; + QSharedPointer diff --git a/srcpkgs/qt5-webengine/patches/0121-glibc-2.33.patch b/srcpkgs/qt5-webengine/patches/0121-glibc-2.33.patch new file mode 100644 index 0000000000..3a0ba3b2d8 --- /dev/null +++ b/srcpkgs/qt5-webengine/patches/0121-glibc-2.33.patch @@ -0,0 +1,144 @@ +# Patch made by Kevin Kofler +# https://bugzilla.redhat.com/show_bug.cgi?id=1904652 + +diff -ur qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc +--- qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc 2020-11-07 02:22:36.000000000 +0100 ++++ qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc 2021-01-20 02:14:53.066223906 +0100 +@@ -257,6 +257,18 @@ + return RestrictKillTarget(current_pid, sysno); + } + ++#if defined(__NR_newfstatat) ++ if (sysno == __NR_newfstatat) { ++ return RewriteFstatatSIGSYS(); ++ } ++#endif ++ ++#if defined(__NR_fstatat64) ++ if (sysno == __NR_fstatat64) { ++ return RewriteFstatatSIGSYS(); ++ } ++#endif ++ + if (SyscallSets::IsFileSystem(sysno) || + SyscallSets::IsCurrentDirectory(sysno)) { + return Error(fs_denied_errno); +diff -ur qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc +--- qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc 2020-11-07 02:22:36.000000000 +0100 ++++ qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc 2021-01-22 19:02:55.651668257 +0100 +@@ -6,6 +6,8 @@ + + #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h" + ++#include ++#include + #include + #include + #include +@@ -355,6 +357,35 @@ + return -ENOSYS; + } + ++intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, ++ void* aux) { ++ switch (args.nr) { ++#if defined(__NR_newfstatat) ++ case __NR_newfstatat: ++#endif ++#if defined(__NR_fstatat64) ++ case __NR_fstatat64: ++#endif ++#if defined(__NR_newfstatat) || defined(__NR_fstatat64) ++ if (*reinterpret_cast(args.args[1]) == '\0' ++ && args.args[3] == static_cast(AT_EMPTY_PATH)) { ++ return sandbox::sys_fstat64(static_cast(args.args[0]), ++ reinterpret_cast(args.args[2])); ++ } else { ++ errno = EACCES; ++ return -1; ++ } ++ break; ++#endif ++ } ++ ++ CrashSIGSYS_Handler(args, aux); ++ ++ // Should never be reached. ++ RAW_CHECK(false); ++ return -ENOSYS; ++} ++ + bpf_dsl::ResultExpr CrashSIGSYS() { + return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL); + } +@@ -387,6 +418,10 @@ + return bpf_dsl::Trap(SIGSYSSchedHandler, NULL); + } + ++bpf_dsl::ResultExpr RewriteFstatatSIGSYS() { ++ return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL); ++} ++ + void AllocateCrashKeys() { + #if !defined(OS_NACL_NONSFI) + if (seccomp_crash_key) +diff -ur qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h +--- qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h 2020-11-07 02:22:36.000000000 +0100 ++++ qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h 2021-01-20 02:11:04.583714199 +0100 +@@ -62,6 +62,10 @@ + // sched_setparam(), sched_setscheduler() + SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args, + void* aux); ++// If the fstatat syscall is actually a disguised fstat, calls the regular fstat ++// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler. ++SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, ++ void* aux); + + // Variants of the above functions for use with bpf_dsl. + SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS(); +@@ -72,6 +76,7 @@ + SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex(); + SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace(); + SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS(); ++SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS(); + + // Allocates a crash key so that Seccomp information can be recorded. + void AllocateCrashKeys(); +diff -ur qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/services/syscall_wrappers.cc qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/services/syscall_wrappers.cc +--- qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/services/syscall_wrappers.cc 2020-11-07 02:22:36.000000000 +0100 ++++ qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/services/syscall_wrappers.cc 2021-01-20 02:41:12.033133269 +0100 +@@ -261,4 +261,13 @@ + + #endif // defined(MEMORY_SANITIZER) + ++SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf) ++{ ++#if defined(__NR_fstat64) ++ return syscall(__NR_fstat64, fd, buf); ++#else ++ return syscall(__NR_fstat, fd, buf); ++#endif ++} ++ + } // namespace sandbox +diff -ur qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/services/syscall_wrappers.h qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/services/syscall_wrappers.h +--- qtwebengine-everywhere-src-5.15.2/src/3rdparty/chromium/sandbox/linux/services/syscall_wrappers.h 2020-11-07 02:22:36.000000000 +0100 ++++ qtwebengine-everywhere-src-5.15.2-#1904652/src/3rdparty/chromium/sandbox/linux/services/syscall_wrappers.h 2021-01-20 02:40:26.499827829 +0100 +@@ -17,6 +17,7 @@ + struct rlimit64; + struct cap_hdr; + struct cap_data; ++struct stat64; + + namespace sandbox { + +@@ -84,6 +85,9 @@ + const struct sigaction* act, + struct sigaction* oldact); + ++// Recent glibc rewrites fstat to fstatat. ++SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf); ++ + } // namespace sandbox + + #endif // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_ diff --git a/srcpkgs/qt5-webengine/patches/QTBUG-91715.patch b/srcpkgs/qt5-webengine/patches/QTBUG-91715.patch deleted file mode 100644 index db90ebed7c..0000000000 --- a/srcpkgs/qt5-webengine/patches/QTBUG-91715.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 199ea00a9eea13315a652c62778738629185b059 Mon Sep 17 00:00:00 2001 -From: Allan Sandfeld Jensen -Date: Wed, 10 Mar 2021 17:14:27 +0100 -Subject: [PATCH] Fix normalization of app locales - -Use the internal Chromium routine to get the app locale Chromium -expects. - -Fixes: QTBUG-91715 -Change-Id: I5042eb066cb6879ad69628959912f2841867b4e8 -Reviewed-by: Michael BrĂ¼ning ---- - -diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp -index e13ecd8..c2c78ff 100644 ---- a/src/core/content_browser_client_qt.cpp -+++ b/src/core/content_browser_client_qt.cpp -@@ -471,7 +471,12 @@ - - std::string ContentBrowserClientQt::GetApplicationLocale() - { -- return WebEngineLibraryInfo::getApplicationLocale(); -+ std::string bcp47Name = QLocale().bcp47Name().toStdString(); -+ if (m_cachedQtLocale != bcp47Name) { -+ m_cachedQtLocale = bcp47Name; -+ m_appLocale = WebEngineLibraryInfo::getApplicationLocale(); -+ } -+ return m_appLocale; - } - - std::string ContentBrowserClientQt::GetAcceptLangs(content::BrowserContext *context) -diff --git a/src/core/content_browser_client_qt.h b/src/core/content_browser_client_qt.h -index 7c8aa3a..1ccd292 100644 ---- a/src/core/content_browser_client_qt.h -+++ b/src/core/content_browser_client_qt.h -@@ -269,6 +269,8 @@ - - private: - scoped_refptr m_shareGroupQtQuick; -+ std::string m_appLocale; -+ std::string m_cachedQtLocale; - }; - - } // namespace QtWebEngineCore -diff --git a/src/core/web_engine_library_info.cpp b/src/core/web_engine_library_info.cpp -index 2ad5b75..09a4141 100644 ---- a/src/core/web_engine_library_info.cpp -+++ b/src/core/web_engine_library_info.cpp -@@ -46,6 +46,7 @@ - #include "components/spellcheck/spellcheck_buildflags.h" - #include "content/public/common/content_paths.h" - #include "sandbox/policy/switches.h" -+#include "ui/base/l10n/l10n_util.h" - #include "ui/base/ui_base_paths.h" - #include "ui/base/ui_base_switches.h" - -@@ -353,18 +354,15 @@ - std::string WebEngineLibraryInfo::getApplicationLocale() - { - base::CommandLine *parsedCommandLine = base::CommandLine::ForCurrentProcess(); -- if (!parsedCommandLine->HasSwitch(switches::kLang)) { -+ if (parsedCommandLine->HasSwitch(switches::kLang)) { -+ return parsedCommandLine->GetSwitchValueASCII(switches::kLang); -+ } else { - const QString &locale = QLocale().bcp47Name(); -- -- // QLocale::bcp47Name returns "en" for American English locale. Chromium requires the "US" suffix -- // to clarify the dialect and ignores the shorter version. -- if (locale == "en") -- return "en-US"; -- -- return locale.toStdString(); -+ std::string resolvedLocale; -+ if (l10n_util::CheckAndResolveLocale(locale.toStdString(), &resolvedLocale)) -+ return resolvedLocale; - } -- -- return parsedCommandLine->GetSwitchValueASCII(switches::kLang); -+ return "en-US"; - } - - #if defined(OS_WIN) -diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp -index 0219863..bf2c28a 100644 ---- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp -+++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp -@@ -123,6 +123,7 @@ - void doNotBreakLayout(); - - void changeLocale(); -+ void mixLangLocale(); - void inputMethodsTextFormat_data(); - void inputMethodsTextFormat(); - void keyboardEvents(); -@@ -1210,6 +1211,29 @@ - QCOMPARE(errorLines.first().toUtf8(), QByteArrayLiteral("Die Website ist nicht erreichbar")); - } - -+void tst_QWebEngineView::mixLangLocale() -+{ -+ for (QString locale : { "en_DK", "de_CH", "eu_ES" }) { -+ QLocale::setDefault(locale); -+ QWebEngineView view; -+ QSignalSpy loadSpy(&view, &QWebEngineView::loadFinished); -+ -+ bool terminated = false; -+ auto sc = connect(view.page(), &QWebEnginePage::renderProcessTerminated, [&] () { terminated = true; }); -+ -+ view.load(QUrl("qrc:///resources/dummy.html")); -+ QTRY_VERIFY(terminated || loadSpy.count() == 1); -+ -+ QVERIFY2(!terminated, -+ qPrintable(QString("Locale [%1] terminated: %2, loaded: %3").arg(locale).arg(terminated).arg(loadSpy.count()))); -+ QVERIFY(loadSpy.first().first().toBool()); -+ -+ QString content = toPlainTextSync(view.page()); -+ QVERIFY2(!content.isEmpty() && content.contains("test content"), qPrintable(content)); -+ } -+ QLocale::setDefault(QLocale("en")); -+} -+ - void tst_QWebEngineView::inputMethodsTextFormat_data() - { - QTest::addColumn("string"); diff --git a/srcpkgs/qt5-webengine/template b/srcpkgs/qt5-webengine/template index b647a92d46..0821414452 100644 --- a/srcpkgs/qt5-webengine/template +++ b/srcpkgs/qt5-webengine/template @@ -1,9 +1,9 @@ # Template file for 'qt5-webengine' pkgname=qt5-webengine -version=5.15.3 -revision=2 -_commit=a059e7404a6db799f4da0ad696e65ae9c854b4b0 -_chromium_commit=d9d9e606cb34b1b4ac0f44de132b1eb10763f1f6 +version=5.15.4 +revision=1 +_commit=0d4ca9cfb0d6e538172005e1c4b0b3a021b1c18c +_chromium_commit=3f594ea1afb8b18c864715a796ef21099d432a13 archs="x86_64* i686* armv[67]* ppc64* aarch64*" wrksrc="qtwebengine-${_commit}" build_style=qmake @@ -31,8 +31,8 @@ license="GPL-3.0-or-later, LGPL-3.0-or-later" homepage="https://qt.io/" distfiles="https://github.com/qt/qtwebengine/archive/${_commit}.tar.gz https://github.com/qt/qtwebengine-chromium/archive/${_chromium_commit}.tar.gz" -checksum="8e86257d25a641939d50c14de2049b384c371fcb70a60a289dc5426be0423b40 - ee97e569529a60729e3c6b7317011fd2cc40600079e90c4afa2e5ea9edcd58ef" +checksum="cea995e14c599c0c46b53b9938fd16f2360b639bf77e88a28ea26f518bb7b578 + fa0cab27cc32284f5af227a3dabde05ed6755f06641db6a6ca1c66848b10f715" patch_args="-Np1" no_generic_pkgconfig_link=yes