commit a56a2d42764d85c4211eaa5c1a196555d700b76ab7bcbb7a709c1c0ee7747ca5 Author: Adrian Schröter Date: Fri May 3 15:42:56 2024 +0200 Sync from SUSE:SLFO:Main libqt5-qtwebengine revision 34237511a72d17650c4f90320fe6182d diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/0001-skia-Some-includes-to-fix-build-with-GCC-12.patch b/0001-skia-Some-includes-to-fix-build-with-GCC-12.patch new file mode 100644 index 0000000..e5e0344 --- /dev/null +++ b/0001-skia-Some-includes-to-fix-build-with-GCC-12.patch @@ -0,0 +1,27 @@ +From 68799a1e0815b20ca59ce354a55280399257a201 Mon Sep 17 00:00:00 2001 +From: Fabian Vogt +Date: Fri, 25 Mar 2022 15:29:28 +0100 +Subject: [PATCH] skia: Some includes to fix build with GCC 12 + +Those includes got introduced upstream for other reasons and fixed building +with GCC 12 as a side effect. +--- + src/3rdparty/chromium/third_party/skia/include/core/SkColor.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/3rdparty/chromium/third_party/skia/include/core/SkColor.h b/src/3rdparty/chromium/third_party/skia/include/core/SkColor.h +index 36527e38e53..f77c24ade82 100644 +--- a/src/3rdparty/chromium/third_party/skia/include/core/SkColor.h ++++ b/src/3rdparty/chromium/third_party/skia/include/core/SkColor.h +@@ -12,6 +12,8 @@ + #include "include/core/SkScalar.h" + #include "include/core/SkTypes.h" + ++#include ++ + /** \file SkColor.h + + Types, consts, functions, and macros for colors. +-- +2.34.1 + diff --git a/_constraints b/_constraints new file mode 100644 index 0000000..0274283 --- /dev/null +++ b/_constraints @@ -0,0 +1,28 @@ + + + + 12 + + + 14 + + + 12 + + 4 + + + + armv6l + armv7l + + + + 9 + + + 8 + + + + diff --git a/_service b/_service new file mode 100644 index 0000000..daef2c8 --- /dev/null +++ b/_service @@ -0,0 +1,22 @@ + + + enable + 5.15.16 + git://code.qt.io/qt/qtwebengine.git + git + qtwebengine-everywhere-src + v5.15.16-lts + + + disable + https://chromium.googlesource.com/catapult + main + git + catapult + git + + + *.tar + xz + + diff --git a/_servicedata b/_servicedata new file mode 100644 index 0000000..3a5e391 --- /dev/null +++ b/_servicedata @@ -0,0 +1,4 @@ + + + git://code.qt.io/qt/qtwebengine.git + 224806a7022eed6d5c75b486bec8715a618cb314 \ No newline at end of file diff --git a/armv6-ffmpeg-no-thumb.patch b/armv6-ffmpeg-no-thumb.patch new file mode 100644 index 0000000..a459331 --- /dev/null +++ b/armv6-ffmpeg-no-thumb.patch @@ -0,0 +1,13 @@ +Index: qtwebengine-everywhere-src-5.11.0-alpha/src/3rdparty/chromium/third_party/ffmpeg/chromium/config/Chromium/linux/arm/config.h +=================================================================== +--- qtwebengine-everywhere-src-5.11.0-alpha.orig/src/3rdparty/chromium/third_party/ffmpeg/chromium/config/Chromium/linux/arm/config.h ++++ qtwebengine-everywhere-src-5.11.0-alpha/src/3rdparty/chromium/third_party/ffmpeg/chromium/config/Chromium/linux/arm/config.h +@@ -566,7 +566,7 @@ + #define CONFIG_NEON_CLOBBER_TEST 0 + #define CONFIG_OSSFUZZ 0 + #define CONFIG_PIC 1 +-#define CONFIG_THUMB 1 ++#define CONFIG_THUMB 0 + #define CONFIG_VALGRIND_BACKTRACE 0 + #define CONFIG_XMM_CLOBBER_TEST 0 + #define CONFIG_BSFS 1 diff --git a/catapult-git.tar.xz b/catapult-git.tar.xz new file mode 100644 index 0000000..c47486d --- /dev/null +++ b/catapult-git.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c550a6ae4ad834bcf97bfe7594b48c25d72657a801dfeb655d0553e0cc7074d0 +size 99546648 diff --git a/disable-gpu-when-using-nouveau-boo-1005323.diff b/disable-gpu-when-using-nouveau-boo-1005323.diff new file mode 100644 index 0000000..82d429b --- /dev/null +++ b/disable-gpu-when-using-nouveau-boo-1005323.diff @@ -0,0 +1,94 @@ +From: Antonio Larrosa +Subject: Disable GPU when using nouveau or running on wayland +References: boo#1005323, boo#1060990 + +Qt WebEngine uses multi-threaded OpenGL, which nouveau does not support. +It also crashes when running on wayland, the cause is not yet known. +Work around these issues by not doing GPU-accelerated rendering in such +cases. + +Index: qtwebengine-everywhere-src-5.15.1/src/core/web_engine_context.cpp +=================================================================== +--- qtwebengine-everywhere-src-5.15.1.orig/src/core/web_engine_context.cpp ++++ qtwebengine-everywhere-src-5.15.1/src/core/web_engine_context.cpp +@@ -127,6 +127,7 @@ + #include + #if QT_CONFIG(opengl) + # include ++# include + #endif + #include + #include +@@ -186,6 +187,39 @@ void dummyGetPluginCallback(const std::v + } + #endif + ++#ifndef QT_NO_OPENGL ++QString openGLVendor() ++{ ++ QString vendor; ++ ++ QOpenGLContext *oldContext = QOpenGLContext::currentContext(); ++ QSurface *oldSurface = 0; ++ if (oldContext) ++ oldSurface = oldContext->surface(); ++ ++ QScopedPointer surface( new QOffscreenSurface ); ++ surface->create(); ++ QOpenGLContext context; ++ if (!context.create()) { ++ qDebug() << "Error creating openGL context"; ++ } ++ else if (!context.makeCurrent(surface.data())) { ++ qDebug() << "Error making openGL context current context"; ++ } else { ++ const GLubyte *p; ++ QOpenGLFunctions *f = context.functions(); ++ if ((p = f->glGetString(GL_VENDOR))) ++ vendor = QString::fromLatin1(reinterpret_cast(p)); ++ } ++ ++ context.doneCurrent(); ++ if (oldContext && oldSurface) ++ oldContext->makeCurrent(oldSurface); ++ ++ return vendor; ++} ++#endif ++ + } // namespace + + namespace QtWebEngineCore { +@@ -697,10 +731,31 @@ WebEngineContext::WebEngineContext() + const char *glType = 0; + #if QT_CONFIG(opengl) + ++ bool disableGpu = qEnvironmentVariableIsSet("QT_WEBENGINE_DISABLE_GPU"); ++ ++ if (!qEnvironmentVariableIsSet("QT_WEBENGINE_DISABLE_WAYLAND_WORKAROUND") && qApp->platformName().startsWith("wayland", Qt::CaseInsensitive)) ++ { ++ qWarning() << "Running on wayland. Qt WebEngine will disable usage of the GPU.\n" ++ "Note: you can set the QT_WEBENGINE_DISABLE_WAYLAND_WORKAROUND\n" ++ "environment variable before running this application, but this is \n" ++ "not recommended since this usually causes applications to crash."; ++ disableGpu = true; ++ } ++ ++ if (!qEnvironmentVariableIsSet("QT_WEBENGINE_DISABLE_NOUVEAU_WORKAROUND") && openGLVendor() == QStringLiteral("nouveau")) ++ { ++ qWarning() << "Nouveau openGL driver detected. Qt WebEngine will disable usage of the GPU.\n" ++ "Note: you can set the QT_WEBENGINE_DISABLE_NOUVEAU_WORKAROUND\n" ++ "environment variable before running this application, but this is \n" ++ "not recommended since this usually causes applications to crash as\n" ++ "Nouveau openGL drivers don't support multithreaded rendering"; ++ disableGpu = true; ++ } ++ + const bool tryGL = (usingDefaultSGBackend() && !usingSoftwareDynamicGL() && + QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) + || enableGLSoftwareRendering; +- if (tryGL) { ++ if (tryGL && !disableGpu) { + if (qt_gl_global_share_context() && qt_gl_global_share_context()->isValid()) { + // If the native handle is QEGLNativeContext try to use GL ES/2. + // If there is no native handle, assume we are using wayland and try GL ES/2. diff --git a/libqt5-qtwebengine-rpmlintrc b/libqt5-qtwebengine-rpmlintrc new file mode 100644 index 0000000..0f7d171 --- /dev/null +++ b/libqt5-qtwebengine-rpmlintrc @@ -0,0 +1,2 @@ +# Silence rpmlint error. The libraries SONAME won't change +addFilter("shlib-policy-name-error .*") diff --git a/libqt5-qtwebengine.changes b/libqt5-qtwebengine.changes new file mode 100644 index 0000000..63141d6 --- /dev/null +++ b/libqt5-qtwebengine.changes @@ -0,0 +1,1861 @@ +------------------------------------------------------------------- +Wed Nov 22 09:44:27 UTC 2023 - christophe@krop.fr + +- Update to version 5.15.16: + * Bump version to 5.15.16 + * Add check for system ffmpeg compatibility + * Fix handling of external URLs in PDFs + * Update Chromium: + * [Backport] CVE-2023-5996: Use after free in WebAudio + * [Backport] CVE-2023-5482 and CVE-2023-5849 + * [Backport] CVE-2023-45853: Buffer overflow in MiniZip + * [Backport] Security bug 1478470 + * [Backport] Security bug 1472365 and 1472366 + * [Backport] CVE-2023-5218: Use after free in Site Isolation + * [Backport] Security bug 1486316 + * FIXUP: [Backport] [PA] Support 16kb pagesize on Linux+ARM64 + * [Backport] Add Intel Meteorlake GPU series type + * [Backport] Add Intel Raptorlake GPU series type + * [Backport] Add a few missing IntelGpuSeriesTypes in + gpu_util.cc + * [Backport] Add Intel Alchemist GPU series type + * [Backport] Add Alderlake to intel_gpu_series field in gpu + control list. + * [Backport] Add missing Intel GPU series types. + * [Backport] Add Alderlake's GPU to list supporting two NV12 + overlay planes. + * [Backport] CVE-2023-5217: Heap buffer overflow in vp8 + encoding in libvpx + * [Backport] Security bug 1479104 + * [Backport] [PA] Support 16kb pagesize on Linux+ARM64 + * [Backport] Replace uses of re2::StringPiece::set(). + * Fix build with GCC 13 + * Fix errors and warnings for perfetto + * Remove nodiscard attribute from cpwl_combo_box.h + * Bump V8_PATCH_LEVEL + * [Backport] CVE-2023-4762: Type Confusion in V8 + * [Backport] CVE-2023-4362: Heap buffer overflow in Mojom IDL + * [Backport] CVE-2023-4354: Heap buffer overflow in Skia + * [Backport] CVE-2023-4351: Use after free in Network + * Disable Windows IME for GPU thread + * [Backport] CVE-2023-4863: Heap buffer overflow in WebP + * [Backport] Security bug 1465224 + * [Backport] Dependency for security bug 1465224 + * [Backport] CVE-2023-4071: Heap buffer overflow in Visuals + * [Backport] CVE-2023-4076: Use after free in WebRTC + * [Backport] CVE-2023-4074: Use after free in Blink Task + Scheduling + +------------------------------------------------------------------- +Fri Sep 01 08:27:14 UTC 2023 - christophe@krop.fr + +- Update to version 5.15.15: + * Update Chromium: + * [Backport] Security bug 1454860 + * Further fixes for building with GCC 13 + * Fixup [Backport] CVE-2023-2935: Type Confusion in V8 + * [Backport] Security bug 1447430 + * [Backport] CVE-2023-2930: Use after free in Extensions + * [Backport] CVE-2023-3079: Type Confusion in V8 + * [Backport] CVE-2023-3216: Type Confusion in V8 + * [Backport] CVE-2023-2933: Use after free in PDF + * [Backport] CVE-2023-2935: Type Confusion in V8 + * [Backport] CVE-2023-2932: Use after free in PDF + * [Backport] CVE-2023-2931: Use after free in PDF + * [Backport] Security bug 1444195 + * [Backport] Security bug 1428743 + * [Backport] CVE-2023-2721: Use after free in Navigation + +------------------------------------------------------------------- +Fri Jul 28 19:03:30 UTC 2023 - Andreas Stieger + +- build with older re2 on Tumbleweed, the upcoming re2 2023-07-01 + breaks qtwebengine + +------------------------------------------------------------------- +Thu May 25 15:01:57 UTC 2023 - christophe@krop.fr + +- Update to version 5.15.14: + * Blacklist TouchInputTest::touchTap for sles 15.4 + * Blacklist tst_QWebEnginePage::mouseMovementProperties for SLES-15 + * Do not allow universal with debug builds + * Enable accessibility by default on Linux + * Fix blacklisting of mouseMovementProperties for sles 15.4 + * Fix build with GCC 13 + * Fix initialization of QWebEngineDownloadItem::totalBytes for Widgets + * Fix memory management in QPdfDocument functions + * Update Chromium: + * Fixes for building with GCC-13 + * [Backport] CVE-2023-1215: Type Confusion in CSS + * [Backport] CVE-2023-1217: Stack buffer overflow in Crash reporting + * [Backport] CVE-2023-1219: Heap buffer overflow in Metrics + * [Backport] CVE-2023-1220: Heap buffer overflow in UMA + * [Backport] CVE-2023-1222: Heap buffer overflow in Web Audio API + * [Backport] CVE-2023-1529: Out of bounds memory access in WebHID + * [Backport] CVE-2023-1530: Use after free in PDF + * [Backport] CVE-2023-1531: Use after free in ANGLE + * [Backport] CVE-2023-1534: Out of bounds read in ANGLE + * [Backport] CVE-2023-1810: Heap buffer overflow in Visuals + * [Backport] CVE-2023-1811: Use after free in Frames + * [Backport] CVE-2023-2033: Type Confusion in V8 + * [Backport] CVE-2023-2137: Heap buffer overflow in sqlite + * [Backport] CVE-2023-29469 / Security bug 1433328 + * [Backport] Security bug 1337747 + * [Backport] Security bug 1417585 + * [Backport] Security bug 1418734 + * [Backport] Security bug 1423360 + * [Backport] Security bug 1427388 +- Drop patch, merged upstream: + * 0001-Fixes-for-building-with-GCC-13.patch + +------------------------------------------------------------------- +Fri Apr 28 21:20:40 UTC 2023 - Dirk Müller + +- add python311-fixes.patch: + * Fix build when python3 is python 3.11+ + +------------------------------------------------------------------- +Tue Apr 11 19:28:44 UTC 2023 - Christophe Marin + +- Add patch to fix build with GCC 13 (boo#1207469): + * 0001-Fixes-for-building-with-GCC-13.patch + +------------------------------------------------------------------- +Thu Mar 09 10:11:11 UTC 2023 - christophe@krop.fr + +- Update to version 5.15.13: + * Force to disable IPC logging + * Move out GetInProcessGpuShareGroup form content browser client + * Fix probabilistic signature scheme + * Bump version to 5.15.13 + * Recreate response head objects on multiple redirect + * Add checksum to mailbox name in Release build too + * Drop dependency on content/public/browser in content gpu + * FIXUP: Mark Node::opcode() and Operator::opcode() + as constexpr + * [Backport] Add missing include for std::begin and std::end + in SkParseColor.cpp + * [Backport] CVE-2022-4179: Use after free in Audio + * [Backport] CVE-2022-4437: Use after free in Mojo IPC + * [Backport] CVE-2022-4438: Use after free in Blink Frames + * [Backport] CVE-2023-0129: Heap buffer overflow in + Network Service + * [Backport] CVE-2023-0472: Use after free in WebRTC + * [Backport] CVE-2023-0698: Out of bounds read in WebRTC + * [Backport] CVE-2023-0931: Use after free in Video + * [Backport] CVE-2023-0933: Integer overflow in PDF + * [Backport] Disable ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE + for clang-cl + * [Backport] Fix more clang deprecated builtins + * [Backport] Map the absl::is_trivially_* functions to their + std impl + * [Backport] Mark Node::opcode() and Operator::opcode() + as constexpr + * [Backport] Security bug 1393384 + * [Backport] Security bug 1394382 + * [Backport] Security bug 1399424 + * [Backport] Security bug 1406115 + * [Backport][Windows] Remove unused sidestep intercepts +- Update 0001-skia-Some-includes-to-fix-build-with-GCC-12.patch + +------------------------------------------------------------------- +Thu Mar 9 08:51:39 UTC 2023 - Martin Liška + +- Use gcc12 for openSUSE:Factory as workaround for boo#1207469. + +------------------------------------------------------------------- +Thu Dec 29 15:26:07 UTC 2022 - christophe@krop.fr + +- Update to version 5.15.12: + * Bump version to 5.15.12 + * Update Chromium: + * Bump V8_PATCH_LEVEL + * Fixup for patch for CVE-2022-3200 on OpenSuse 15.1 + * Fixup the patch for CVE-2022-3200 on 87-based / 5.15 + * [Backport] CVE-2022-3038: Use after free in Network Service + * [Backport] CVE-2022-3040: Use after free in Layout + * [Backport] CVE-2022-3041: Use after free in WebSQL + * [Backport] CVE-2022-3046: Use after free in Browser Tag + * [Backport] CVE-2022-3075: Insufficient data validation in Mojo + * [Backport] CVE-2022-3196: Use after free in PDF + * [Backport] CVE-2022-3197: Use after free in PDF + * [Backport] CVE-2022-3198: Use after free in PDF + * [Backport] CVE-2022-3199: Use after free in Frames. + * [Backport] CVE-2022-3200: Heap buffer overflow in Internals + * [Backport] CVE-2022-3201: Insufficient validation of untrusted + input in Developer Tools (1/2) + * [Backport] CVE-2022-3201: Insufficient validation of untrusted + input in Developer Tools (2/2) + * [Backport] CVE-2022-3304: Use after free in CSS + * [Backport] CVE-2022-3370: Use after free in Custom Elements + * [Backport] CVE-2022-3373: Out of bounds write in V8 + * [Backport] CVE-2022-3445: Use after free in Skia. + * [Backport] CVE-2022-3446 and CVE-2022-35737 + * [Backport] CVE-2022-3885: Use after free in V8 + * [Backport] CVE-2022-3887: Use after free in Web Workers + * [Backport] CVE-2022-3889: Type Confusion in V8 + * [Backport] CVE-2022-3890: Heap buffer overflow in Crashpad + * [Backport] CVE-2022-4174: Type Confusion in V8 + * [Backport] CVE-2022-4180: Use after free in Mojo + * [Backport] CVE-2022-4181: Use after free in Forms + * [Backport] CVE-2022-4262: Type Confusion in V8 + * [Backport] Security bug 1356308 + * [Backport] Security bug 1378916 + * [Backport] Security bugs 1346938 and 1338114 + +------------------------------------------------------------------- +Wed Oct 05 17:28:40 UTC 2022 - christophe@krop.fr + +- Update to version 5.15.11: + * Work-around GNOME bug misidentifying HTML content + * Fix busy waiting on streaming QIODevice's + * Add workaround for un-minimizing QWebEngineView under Gnome + * Build the QtDesigner plugin in all configurations + * Bump version to 5.15.11 + * Fix method check + * Do not use the native dialog to show the color picker on macOS + * FIXUP: Add workaround for unstable gn on macOS in ci + * Fix top level build with no widget + * Fix touch input for widget's delegate for html popup + * Keep page's zoom level on loading new urls + * Fix leak if loader error is seen first + * Add workaround for unstable gn on macOS in ci + * Pass archiver to gn build + * Fix read-after-free on EGL extensions + * Update Chromium: + * FIXUP: Fix url_utils for QtWebEngine + * FIXUP: Workaround MSVC2022 ICE in constexpr functions + * Fixup: CVE-2022-0796: Use after free in Media + * [Backport] CVE-2022-0796: Use after free in Media + * [Backport] CVE-2022-1855: Use after free in Messaging + * [Backport] CVE-2022-1857: Insufficient policy enforcement in + File System API + * [Backport] CVE-2022-2008: Out of bounds memory access in WebGL + * [Backport] CVE-2022-2010: Out of bounds read in compositing + * [Backport] CVE-2022-2158: Type Confusion in V8 + * [Backport] CVE-2022-2160: Insufficient policy enforcement + in DevTools + * [Backport] CVE-2022-2162: Insufficient policy enforcement in + File System API + * [Backport] CVE-2022-2294: Heap buffer overflow in WebRTC + * [Backport] CVE-2022-2295: Type Confusion in V8 + * [Backport] CVE-2022-2477 : Use after free in Guest View + * [Backport] CVE-2022-2610: Insufficient policy enforcement + in Background Fetch + * [Backport] CVE-2022-27404 + * [Backport] CVE-2022-27405 + * [Backport] CVE-2022-27406 + * [Backport] Linux sandbox: ENOSYS for some statx syscalls + * [Backport] Security bug 1287804 + * [Backport] Security bug 1316578 + * [Backport] Security bug 1343889 +- Replace sandbox-statx-futex_time64.patch with upstream change: + * sandbox_futex_time64.patch + +------------------------------------------------------------------- +Mon Sep 26 14:35:08 UTC 2022 - Christophe Giboudeaux + +- Use python 3.9 to build qtwebengine on Leap 15. + +------------------------------------------------------------------- +Fri Sep 23 18:01:11 UTC 2022 - Christophe Giboudeaux + +- Add patches to build with python 3, ffmpeg 5 and pipewire 0.3: + * qtwebengine-ffmpeg5.patch + * qtwebengine-pipewire-0.3.patch + * qtwebengine-python3.patch +- Use a newer catapult snapshot when building with python3 + +------------------------------------------------------------------- +Mon Aug 8 06:45:29 UTC 2022 - Christophe Giboudeaux + +- Stop using 'pkgconfig(xxx)' BuildRequires for FFmpeg + dependencies. They will point to FFmpeg-5 soon. + +------------------------------------------------------------------- +Wed Jun 8 14:36:14 UTC 2022 - Christophe Giboudeaux + +- Update to version 5.15.10: + * Fix top level build with no widget + * Fix read-after-free on EGL extensions + * Update Chromium + * Add workaround for unstable gn on macOS in ci + * Pass archiver to gn build + * Fix navigation to non-local URLs + * Add support for universal builds for qtwebengine and qtpdf + * Enable Apple Silicon support + * Fix cross compilation x86_64->arm64 on mac + * Bump version to 5.15.10 + * CustomDialogs: Make custom input fields readable in dark mode + * CookieBrowser: Make alternating rows readable in dark mode + * Update Chromium: + * Bump V8_PATCH_LEVEL + * Fix clang set-but-unused-variable warning + * Fix mac toolchain python linker script call + * Fix missing dependency for gpu sources + * Fix python calls + * Fix undefined symbol for universal link + * Quick fix for regression in service workers by reverting + backports + * [Backport] CVE-2022-0797: Out of bounds memory access + in Mojo + * [Backport] CVE-2022-1125 + * [Backport] CVE-2022-1138: Inappropriate implementation + in Web Cursor. + * [Backport] CVE-2022-1305: Use after free in storage + * [Backport] CVE-2022-1310: Use after free in regular + expressions + * [Backport] CVE-2022-1314: Type Confusion in V8 + * [Backport] CVE-2022-1493: Use after free in Dev Tools + * [Backport] On arm64 hosts, set host_cpu to 'arm64', not 'arm' + * [Backport] Security Bug 1296876 + * [Backport] Security bug 1269999 + * [Backport] Security bug 1280852 + * [Backport] Security bug 1292905 + * [Backport] Security bug 1304659 + * [Backport] Security bug 1306507 + +------------------------------------------------------------------- +Mon May 2 08:30:15 UTC 2022 - Martin Liška + +- Remove dependency on binutils-gold as the package will be removed + in the future. Gold linker is unmaintained by the upstream project. + +------------------------------------------------------------------- +Wed Apr 27 07:34:23 UTC 2022 - Christophe Giboudeaux + +- Add libqt5-qtwebengine-rpmlintrc to silence the + 'shlib-policy-name-error' rpmlint error + +------------------------------------------------------------------- +Wed Apr 06 14:41:04 UTC 2022 - christophe@krop.fr + +- Update to version 5.15.9: + * QPdfView: scale page rendering according to devicePixelRatio + * Update documented Chromium version + * Use IsSameDocument() rather than IsLoadingToDifferentDocument() + * Update module-split for installer + * Fix printing PDF files + * Do not override signal handlers + * Avoid using xkbcommon in non-X11 builds + * Update documentation + * Update Chromium: + * Bump V8_PATCH_LEVEL + * Do not overwrite signal handlers in the browser process. + * Replace base::ranges::set_union with std::set_union to fix + MSVC2017 build + * [Backport] CVE-2022-0100: Heap buffer overflow in Media + streams API + * [Backport] CVE-2022-0102: Type Confusion in V8 + * [Backport] CVE-2022-0103: Use after free in SwiftShader + * [Backport] CVE-2022-0104: Heap buffer overflow in ANGLE + * [Backport] CVE-2022-0108: Inappropriate implementation + in Navigation + * [Backport] CVE-2022-0109: Inappropriate implementation + in Autofill + * [Backport] CVE-2022-0111 and CVE-2022-0117 + * [Backport] CVE-2022-0113: Inappropriate implementatio + n in Blink + * [Backport] CVE-2022-0116: Inappropriate implementation + in Compositing + * [Backport] CVE-2022-0289: Use after free in Safe browsing + * [Backport] CVE-2022-0291: Inappropriate implementation + in Storage + * [Backport] CVE-2022-0293: Use after free in Web packaging + * [Backport] CVE-2022-0298: Use after free in Scheduling + * [Backport] CVE-2022-0305: Inappropriate implementation in + Service Worker API + * [Backport] CVE-2022-0306: Heap buffer overflow in PDFium + * [Backport] CVE-2022-0310 and CVE-0311: Heap buffer overflow + in Task Manager + * [Backport] CVE-2022-0456: Use after free in Web Search + * [Backport] CVE-2022-0459: Use after free in Screen Capture + * [Backport] CVE-2022-0460: Use after free in Window Dialog + * [Backport] CVE-2022-0461: Policy bypass in COOP + * [Backport] CVE-2022-0606: Use after free in ANGLE + * [Backport] CVE-2022-0607: Use after free in GPU + * [Backport] CVE-2022-0608: Integer overflow in Mojo + * [Backport] CVE-2022-0609: Use after free in Animation + * [Backport] CVE-2022-0610: Inappropriate implementation + in Gamepad API + * [Backport] CVE-2022-0971 (boo#1197163) + * [Backport] CVE-2022-1096 (boo#1197552) + * [Backport] CVE-2022-23852 + * [Backport] Copy 'name_' member during StyleRuleProperty::Copy + * [Backport] Security bug 1256885 + * [Backport] Security bug 1258603 + * [Backport] Security bug 1259557 + * [Backport] Security bug 1261415 + * [Backport] Security bug 1265570 + * [Backport] Security bug 1268448 + * [Backport] Security bug 1270014 + * [Backport] Security bug 1274113 + * [Backport] Security bug 1276331 + * [Backport] Security bug 1280743 + * [Backport] Security bug 1289394 + * [Backport] Security bug 1292537 + * [Backport] sandbox: build if glibc 2.34+ dynamic stack size + is enabled +- Drop patches, now upstream: + * CVE-2022-0971-qtwebengine-5.15.patch + * CVE-2022-1096-qtwebengine-5.15.patch + +------------------------------------------------------------------- +Mon Apr 4 19:25:12 UTC 2022 - Christophe Giboudeaux + +- Add security fixes: + * CVE-2022-0971-qtwebengine-5.15.patch (CVE-2022-0971, boo#1197163) + * CVE-2022-1096-qtwebengine-5.15.patch (CVE-2022-1096, boo#1197552) + +------------------------------------------------------------------- +Fri Mar 25 14:31:28 UTC 2022 - Fabian Vogt + +- Add patch to fix build with GCC 12: + * 0001-skia-Some-includes-to-fix-build-with-GCC-12.patch + +------------------------------------------------------------------- +Tue Jan 04 22:22:01 UTC 2022 - christophe@krop.fr + +- Update to version 5.15.8: + * Update Chromium: + [Backport] CVE-2021-3517: libxml2: Heap-based buffer overflow + in xmlEncodeEntitiesInternal() in entities.c + [Backport] CVE-2021-3541 libxml2: Exponential entity expansion + attack bypasses all existing protection mechanisms + [Backport] CVE-2021-37984 : Heap buffer overflow in PDFium + [Backport] CVE-2021-37987 : Use after free in Network APIs + [Backport] CVE-2021-37989 : Inappropriate implementation in Blink + [Backport] CVE-2021-37992 : Out of bounds read in WebAudio + [Backport] CVE-2021-37993 : Use after free in PDF Accessibility + [Backport] CVE-2021-37996 : Insufficient validation of untrusted + input in Downloads + [Backport] CVE-2021-38001 : Type Confusion in V8 + [Backport] CVE-2021-38003 : Inappropriate implementation in V8 + [Backport] CVE-2021-38005: Use after free in loader (1/3) + [Backport] CVE-2021-38005: Use after free in loader (2/3) + [Backport] CVE-2021-38005: Use after free in loader (3/3) + [Backport] CVE-2021-38007: Type Confusion in V8 + [Backport] CVE-2021-38009: Inappropriate implementation in cache + [Backport] CVE-2021-38010: Inappropriate implementation in serviceworkers + [Backport] CVE-2021-38012: Type Confusion in V8 + [Backport] CVE-2021-38015: Inappropriate implementation in input + [Backport] CVE-2021-38017: Insufficient policy enforcement in iframe + sandbox + [Backport] CVE-2021-38018: Inappropriate implementation in navigation + [Backport] CVE-2021-38019: Insufficient policy enforcement in CORS + [Backport] CVE-2021-38021: Inappropriate implementation in referrer + [Backport] CVE-2021-38022: Inappropriate implementation in WebAuthentication + [Backport] CVE-2021-4057: Use after free in file API + [Backport] CVE-2021-4058: Heap buffer overflow in ANGLE (1/2) + [Backport] CVE-2021-4058: Heap buffer overflow in ANGLE (2/2) + [Backport] CVE-2021-4059: Insufficient data validation in loader + [Backport] CVE-2021-4062: Heap buffer overflow in BFCache + [Backport] CVE-2021-4078: Type confusion in V8 + [Backport] CVE-2021-4079: Out of bounds write in WebRTC + [Backport] CVE-2021-4098: Insufficient data validation in Mojo + [Backport] CVE-2021-4099: Use after free in Swiftshader + [Backport] CVE-2021-4101: Heap buffer overflow in Swiftshader. + [Backport] CVE-2021-4102: Use after free in V8 + [Backport] Dependency for CVE-2021-37989 + [Backport] Dependency for CVE-2021-38009 + [Backport] Security bug 1245870 + [Backport] Security bug 1252858 + [Backport] Security bug 1259899 + Bump V8_PATCH_LEVEL + Compile with GCC 11 -std=c++20 + Fix stack overflow on gpu channel recreate with an error + Use wglSetPixelFormat directly only if in software mode + [Backport] Handle long SIGSTKSZ in glibc > 2.33 + [Backport] abseil-cpp: Fixes build with latest glibc + * Handle qtpdf compilation with static runtime + * Add bitcode support for qtpdf on ios + * Do not access accessibility from qt post routines + * Blacklist javascriptClipboard test on ubuntu 20.04 + * Re-enable network-service-in-process + * Bump version from 5.15.7 to 5.15.8 + * Update patch level + * Fix pinch gesture + * Fix leak of properties after XkbRF_GetNamesProp + * Fix leak on getDefaultScreeenId +- Drop patch: + * 0001-Fix-build-with-glibc-2.34.patch + +------------------------------------------------------------------- +Fri Oct 29 09:53:05 UTC 2021 - christophe@krop.fr + +- Update to version 5.15.7: + * Update Chromium: + [Backport] Linux sandbox: update syscalls numbers on 32-bit platforms + [Backport] sandbox: linux: allow clock_nanosleep & gettime64 + [Backport] Linux sandbox: update syscall numbers for all platforms. + [Backport] Ease HarfBuzz API change with feature detection + [Backport] Security bug 1248665 + [Backport] CVE-2021-37975 : Use after free in V8 + [Backport] CVE-2021-37980 : Inappropriate implementation in Sandbox + [Backport] CVE-2021-37979 : Heap buffer overflow in WebRTC (2/2) + [Backport] CVE-2021-37979 : Heap buffer overflow in WebRTC (1/2) + [Backport] CVE-2021-37978 : Heap buffer overflow in Blink + [Backport] CVE-2021-30616: Use after free in Media. + [Backport] CVE-2021-37962 : Use after free in Performance Manager (2/2) + [Backport] CVE-2021-37962 : Use after free in Performance Manager (1/2) + [Backport] CVE-2021-37973 : Use after free in Portals + [Backport] CVE-2021-37971 : Incorrect security UI in Web Browser UI. + [Backport] CVE-2021-37968 : Inappropriate implementation in Background Fetch API + [Backport] CVE-2021-37967 : Inappropriate implementation in Background Fetch API + [Backport] Linux sandbox: return ENOSYS for clone3 + [Backport] Linux sandbox: fix fstatat() crash + [Backport] Reland "Reland "Linux sandbox syscall broker: use struct kernel_stat"" + [Backport] Security bug 1238178 (2/2) + [Backport] Security bug 1238178 (1/2) + [Backport] CVE-2021-30633: Use after free in Indexed DB API (2/2) + [Backport] CVE-2021-30633: Use after free in Indexed DB API (1/2) + [Backport] CVE-2021-30630: Inappropriate implementation in Blink + [Backport] CVE-2021-30629: Use after free in Permissions + [Backport] CVE-2021-30628: Stack buffer overflow in ANGLE + [Backport] CVE-2021-30627: Type Confusion in Blink layout + [Backport] CVE-2021-30626: Out of bounds memory access in ANGLE + [Backport] CVE-2021-30625: Use after free in Selection API + [Backport] Security bug 1206289 + [Backport] CVE-2021-30613: Use after free in Base internals + [Backport] Security bug 1227228 + [Backport] CVE-2021-30618: Inappropriate implementation in DevTools + * Update patch level + * Blacklist certificate test until certicates have been renewed + * Block CORS from local URLs when remote access is not enabled + * Do not wait on weak_pointer for termination errors + * Support MSVC_VER 16.8 + * Fix wrong save file filter for Markdown Editor example + * Add Chromium version source documentation + * Bump version from 5.15.6 to 5.15.7 + * Fix crash when clicking on a link in PDF +- Drop openSUSE patches: + * fix1163766.patch. Should be addressed with: + https://github.com/qt/qtwebengine-chromium/commit/652f834de + https://github.com/qt/qtwebengine-chromium/commit/faae106ed + https://github.com/qt/qtwebengine-chromium/commit/6b7b3f1bf + * chromium-glibc-2.33.patch. Should be addressed with the + [Backport] Linux sandbox: fix fstatat() crash and + Reland "Reland "Linux sandbox syscall broker: use struct kernel_stat"" + changes. + * chromium-older-harfbuzz.patch +- Drop upstream changes: + * 0001-return-ENOSYS-for-clone3.patch + * chromium-harfbuzz-3.0.0.patch + * skia-harfbuzz-3.0.0.patch +- Rebase patches: + * sandbox-statx-futex_time64.patch + +------------------------------------------------------------------- +Tue Sep 21 11:34:41 UTC 2021 - Fabian Vogt + +- Add patches from Arch to fix build with HarfBuzz 3.0.0: + * chromium-harfbuzz-3.0.0.patch + * skia-harfbuzz-3.0.0.patch +- ... but don't break with < 2.9.0: + * chromium-older-harfbuzz.patch + +------------------------------------------------------------------- +Thu Sep 09 07:19:58 UTC 2021 - christophe@krop.fr + +- Update to version 5.15.6: + * Update Chromium: + + [Backport] CVE-2021-30560: Use after free in Blink XSLT + + [Backport] CVE-2021-30566: Stack buffer overflow in Printing + + [Backport] CVE-2021-30585: Use after free in sensor handling + + Bump V8_PATCH_LEVEL + + [Backport] Security bug 1228036 + + [Backport] CVE-2021-30604: Use after free in ANGLE + + [Backport] CVE-2021-30603: Race in WebAudio + + [Backport] CVE-2021-30602: Use after free in WebRTC + + [Backport] CVE-2021-30599: Type Confusion in V8 + + [Backport] CVE-2021-30598: Type Confusion in V8 + + [Backport] Security bug 1227933 + + [Backport] Security bug 1205059 + + [Backport] Security bug 1184294 + + [Backport] Security bug 1198385 + + [Backport] CVE-2021-30588: Type Confusion in V8 + + [Backport] CVE-2021-30587: Inappropriate implementation in Compositing on Windows + + [Backport] CVE-2021-30573: Use after free in GPU + + [Backport] CVE-2021-30569, security bugs 1198216 and 1204814 + + [Backport] CVE-2021-30568: Heap buffer overflow in WebGL + + [Backport] CVE-2021-30541: Use after free in V8 + + [Backport] Security bugs 1197786 and 1194330 + + [Backport] Security bug 1194689 + + [Backport] CVE-2021-30563: Type Confusion in V8 + + [Backport] Security bug 1211215 + + [Backport] Security bug 1209558 + + [Backport] CVE-2021-30553: Use after free in Network service + + [Backport] CVE-2021-30548: Use after free in Loader + + [Backport] CVE-2021-30547: Out of bounds write in ANGLE + + [Backport] CVE-2021-30556: Use after free in WebAudio + + [Backport] CVE-2021-30559: Out of bounds write in ANGLE + + [Backport] CVE-2021-30533: Insufficient policy enforcement in PopupBlocker + + [Backport] Security bug 1202534 + + [Backport] CVE-2021-30536: Out of bounds read in V8 + + [Backport] CVE-2021-30522: Use after free in WebAudio + + [Backport] CVE-2021-30554 Use after free in WebGL + + [Backport] CVE-2021-30551: Type Confusion in V8 + + [Backport] CVE-2021-30544: Use after free in BFCache + + [Backport] CVE-2021-30535: Double free in ICU + + [Backport] CVE-2021-30534: Insufficient policy enforcement in iFrameSandbox + + [Backport] CVE-2021-30530: Out of bounds memory access in WebAudio + + [Backport] CVE-2021-30523: Use after free in WebRTC + + Generate mojo bindings before compiling extension API registration + * Bump version from 5.15.5 to 5.15.6 + * Always send phased wheel events beginning with Began +- Import patch from the chromium package: + * 0001-return-ENOSYS-for-clone3.patch +- Add changes from the chromium package to + 0001-Fix-build-with-glibc-2.34.patch + +------------------------------------------------------------------- +Wed Aug 4 15:23:24 UTC 2021 - Christophe Giboudeaux + +- Add patch to fix build with glibc 2.34 (boo#1189095) + * 0001-Fix-build-with-glibc-2.34.patch + +------------------------------------------------------------------- +Thu Jun 24 16:39:27 UTC 2021 - Christophe Giboudeaux + +- Update the CMake version workaround to get qtbase's real version + +------------------------------------------------------------------- +Tue Jun 22 09:00:44 UTC 2021 - christophe@krop.fr + +- Update to version 5.15.5: + * Abort findText also right on explicit navigation request + * Adapt to new Connections syntax + * Add devtools eyedropper support + * Add more tests to tst_loadsignals + * Add support for Keyboard.getLayoutMap() + * Add web-ui chrome://net-internals + * Allow leaving OCSP off + * Always send phased wheel events beginning with Began + * Avoid accessing profileAdapter when profile is shutting down + * Avoid unknownFunc messages in qmltests + * Blacklist CertificateError::test_error for macOS + * Blacklist NewViewRequest::test_loadNewViewRequest on macOS + * Blacklist handleError on macos until we merge the fix + * Blacklist numberOfStartedAndFinishedSignalsIsSame on b2q CIs + * Depend on QCoreApplication::startingUp() for checking + existence of app + * Do not allow WebBluetooth to continue + * Do not hide virtual keyboard if the focused node is editable + * Doc: Add a note about navigation within a page to a fragment + * Docs: Suggest to use higher DPI for printing + * Fix FilePickerController's path validation for windows and + corresponding tests + * Fix application locales again + * Fix embedded PDFs when plugins are disabled + * Fix first party url for cookie filter + * Fix inconsistent number of load signals and their order + * Fix normalization of app locales + * Fix not working certificates on mac > 10.14 + * Fix prl files on ios + * Fix qmltests::WebEngineViewNavigationHistory auto tests + * Fix qtpdf static builds on windows + * Fix static build of qml qtpdf + * Follow InProcessGpuThread::Init() on thread priority + * Generate mojo bindings before compiling extension API + registration + * Implement PluginServiceFilterQt + * Load signals test: use focusProxy for link clicking test + * Make able to override disabled features from command line + * Notify canGoBack/canGoForward changes based on web actions + * Only disconnect QWebEnginePage signals that QWebEngineView + connected + * Package devtools inspector overlay + * Remove ResourceTypeSubFrame check after website update + * Remove obsolete loadSignals test + secondLoadForError_WhenErrorPageEnabled + * Remove qquickwebengineprofile test + * Remove tracking of frame which load error page + * Remove ui/snapshot overrides for aura + * Report server directs in navigation type + * Return to using the default devtools page + * Set enumaration root directory for File.webkitRelativePath API + * Set more Display properties + * Show PDF viewer in a guest view + * Support devtools close button in QuickNanoBrowser + * Support zoom-in, zoom-out and cell web cursors on macOS + * Unblacklist and fix load signals test for file download + * Update Chromium and adapt PermissionManagerQt + * Update platform notes + * View: test signal for deletion of external page set to view +- Drop patches: + * 0001-Fix-normalization-of-app-locales.patch + * 0001-Fix-build-with-GCC-11.patch + * 0001-Fix-build-with-system-ICU-69.patch + +------------------------------------------------------------------- +Thu May 6 11:45:34 UTC 2021 - Fabian Vogt + +- Add patch to fix build with ICU 69: + * 0001-Fix-build-with-system-ICU-69.patch + +------------------------------------------------------------------- +Wed Apr 14 18:26:57 UTC 2021 - Christophe Giboudeaux + +- Add patch to fix build with GCC 11: + * 0001-Fix-build-with-GCC-11.patch + +------------------------------------------------------------------- +Wed Apr 14 16:35:17 UTC 2021 - Guillaume GARDET + +- Update _constraints to avoid OOM + +------------------------------------------------------------------- +Tue Apr 13 20:12:47 UTC 2021 - Fabian Vogt + +- Add back missing part in fix1163766.patch (boo#1184610) + +------------------------------------------------------------------- +Wed Mar 24 12:45:13 UTC 2021 - christophe@krop.fr + +- Update to version 5.15.3: + * Fix spelling and coding style + * Fix new view request handling (QTBUG-87378) + * Fix getDefaultScreenId on X11 + * Fix flaky tst_QWebEngineView::textSelectionOutOfInputField test + * Move touch input tests to separate testcase + * Add touch input tests for scrolling and pinch zooming + * Fix rare duplicate ids forming in touch point id's mapping + * Use the module's version number for QtWebEngineProcess + * Touch handling: provide id mapping without modifying TouchPoint instance + (QTBUG-88001) + * Touch handling: fix mapped ids cleanup for TouchCancel event + * et custom headers from QWebEngineUrlRequestInfo before triggering redirect + (QTBUG-88861) + * Forward modifier flags for lock keys (QTBUG-89001) + * Fix handling of more than one finger for touch event (QTBUG-86389) + * Stabilize load signals emitting (QTBUG-65223, QTBUG-87089) + * Fix building against 5.12 on most CIs + * Update minimum HarfBuzz version to 2.4.0 (QTBUG-88976) + * Fix building against Qt 5.14 + * Migrate user script IPC to mojo + * Fix crashes in user resource controller when single process + * Minor. Fix namespace for user resource controller + * Minor. RenderThreadObserverQt is really a RenderConfiguration + * Remove RenderViewObserverHelper from UserResourceController + * Cache mojo interface bindings to UserResourceControllerRenderFrame + * Cache mojo interface bindings for WebChannelIPCTransport + * Migrate render_view_observer_qt to mojo + * Fix crash on linkedin.com (QTBUG-89740) + * Suppress error pages also for http errors if they are disabled + * Fix leak in QQuickWebEngineViewPrivate::contextMenuRequested + * Register PerformanceNode early enough + * Quiet log on webrtc usage + * Remove configure option that doesn't work + * Remove Java build dependency + * Fix blank popups in qml (QTBUG-86034) + * Fix position of popup on qml (QTBUG-86034, QTBUG-89358) + * Enable hangout services extension (QTBUG-85731) + * Allow to fallback to default locale for non existent data packs (QTBUG-90490) + * Support devtools close button + * Do not extract download file names from certain url schemes (QTBUG-90355) + * Leave room for the null-termination byte when checking remote drive path + (QTBUG-90347) + * Do not set open files limit for linking if not necessary + * Remove even more remains of non network service code + * Add back prefers-color-scheme support (QTBUG-89753) + * Start supporting chrome.resourcesPrivate API (QTBUG-90035) + * Enable chrome://user-actions WebUI + * Remove remains of chrome://flash + * Fix loadFinished signal if page has content but server sends HTTP error + (QTBUG-90517) + * Fix devtools page resource loading as raw data instead of html string + * Remove frame metadata observer (RenderWidgetHostViewQt) on destroy + * Resolve installed interceptors right before interception point (QTBUG-86286) + * Update searches faster + * Remove more leftovers of the old compositor + * Enable webrtc logging and the corresponding WebUI + * Support mips64el platform CPU(loongson 3A4000) + * Add tracing UI resources + * Fix crash on meet.google.com + * Fix mad popup qquickwindows on wayland + * Fix crashes on BrowserContext destruction + * Fix crash on exit in quicknanobrowser when popup + * Remove QtPdf dependency on nss at build-time + * Avoid accessing profileAdapter when profile is shutting down (QTBUG-91187) + * Do not flush messages form profile destructor + * Ignore QQuickWebEngineNewViewRequest if it is unhandled + * Fix ScopedGLContextChecker with QTWEBENGINE_DISABLE_GPU_THREAD=1 + * Don't send duplicate load progress values + * Fix neon support in libpng + * Do not call deprecated profile interceptor on ui thread (QTBUG-86267) + * Add certificate error message for ERR_SSL_OBSOLETE_VERSION + * Fix assert in WebContentsAdapter::devToolsFrontendDestroyed + * Avoid to reject a certificate error twice in Quick + * Fix PDF viewer plugin + * FIXUP: Fix swap condition in DisplayGLOutputSurface::updatePaintNode + (QTBUG-86599) + * Fix favicon engine under device pixel scaling + * Do not pass a native keycode matching the menu key when it is remapped + (QTBUG-86672) + * Optimize WebEngineSettings::testAttribute + * Warn about QtWebengineProcess launching from network share (QTBUG-84632) + * Handle non-ascii names for pulseaudio (QTBUG-85363) + * Do not set audio device for desktop capture if audio loopback is unsupported + * Fix new view request handling (QTBUG-87378) + * Fix getDefaultScreenId on X11 + * Touch handling: provide id mapping without modifying TouchPoint instance + (QTBUG-88001) + * Set custom headers from QWebEngineUrlRequestInfo before triggering redirect + (QTBUG-88861) + * Stabilize load signals emitting (QTBUG-65223) + +- CVE fixes backported in chromium updates: + * CVE-2020-16044: Use after free in WebRTC + * CVE-2021-21118: Heap buffer overflow in Blink + * CVE-2021-21119: Use after free in Media + * CVE-2021-21120: Use after free in WebSQL + * CVE-2021-21121: Use after free in Omnibox + * CVE-2021-21122: Use after free in Blink + * CVE-2021-21123: Insufficient data validation in File System API + * CVE-2021-21125: Insufficient policy enforcement in File System API + * CVE-2021-21126: Insufficient policy enforcement in extensions + * CVE-2021-21127: Insufficient policy enforcement in extensions + * CVE-2021-21128: Heap buffer overflow in Blink + * CVE-2021-21129: Insufficient policy enforcement in File System API + * CVE-2021-21130: Insufficient policy enforcement in File System API + * CVE-2021-21131: Insufficient policy enforcement in File System API + * CVE-2021-21132: Inappropriate implementation in DevTools + * CVE-2021-21135: Inappropriate implementation in Performance API + * CVE-2021-21137: Inappropriate implementation in DevTools + * CVE-2021-21140: Uninitialized Use in USB + * CVE-2021-21141: Insufficient policy enforcement in File System API + * CVE-2021-21145: Use after free in Fonts + * CVE-2021-21146: Use after free in Navigation + * CVE-2021-21147: Inappropriate implementation in Skia + * CVE-2021-21148: Heap buffer overflow in V8 + * CVE-2021-21149: Stack overflow in Data Transfer + * CVE-2021-21150: Use after free in Downloads + * CVE-2021-21152: Heap buffer overflow in Media + * CVE-2021-21153: Stack overflow in GPU Process + * CVE-2021-21156: Heap buffer overflow in V8 + * CVE-2021-21157: Use after free in Web Sockets +- Drop obsolete patches: + * icu-68.patch + * icu-68-2.patch +- Rebase patches: + * fix1163766.patch + * sandbox-statx-futex_time64.patch + * rtc-dont-use-h264.patch + * chromium-glibc-2.33.patch +- Add patch to fix crash with certain locales: + * 0001-Fix-normalization-of-app-locales.patch +- Clean the spec file a bit + +------------------------------------------------------------------- +Wed Mar 10 16:52:28 UTC 2021 - Fabian Vogt + +- Can't use system_vpx on Leap 15.3 + +------------------------------------------------------------------- +Wed Feb 17 13:19:20 UTC 2021 - Fabian Vogt + +- Add patch to fix sandbox with glibc 2.33 on 32bit: + * sandbox-statx-futex_time64.patch + +------------------------------------------------------------------- +Tue Feb 16 09:52:13 UTC 2021 - Guillaume GARDET + +- Relax constraints for armv6 and armv7 + +------------------------------------------------------------------- +Mon Feb 15 16:28:49 UTC 2021 - Fabian Vogt + +- Add patch to fix sandbox with glibc 2.33 (boo#1182233): + * chromium-glibc-2.33.patch + +------------------------------------------------------------------- +Fri Jan 29 11:06:22 UTC 2021 - Fabian Vogt + +- Bump _constraints and %limit_build, hopefully avoid occasional + OOM and make the build quicker +- Drop obsolete conditions + +------------------------------------------------------------------- +Fri Jan 8 16:27:22 UTC 2021 - Fabian Vogt + +- Drop baselibs.conf, not needed after libksysguard5 got adjusted + +------------------------------------------------------------------- +Tue Dec 15 08:59:07 UTC 2020 - Callum Farmer + +- Fix build with ICU 68: + * Added icu-68.patch + * Added icu-68-2.patch + +------------------------------------------------------------------- +Fri Nov 20 12:10:08 UTC 2020 - Fabian Vogt + +- Update to 5.15.2: + * New bugfix release + * For more details please see: + http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.15.2/?h=5.15.2 + +------------------------------------------------------------------- +Thu Sep 10 07:57:36 UTC 2020 - Fabian Vogt + +- Update to 5.15.1: + * New bugfix release + * For more details please see: + http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.15.1/?h=5.15.1 +- Drop patches, now upstream: + * icu-v67.patch + * 0001-fix-build-after-y2038-changes-in-glibc.patch +- Refresh disable-gpu-when-using-nouveau-boo-1005323.diff +- Update rtc-dont-use-h264.patch + +------------------------------------------------------------------- +Thu May 28 10:28:37 UTC 2020 - Fabian Vogt + +- Add patch to not require openh264 and don't build the bundled version: + * rtc-dont-use-h264.patch + +------------------------------------------------------------------- +Wed May 27 08:47:23 UTC 2020 - Fabian Vogt + +- Can't use system VPX on Leap 15.2 + +------------------------------------------------------------------- +Tue May 26 11:27:19 UTC 2020 - Callum Farmer + +- Update to version 5.15.0: + * No changelog available + +------------------------------------------------------------------- +Thu May 21 10:35:41 UTC 2020 - Callum Farmer + +- Update to version 5.15.0-rc2: + * No changelog available + * Removed some-more-includes-gcc10.patch: contained in upstream + +------------------------------------------------------------------- +Wed May 6 11:43:17 UTC 2020 - Fabian Vogt + +- Update to 5.15.0-rc: + * New bugfix release + * For the changes between 5.14.2 and 5.15.0 please see: + http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.15.0/?h=5.15.0 +- Drop patches, now upstream: + * QTBUG-82186.patch + +------------------------------------------------------------------- +Fri Apr 24 10:19:13 UTC 2020 - Ismail Dönmez + +- Add icu-v67.patch to fix compilation with icu v67, this is a backport + of https://github.com/v8/v8/commit/3f8dc4b2e5baf77b463334c769af85b79d8c1463 +- Rebase icu-v67.patch on 5.15.0-beta4 + +------------------------------------------------------------------- +Fri Apr 24 07:11:42 UTC 2020 - Fabian Vogt + +- Update to 5.15.0-beta4: + * New bugfix release + * No changelog available +- Refresh QTBUG-82186.patch + +------------------------------------------------------------------- +Tue Apr 14 06:47:59 UTC 2020 - Fabian Vogt + +- Update to 5.15.0-beta3: + * New bugfix release + * No changelog available +- Refresh fix1163766.patch + +------------------------------------------------------------------- +Thu Apr 9 08:21:02 UTC 2020 - Bernhard Wiedemann + +- Add fix1163766.patch to fix opensuse-welcome on i686 (boo#1163766) + +------------------------------------------------------------------- +Mon Mar 30 13:49:40 UTC 2020 - Fabian Vogt + +- Add patch to fix build with GCC 10 (boo#1158516): + * some-more-includes-gcc10.patch + +------------------------------------------------------------------- +Tue Mar 24 12:14:06 UTC 2020 - Fabian Vogt + +- Update to 5.15.0-beta2: + * New bugfix release + * No changelog available + +------------------------------------------------------------------- +Fri Feb 28 09:59:24 UTC 2020 - Fabian Vogt + +- Update to 5.15.0-beta1: + * New bugfix release + * No changelog available +- Drop patches, now upstream: + * fix-missing-designerplugin.patch + * QTBUG-81574.patch + +------------------------------------------------------------------- +Fri Feb 21 13:36:31 UTC 2020 - Fabian Vogt + +- Fix a deadlock causing audio/video playback to fail (boo#1163744): + * QTBUG-82186.patch + +------------------------------------------------------------------- +Fri Feb 21 09:25:44 UTC 2020 - Fabian Vogt + +- Fix an issue with selections breaking replying in KMail: + * QTBUG-81574.patch + +------------------------------------------------------------------- +Wed Feb 19 10:17:00 UTC 2020 - Fabian Vogt + +- Update to 5.15.0-alpha: + * New feature release + * For more details please see: + https://wiki.qt.io/New_Features_in_Qt_5.15 +- Add patch to fix building the designer plugin: + * fix-missing-designerplugin.patch +- Move designer plugin into -devel subpackage +- Add packages for new Qt PDF module (which is technically separate + from WebEngine, but shares the source tarball) + +------------------------------------------------------------------- +Mon Jan 27 13:14:47 UTC 2020 - Fabian Vogt + +- Update to 5.14.1: + * New bugfix release + * For more details please see: + http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.14.1/?h=v5.14.1 + +------------------------------------------------------------------- +Mon Jan 20 15:00:59 UTC 2020 - Guillaume GARDET + +- Disable valgrind on %arm due to boo#1130395 + +------------------------------------------------------------------- +Thu Dec 12 12:59:01 UTC 2019 - Fabian Vogt + +- Update to 5.14.0: + * New bugfix release + * For the changes between 5.13.2 and 5.14.0 please see: + https://code.qt.io/cgit/qt/qtwebengine.git/tree/dist/changes-5.14.0?h=v5.14.0 + * For the changes between 5.13.1 and 5.13.2 please see: + https://code.qt.io/cgit/qt/qtwebengine.git/tree/dist/changes-5.13.2?h=v5.14.0 + +------------------------------------------------------------------- +Wed Dec 4 14:38:17 UTC 2019 - Fabian Vogt + +- Update to 5.14.0-rc: + * New bugfix release + * No changelog available + * For more details please see: + * For more details about Qt 5.14 please see: + https://wiki.qt.io/New_Features_in_Qt_5.14 + +------------------------------------------------------------------- +Tue Nov 12 13:03:47 UTC 2019 - Fabian Vogt + +- Update to 5.14.0-beta3: + * New bugfix release + * No changelog available +- Remove patches, now upstream: + * fix-system-icu.patch + +------------------------------------------------------------------- +Thu Oct 24 13:23:15 UTC 2019 - Fabian Vogt + +- Update to 5.14.0-beta2: + * New bugfix release + * No changelog available +- Drop patch, not necessary anymore: + * harmony-fix.diff + +------------------------------------------------------------------- +Tue Oct 15 12:35:01 UTC 2019 - Fabian Vogt + +- Update to 5.14.0-beta1: + * New bugfix release + * No changelog available + +------------------------------------------------------------------- +Mon Sep 30 13:30:50 UTC 2019 - Fabian Vogt + +- Update to 5.14.0-alpha: + * New feature release + * No changelog available + * For more details about Qt 5.14 please see: + https://wiki.qt.io/New_Features_in_Qt_5.14 +- Drop chromium-non-void-return.patch, with newer post-build-checks + this is not necessary anymore +- Add patch to fix build with system ICU (QTBUG-78911): + * fix-system-icu.patch + +------------------------------------------------------------------- +Thu Sep 19 07:48:11 UTC 2019 - Fabian Vogt + +- Add gn_args+=link_pulseaudio=true to work around incompatibility + with PA 13 headers (QTBUG-77037) +- Enable kerberos support + +------------------------------------------------------------------- +Fri Sep 6 08:04:49 UTC 2019 - Fabian Vogt + +- Update to 5.13.1: + * New bugfix release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.13.1/?h=v5.13.1 + +------------------------------------------------------------------- +Tue Aug 6 20:17:28 UTC 2019 - Stefan Brüns + +- Increase disk constraints to 12G, TW needs 11.7G currently + +------------------------------------------------------------------- +Fri Jul 12 07:26:17 UTC 2019 - Fabian Vogt + +- Increase assumed per-job memory use to 2.5GB + +------------------------------------------------------------------- +Thu Jul 11 07:46:30 UTC 2019 - Jiri Slaby + +- add 0001-fix-build-after-y2038-changes-in-glibc.patch + +------------------------------------------------------------------- +Wed Jun 19 11:26:34 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.13.0: + * New bugfix release + * No changelog available + * For more details about Qt 5.13 please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.13.0/?h=5.13 + +------------------------------------------------------------------- +Sat Jun 15 14:37:48 UTC 2019 - Stefan Brüns + +- Replace open coded macro for parallel build limit by the one from the + memory-constraints package + +------------------------------------------------------------------- +Tue Jun 4 07:25:38 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.13.0-rc: + * New bugfix release + * No changelog available + +------------------------------------------------------------------- +Tue Apr 30 12:50:05 UTC 2019 - Fabian Vogt + +- Fix system_vpx bcond + +------------------------------------------------------------------- +Mon Apr 29 09:17:20 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.13.0-beta2: + * New bugfix release + * No changelog available +- Refresh patches: + * harmony-fix.diff + * chromium-non-void-return.patch (sigh, again) +- Fix system_vpx bcond +- Disable using the system ICU on Leap < 16, too old + +------------------------------------------------------------------- +Thu Apr 18 07:27:59 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.12.3: + * New bugfix release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.12.3/?h=v5.12.3 +- Refresh chromium-non-void-return.patch + +------------------------------------------------------------------- +Thu Mar 21 10:26:45 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.13.0-beta1: + * New feature release + * For more details about Qt 5.13 please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.13.0/?h=5.13 +- Refresh patches: + * disable-gpu-when-using-nouveau-boo-1005323.diff + * harmony-fix.diff + * chromium-non-void-return.patch (sigh) +- Remote patches, now upstream: + * reproducible.patch + +------------------------------------------------------------------- +Thu Mar 14 08:52:25 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.12.2: + * New bugfix release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.12.2/?h=5.12.2 +- Remove patches, now upstream: + * cve-2019-5786.patch + +------------------------------------------------------------------- +Mon Mar 11 16:14:07 UTC 2019 - Martin Herkt <9+suse@cirno.systems> + +- Add cve-2019-5786.patch + Backport fix for CVE-2019-5786 + https://bugreports.qt.io/browse/QTBUG-74254 + +------------------------------------------------------------------- +Mon Feb 4 14:16:08 UTC 2019 - wbauer@tmo.at + +- Fix build on Leap 42.3 by adding c++14 to QT_CONFIG + +------------------------------------------------------------------- +Fri Feb 1 08:40:35 UTC 2019 - fabian@ritter-vogt.de + +- Update to 5.12.1: + * New bugfix release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.12.1/?h=v5.12.1 +- Refresh disable-gpu-when-using-nouveau-boo-1005323.diff +- Remove patches, now upstream: + * gn-fix_arm.patch + * chromium-66.0.3359.170-gcc8-alignof.patch + +------------------------------------------------------------------- +Mon Jan 21 14:14:56 UTC 2019 - Bernhard Wiedemann + +- Add reproducible.patch to override chromium build date + to make package build reproducible (boo#1047218) +- Use openSUSE's ninja for the build so that we can apply fixes there + that are used by everyone (boo#1118619) + +------------------------------------------------------------------- +Fri Dec 21 07:34:16 UTC 2018 - Guillaume GARDET + +- Backport patch to fix %arm builds: + * gn-fix_arm.patch + +------------------------------------------------------------------- +Thu Dec 6 13:37:44 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.12.0: + * New feature release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.12.0/?h=v5.12.0 + +------------------------------------------------------------------- +Mon Dec 3 08:17:29 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.12.0-rc2: + * New bugfix release + * Only important bugfixes +- Changelog for Qt 5.12.0: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.12.0/?h=5.12.0 + +------------------------------------------------------------------- +Thu Nov 22 13:40:08 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.12.0-rc: + * New bugfix release + * No changelog available + +------------------------------------------------------------------- +Thu Nov 8 15:25:48 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.12.0-beta4: + * New bugfix release + * No changelog available +- Add yet another hunk to chromium-non-void-return.patch + +------------------------------------------------------------------- +Fri Oct 26 07:21:23 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.12.0-beta3: + * New bugfix release + * No changelog available + +------------------------------------------------------------------- +Wed Oct 17 08:24:15 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.12.0-beta2: + * New bugfix release + * No changelog available + +------------------------------------------------------------------- +Fri Oct 5 19:35:36 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.12.0-beta1: + * New bugfix release + * No changelog available +- Refresh patches: + * harmony-fix.diff + * chromium-66.0.3359.170-gcc8-alignof.patch +- Replace no-return-in-nonvoid-function.diff with + with chromium-non-void-return.patch from the chromium package + +------------------------------------------------------------------- +Tue Oct 2 07:34:48 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.12.0-alpha: + * New feature release + * For more details please see: + * http://wiki.qt.io/New_Features_in_Qt_5.12 +- Refresh disable-gpu-when-using-nouveau-boo-1005323.diff +- Raise mem_per_process to 200M + +------------------------------------------------------------------- +Fri Sep 21 07:59:57 UTC 2018 - fabian@ritter-vogt.de + +- Update to 5.11.2 + * New bugfix release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.11.2/?h=v5.11.2 +- Remove patches, now upstream: + * fix-build-with-ffmpeg4.patch + +------------------------------------------------------------------- +Tue Aug 14 09:31:03 UTC 2018 - wbauer@tmo.at + +- Use pkgconfig() notation for the libav* BuildRequires + +------------------------------------------------------------------- +Sat Jun 30 09:22:22 UTC 2018 - fabian@ritter-vogt.de + +- Enable building against the system ICU again +- Add physicalmemory >= 5GiB to _constraints in the hope to speed up + builds + +------------------------------------------------------------------- +Tue Jun 19 10:52:44 CEST 2018 - fabian@ritter-vogt.de + +- Update to 5.11.1 + * New bugfix release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.11.1/?h=v5.11.1 +- Remove patches, now upstream: + * fix-build-with-gcc-8.patch + * fix-build-with-gcc-8-for-real.patch + * fix-build-with-opengles2.patch +- Add patch to fix build on 32-bit: + * chromium-66.0.3359.170-gcc8-alignof.patch + +------------------------------------------------------------------- +Fri Jun 8 09:16:47 UTC 2018 - guillaume.gardet@opensuse.org + +- Add a patch to fix build with opengles2 (means on ARM): + * fix-build-with-opengles2.patch + +------------------------------------------------------------------- +Thu Jun 7 07:18:15 UTC 2018 - fvogt@suse.com + +- Add yet another upstream chromium patch to fix build with GCC 8.1: + * fix-build-with-gcc-8-for-real.patch + +------------------------------------------------------------------- +Tue Jun 5 12:02:59 UTC 2018 - lbeltrame@kde.org + +- Add upstream Chromium patch to fix build with GCC 8.1: + * fix-build-with-gcc-8.patch +- Add upstream Chromium patch to fix build with ffmpeg 4: + * fix-build-with-ffmpeg4.patch +- Refresh patches: + * disable-gpu-when-using-nouveau-boo-1005323.diff + * harmony-fix.diff + +------------------------------------------------------------------- +Wed May 30 07:54:28 UTC 2018 - fabian@ritter-vogt.de + +- Fix %postun: Comment in wrong section + +------------------------------------------------------------------- +Tue May 22 16:59:28 CEST 2018 - fabian@ritter-vogt.de + +- Update to 5.11.0 + * New bugfix release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.11.0/?h=v5.11.0 + +------------------------------------------------------------------- +Thu May 17 15:21:39 UTC 2018 - fabian@ritter-vogt.de + +- Use %autopatch +- Use %license + +------------------------------------------------------------------- +Tue May 8 11:02:00 CEST 2018 - fabian@ritter-vogt.de + +- Update to 5.11.0-rc + * New bugfix release + * No changelog available + +------------------------------------------------------------------- +Mon May 7 12:13:15 UTC 2018 - guillaume.gardet@opensuse.org + +- Fix armv6 by removing unneeded additionnal RPM_OPT_FLAGS + +------------------------------------------------------------------- +Mon Apr 23 08:59:37 CEST 2018 - fabian@ritter-vogt.de + +- Update to 5.11.0-beta4 + * New bugfix release + * No changelog available + +------------------------------------------------------------------- +Wed Apr 11 11:00:17 UTC 2018 - mliska@suse.cz + +- Add no-return-in-nonvoid-function.diff in order to fix boo#1087068. + +------------------------------------------------------------------- +Wed Apr 11 09:15:40 CEST 2018 - fabian@ritter-vogt.de + +- Update to 5.11.0-beta3 + * New bugfix release + * No changelog available +- Refresh patches: + * no-return-in-nonvoid-function.diff + +------------------------------------------------------------------- +Thu Mar 29 13:20:53 UTC 2018 - kamikazow@opensuse.org + +- Changed license header back to original template + * LGPL-2.1-or-later was wrong +- Package license is LGPL-3.0-only, GPL-2.0-only, GPL-3.0-only + * incorporates 3rd party code (Chromium, WebKit, even some dating + back to KHTML), therefore no "with-Qt-Company-Qt-exception-1.1" + because those 3rd parties never granted them. + +------------------------------------------------------------------- +Wed Mar 28 09:18:01 CEST 2018 - fabian@ritter-vogt.de + +- Update to 5.11.0-beta2 + * New bugfix release + * No changelog available +- Remove patches, now upstream: + * qtwebengine-everywhere-src-5.10.1-security-5.9.5.patch + * qtwebengine-everywhere-src-5.10.1-CVE-2018-6033.patch + +------------------------------------------------------------------- +Tue Mar 27 15:34:51 UTC 2018 - wbauer@tmo.at + +- Only automatically convert dictionaries on Leap 15 or higher, + %filetriggerin is not supported in Leap 42.3 which caused the + build to fail + +------------------------------------------------------------------- +Sun Mar 25 15:58:52 UTC 2018 - kamikazow@opensuse.org + +- Enable spell checking: + * Ported script snippet from Fedora package by Kevin Kofler + * Converts available Hunspell dictionaries locally during installation +- Changed specfile header to reflect code coming from K. Kofler + +------------------------------------------------------------------- +Fri Mar 23 08:14:18 UTC 2018 - wbauer@tmo.at + +- Also adjust the minimum versions of the private-headers-devel + subpackage's requirements + +------------------------------------------------------------------- +Thu Mar 22 22:40:32 UTC 2018 - kamikazow@opensuse.org + +- Apply a fix to make QtWE-using applications actually compile against it + +------------------------------------------------------------------- +Sun Mar 18 22:57:09 UTC 2018 - kamikazow@opensuse.org + +- Forward-port security backports from 5.9.5 LTS (up to Chromium 65.0.3325.146) + * qtwebengine-everywhere-src-5.10.1-security-5.9.5.patch from Fedora + * qtwebengine-everywhere-src-5.10.1-CVE-2018-6033.patch from Fedora + +------------------------------------------------------------------- +Tue Mar 13 13:40:53 UTC 2018 - christophe@krop.fr + +- Fix the license tag. + +------------------------------------------------------------------- +Thu Mar 1 09:56:21 CET 2018 - fabian@ritter-vogt.de + +- Update to 5.11.0-beta1 + * New feature release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.11.0-beta1/?h=v5.11.0-beta1 + +------------------------------------------------------------------- +Tue Feb 20 14:32:19 CET 2018 - fabian@ritter-vogt.de + +- Update to 5.11.0-alpha + * New feature release + * For more details please see: + * https://wiki.qt.io/New_Features_in_Qt_5.11 +- Refresh patches: + * armv6-ffmpeg-no-thumb.patch + +------------------------------------------------------------------- +Wed Feb 14 15:47:56 CET 2018 - fabian@ritter-vogt.de + +- Update to 5.10.1 + * New bugfix release + * For more details please see: + * http://code.qt.io/cgit/qt/qtwebengine.git/plain/dist/changes-5.10.1/?h=v5.10.1 + +------------------------------------------------------------------- +Fri Feb 2 10:43:48 UTC 2018 - dimstar@opensuse.org + +- Eliminate build dependency on procps: we only used it to run + 'free', in order to find out how much RAM we have available. We + can get this information directly from the kernel, from + /proc/meminfo. + +------------------------------------------------------------------- +Fri Jan 12 19:10:53 UTC 2018 - fabian@ritter-vogt.de + +- Also work around crashes on wayland by disabling the GPU by default (boo#1060990): + * disable-gpu-when-using-nouveau-boo-1005323.diff + +------------------------------------------------------------------- +Fri Dec 8 23:14:38 UTC 2017 - christophe@krop.fr + +- Update the license tag (boo#967696) + +------------------------------------------------------------------- +Thu Dec 7 12:18:17 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.10.0 final + * New bugfix release + +------------------------------------------------------------------- +Sun Dec 3 14:13:03 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.10.0 RC 2 + * New bugfix release + +------------------------------------------------------------------- +Thu Nov 30 09:47:21 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.10.0 RC 1 + * New bugfix release + +------------------------------------------------------------------- +Sat Nov 25 12:46:51 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.9.3 + * New bugfix release + * For more details, see: + http://code.qt.io/cgit/qt/qtwebengine.git/tree/dist/changes-5.9.3/?h=v5.9.3 + +- Add patch to fix build on armv6: + spinlock-armv6.patch + +------------------------------------------------------------------- +Wed Nov 15 11:41:56 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.10 Beta 4 +- Contains bugfixes + +------------------------------------------------------------------- +Thu Nov 2 08:53:34 UTC 2017 - tittiatcoke@gmail.com + +- Add some feature from the Chromium builds to determine the maximum + allowed parallel processes based on the available memory. Also + ensure that the ninja build follows this maximum + +------------------------------------------------------------------- +Thu Nov 2 07:23:00 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.10 Beta 3 +- Contains bugfixes +- Refresh patches: + * armv6-ffmpeg-no-thumb.patch + * disable-gpu-when-using-nouveau-boo-1005323.diff + * harmony-fix.diff + +------------------------------------------------------------------- +Tue Oct 31 16:49:12 UTC 2017 - fabian@ritter-vogt.de + +- Restore working version of + disable-gpu-when-using-nouveau-boo-1005323.diff + +------------------------------------------------------------------- +Mon Oct 30 16:19:45 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.10 Beta 2 +- Contains bugfixes + +------------------------------------------------------------------- +Mon Oct 9 16:17:45 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.10 Beta 1 +- For more information visit: + https://blog.qt.io/blog/2017/10/09/qt-5-10-beta-released/ +- Remove patches, now upstream: + * clip-ft-glyph.diff +- Refresh patches: + * disable-gpu-when-using-nouveau-boo-1005323.diff + * harmony-fix.diff + +------------------------------------------------------------------- +Sun Oct 8 14:12:31 UTC 2017 - lbeltrame@kde.org + +- Update to 5.9.2 + * For more details please see: + https://blog.qt.io/blog/2017/10/06/qt-5-9-2-released/ +- Dropped patches, now upstream: + * clip-ft-glyph.diff + +------------------------------------------------------------------- +Tue Oct 3 02:27:41 UTC 2017 - t.zell@gmx.de + +- Fixes to make fonts readable again with FreeType 2.8.1 (boo#1061344): + * clip-ft-glyph.diff + * harmony-fix.diff + +------------------------------------------------------------------- +Tue Sep 26 15:03:00 UTC 2017 - fabian@ritter-vogt.de + +- Unbundle ffmpeg if possible, only support proprietary codecs + if the system ffmpeg does + +------------------------------------------------------------------- +Mon Sep 25 14:42:37 CEST 2017 - fabian@ritter-vogt.de + +- Update to 5.10 Alpha 1 +- For more information visit: + https://blog.qt.io/blog/2017/09/13/qt-5-10-alpha-released/ + +------------------------------------------------------------------- +Mon Jul 10 09:56:30 UTC 2017 - mlin@suse.com + +- Raise memory size to 9G and drop overwrite part of s390z build, + we didn't have build s390x at all. (bsc#1047896) +- Make it -j4 for all archtectures: do not run too many parallel that + would costs more memory. + +------------------------------------------------------------------- +Sat Jul 1 08:03:22 UTC 2017 - lbeltrame@kde.org + +- Update to 5.9.1 + * For more details please see: + http://blog.qt.io/blog/2017/06/30/qt-5-9-1-released/ +- Drop upstreamed patches: + * arm64-linux.patch + * arm64-toolchain.patch + +------------------------------------------------------------------- +Tue Jun 13 11:26:59 UTC 2017 - fvogt@suse.com + +- Backport patches to fix build on AArch64 and add workaround + (QTBUG-61128): + * arm64-linux.patch + * arm64-toolchain.patch +- Use proprietary codecs if supported by system ffmpeg (boo#1043375) + +------------------------------------------------------------------- +Thu Jun 1 07:58:09 UTC 2017 - fabian@ritter-vogt.de + +- Remove patch that is apparently not enough for aarch64: + * gn-add-aarch64.patch + +------------------------------------------------------------------- +Thu Jun 1 07:49:42 UTC 2017 - jengelh@inai.de + +- Update descriptions. +- Use find -exec's "+" strategy. + +------------------------------------------------------------------- +Wed May 31 07:05:31 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.9.0 final + +------------------------------------------------------------------- +Tue May 30 14:32:33 UTC 2017 - fabian@ritter-vogt.de + +- Disable usage of system ICU on TW as ICU 59 is not supported + and patches do not apply + +------------------------------------------------------------------- +Wed May 24 19:16:41 UTC 2017 - fabian@ritter-vogt.de + +- Update to 5.9.0 RC: + * For more details please see: + http://lists.qt-project.org/pipermail/announce/2017-May/000115.html + and https://wiki.qt.io/New_Features_in_Qt_5.9 +- Remove patches, now upstream: + * fix-chromium-gcc7.patch + * use-fno-delete-null-pointer-checks-with-gcc-6.diff + * webrtc-build-with-neon.patch +- Refresh patches: + * armv6-ffmpeg-no-thumb.patch + * disable-gpu-when-using-nouveau-boo-1005323.diff +- Support new build system, which does not support manual unbundling + anymore +- Add patch to allow building on aarch64: + * gn-add-aarch64.patch +- Reorder rpm sections + +------------------------------------------------------------------- +Mon May 15 14:07:24 UTC 2017 - fabian@ritter-vogt.de + +- Add patch to fix build with gcc 7: + * fix-chromium-gcc7.patch + +------------------------------------------------------------------- +Wed Dec 14 16:06:02 UTC 2016 - hrvoje.senjan@gmail.com + +- Update to 5.7.1 + * For more details please see: + https://blog.qt.io/blog/2016/12/14/qt-5-7-1-released/ + and https://www.qt.io/qt5-7/ +- Drop upstreamed patches: + Do-not-depend-on-Linux-4.5.patch and + detect-gcc6-use-fno-delete-null-pointer-checks.diff + +------------------------------------------------------------------- +Thu Nov 3 10:47:39 UTC 2016 - wbauer@tmo.at + +- Add -fno-delete-null-pointer-checks to CXXFLAGS instead to + really fix the gcc6 issues (boo#1003985) + +------------------------------------------------------------------- +Tue Oct 25 13:40:49 UTC 2016 - alarrosa@suse.com + +- Add disable-gpu-when-using-nouveau-boo-1005323.diff. Disables the + use of the gpu by webengine when the nouveau opengl driver is + detected since nouveau doesn't support rendering from different + threads. Also, allows to use two environment variables + QT_WEBENGINE_DISABLE_GPU to force the disabling of the gpu and + QT_WEBENGINE_DISABLE_NOUVEAU_WORKAROUND to disable the detection + of nouveau, just in case someone wants to try with newer nouveau + releases (boo#1005323, boo#997171). + +------------------------------------------------------------------- +Thu Oct 6 09:26:52 UTC 2016 - hrvoje.senjan@gmail.com + +- Pass the -fno-delete-null-pointer-checks flag to avoid further + gcc6 issues + +------------------------------------------------------------------- +Wed Oct 5 09:54:47 UTC 2016 - hrvoje.senjan@gmail.com + +- Added Do-not-depend-on-Linux-4.5.patch (boo#1002873) + +------------------------------------------------------------------- +Wed Sep 28 07:32:47 UTC 2016 - schwab@suse.de + +- Ensure to build for armv6 on armv6 +- armv6-ffmpeg-no-thumb.patch: Fix ffmpeg configuration for armv6 +- webrtc-build-with-neon.patch: Properly configure webrtc for neon support + +------------------------------------------------------------------- +Sat Sep 24 18:39:10 UTC 2016 - hrvoje.senjan@gmail.com + +- Update to 5.7.0 + * For more details please see: + https://www.qt.io/qt5-7/ +- Add detect-gcc6-use-fno-delete-null-pointer-checks.diff + +------------------------------------------------------------------- +Thu Jun 23 08:10:46 UTC 2016 - lbeltrame@kde.org + +- Add use-fno-delete-null-pointer-checks-with-gcc-6.diff: fix + crashes with GCC 6 (https://codereview.qt-project.org/#/c/161965/) + +------------------------------------------------------------------- +Wed Jun 8 14:15:23 UTC 2016 - hrvoje.senjan@gmail.com + +- Update to 5.6.1 + * For more details please see: + http://blog.qt.io/blog/2016/06/08/qt-5-6-1-released/ +- Drop obsolete gcc50-fixes.diff + +------------------------------------------------------------------- +Fri Mar 18 19:03:33 UTC 2016 - hrvoje.senjan@gmail.com + +- Update to 5.6.0 + * For more details please see: + http://blog.qt.io/blog/2016/03/16/qt-5-6-released/ + and https://wiki.qt.io/New_Features_in_Qt_5.6 +- Drop upstreamed and/or obsolete patches: + gyp-arm64.patch, gyp_conf.patch, sandbox-linux-arm64.patch and + strip.diff + +------------------------------------------------------------------- +Thu Dec 3 07:24:43 UTC 2015 - mlin@suse.com + +- Do not build on s390 and s390x, chromium have not ported to them + +------------------------------------------------------------------- +Fri Oct 16 20:22:42 UTC 2015 - hrvoje.senjan@gmail.com + +- Update to 5.5.1 + * For more details please see: + http://blog.qt.io/blog/2015/10/15/qt-5-5-1-released/ + +------------------------------------------------------------------- +Wed Sep 30 08:10:19 UTC 2015 - schwab@suse.de + +- gyp-arm64.patch: Update ffmpeg config +- sandbox-linux-arm64.patch: fix chromium build for aarch64 + +------------------------------------------------------------------- +Sun Aug 16 08:32:10 UTC 2015 - hrvoje.senjan@gmail.com + +- Update to 5.5.0 + * For more details please see: + http://blog.qt.io/blog/2015/07/01/qt-5-5-released/ + and https://wiki.qt.io/New_Features_in_Qt_5.5 +- Enable jsoncpp support on Leap + +------------------------------------------------------------------- +Fri Aug 14 13:33:36 UTC 2015 - normand@linux.vnet.ibm.com + +- ExcludeArch: ppc ppc64 ppc64le + http://www.chromium.org/blink not ported to PowerPC + +------------------------------------------------------------------- +Mon Jun 29 15:23:43 UTC 2015 - schwab@suse.de + +- gyp-arm64.patch: fix support for aarch64 +- gcc50-fixes.diff: also handle gcc < 5 + +------------------------------------------------------------------- +Mon Jun 22 11:56:10 UTC 2015 - tittiatcoke@gmail.com + +- Add patch gcc50-fixes.diff to fix the detection of the GCC 5.x + compiler. Patch is equal to the one used for Chromium + +------------------------------------------------------------------- +Wed Jun 3 22:56:36 UTC 2015 - hrvoje.senjan@gmail.com + +- Update to 5.4.2 + * Bugfix release, for more details please see: + http://blog.qt.io/blog/2015/06/02/qt-5-4-2-released/ +- Use correct names in baselibs.conf + +------------------------------------------------------------------- +Wed May 27 10:24:39 UTC 2015 - aj@ajaissle.de + +- Fix summary, this is not an Qt 5 Nfc Addon + +------------------------------------------------------------------- +Tue Feb 24 16:10:33 UTC 2015 - hrvoje.senjan@gmail.com + +- Update to 5.4.1 + * For more details please see: + http://blog.qt.io/blog/2015/02/24/qt-5-4-1-released/ +- Add minimal requires on other Qt5 libraries + +------------------------------------------------------------------- +Wed Dec 10 11:00:14 UTC 2014 - hrvoje.senjan@gmail.com + +- Update to 5.4 Final + * For more details please see: + http://blog.qt.digia.com/blog/2014/12/10/qt-5-4-released/ + and http://qt-project.org/wiki/New-Features-in-Qt-5.4 + +------------------------------------------------------------------- +Thu Nov 27 15:58:50 UTC 2014 - hrvoje.senjan@gmail.com + +- Update to 5.4 RC + * For more details please see: + http://blog.qt.digia.com/blog/2014/11/27/qt-5-4-release-candidate-available/ + and http://qt-project.org/wiki/New-Features-in-Qt-5.4 + +------------------------------------------------------------------- +Sat Aug 2 15:31:16 UTC 2014 - hrvoje.senjan@gmail.com + +- Activate libqt5-qtwebengine package + diff --git a/libqt5-qtwebengine.spec b/libqt5-qtwebengine.spec new file mode 100644 index 0000000..f454a63 --- /dev/null +++ b/libqt5-qtwebengine.spec @@ -0,0 +1,493 @@ +# +# spec file for package libqt5-qtwebengine +# +# Copyright (c) 2023 SUSE LLC +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +%bcond_without system_ffmpeg +%bcond_without system_minizip +%bcond_without pipewire +# The default python version is too old on Leap 15 +%if 0%{?suse_version} < 1550 +%bcond_without python39 +%else +%bcond_without python3 +%endif + +# spellchecking dictionary directory +%global _qtwebengine_dictionaries_dir %{_libqt5_datadir}/qtwebengine_dictionaries + +Name: libqt5-qtwebengine +Version: 5.15.16 +Release: 0 +Summary: Qt 5 WebEngine Library +License: LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +Group: Development/Libraries/X11 +URL: https://www.qt.io +%define base_name libqt5 +%define real_version 5.15.16 +%define so_version 5.15.16 +%define tar_version qtwebengine-everywhere-src-%{version} +Source: %{tar_version}.tar.xz +# Use a git snapshot for catapult to build with python3 (git rev: 2da767c6) +Source1: catapult-git.tar.xz +Source99: libqt5-qtwebengine-rpmlintrc +# PATCH-FIX-UPSTREAM armv6-ffmpeg-no-thumb.patch - Fix ffmpeg configuration for armv6 +Patch0: armv6-ffmpeg-no-thumb.patch +# PATCH-FIX-OPENSUSE disable-gpu-when-using-nouveau-boo-1005323.diff +Patch1: disable-gpu-when-using-nouveau-boo-1005323.diff +# PATCH-FIX-OPENSUSE +Patch2: rtc-dont-use-h264.patch +# PATCH-FIX-UPSTREAM +Patch3: 0001-skia-Some-includes-to-fix-build-with-GCC-12.patch +# PATCH-FIX-UPSTREAM -- build with pipewire 0.3 +Patch4: qtwebengine-pipewire-0.3.patch +# PATCH-FIX-OPENSUSE -- build with python 3 +Patch5: qtwebengine-python3.patch +# PATCH-FIX-UPSTREAM -- handle futex_time64 +Patch6: sandbox_futex_time64.patch +# PATCH-FIX-UPSTREAM -- python 3.11 fixes +Patch7: python311-fixes.patch +### Patch 50-99 are applied conditionally +# PATCH-FIX-OPENSUSE -- allow building qtwebengine with ffmpeg5 +Patch50: qtwebengine-ffmpeg5.patch +### +# http://www.chromium.org/blink is not ported to PowerPC & s390 +ExcludeArch: ppc ppc64 ppc64le s390 s390x +# Try to fix i586 MemoryErrors with rpmlint +#!BuildIgnore: rpmlint +BuildRequires: bison +BuildRequires: fdupes +BuildRequires: flac-devel +BuildRequires: flex +BuildRequires: git-core +BuildRequires: gperf +BuildRequires: krb5 +BuildRequires: krb5-devel +BuildRequires: libQt5QuickControls2-devel +BuildRequires: libcap-devel +BuildRequires: libgcrypt-devel +BuildRequires: libjpeg-devel +BuildRequires: libpng-devel +BuildRequires: libqt5-qtbase-private-headers-devel >= 5.12 +BuildRequires: libqt5-qtdeclarative-private-headers-devel >= 5.12 +BuildRequires: libqt5-qtlocation-private-headers-devel >= 5.12 +# For building pdf examples... +BuildRequires: libqt5-qtsvg-devel +BuildRequires: libqt5-qttools-private-headers-devel >= 5.12 +BuildRequires: libqt5-qtwebchannel-private-headers-devel >= 5.12 +BuildRequires: libqt5-qtxmlpatterns-private-headers-devel >= 5.12 +BuildRequires: memory-constraints +BuildRequires: ninja +BuildRequires: nodejs-default +BuildRequires: pam-devel +BuildRequires: pciutils-devel +BuildRequires: perl +BuildRequires: perl-JSON +%if %{with pipewire} +BuildRequires: pipewire-devel +%endif +BuildRequires: pkgconfig +%if %{with python3} +BuildRequires: python3 +BuildRequires: python3-devel +BuildRequires: python3-xml +%endif +%if %{with python39} +BuildRequires: python39 +BuildRequires: python39-devel +BuildRequires: python39-xml +%endif +BuildRequires: re2c +BuildRequires: sed +BuildRequires: snappy-devel +BuildRequires: update-desktop-files +BuildRequires: usbutils +BuildRequires: util-linux +%ifnarch %{arm} +BuildRequires: valgrind-devel +%endif +BuildRequires: wdiff +BuildRequires: xz +BuildRequires: yasm +BuildRequires: yasm-devel +BuildRequires: perl(Switch) +BuildRequires: pkgconfig(alsa) +BuildRequires: pkgconfig(atk) +BuildRequires: pkgconfig(bzip2) +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(dbus-1) +BuildRequires: pkgconfig(fontconfig) +BuildRequires: pkgconfig(freetype2) >= 2.4.2 +BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(glib-2.0) >= 2.32 +BuildRequires: pkgconfig(glproto) +BuildRequires: pkgconfig(gmodule-2.0) +BuildRequires: pkgconfig(gobject-2.0) +BuildRequires: pkgconfig(gthread-2.0) +BuildRequires: pkgconfig(harfbuzz) >= 2.4.0 +BuildRequires: pkgconfig(icu-i18n) >= 65.0 +BuildRequires: pkgconfig(icu-uc) >= 65.0 +BuildRequires: pkgconfig(jsoncpp) +BuildRequires: pkgconfig(lcms2) +%if %{with system_ffmpeg} +BuildRequires: pkgconfig(libavcodec) +BuildRequires: pkgconfig(libavformat) +BuildRequires: pkgconfig(libavutil) +%endif +BuildRequires: pkgconfig(libcrypto) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(libevent) +BuildRequires: pkgconfig(libexif) +BuildRequires: pkgconfig(libmtp) +BuildRequires: pkgconfig(libpci) +BuildRequires: pkgconfig(libpng) +BuildRequires: pkgconfig(libpulse) +BuildRequires: pkgconfig(libsrtp) +BuildRequires: pkgconfig(libudev) +BuildRequires: pkgconfig(libusb-1.0) +BuildRequires: pkgconfig(libwebp) +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: pkgconfig(libxslt) +%if %{with system_minizip} +BuildRequires: pkgconfig(minizip) +%endif +BuildRequires: pkgconfig(nspr) +BuildRequires: pkgconfig(nss) +BuildRequires: pkgconfig(opus) +BuildRequires: pkgconfig(pangocairo) +BuildRequires: pkgconfig(pangoft2) +BuildRequires: pkgconfig(poppler-cpp) +BuildRequires: pkgconfig(protobuf) +# re2 >= 2023-07-01 breaks the build, use libre2-10-devel if needed +BuildRequires: pkgconfig(re2) <= 10.0.0 +BuildRequires: pkgconfig(speex) +BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(vpx) >= 1.8.0 +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(xcomposite) +BuildRequires: pkgconfig(xcursor) +BuildRequires: pkgconfig(xdamage) +BuildRequires: pkgconfig(xext) +BuildRequires: pkgconfig(xfixes) +BuildRequires: pkgconfig(xi) +BuildRequires: pkgconfig(xkbfile) +BuildRequires: pkgconfig(xrandr) +BuildRequires: pkgconfig(xrender) +BuildRequires: pkgconfig(xscrnsaver) +BuildRequires: pkgconfig(xt) +BuildRequires: pkgconfig(xtst) +BuildRequires: pkgconfig(zlib) +BuildRequires: yasm-devel +%requires_ge libQt5Network5 +%requires_ge libQtQuick5 +%requires_ge libQt5Widgets5 + +%description +Qt WebEngine provides functionality for rendering regions of dynamic +web content. + +The functionality in Qt WebEngine is divided into the following +modules: + +* QtWebEngineCore: Provides public API shared by both QtWebEngine and + QtWebEngineWidgets +* QtWebEngine: Provides QML types for rendering web content within a + QML application +* QtWebEngineWidgets: Provides a web browser engine as well as C++ + classes to render and interact with web content + +%package devel +Summary: Development files for the Qt5 WebEngine library +Group: Development/Libraries/X11 +Requires: %{name} = %{version} + +%description devel +You need this package if you want to compile programs with Qt WebEngine. + +%package private-headers-devel +Summary: Non-ABI stable experimental API for the Qt5 WebEngine library +Group: Development/Libraries/C and C++ +Requires: %{name}-devel = %{version} +%requires_ge libqt5-qtbase-private-headers-devel +%requires_ge libqt5-qtdeclarative-private-headers-devel +BuildArch: noarch + +%description private-headers-devel +This package provides private headers of libqt5-qtwebengine that are normally +not used by application development and that do not have any ABI or +API guarantees. The packages that build against these have to require +the exact Qt version. + +%package examples +Summary: Qt5 WebEngine examples +Group: Development/Libraries/X11 +Requires: libqt5-qtquickcontrols2 +Recommends: %{name}-devel + +%description examples +Examples for the libqt5-qtwebengine module. + +%package -n libQt5Pdf5 +Summary: Qt5 PDF library +Group: Development/Libraries/X11 + +%description -n libQt5Pdf5 +Main library of the Qt PDF module. + +%package -n libQt5PdfWidgets5 +Summary: Qt5 PDF library for Qt Widgets +Group: Development/Libraries/X11 + +%description -n libQt5PdfWidgets5 +Library of the Qt PDF module with support for Qt Widgets. + +%package -n libqt5-qtpdf-imports +Summary: Qt5 PDF module for QML +Group: Development/Libraries/X11 + +%description -n libqt5-qtpdf-imports +Qt Quick module for the Qt PDF library. + +%package -n libqt5-qtpdf-devel +Summary: Development files for the Qt5 PDF library +Group: Development/Libraries/X11 +Requires: libQt5Pdf5 = %{version} +Requires: libQt5PdfWidgets5 = %{version} + +%description -n libqt5-qtpdf-devel +You need this package if you want to compile programs with Qt PDF. + +%package -n libqt5-qtpdf-private-headers-devel +Summary: Non-ABI stable experimental API for the Qt5 PDF library +Group: Development/Libraries/C and C++ +Requires: libqt5-qtpdf-devel = %{version} +%requires_ge libqt5-qtbase-private-headers-devel +BuildArch: noarch + +%description -n libqt5-qtpdf-private-headers-devel +This package provides private headers of libqt5-qtpdf that are normally +not used by application development and that do not have any ABI or +API guarantees. The packages that build against these have to require +the exact Qt version. + +%package -n libqt5-qtpdf-examples +Summary: Qt5 PDF examples +Group: Development/Libraries/X11 +Recommends: libqt5-qtpdf-devel + +%description -n libqt5-qtpdf-examples +Examples for the libqt5-qtpdf module. + +%prep +%setup -q -n %{tar_version} +# Leap 15 doesn't understand '%%autopatch -m' +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 + +# Replace the whole catapult folder rather than picking individual changes +pushd src/3rdparty/chromium/third_party +rm -r catapult +tar xJf %{SOURCE1} +mv catapult-git catapult +popd + +# FFmpeg 5 +%if %{with system_ffmpeg} +%if %{pkg_vcmp libavcodec-devel >= 5} +%patch50 -p1 +%endif +%endif + +sed -i 's|$(STRIP)|strip|g' src/core/core_module.pro + +#force the configure script to generate the forwarding headers (it checks whether .git directory exists) +mkdir .git + +# QTBUG-61128 +sed -i -e '/toolprefix = /d' -e 's/\${toolprefix}//g' \ + src/3rdparty/chromium/build/toolchain/linux/BUILD.gn + +%build +rm -r src/3rdparty/chromium/third_party/openh264/src + +%if %{with python39} +sed -i 's#QMAKE_PYTHON = python3#QMAKE_PYTHON = python3.9#' mkspecs/features/functions.prf +sed -i 's#python3#python3.9#' configure.pri +%endif + +%ifnarch x86_64 +RPM_OPT_FLAGS="$RPM_OPT_FLAGS " +export RPM_OPT_FLAGS=${RPM_OPT_FLAGS/-g / } +%endif +# Upstream does not care about those warnings, but optflags has -Werror=return-type. +export RPM_OPT_FLAGS="${RPM_OPT_FLAGS} -Wno-return-type" +# It does not actually include proprietary codecs, it only makes it attempt to use ffmpeg +# Link pulseaudio to work around QTBUG-77037 +%qmake5 QMAKE_CFLAGS="$RPM_OPT_FLAGS" \ + QMAKE_CXXFLAGS="$RPM_OPT_FLAGS" \ + QMAKE_LFLAGS+="-Wl,--no-keep-memory -Wl,--hash-size=31 -Wl,--reduce-memory-overheads" \ + gn_args+="link_pulseaudio=true" \ + gn_args+="media_use_openh264=false" \ + gn_args+="use_system_libxml=true use_system_libxslt=true" \ + qtwebengine.pro -- \ + -webengine-alsa \ + -no-webengine-embedded-build \ + -webengine-kerberos \ + -system-webengine-icu \ + -system-webengine-opus \ + -system-webengine-webp \ + -webengine-pepper-plugins \ + -webengine-printing-and-pdf \ +%if %{with system_ffmpeg} + -system-webengine-ffmpeg \ + -webengine-proprietary-codecs \ +%endif +%if %{with pipewire} + -webengine-webrtc-pipewire +%endif + +# Determine the right number of parallel processes based on the available memory +%limit_build -m 2750 + +# Ensure that also the internal chromium build follows the right number of parallel +# processes instead of its defaults. +export NINJAFLAGS="%{?_smp_mflags}" + +# Warning: Don't use %%make_build or the chromium build log won't be available +make %{_smp_mflags} VERBOSE=1 + +%install +%qmake5_install + +find %{buildroot}%{_libdir} -type f -name '*la' -print -exec perl -pi -e 's, -L%{_builddir}/\S+,,g' {} + +find %{buildroot}%{_libdir} -type f -name '*pc' -print -exec perl -pi -e "s, -L$RPM_BUILD_DIR/?\S+,,g" {} + -exec sed -i -e "s,^moc_location=.*,moc_location=%libqt5_bindir/moc," -e "s,uic_location=.*,uic_location=%libqt5_bindir/uic," {} + +find %{buildroot}%{_libdir} -type f -name '*pc' -exec sed -i -e "/^RPM_BUILD_DIR/d" {} + +sed -i '/^Libs.private/d' %{buildroot}%{_libdir}/pkgconfig/Qt*Web*.pc + +# kill .la files +rm -f %{buildroot}%{_libqt5_libdir}/*.la + +# Workaround to allow using QtWE with older Qt versions +%global qtcore_version %(printf %{pkg_version libQt5Core5} | cut -d + -f 1) +# NOTE the space after '%%{version}' is important to only match '5.15.X ${_Qt5XXX_FIND_VERSION_EXACT}' +sed -i 's#%{version} #%{qtcore_version} #' %{buildroot}%{_libqt5_libdir}/cmake/*/*Config.cmake + +# Hunspell dictionaries will be converted and put here on package installation +mkdir -p %{buildroot}%{_qtwebengine_dictionaries_dir} + +%if %{pkg_vcmp libQt5Core5 >= 5.15} +# CMake files for plugins are only useful for static builds +rm -r %{buildroot}%{_libqt5_libdir}/cmake/Qt5Gui +%endif + +%ldconfig_scriptlets +%ldconfig_scriptlets -n libQt5Pdf5 +%ldconfig_scriptlets -n libQt5PdfWidgets5 + +%filetriggerin -- %{_datadir}/hunspell +# Convert Hunspell dictionaries on package installation +while read filename ; do + case "$filename" in + *.dic) + bdicname=%{_qtwebengine_dictionaries_dir}/`basename -s .dic "$filename"`.bdic + %{_libqt5_bindir}/qwebengine_convert_dict "$filename" "$bdicname" &> /dev/null || : + ;; + esac +done + +%files +%license LICENSE.* +%dir %{_datadir}/qt5/ +%dir %{_qtwebengine_dictionaries_dir} +%dir %{_datadir}/qt5/resources/ +%{_datadir}/qt5/resources/qtwebengine_* +%dir %{_datadir}/qt5/translations/ +%{_datadir}/qt5/translations/qtwebengine_locales/ +%{_libqt5_archdatadir}/qml/QtWebEngine/ +%{_libqt5_bindir}/qwebengine_convert_dict +%{_libqt5_libdir}/libQt5WebEngine.so.* +%{_libqt5_libdir}/libQt5WebEngineCore.so.* +%{_libqt5_libdir}/libQt5WebEngineWidgets.so.* +%dir %{_libqt5_libexecdir} +%{_libqt5_libexecdir}/QtWebEngineProcess + +%files private-headers-devel +%license LICENSE.* +%{_libqt5_includedir}/QtWebEngine*/%{so_version} + +%files devel +%exclude %{_libqt5_includedir}/QtWebEngine*/%{so_version} +%{_libqt5_includedir}/QtWebEngine*/ +%dir %{_libqt5_libdir}/cmake/Qt5Designer/ +%{_libqt5_libdir}/cmake/Qt5Designer/Qt5Designer_QWebEngineViewPlugin.cmake +%{_libqt5_libdir}/cmake/Qt5WebEngine*/ +%{_libqt5_libdir}/libQt5WebEngine*.prl +%{_libqt5_libdir}/libQt5WebEngine*.so +%{_libqt5_libdir}/pkgconfig/Qt5WebEngine*.pc +%{_libqt5_libdir}/qt5/mkspecs/modules/qt_lib_webengine*.pri +%dir %{_libqt5_plugindir}/designer/ +%{_libqt5_plugindir}/designer/libqwebengineview.so + +%files examples +%license LICENSE.* +%dir %{_libqt5_examplesdir} +%{_libqt5_examplesdir}/webengine*/ + +%files -n libQt5Pdf5 +%license LICENSE.* +%{_libqt5_archdatadir}/plugins/imageformats/libqpdf.so +%{_libqt5_libdir}/libQt5Pdf.so.* + +%files -n libQt5PdfWidgets5 +%license LICENSE.* +%{_libqt5_libdir}/libQt5PdfWidgets.so.* + +%files -n libqt5-qtpdf-imports +%license LICENSE.* +%{_libqt5_archdatadir}/qml/QtQuick/Pdf/ + +%files -n libqt5-qtpdf-private-headers-devel +%license LICENSE.* +%{_libqt5_includedir}/QtPdf/%{so_version} +%{_libqt5_includedir}/QtPdfWidgets/%{so_version} + +%files -n libqt5-qtpdf-devel +%license LICENSE.* +%exclude %{_libqt5_includedir}/QtPdf*/%{so_version} +%{_libqt5_includedir}/QtPdf/ +%{_libqt5_includedir}/QtPdfWidgets/ +%{_libqt5_libdir}/cmake/Qt5Pdf/ +%{_libqt5_libdir}/cmake/Qt5PdfWidgets/ +%{_libqt5_libdir}/libQt5Pdf.prl +%{_libqt5_libdir}/libQt5Pdf.so +%{_libqt5_libdir}/libQt5PdfWidgets.prl +%{_libqt5_libdir}/libQt5PdfWidgets.so +%{_libqt5_libdir}/pkgconfig/Qt5Pdf.pc +%{_libqt5_libdir}/pkgconfig/Qt5PdfWidgets.pc +%{_libqt5_libdir}/qt5/mkspecs/modules/qt_lib_pdf*.pri + +%files -n libqt5-qtpdf-examples +%license LICENSE.* +%dir %{_libqt5_examplesdir} +%{_libqt5_examplesdir}/pdf*/ + +%changelog diff --git a/python311-fixes.patch b/python311-fixes.patch new file mode 100644 index 0000000..d3edf87 --- /dev/null +++ b/python311-fixes.patch @@ -0,0 +1,149 @@ +From f90f49df8db04dcb72f7ce0c4d0b2fe329bab00c Mon Sep 17 00:00:00 2001 +From: Dan Harrington +Date: Fri, 04 Jun 2021 16:46:25 +0000 +Subject: [PATCH] Migrate presubmit to python3 + +Fixed a couple warnings I found when running the unit +tests in python3. + +Bug: 1212110 +Change-Id: I3d1b5859b5c517ad5eea30cb816fad0389715f73 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2934203 +Reviewed-by: Jesse Doherty +Commit-Queue: Dan H +Cr-Commit-Position: refs/heads/master@{#889331} +--- + +Index: qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/tools/metrics/ukm/PRESUBMIT.py +=================================================================== +--- qtwebengine-everywhere-src-5.15.13.orig/src/3rdparty/chromium/tools/metrics/ukm/PRESUBMIT.py ++++ qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/tools/metrics/ukm/PRESUBMIT.py +@@ -8,6 +8,8 @@ See http://dev.chromium.org/developers/h + for more details on the presubmit API built into gcl. + """ + ++USE_PYTHON3 = True ++ + UKM_XML = 'ukm.xml' + + +Index: qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/tools/metrics/ukm/gen_builders_test.py +=================================================================== +--- qtwebengine-everywhere-src-5.15.13.orig/src/3rdparty/chromium/tools/metrics/ukm/gen_builders_test.py ++++ qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/tools/metrics/ukm/gen_builders_test.py +@@ -25,8 +25,8 @@ class GenBuildersTest(unittest.TestCase) + + def testGenerateCode(self): + relpath = '.' +- data = ukm_model.UKM_XML_TYPE.Parse( +- open('../../tools/metrics/ukm/ukm.xml').read()) ++ with open('../../tools/metrics/ukm/ukm.xml') as f: ++ data = ukm_model.UKM_XML_TYPE.Parse(f.read()) + event = data[ukm_model._EVENT_TYPE.tag][0] + metric = event[ukm_model._METRIC_TYPE.tag][0] + self.assertIsNotNone(event) +Index: qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/tools/metrics/ukm/ukm_model.py +=================================================================== +--- qtwebengine-everywhere-src-5.15.13.orig/src/3rdparty/chromium/tools/metrics/ukm/ukm_model.py ++++ qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/tools/metrics/ukm/ukm_model.py +@@ -39,15 +39,16 @@ _INDEX_TYPE = models.ObjectNodeType( + ], + single_line=True) + +-_STATISTICS_TYPE = models.ObjectNodeType( ++_STATISTICS_TYPE = models.ObjectNodeType( + 'statistics', + attributes=[ +- ('export', str, r'^(?i)(|true|false)$'), ++ ('export', str, r'(?i)^(|true|false)$'), + ], + children=[ + models.ChildType(_QUANTILES_TYPE.tag, _QUANTILES_TYPE, multiple=False), +- models.ChildType( +- _ENUMERATION_TYPE.tag, _ENUMERATION_TYPE, multiple=False), ++ models.ChildType(_ENUMERATION_TYPE.tag, ++ _ENUMERATION_TYPE, ++ multiple=False), + ]) + + _HISTORY_TYPE = models.ObjectNodeType( +@@ -90,25 +91,34 @@ _METRIC_TYPE = models.ObjectNodeType( + _AGGREGATION_TYPE.tag, _AGGREGATION_TYPE, multiple=True), + ]) + +-_EVENT_TYPE = models.ObjectNodeType( +- 'event', +- attributes=[ +- ('name', str, r'^[A-Za-z0-9.]+$'), +- ('singular', str, r'^(?i)(|true|false)$'), +- ], +- alphabetization=[ +- (_OBSOLETE_TYPE.tag, _KEEP_ORDER), +- (_OWNER_TYPE.tag, _KEEP_ORDER), +- (_SUMMARY_TYPE.tag, _KEEP_ORDER), +- (_METRIC_TYPE.tag, _LOWERCASE_FN('name')), +- ], +- extra_newlines=(1, 1, 1), +- children=[ +- models.ChildType(_OBSOLETE_TYPE.tag, _OBSOLETE_TYPE, multiple=False), +- models.ChildType(_OWNER_TYPE.tag, _OWNER_TYPE, multiple=True), +- models.ChildType(_SUMMARY_TYPE.tag, _SUMMARY_TYPE, multiple=False), +- models.ChildType(_METRIC_TYPE.tag, _METRIC_TYPE, multiple=True), +- ]) ++_EVENT_TYPE = models.ObjectNodeType('event', ++ attributes=[ ++ ('name', str, r'^[A-Za-z0-9.]+$'), ++ ('singular', str, ++ r'(?i)^(|true|false)$'), ++ ], ++ alphabetization=[ ++ (_OBSOLETE_TYPE.tag, _KEEP_ORDER), ++ (_OWNER_TYPE.tag, _KEEP_ORDER), ++ (_SUMMARY_TYPE.tag, _KEEP_ORDER), ++ (_METRIC_TYPE.tag, ++ _LOWERCASE_FN('name')), ++ ], ++ extra_newlines=(1, 1, 1), ++ children=[ ++ models.ChildType(_OBSOLETE_TYPE.tag, ++ _OBSOLETE_TYPE, ++ multiple=False), ++ models.ChildType(_OWNER_TYPE.tag, ++ _OWNER_TYPE, ++ multiple=True), ++ models.ChildType(_SUMMARY_TYPE.tag, ++ _SUMMARY_TYPE, ++ multiple=False), ++ models.ChildType(_METRIC_TYPE.tag, ++ _METRIC_TYPE, ++ multiple=True), ++ ]) + + _UKM_CONFIGURATION_TYPE = models.ObjectNodeType( + 'ukm-configuration', +Index: qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/PRESUBMIT_test_mocks.py +=================================================================== +--- qtwebengine-everywhere-src-5.15.13.orig/src/3rdparty/chromium/PRESUBMIT_test_mocks.py ++++ qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/PRESUBMIT_test_mocks.py +@@ -119,7 +119,7 @@ class MockInputApi(object): + def PresubmitLocalPath(self): + return self.presubmit_local_path + +- def ReadFile(self, filename, mode='rU'): ++ def ReadFile(self, filename, mode='r'): + if hasattr(filename, 'AbsoluteLocalPath'): + filename = filename.AbsoluteLocalPath() + for file_ in self.files: +Index: qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/tools/grit/grit/util.py +=================================================================== +--- qtwebengine-everywhere-src-5.15.13.orig/src/3rdparty/chromium/tools/grit/grit/util.py ++++ qtwebengine-everywhere-src-5.15.13/src/3rdparty/chromium/tools/grit/grit/util.py +@@ -211,7 +211,7 @@ def ReadFile(filename, encoding): + mode = 'rb' + encoding = None + else: +- mode = 'rU' ++ mode = 'r' + + with io.open(abs(filename), mode, encoding=encoding) as f: + return f.read() diff --git a/qtwebengine-everywhere-src-5.15.16.tar.xz b/qtwebengine-everywhere-src-5.15.16.tar.xz new file mode 100644 index 0000000..bf631fa --- /dev/null +++ b/qtwebengine-everywhere-src-5.15.16.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd1c1b1953191845a57aca6cd82b67daf12582ebebe36c5f8bd899d6ae54886d +size 320185952 diff --git a/qtwebengine-ffmpeg5.patch b/qtwebengine-ffmpeg5.patch new file mode 100644 index 0000000..6fc3c8e --- /dev/null +++ b/qtwebengine-ffmpeg5.patch @@ -0,0 +1,153 @@ +Allow building qtwebengine using ffmpeg 5 +Origin: ArchLinux, https://github.com/archlinux/svntogit-packages/tree/packages/qt5-webengine/trunk + +diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h +index 2734a48..70b1877 100644 +--- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h ++++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h +@@ -29,6 +29,7 @@ extern "C" { + #include + #include + #include ++#include + #include + #include + #include +diff --git a/src/3rdparty/chromium/media/filters/audio_file_reader.cc b/src/3rdparty/chromium/media/filters/audio_file_reader.cc +index cb81d92..bd73908 100644 +--- a/src/3rdparty/chromium/media/filters/audio_file_reader.cc ++++ b/src/3rdparty/chromium/media/filters/audio_file_reader.cc +@@ -85,7 +85,7 @@ bool AudioFileReader::OpenDemuxer() { + } + + bool AudioFileReader::OpenDecoder() { +- AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); ++ const AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); + if (codec) { + // MP3 decodes to S16P which we don't support, tell it to use S16 instead. + if (codec_context_->sample_fmt == AV_SAMPLE_FMT_S16P) +diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc b/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc +index 0d825ed..72fac61 100644 +--- a/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc ++++ b/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc +@@ -329,7 +329,7 @@ bool FFmpegAudioDecoder::ConfigureDecoder(const AudioDecoderConfig& config) { + } + } + +- AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); ++ const AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); + if (!codec || + avcodec_open2(codec_context_.get(), codec, &codec_options) < 0) { + DLOG(ERROR) << "Could not initialize audio decoder: " +diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_demuxer.cc b/src/3rdparty/chromium/media/filters/ffmpeg_demuxer.cc +index d34db63..427565b 100644 +--- a/src/3rdparty/chromium/media/filters/ffmpeg_demuxer.cc ++++ b/src/3rdparty/chromium/media/filters/ffmpeg_demuxer.cc +@@ -98,12 +98,12 @@ static base::TimeDelta ExtractStartTime(AVStream* stream) { + + // Next try to use the first DTS value, for codecs where we know PTS == DTS + // (excludes all H26x codecs). The start time must be returned in PTS. +- if (stream->first_dts != kNoFFmpegTimestamp && ++ if (av_stream_get_first_dts(stream) != kNoFFmpegTimestamp && + stream->codecpar->codec_id != AV_CODEC_ID_HEVC && + stream->codecpar->codec_id != AV_CODEC_ID_H264 && + stream->codecpar->codec_id != AV_CODEC_ID_MPEG4) { + const base::TimeDelta first_pts = +- ConvertFromTimeBase(stream->time_base, stream->first_dts); ++ ConvertFromTimeBase(stream->time_base, av_stream_get_first_dts(stream)); + if (first_pts < start_time) + start_time = first_pts; + } +@@ -408,11 +408,11 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + scoped_refptr buffer; + + if (type() == DemuxerStream::TEXT) { +- int id_size = 0; ++ size_t id_size = 0; + uint8_t* id_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_WEBVTT_IDENTIFIER, &id_size); + +- int settings_size = 0; ++ size_t settings_size = 0; + uint8_t* settings_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_WEBVTT_SETTINGS, &settings_size); + +@@ -424,7 +424,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + buffer = DecoderBuffer::CopyFrom(packet->data, packet->size, + side_data.data(), side_data.size()); + } else { +- int side_data_size = 0; ++ size_t side_data_size = 0; + uint8_t* side_data = av_packet_get_side_data( + packet.get(), AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, &side_data_size); + +@@ -485,7 +485,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { + packet->size - data_offset); + } + +- int skip_samples_size = 0; ++ size_t skip_samples_size = 0; + const uint32_t* skip_samples_ptr = + reinterpret_cast(av_packet_get_side_data( + packet.get(), AV_PKT_DATA_SKIP_SAMPLES, &skip_samples_size)); +diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_glue.cc b/src/3rdparty/chromium/media/filters/ffmpeg_glue.cc +index 0ef3521..8483ecc 100644 +--- a/src/3rdparty/chromium/media/filters/ffmpeg_glue.cc ++++ b/src/3rdparty/chromium/media/filters/ffmpeg_glue.cc +@@ -59,7 +59,6 @@ static int64_t AVIOSeekOperation(void* opaque, int64_t offset, int whence) { + } + + void FFmpegGlue::InitializeFFmpeg() { +- av_register_all(); + } + + static void LogContainer(bool is_local_file, +@@ -95,9 +94,6 @@ FFmpegGlue::FFmpegGlue(FFmpegURLProtocol* protocol) { + // Enable fast, but inaccurate seeks for MP3. + format_context_->flags |= AVFMT_FLAG_FAST_SEEK; + +- // Ensures we can read out various metadata bits like vp8 alpha. +- format_context_->flags |= AVFMT_FLAG_KEEP_SIDE_DATA; +- + // Ensures format parsing errors will bail out. From an audit on 11/2017, all + // instances were real failures. Solves bugs like http://crbug.com/710791. + format_context_->error_recognition |= AV_EF_EXPLODE; +diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc +index ef12477..7996606 100644 +--- a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc ++++ b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc +@@ -391,7 +391,7 @@ bool FFmpegVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config, + if (decode_nalus_) + codec_context_->flags2 |= AV_CODEC_FLAG2_CHUNKS; + +- AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); ++ const AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); + if (!codec || avcodec_open2(codec_context_.get(), codec, NULL) < 0) { + ReleaseFFmpegResources(); + return false; +diff --git a/src/3rdparty/chromium/media/filters/media_file_checker.cc b/src/3rdparty/chromium/media/filters/media_file_checker.cc +index 59c2a2f..1a9872c 100644 +--- a/src/3rdparty/chromium/media/filters/media_file_checker.cc ++++ b/src/3rdparty/chromium/media/filters/media_file_checker.cc +@@ -68,7 +68,7 @@ bool MediaFileChecker::Start(base::TimeDelta check_time) { + auto context = AVStreamToAVCodecContext(format_context->streams[i]); + if (!context) + continue; +- AVCodec* codec = avcodec_find_decoder(cp->codec_id); ++ const AVCodec* codec = avcodec_find_decoder(cp->codec_id); + if (codec && avcodec_open2(context.get(), codec, nullptr) >= 0) { + auto loop = std::make_unique(context.get()); + stream_contexts[i] = {std::move(context), std::move(loop)}; +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc +index 9002b87..d12fade 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc +@@ -203,7 +203,7 @@ int32_t H264DecoderImpl::InitDecode(const VideoCodec* codec_settings, + // a pointer |this|. + av_context_->opaque = this; + +- AVCodec* codec = avcodec_find_decoder(av_context_->codec_id); ++ const AVCodec* codec = avcodec_find_decoder(av_context_->codec_id); + if (!codec) { + // This is an indication that FFmpeg has not been initialized or it has not + // been compiled/initialized with the correct set of codecs. diff --git a/qtwebengine-pipewire-0.3.patch b/qtwebengine-pipewire-0.3.patch new file mode 100644 index 0000000..5cb5c66 --- /dev/null +++ b/qtwebengine-pipewire-0.3.patch @@ -0,0 +1,1764 @@ +Fix build with pipewire 0.3 +Origin: ArchLinux, https://github.com/archlinux/svntogit-packages/tree/packages/qt5-webengine/trunk + +--- + .../webrtc/modules/desktop_capture/BUILD.gn | 42 +- + .../linux/base_capturer_pipewire.cc | 770 ++++++++++++++---- + .../linux/base_capturer_pipewire.h | 58 +- + .../linux/{pipewire.sigs => pipewire02.sigs} | 3 + + .../desktop_capture/linux/pipewire03.sigs | 46 ++ + .../linux/screen_capturer_pipewire.cc | 29 - + .../linux/screen_capturer_pipewire.h | 33 - + .../linux/window_capturer_pipewire.cc | 29 - + .../linux/window_capturer_pipewire.h | 33 - + .../desktop_capture/screen_capturer_linux.cc | 4 +- + .../desktop_capture/window_capturer_linux.cc | 4 +- + .../chromium/third_party/webrtc/webrtc.gni | 4 + + 12 files changed, 750 insertions(+), 305 deletions(-) + rename src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/{pipewire.sigs => pipewire02.sigs} (91%) + create mode 100644 src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire03.sigs + delete mode 100644 src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc + delete mode 100644 src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h + delete mode 100644 src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc + delete mode 100644 src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.h + +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/BUILD.gn b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/BUILD.gn +index 5235512..8259442 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/BUILD.gn ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/BUILD.gn +@@ -11,6 +11,11 @@ import("//build/config/ui.gni") + import("//tools/generate_stubs/rules.gni") + import("../../webrtc.gni") + ++if (rtc_use_pipewire) { ++ assert(rtc_pipewire_version == "0.2" || rtc_pipewire_version == "0.3", ++ "Unsupported PipeWire version") ++} ++ + use_desktop_capture_differ_sse2 = current_cpu == "x86" || current_cpu == "x64" + + config("x11_config") { +@@ -200,22 +205,41 @@ if (is_linux || is_chromeos) { + ] + } + +- if (rtc_link_pipewire) { ++ if (rtc_pipewire_version == "0.3") { + pkg_config("pipewire") { +- packages = [ "libpipewire-0.2" ] ++ packages = [ "libpipewire-0.3" ] ++ if (!rtc_link_pipewire) { ++ ignore_libs = true ++ } + } + } else { ++ pkg_config("pipewire") { ++ packages = [ "libpipewire-0.2" ] ++ if (!rtc_link_pipewire) { ++ ignore_libs = true ++ } ++ } ++ } ++ ++ if (!rtc_link_pipewire) { + # When libpipewire is not directly linked, use stubs to allow for dlopening of + # the binary. + generate_stubs("pipewire_stubs") { +- configs = [ "../../:common_config" ] ++ configs = [ ++ "../../:common_config", ++ ":pipewire", ++ ] + deps = [ "../../rtc_base" ] + extra_header = "linux/pipewire_stub_header.fragment" + logging_function = "RTC_LOG(LS_VERBOSE)" + logging_include = "rtc_base/logging.h" + output_name = "linux/pipewire_stubs" + path_from_source = "modules/desktop_capture/linux" +- sigs = [ "linux/pipewire.sigs" ] ++ if (rtc_pipewire_version == "0.3") { ++ sigs = [ "linux/pipewire03.sigs" ] ++ } else { ++ sigs = [ "linux/pipewire02.sigs" ] ++ } + } + } + +@@ -506,6 +530,7 @@ rtc_library("desktop_capture_generic") { + absl_deps = [ + "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/strings", ++ "//third_party/abseil-cpp/absl/types:optional", + ] + + if (rtc_use_x11_extensions) { +@@ -526,20 +551,15 @@ rtc_library("desktop_capture_generic") { + sources += [ + "linux/base_capturer_pipewire.cc", + "linux/base_capturer_pipewire.h", +- "linux/screen_capturer_pipewire.cc", +- "linux/screen_capturer_pipewire.h", +- "linux/window_capturer_pipewire.cc", +- "linux/window_capturer_pipewire.h", + ] + + configs += [ + ":pipewire_config", + ":gio", ++ ":pipewire", + ] + +- if (rtc_link_pipewire) { +- configs += [ ":pipewire" ] +- } else { ++ if (!rtc_link_pipewire) { + deps += [ ":pipewire_stubs" ] + } + } +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +index 2640e93..c302a08 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +@@ -14,8 +14,14 @@ + #include + #include + #include ++#if !PW_CHECK_VERSION(0, 3, 0) + #include + #include ++#endif ++ ++#include ++#include ++#include + + #include + #include +@@ -30,7 +36,11 @@ + #include "modules/desktop_capture/linux/pipewire_stubs.h" + + using modules_desktop_capture_linux::InitializeStubs; +-using modules_desktop_capture_linux::kModulePipewire; ++#if PW_CHECK_VERSION(0, 3, 0) ++using modules_desktop_capture_linux::kModulePipewire03; ++#else ++using modules_desktop_capture_linux::kModulePipewire02; ++#endif + using modules_desktop_capture_linux::StubPathMap; + #endif // defined(WEBRTC_DLOPEN_PIPEWIRE) + +@@ -47,9 +57,156 @@ const char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast"; + const int kBytesPerPixel = 4; + + #if defined(WEBRTC_DLOPEN_PIPEWIRE) ++#if PW_CHECK_VERSION(0, 3, 0) ++const char kPipeWireLib[] = "libpipewire-0.3.so.0"; ++#else + const char kPipeWireLib[] = "libpipewire-0.2.so.1"; + #endif ++#endif + ++// static ++struct dma_buf_sync { ++ uint64_t flags; ++}; ++#define DMA_BUF_SYNC_READ (1 << 0) ++#define DMA_BUF_SYNC_START (0 << 2) ++#define DMA_BUF_SYNC_END (1 << 2) ++#define DMA_BUF_BASE 'b' ++#define DMA_BUF_IOCTL_SYNC _IOW(DMA_BUF_BASE, 0, struct dma_buf_sync) ++ ++static void SyncDmaBuf(int fd, uint64_t start_or_end) { ++ struct dma_buf_sync sync = {0}; ++ ++ sync.flags = start_or_end | DMA_BUF_SYNC_READ; ++ ++ while (true) { ++ int ret; ++ ret = ioctl(fd, DMA_BUF_IOCTL_SYNC, &sync); ++ if (ret == -1 && errno == EINTR) { ++ continue; ++ } else if (ret == -1) { ++ RTC_LOG(LS_ERROR) << "Failed to synchronize DMA buffer: " ++ << g_strerror(errno); ++ break; ++ } else { ++ break; ++ } ++ } ++} ++ ++class ScopedBuf { ++ public: ++ ScopedBuf() {} ++ ScopedBuf(unsigned char* map, int map_size, bool is_dma_buf, int fd) ++ : map_(map), map_size_(map_size), is_dma_buf_(is_dma_buf), fd_(fd) {} ++ ~ScopedBuf() { ++ if (map_ != MAP_FAILED) { ++ if (is_dma_buf_) { ++ SyncDmaBuf(fd_, DMA_BUF_SYNC_END); ++ } ++ munmap(map_, map_size_); ++ } ++ } ++ ++ operator bool() { return map_ != MAP_FAILED; } ++ ++ void initialize(unsigned char* map, int map_size, bool is_dma_buf, int fd) { ++ map_ = map; ++ map_size_ = map_size; ++ is_dma_buf_ = is_dma_buf; ++ fd_ = fd; ++ } ++ ++ unsigned char* get() { return map_; } ++ ++ protected: ++ unsigned char* map_ = nullptr; ++ int map_size_; ++ bool is_dma_buf_; ++ int fd_; ++}; ++ ++template ++class Scoped { ++ public: ++ Scoped() {} ++ explicit Scoped(T* val) { ptr_ = val; } ++ ~Scoped() { RTC_NOTREACHED(); } ++ ++ T* operator->() { return ptr_; } ++ ++ bool operator!() { return ptr_ == nullptr; } ++ ++ T* get() { return ptr_; } ++ ++ T** receive() { ++ RTC_CHECK(!ptr_); ++ return &ptr_; ++ } ++ ++ Scoped& operator=(T* val) { ++ ptr_ = val; ++ return *this; ++ } ++ ++ protected: ++ T* ptr_ = nullptr; ++}; ++ ++template <> ++Scoped::~Scoped() { ++ if (ptr_) { ++ g_error_free(ptr_); ++ } ++} ++ ++template <> ++Scoped::~Scoped() { ++ if (ptr_) { ++ g_free(ptr_); ++ } ++} ++ ++template <> ++Scoped::~Scoped() { ++ if (ptr_) { ++ g_variant_unref(ptr_); ++ } ++} ++ ++template <> ++Scoped::~Scoped() { ++ if (ptr_) { ++ g_variant_iter_free(ptr_); ++ } ++} ++ ++template <> ++Scoped::~Scoped() { ++ if (ptr_) { ++ g_object_unref(ptr_); ++ } ++} ++ ++template <> ++Scoped::~Scoped() { ++ if (ptr_) { ++ g_object_unref(ptr_); ++ } ++} ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++void BaseCapturerPipeWire::OnCoreError(void* data, ++ uint32_t id, ++ int seq, ++ int res, ++ const char* message) { ++ BaseCapturerPipeWire* that = static_cast(data); ++ RTC_DCHECK(that); ++ ++ RTC_LOG(LS_ERROR) << "PipeWire remote error: " << message; ++} ++#else + // static + void BaseCapturerPipeWire::OnStateChanged(void* data, + pw_remote_state old_state, +@@ -64,7 +221,7 @@ void BaseCapturerPipeWire::OnStateChanged(void* data, + break; + case PW_REMOTE_STATE_CONNECTED: + RTC_LOG(LS_INFO) << "PipeWire remote state: connected."; +- that->CreateReceivingStream(); ++ that->pw_stream_ = that->CreateReceivingStream(); + break; + case PW_REMOTE_STATE_CONNECTING: + RTC_LOG(LS_INFO) << "PipeWire remote state: connecting."; +@@ -74,6 +231,7 @@ void BaseCapturerPipeWire::OnStateChanged(void* data, + break; + } + } ++#endif + + // static + void BaseCapturerPipeWire::OnStreamStateChanged(void* data, +@@ -83,6 +241,18 @@ void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + BaseCapturerPipeWire* that = static_cast(data); + RTC_DCHECK(that); + ++#if PW_CHECK_VERSION(0, 3, 0) ++ switch (state) { ++ case PW_STREAM_STATE_ERROR: ++ RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message; ++ break; ++ case PW_STREAM_STATE_PAUSED: ++ case PW_STREAM_STATE_STREAMING: ++ case PW_STREAM_STATE_UNCONNECTED: ++ case PW_STREAM_STATE_CONNECTING: ++ break; ++ } ++#else + switch (state) { + case PW_STREAM_STATE_ERROR: + RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message; +@@ -97,36 +267,74 @@ void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + case PW_STREAM_STATE_STREAMING: + break; + } ++#endif + } + + // static ++#if PW_CHECK_VERSION(0, 3, 0) ++void BaseCapturerPipeWire::OnStreamParamChanged(void* data, ++ uint32_t id, ++ const struct spa_pod* format) { ++#else + void BaseCapturerPipeWire::OnStreamFormatChanged(void* data, + const struct spa_pod* format) { ++#endif + BaseCapturerPipeWire* that = static_cast(data); + RTC_DCHECK(that); + + RTC_LOG(LS_INFO) << "PipeWire stream format changed."; + ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (!format || id != SPA_PARAM_Format) { ++#else + if (!format) { + pw_stream_finish_format(that->pw_stream_, /*res=*/0, /*params=*/nullptr, + /*n_params=*/0); ++#endif + return; + } + ++#if PW_CHECK_VERSION(0, 3, 0) ++ spa_format_video_raw_parse(format, &that->spa_video_format_); ++#else + that->spa_video_format_ = new spa_video_info_raw(); + spa_format_video_raw_parse(format, that->spa_video_format_, + &that->pw_type_->format_video); ++#endif + ++#if PW_CHECK_VERSION(0, 3, 0) ++ auto width = that->spa_video_format_.size.width; ++ auto height = that->spa_video_format_.size.height; ++#else + auto width = that->spa_video_format_->size.width; + auto height = that->spa_video_format_->size.height; ++#endif + auto stride = SPA_ROUND_UP_N(width * kBytesPerPixel, 4); + auto size = height * stride; + ++ that->desktop_size_ = DesktopSize(width, height); ++ + uint8_t buffer[1024] = {}; + auto builder = spa_pod_builder{buffer, sizeof(buffer)}; + + // Setup buffers and meta header for new format. +- const struct spa_pod* params[2]; ++ const struct spa_pod* params[3]; ++#if PW_CHECK_VERSION(0, 3, 0) ++ params[0] = reinterpret_cast(spa_pod_builder_add_object( ++ &builder, SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers, ++ SPA_PARAM_BUFFERS_size, SPA_POD_Int(size), SPA_PARAM_BUFFERS_stride, ++ SPA_POD_Int(stride), SPA_PARAM_BUFFERS_buffers, ++ SPA_POD_CHOICE_RANGE_Int(8, 1, 32))); ++ params[1] = reinterpret_cast(spa_pod_builder_add_object( ++ &builder, SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, SPA_PARAM_META_type, ++ SPA_POD_Id(SPA_META_Header), SPA_PARAM_META_size, ++ SPA_POD_Int(sizeof(struct spa_meta_header)))); ++ params[2] = reinterpret_cast(spa_pod_builder_add_object( ++ &builder, SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, SPA_PARAM_META_type, ++ SPA_POD_Id(SPA_META_VideoCrop), SPA_PARAM_META_size, ++ SPA_POD_Int(sizeof(struct spa_meta_region)))); ++ pw_stream_update_params(that->pw_stream_, params, 3); ++#else + params[0] = reinterpret_cast(spa_pod_builder_object( + &builder, + // id to enumerate buffer requirements +@@ -155,8 +363,18 @@ void BaseCapturerPipeWire::OnStreamFormatChanged(void* data, + // Size: size of the metadata, specified as integer (i) + ":", that->pw_core_type_->param_meta.size, "i", + sizeof(struct spa_meta_header))); +- +- pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/2); ++ params[2] = reinterpret_cast(spa_pod_builder_object( ++ &builder, ++ // id to enumerate supported metadata ++ that->pw_core_type_->param.idMeta, that->pw_core_type_->param_meta.Meta, ++ // Type: specified as id or enum (I) ++ ":", that->pw_core_type_->param_meta.type, "I", ++ that->pw_core_type_->meta.VideoCrop, ++ // Size: size of the metadata, specified as integer (i) ++ ":", that->pw_core_type_->param_meta.size, "i", ++ sizeof(struct spa_meta_video_crop))); ++ pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/3); ++#endif + } + + // static +@@ -164,15 +382,26 @@ void BaseCapturerPipeWire::OnStreamProcess(void* data) { + BaseCapturerPipeWire* that = static_cast(data); + RTC_DCHECK(that); + +- pw_buffer* buf = nullptr; ++ struct pw_buffer* next_buffer; ++ struct pw_buffer* buffer = nullptr; ++ ++ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); ++ while (next_buffer) { ++ buffer = next_buffer; ++ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); + +- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) { ++ if (next_buffer) { ++ pw_stream_queue_buffer(that->pw_stream_, buffer); ++ } ++ } ++ ++ if (!buffer) { + return; + } + +- that->HandleBuffer(buf); ++ that->HandleBuffer(buffer); + +- pw_stream_queue_buffer(that->pw_stream_, buf); ++ pw_stream_queue_buffer(that->pw_stream_, buffer); + } + + BaseCapturerPipeWire::BaseCapturerPipeWire(CaptureSourceType source_type) +@@ -183,6 +412,7 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + pw_thread_loop_stop(pw_main_loop_); + } + ++#if !PW_CHECK_VERSION(0, 3, 0) + if (pw_type_) { + delete pw_type_; + } +@@ -190,30 +420,41 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + if (spa_video_format_) { + delete spa_video_format_; + } ++#endif + + if (pw_stream_) { + pw_stream_destroy(pw_stream_); + } + ++#if !PW_CHECK_VERSION(0, 3, 0) + if (pw_remote_) { + pw_remote_destroy(pw_remote_); + } ++#endif + ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (pw_core_) { ++ pw_core_disconnect(pw_core_); ++ } ++ ++ if (pw_context_) { ++ pw_context_destroy(pw_context_); ++ } ++#else + if (pw_core_) { + pw_core_destroy(pw_core_); + } ++#endif + + if (pw_main_loop_) { + pw_thread_loop_destroy(pw_main_loop_); + } + ++#if !PW_CHECK_VERSION(0, 3, 0) + if (pw_loop_) { + pw_loop_destroy(pw_loop_); + } +- +- if (current_frame_) { +- free(current_frame_); +- } ++#endif + + if (start_request_signal_id_) { + g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_); +@@ -228,18 +469,16 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + } + + if (session_handle_) { +- GDBusMessage* message = g_dbus_message_new_method_call( +- kDesktopBusName, session_handle_, kSessionInterfaceName, "Close"); +- if (message) { +- GError* error = nullptr; +- g_dbus_connection_send_message(connection_, message, ++ Scoped message(g_dbus_message_new_method_call( ++ kDesktopBusName, session_handle_, kSessionInterfaceName, "Close")); ++ if (message.get()) { ++ Scoped error; ++ g_dbus_connection_send_message(connection_, message.get(), + G_DBUS_SEND_MESSAGE_FLAGS_NONE, +- /*out_serial=*/nullptr, &error); +- if (error) { ++ /*out_serial=*/nullptr, error.receive()); ++ if (error.get()) { + RTC_LOG(LS_ERROR) << "Failed to close the session: " << error->message; +- g_error_free(error); + } +- g_object_unref(message); + } + } + +@@ -274,7 +513,11 @@ void BaseCapturerPipeWire::InitPipeWire() { + StubPathMap paths; + + // Check if the PipeWire library is available. +- paths[kModulePipewire].push_back(kPipeWireLib); ++#if PW_CHECK_VERSION(0, 3, 0) ++ paths[kModulePipewire03].push_back(kPipeWireLib); ++#else ++ paths[kModulePipewire02].push_back(kPipeWireLib); ++#endif + if (!InitializeStubs(paths)) { + RTC_LOG(LS_ERROR) << "Failed to load the PipeWire library and symbols."; + portal_init_failed_ = true; +@@ -284,16 +527,46 @@ void BaseCapturerPipeWire::InitPipeWire() { + + pw_init(/*argc=*/nullptr, /*argc=*/nullptr); + ++#if PW_CHECK_VERSION(0, 3, 0) ++ pw_main_loop_ = pw_thread_loop_new("pipewire-main-loop", nullptr); ++ ++ pw_thread_loop_lock(pw_main_loop_); ++ ++ pw_context_ = ++ pw_context_new(pw_thread_loop_get_loop(pw_main_loop_), nullptr, 0); ++ if (!pw_context_) { ++ RTC_LOG(LS_ERROR) << "Failed to create PipeWire context"; ++ return; ++ } ++ ++ pw_core_ = pw_context_connect(pw_context_, nullptr, 0); ++ if (!pw_core_) { ++ RTC_LOG(LS_ERROR) << "Failed to connect PipeWire context"; ++ return; ++ } ++#else + pw_loop_ = pw_loop_new(/*properties=*/nullptr); + pw_main_loop_ = pw_thread_loop_new(pw_loop_, "pipewire-main-loop"); + ++ pw_thread_loop_lock(pw_main_loop_); ++ + pw_core_ = pw_core_new(pw_loop_, /*properties=*/nullptr); + pw_core_type_ = pw_core_get_type(pw_core_); + pw_remote_ = pw_remote_new(pw_core_, nullptr, /*user_data_size=*/0); + + InitPipeWireTypes(); ++#endif + + // Initialize event handlers, remote end and stream-related. ++#if PW_CHECK_VERSION(0, 3, 0) ++ pw_core_events_.version = PW_VERSION_CORE_EVENTS; ++ pw_core_events_.error = &OnCoreError; ++ ++ pw_stream_events_.version = PW_VERSION_STREAM_EVENTS; ++ pw_stream_events_.state_changed = &OnStreamStateChanged; ++ pw_stream_events_.param_changed = &OnStreamParamChanged; ++ pw_stream_events_.process = &OnStreamProcess; ++#else + pw_remote_events_.version = PW_VERSION_REMOTE_EVENTS; + pw_remote_events_.state_changed = &OnStateChanged; + +@@ -301,19 +574,33 @@ void BaseCapturerPipeWire::InitPipeWire() { + pw_stream_events_.state_changed = &OnStreamStateChanged; + pw_stream_events_.format_changed = &OnStreamFormatChanged; + pw_stream_events_.process = &OnStreamProcess; ++#endif + ++#if PW_CHECK_VERSION(0, 3, 0) ++ pw_core_add_listener(pw_core_, &spa_core_listener_, &pw_core_events_, this); ++ ++ pw_stream_ = CreateReceivingStream(); ++ if (!pw_stream_) { ++ RTC_LOG(LS_ERROR) << "Failed to create PipeWire stream"; ++ return; ++ } ++#else + pw_remote_add_listener(pw_remote_, &spa_remote_listener_, &pw_remote_events_, + this); + pw_remote_connect_fd(pw_remote_, pw_fd_); ++#endif + + if (pw_thread_loop_start(pw_main_loop_) < 0) { + RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop"; + portal_init_failed_ = true; + } + ++ pw_thread_loop_unlock(pw_main_loop_); ++ + RTC_LOG(LS_INFO) << "PipeWire remote opened."; + } + ++#if !PW_CHECK_VERSION(0, 3, 0) + void BaseCapturerPipeWire::InitPipeWireTypes() { + spa_type_map* map = pw_core_type_->map; + pw_type_ = new PipeWireType(); +@@ -323,23 +610,44 @@ void BaseCapturerPipeWire::InitPipeWireTypes() { + spa_type_format_video_map(map, &pw_type_->format_video); + spa_type_video_format_map(map, &pw_type_->video_format); + } ++#endif + +-void BaseCapturerPipeWire::CreateReceivingStream() { ++pw_stream* BaseCapturerPipeWire::CreateReceivingStream() { ++#if !PW_CHECK_VERSION(0, 3, 0) ++ if (pw_remote_get_state(pw_remote_, nullptr) != PW_REMOTE_STATE_CONNECTED) { ++ RTC_LOG(LS_ERROR) << "Cannot create pipewire stream"; ++ return nullptr; ++ } ++#endif + spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1}; +- spa_rectangle pwScreenBounds = +- spa_rectangle{static_cast(desktop_size_.width()), +- static_cast(desktop_size_.height())}; +- +- spa_fraction pwFrameRateMin = spa_fraction{0, 1}; +- spa_fraction pwFrameRateMax = spa_fraction{60, 1}; ++ spa_rectangle pwMaxScreenBounds = spa_rectangle{UINT32_MAX, UINT32_MAX}; + + pw_properties* reuseProps = + pw_properties_new_string("pipewire.client.reuse=1"); +- pw_stream_ = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); ++#if PW_CHECK_VERSION(0, 3, 0) ++ auto stream = pw_stream_new(pw_core_, "webrtc-consume-stream", reuseProps); ++#else ++ auto stream = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); ++#endif + + uint8_t buffer[1024] = {}; + const spa_pod* params[1]; + spa_pod_builder builder = spa_pod_builder{buffer, sizeof(buffer)}; ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++ params[0] = reinterpret_cast(spa_pod_builder_add_object( ++ &builder, SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, ++ SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_video), ++ SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), ++ SPA_FORMAT_VIDEO_format, ++ SPA_POD_CHOICE_ENUM_Id(5, SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_RGBx, ++ SPA_VIDEO_FORMAT_RGBA, SPA_VIDEO_FORMAT_BGRx, ++ SPA_VIDEO_FORMAT_BGRA), ++ SPA_FORMAT_VIDEO_size, ++ SPA_POD_CHOICE_RANGE_Rectangle(&pwMinScreenBounds, &pwMinScreenBounds, ++ &pwMaxScreenBounds), ++ 0)); ++#else + params[0] = reinterpret_cast(spa_pod_builder_object( + &builder, + // id to enumerate formats +@@ -349,69 +657,218 @@ void BaseCapturerPipeWire::CreateReceivingStream() { + // then allowed formats are enumerated (e) and the format is undecided (u) + // to allow negotiation + ":", pw_type_->format_video.format, "Ieu", pw_type_->video_format.BGRx, +- SPA_POD_PROP_ENUM(2, pw_type_->video_format.RGBx, +- pw_type_->video_format.BGRx), ++ SPA_POD_PROP_ENUM( ++ 4, pw_type_->video_format.RGBx, pw_type_->video_format.BGRx, ++ pw_type_->video_format.RGBA, pw_type_->video_format.BGRA), + // Video size: specified as rectangle (R), preferred size is specified as + // first parameter, then allowed size is defined as range (r) from min and + // max values and the format is undecided (u) to allow negotiation +- ":", pw_type_->format_video.size, "Rru", &pwScreenBounds, 2, +- &pwMinScreenBounds, &pwScreenBounds, +- // Frame rate: specified as fraction (F) and set to minimum frame rate +- // value +- ":", pw_type_->format_video.framerate, "F", &pwFrameRateMin, +- // Max frame rate: specified as fraction (F), preferred frame rate is set +- // to maximum value, then allowed frame rate is defined as range (r) from +- // min and max values and it is undecided (u) to allow negotiation +- ":", pw_type_->format_video.max_framerate, "Fru", &pwFrameRateMax, 2, +- &pwFrameRateMin, &pwFrameRateMax)); +- +- pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_, ++ ":", pw_type_->format_video.size, "Rru", &pwMinScreenBounds, ++ SPA_POD_PROP_MIN_MAX(&pwMinScreenBounds, &pwMaxScreenBounds))); ++#endif ++ ++ pw_stream_add_listener(stream, &spa_stream_listener_, &pw_stream_events_, + this); ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (pw_stream_connect(stream, PW_DIRECTION_INPUT, pw_stream_node_id_, ++ PW_STREAM_FLAG_AUTOCONNECT, params, 1) != 0) { ++#else + pw_stream_flags flags = static_cast( +- PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE | +- PW_STREAM_FLAG_MAP_BUFFERS); +- if (pw_stream_connect(pw_stream_, PW_DIRECTION_INPUT, /*port_path=*/nullptr, ++ PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE); ++ if (pw_stream_connect(stream, PW_DIRECTION_INPUT, /*port_path=*/nullptr, + flags, params, + /*n_params=*/1) != 0) { ++#endif + RTC_LOG(LS_ERROR) << "Could not connect receiving stream."; + portal_init_failed_ = true; +- return; ++ return nullptr; + } ++ ++ return stream; + } + + void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) { + spa_buffer* spaBuffer = buffer->buffer; +- void* src = nullptr; ++ ScopedBuf map; ++ uint8_t* src = nullptr; ++ ++ if (spaBuffer->datas[0].chunk->size == 0) { ++ RTC_LOG(LS_ERROR) << "Failed to get video stream: Zero size."; ++ return; ++ } ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (spaBuffer->datas[0].type == SPA_DATA_MemFd || ++ spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { ++#else ++ if (spaBuffer->datas[0].type == pw_core_type_->data.MemFd || ++ spaBuffer->datas[0].type == pw_core_type_->data.DmaBuf) { ++#endif ++ map.initialize( ++ static_cast( ++ mmap(nullptr, ++ spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, ++ PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0)), ++ spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, ++#if PW_CHECK_VERSION(0, 3, 0) ++ spaBuffer->datas[0].type == SPA_DATA_DmaBuf, ++#else ++ spaBuffer->datas[0].type == pw_core_type_->data.DmaBuf, ++#endif ++ spaBuffer->datas[0].fd); ++ ++ if (!map) { ++ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " ++ << std::strerror(errno); ++ return; ++ } ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { ++#else ++ if (spaBuffer->datas[0].type == pw_core_type_->data.DmaBuf) { ++#endif ++ SyncDmaBuf(spaBuffer->datas[0].fd, DMA_BUF_SYNC_START); ++ } ++ ++ src = SPA_MEMBER(map.get(), spaBuffer->datas[0].mapoffset, uint8_t); ++#if PW_CHECK_VERSION(0, 3, 0) ++ } else if (spaBuffer->datas[0].type == SPA_DATA_MemPtr) { ++#else ++ } else if (spaBuffer->datas[0].type == pw_core_type_->data.MemPtr) { ++#endif ++ src = static_cast(spaBuffer->datas[0].data); ++ } + +- if (!(src = spaBuffer->datas[0].data)) { ++ if (!src) { ++ return; ++ } ++ ++#if PW_CHECK_VERSION(0, 3, 0) ++ struct spa_meta_region* video_metadata = ++ static_cast(spa_buffer_find_meta_data( ++ spaBuffer, SPA_META_VideoCrop, sizeof(*video_metadata))); ++#else ++ struct spa_meta_video_crop* video_metadata = ++ static_cast( ++ spa_buffer_find_meta(spaBuffer, pw_core_type_->meta.VideoCrop)); ++#endif ++ ++ // Video size from metadata is bigger than an actual video stream size. ++ // The metadata are wrong or we should up-scale the video...in both cases ++ // just quit now. ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (video_metadata && (video_metadata->region.size.width > ++ static_cast(desktop_size_.width()) || ++ video_metadata->region.size.height > ++ static_cast(desktop_size_.height()))) { ++#else ++ if (video_metadata && (video_metadata->width > desktop_size_.width() || ++ video_metadata->height > desktop_size_.height())) { ++#endif ++ RTC_LOG(LS_ERROR) << "Stream metadata sizes are wrong!"; + return; + } + +- uint32_t maxSize = spaBuffer->datas[0].maxsize; +- int32_t srcStride = spaBuffer->datas[0].chunk->stride; +- if (srcStride != (desktop_size_.width() * kBytesPerPixel)) { ++ // Use video metadata when video size from metadata is set and smaller than ++ // video stream size, so we need to adjust it. ++ bool video_is_full_width = true; ++ bool video_is_full_height = true; ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (video_metadata && video_metadata->region.size.width != 0 && ++ video_metadata->region.size.height != 0) { ++ if (video_metadata->region.size.width < ++ static_cast(desktop_size_.width())) { ++ video_is_full_width = false; ++ } else if (video_metadata->region.size.height < ++ static_cast(desktop_size_.height())) { ++ video_is_full_height = false; ++ } ++ } ++#else ++ if (video_metadata && video_metadata->width != 0 && ++ video_metadata->height != 0) { ++ if (video_metadata->width < desktop_size_.width()) { ++ } else if (video_metadata->height < desktop_size_.height()) { ++ video_is_full_height = false; ++ } ++ } ++#endif ++ ++ DesktopSize video_size_prev = video_size_; ++ if (!video_is_full_height || !video_is_full_width) { ++#if PW_CHECK_VERSION(0, 3, 0) ++ video_size_ = DesktopSize(video_metadata->region.size.width, ++ video_metadata->region.size.height); ++#else ++ video_size_ = DesktopSize(video_metadata->width, video_metadata->height); ++#endif ++ } else { ++ video_size_ = desktop_size_; ++ } ++ ++ webrtc::MutexLock lock(¤t_frame_lock_); ++ if (!current_frame_ || !video_size_.equals(video_size_prev)) { ++ current_frame_ = std::make_unique( ++ video_size_.width() * video_size_.height() * kBytesPerPixel); ++ } ++ ++ const int32_t dst_stride = video_size_.width() * kBytesPerPixel; ++ const int32_t src_stride = spaBuffer->datas[0].chunk->stride; ++ ++ if (src_stride != (desktop_size_.width() * kBytesPerPixel)) { + RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: " +- << srcStride ++ << src_stride + << " != " << (desktop_size_.width() * kBytesPerPixel); + portal_init_failed_ = true; ++ + return; + } + +- if (!current_frame_) { +- current_frame_ = static_cast(malloc(maxSize)); +- } +- RTC_DCHECK(current_frame_ != nullptr); +- +- // If both sides decided to go with the RGBx format we need to convert it to +- // BGRx to match color format expected by WebRTC. +- if (spa_video_format_->format == pw_type_->video_format.RGBx) { +- uint8_t* tempFrame = static_cast(malloc(maxSize)); +- std::memcpy(tempFrame, src, maxSize); +- ConvertRGBxToBGRx(tempFrame, maxSize); +- std::memcpy(current_frame_, tempFrame, maxSize); +- free(tempFrame); +- } else { +- std::memcpy(current_frame_, src, maxSize); ++ // Adjust source content based on metadata video position ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (!video_is_full_height && ++ (video_metadata->region.position.y + video_size_.height() <= ++ desktop_size_.height())) { ++ src += src_stride * video_metadata->region.position.y; ++ } ++ const int x_offset = ++ !video_is_full_width && ++ (video_metadata->region.position.x + video_size_.width() <= ++ desktop_size_.width()) ++ ? video_metadata->region.position.x * kBytesPerPixel ++ : 0; ++#else ++ if (!video_is_full_height && ++ (video_metadata->y + video_size_.height() <= desktop_size_.height())) { ++ src += src_stride * video_metadata->y; ++ } ++ ++ const int x_offset = ++ !video_is_full_width && ++ (video_metadata->x + video_size_.width() <= desktop_size_.width()) ++ ? video_metadata->x * kBytesPerPixel ++ : 0; ++#endif ++ ++ uint8_t* dst = current_frame_.get(); ++ for (int i = 0; i < video_size_.height(); ++i) { ++ // Adjust source content based on crop video position if needed ++ src += x_offset; ++ std::memcpy(dst, src, dst_stride); ++ // If both sides decided to go with the RGBx format we need to convert it to ++ // BGRx to match color format expected by WebRTC. ++#if PW_CHECK_VERSION(0, 3, 0) ++ if (spa_video_format_.format == SPA_VIDEO_FORMAT_RGBx || ++ spa_video_format_.format == SPA_VIDEO_FORMAT_RGBA) { ++#else ++ if (spa_video_format_->format == pw_type_->video_format.RGBx || ++ spa_video_format_->format == pw_type_->video_format.RGBA) { ++#endif ++ ConvertRGBxToBGRx(dst, dst_stride); ++ } ++ src += src_stride - x_offset; ++ dst += dst_stride; + } + } + +@@ -441,14 +898,13 @@ void BaseCapturerPipeWire::OnProxyRequested(GObject* /*object*/, + BaseCapturerPipeWire* that = static_cast(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GDBusProxy *proxy = g_dbus_proxy_new_finish(result, &error); ++ Scoped error; ++ GDBusProxy* proxy = g_dbus_proxy_new_finish(result, error.receive()); + if (!proxy) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to create a proxy for the screen cast portal: " + << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } +@@ -462,38 +918,36 @@ void BaseCapturerPipeWire::OnProxyRequested(GObject* /*object*/, + // static + gchar* BaseCapturerPipeWire::PrepareSignalHandle(GDBusConnection* connection, + const gchar* token) { +- gchar* sender = g_strdup(g_dbus_connection_get_unique_name(connection) + 1); +- for (int i = 0; sender[i]; i++) { +- if (sender[i] == '.') { +- sender[i] = '_'; ++ Scoped sender( ++ g_strdup(g_dbus_connection_get_unique_name(connection) + 1)); ++ for (int i = 0; sender.get()[i]; i++) { ++ if (sender.get()[i] == '.') { ++ sender.get()[i] = '_'; + } + } + +- gchar* handle = g_strconcat(kDesktopRequestObjectPath, "/", sender, "/", ++ gchar* handle = g_strconcat(kDesktopRequestObjectPath, "/", sender.get(), "/", + token, /*end of varargs*/ nullptr); +- g_free(sender); + + return handle; + } + + void BaseCapturerPipeWire::SessionRequest() { + GVariantBuilder builder; +- gchar* variant_string; ++ Scoped variant_string; + + g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT); + variant_string = + g_strdup_printf("webrtc_session%d", g_random_int_range(0, G_MAXINT)); + g_variant_builder_add(&builder, "{sv}", "session_handle_token", +- g_variant_new_string(variant_string)); +- g_free(variant_string); ++ g_variant_new_string(variant_string.get())); + variant_string = g_strdup_printf("webrtc%d", g_random_int_range(0, G_MAXINT)); + g_variant_builder_add(&builder, "{sv}", "handle_token", +- g_variant_new_string(variant_string)); ++ g_variant_new_string(variant_string.get())); + +- portal_handle_ = PrepareSignalHandle(connection_, variant_string); ++ portal_handle_ = PrepareSignalHandle(connection_, variant_string.get()); + session_request_signal_id_ = SetupRequestResponseSignal( + portal_handle_, OnSessionRequestResponseSignal); +- g_free(variant_string); + + RTC_LOG(LS_INFO) << "Screen cast session requested."; + g_dbus_proxy_call( +@@ -509,22 +963,21 @@ void BaseCapturerPipeWire::OnSessionRequested(GDBusProxy *proxy, + BaseCapturerPipeWire* that = static_cast(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GVariant* variant = g_dbus_proxy_call_finish(proxy, result, &error); ++ Scoped error; ++ Scoped variant( ++ g_dbus_proxy_call_finish(proxy, result, error.receive())); + if (!variant) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to create a screen cast session: " + << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } + RTC_LOG(LS_INFO) << "Initializing the screen cast session."; + +- gchar* handle = nullptr; +- g_variant_get_child(variant, 0, "o", &handle); +- g_variant_unref(variant); ++ Scoped handle; ++ g_variant_get_child(variant.get(), 0, "o", &handle); + if (!handle) { + RTC_LOG(LS_ERROR) << "Failed to initialize the screen cast session."; + if (that->session_request_signal_id_) { +@@ -536,8 +989,6 @@ void BaseCapturerPipeWire::OnSessionRequested(GDBusProxy *proxy, + return; + } + +- g_free(handle); +- + RTC_LOG(LS_INFO) << "Subscribing to the screen cast session."; + } + +@@ -557,11 +1008,11 @@ void BaseCapturerPipeWire::OnSessionRequestResponseSignal( + << "Received response for the screen cast session subscription."; + + guint32 portal_response; +- GVariant* response_data; +- g_variant_get(parameters, "(u@a{sv})", &portal_response, &response_data); +- g_variant_lookup(response_data, "session_handle", "s", ++ Scoped response_data; ++ g_variant_get(parameters, "(u@a{sv})", &portal_response, ++ response_data.receive()); ++ g_variant_lookup(response_data.get(), "session_handle", "s", + &that->session_handle_); +- g_variant_unref(response_data); + + if (!that->session_handle_ || portal_response) { + RTC_LOG(LS_ERROR) +@@ -575,23 +1026,23 @@ void BaseCapturerPipeWire::OnSessionRequestResponseSignal( + + void BaseCapturerPipeWire::SourcesRequest() { + GVariantBuilder builder; +- gchar* variant_string; ++ Scoped variant_string; + + g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT); + // We want to record monitor content. +- g_variant_builder_add(&builder, "{sv}", "types", +- g_variant_new_uint32(capture_source_type_)); ++ g_variant_builder_add( ++ &builder, "{sv}", "types", ++ g_variant_new_uint32(static_cast(capture_source_type_))); + // We don't want to allow selection of multiple sources. + g_variant_builder_add(&builder, "{sv}", "multiple", + g_variant_new_boolean(false)); + variant_string = g_strdup_printf("webrtc%d", g_random_int_range(0, G_MAXINT)); + g_variant_builder_add(&builder, "{sv}", "handle_token", +- g_variant_new_string(variant_string)); ++ g_variant_new_string(variant_string.get())); + +- sources_handle_ = PrepareSignalHandle(connection_, variant_string); ++ sources_handle_ = PrepareSignalHandle(connection_, variant_string.get()); + sources_request_signal_id_ = SetupRequestResponseSignal( + sources_handle_, OnSourcesRequestResponseSignal); +- g_free(variant_string); + + RTC_LOG(LS_INFO) << "Requesting sources from the screen cast session."; + g_dbus_proxy_call( +@@ -608,22 +1059,21 @@ void BaseCapturerPipeWire::OnSourcesRequested(GDBusProxy *proxy, + BaseCapturerPipeWire* that = static_cast(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GVariant* variant = g_dbus_proxy_call_finish(proxy, result, &error); ++ Scoped error; ++ Scoped variant( ++ g_dbus_proxy_call_finish(proxy, result, error.receive())); + if (!variant) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to request the sources: " << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } + + RTC_LOG(LS_INFO) << "Sources requested from the screen cast session."; + +- gchar* handle = nullptr; +- g_variant_get_child(variant, 0, "o", &handle); +- g_variant_unref(variant); ++ Scoped handle; ++ g_variant_get_child(variant.get(), 0, "o", handle.receive()); + if (!handle) { + RTC_LOG(LS_ERROR) << "Failed to initialize the screen cast session."; + if (that->sources_request_signal_id_) { +@@ -635,8 +1085,6 @@ void BaseCapturerPipeWire::OnSourcesRequested(GDBusProxy *proxy, + return; + } + +- g_free(handle); +- + RTC_LOG(LS_INFO) << "Subscribed to sources signal."; + } + +@@ -668,17 +1116,16 @@ void BaseCapturerPipeWire::OnSourcesRequestResponseSignal( + + void BaseCapturerPipeWire::StartRequest() { + GVariantBuilder builder; +- gchar* variant_string; ++ Scoped variant_string; + + g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT); + variant_string = g_strdup_printf("webrtc%d", g_random_int_range(0, G_MAXINT)); + g_variant_builder_add(&builder, "{sv}", "handle_token", +- g_variant_new_string(variant_string)); ++ g_variant_new_string(variant_string.get())); + +- start_handle_ = PrepareSignalHandle(connection_, variant_string); ++ start_handle_ = PrepareSignalHandle(connection_, variant_string.get()); + start_request_signal_id_ = + SetupRequestResponseSignal(start_handle_, OnStartRequestResponseSignal); +- g_free(variant_string); + + // "Identifier for the application window", this is Wayland, so not "x11:...". + const gchar parent_window[] = ""; +@@ -698,23 +1145,22 @@ void BaseCapturerPipeWire::OnStartRequested(GDBusProxy *proxy, + BaseCapturerPipeWire* that = static_cast(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GVariant* variant = g_dbus_proxy_call_finish(proxy, result, &error); ++ Scoped error; ++ Scoped variant( ++ g_dbus_proxy_call_finish(proxy, result, error.receive())); + if (!variant) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to start the screen cast session: " + << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } + + RTC_LOG(LS_INFO) << "Initializing the start of the screen cast session."; + +- gchar* handle = nullptr; +- g_variant_get_child(variant, 0, "o", &handle); +- g_variant_unref(variant); ++ Scoped handle; ++ g_variant_get_child(variant.get(), 0, "o", handle.receive()); + if (!handle) { + RTC_LOG(LS_ERROR) + << "Failed to initialize the start of the screen cast session."; +@@ -727,8 +1173,6 @@ void BaseCapturerPipeWire::OnStartRequested(GDBusProxy *proxy, + return; + } + +- g_free(handle); +- + RTC_LOG(LS_INFO) << "Subscribed to the start signal."; + } + +@@ -746,9 +1190,10 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal( + + RTC_LOG(LS_INFO) << "Start signal received."; + guint32 portal_response; +- GVariant* response_data; +- GVariantIter* iter = nullptr; +- g_variant_get(parameters, "(u@a{sv})", &portal_response, &response_data); ++ Scoped response_data; ++ Scoped iter; ++ g_variant_get(parameters, "(u@a{sv})", &portal_response, ++ response_data.receive()); + if (portal_response || !response_data) { + RTC_LOG(LS_ERROR) << "Failed to start the screen cast session."; + that->portal_init_failed_ = true; +@@ -758,28 +1203,28 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal( + // Array of PipeWire streams. See + // https://github.com/flatpak/xdg-desktop-portal/blob/master/data/org.freedesktop.portal.ScreenCast.xml + // documentation for . +- if (g_variant_lookup(response_data, "streams", "a(ua{sv})", &iter)) { +- GVariant* variant; ++ if (g_variant_lookup(response_data.get(), "streams", "a(ua{sv})", ++ iter.receive())) { ++ Scoped variant; + +- while (g_variant_iter_next(iter, "@(ua{sv})", &variant)) { ++ while (g_variant_iter_next(iter.get(), "@(ua{sv})", variant.receive())) { + guint32 stream_id; +- gint32 width; +- gint32 height; +- GVariant* options; ++ guint32 type; ++ Scoped options; + +- g_variant_get(variant, "(u@a{sv})", &stream_id, &options); +- RTC_DCHECK(options != nullptr); ++ g_variant_get(variant.get(), "(u@a{sv})", &stream_id, options.receive()); ++ RTC_DCHECK(options.get()); + +- g_variant_lookup(options, "size", "(ii)", &width, &height); ++ if (g_variant_lookup(options.get(), "source_type", "u", &type)) { ++ that->capture_source_type_ = ++ static_cast(type); ++ } + +- that->desktop_size_.set(width, height); ++ that->pw_stream_node_id_ = stream_id; + +- g_variant_unref(options); +- g_variant_unref(variant); ++ break; + } + } +- g_variant_iter_free(iter); +- g_variant_unref(response_data); + + that->OpenPipeWireRemote(); + } +@@ -807,35 +1252,30 @@ void BaseCapturerPipeWire::OnOpenPipeWireRemoteRequested( + BaseCapturerPipeWire* that = static_cast(user_data); + RTC_DCHECK(that); + +- GError* error = nullptr; +- GUnixFDList* outlist = nullptr; +- GVariant* variant = g_dbus_proxy_call_with_unix_fd_list_finish( +- proxy, &outlist, result, &error); ++ Scoped error; ++ Scoped outlist; ++ Scoped variant(g_dbus_proxy_call_with_unix_fd_list_finish( ++ proxy, outlist.receive(), result, error.receive())); + if (!variant) { +- if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ if (g_error_matches(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + RTC_LOG(LS_ERROR) << "Failed to open the PipeWire remote: " + << error->message; +- g_error_free(error); + that->portal_init_failed_ = true; + return; + } + + gint32 index; +- g_variant_get(variant, "(h)", &index); ++ g_variant_get(variant.get(), "(h)", &index); + +- if ((that->pw_fd_ = g_unix_fd_list_get(outlist, index, &error)) == -1) { ++ if ((that->pw_fd_ = ++ g_unix_fd_list_get(outlist.get(), index, error.receive())) == -1) { + RTC_LOG(LS_ERROR) << "Failed to get file descriptor from the list: " + << error->message; +- g_error_free(error); +- g_variant_unref(variant); + that->portal_init_failed_ = true; + return; + } + +- g_variant_unref(variant); +- g_object_unref(outlist); +- + that->InitPipeWire(); + } + +@@ -854,15 +1294,18 @@ void BaseCapturerPipeWire::CaptureFrame() { + return; + } + ++ webrtc::MutexLock lock(¤t_frame_lock_); + if (!current_frame_) { + callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr); + return; + } + +- std::unique_ptr result(new BasicDesktopFrame(desktop_size_)); ++ DesktopSize frame_size = video_size_; ++ ++ std::unique_ptr result(new BasicDesktopFrame(frame_size)); + result->CopyPixelsFrom( +- current_frame_, (desktop_size_.width() * kBytesPerPixel), +- DesktopRect::MakeWH(desktop_size_.width(), desktop_size_.height())); ++ current_frame_.get(), (frame_size.width() * kBytesPerPixel), ++ DesktopRect::MakeWH(frame_size.width(), frame_size.height())); + if (!result) { + callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr); + return; +@@ -887,4 +1330,11 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) { + return true; + } + ++// static ++std::unique_ptr BaseCapturerPipeWire::CreateRawCapturer( ++ const DesktopCaptureOptions& options) { ++ return std::make_unique( ++ BaseCapturerPipeWire::CaptureSourceType::kAny); ++} ++ + } // namespace webrtc +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +index f28d7a5..75d20db 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +@@ -10,18 +10,23 @@ + + #ifndef MODULES_DESKTOP_CAPTURE_LINUX_BASE_CAPTURER_PIPEWIRE_H_ + #define MODULES_DESKTOP_CAPTURE_LINUX_BASE_CAPTURER_PIPEWIRE_H_ +- + #include + #define typeof __typeof__ + #include + #include ++#if PW_CHECK_VERSION(0, 3, 0) ++#include ++#endif + ++#include "absl/types/optional.h" + #include "modules/desktop_capture/desktop_capture_options.h" + #include "modules/desktop_capture/desktop_capturer.h" + #include "rtc_base/constructor_magic.h" ++#include "rtc_base/synchronization/mutex.h" + + namespace webrtc { + ++#if !PW_CHECK_VERSION(0, 3, 0) + class PipeWireType { + public: + spa_type_media_type media_type; +@@ -29,14 +34,25 @@ class PipeWireType { + spa_type_format_video format_video; + spa_type_video_format video_format; + }; ++#endif + + class BaseCapturerPipeWire : public DesktopCapturer { + public: +- enum CaptureSourceType { Screen = 1, Window }; ++ // Values are set based on source type property in ++ // xdg-desktop-portal/screencast ++ // https://github.com/flatpak/xdg-desktop-portal/blob/master/data/org.freedesktop.portal.ScreenCast.xml ++ enum class CaptureSourceType : uint32_t { ++ kScreen = 0b01, ++ kWindow = 0b10, ++ kAny = 0b11 ++ }; + + explicit BaseCapturerPipeWire(CaptureSourceType source_type); + ~BaseCapturerPipeWire() override; + ++ static std::unique_ptr CreateRawCapturer( ++ const DesktopCaptureOptions& options); ++ + // DesktopCapturer interface. + void Start(Callback* delegate) override; + void CaptureFrame() override; +@@ -45,6 +61,21 @@ class BaseCapturerPipeWire : public DesktopCapturer { + + private: + // PipeWire types --> ++#if PW_CHECK_VERSION(0, 3, 0) ++ struct pw_context* pw_context_ = nullptr; ++ struct pw_core* pw_core_ = nullptr; ++ struct pw_stream* pw_stream_ = nullptr; ++ struct pw_thread_loop* pw_main_loop_ = nullptr; ++ ++ spa_hook spa_core_listener_; ++ spa_hook spa_stream_listener_; ++ ++ // event handlers ++ pw_core_events pw_core_events_ = {}; ++ pw_stream_events pw_stream_events_ = {}; ++ ++ struct spa_video_info_raw spa_video_format_; ++#else + pw_core* pw_core_ = nullptr; + pw_type* pw_core_type_ = nullptr; + pw_stream* pw_stream_ = nullptr; +@@ -60,11 +91,13 @@ class BaseCapturerPipeWire : public DesktopCapturer { + pw_remote_events pw_remote_events_ = {}; + + spa_video_info_raw* spa_video_format_ = nullptr; ++#endif + ++ guint32 pw_stream_node_id_ = 0; + gint32 pw_fd_ = -1; + + CaptureSourceType capture_source_type_ = +- BaseCapturerPipeWire::CaptureSourceType::Screen; ++ BaseCapturerPipeWire::CaptureSourceType::kScreen; + + // <-- end of PipeWire types + +@@ -79,10 +112,12 @@ class BaseCapturerPipeWire : public DesktopCapturer { + guint sources_request_signal_id_ = 0; + guint start_request_signal_id_ = 0; + ++ DesktopSize video_size_; + DesktopSize desktop_size_ = {}; + DesktopCaptureOptions options_ = {}; + +- uint8_t* current_frame_ = nullptr; ++ webrtc::Mutex current_frame_lock_; ++ std::unique_ptr current_frame_; + Callback* callback_ = nullptr; + + bool portal_init_failed_ = false; +@@ -91,21 +126,32 @@ class BaseCapturerPipeWire : public DesktopCapturer { + void InitPipeWire(); + void InitPipeWireTypes(); + +- void CreateReceivingStream(); ++ pw_stream* CreateReceivingStream(); + void HandleBuffer(pw_buffer* buffer); + + void ConvertRGBxToBGRx(uint8_t* frame, uint32_t size); + ++#if PW_CHECK_VERSION(0, 3, 0) ++ static void OnCoreError(void* data, ++ uint32_t id, ++ int seq, ++ int res, ++ const char* message); ++ static void OnStreamParamChanged(void* data, ++ uint32_t id, ++ const struct spa_pod* format); ++#else + static void OnStateChanged(void* data, + pw_remote_state old_state, + pw_remote_state state, + const char* error); ++ static void OnStreamFormatChanged(void* data, const struct spa_pod* format); ++#endif + static void OnStreamStateChanged(void* data, + pw_stream_state old_state, + pw_stream_state state, + const char* error_message); + +- static void OnStreamFormatChanged(void* data, const struct spa_pod* format); + static void OnStreamProcess(void* data); + static void OnNewBuffer(void* data, uint32_t id); + +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire.sigs b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire02.sigs +similarity index 91% +rename from src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire.sigs +rename to src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire02.sigs +index 3e21e9d..5ac3d1d 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire.sigs ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire02.sigs +@@ -26,6 +26,7 @@ void pw_remote_add_listener(pw_remote *remote, spa_hook *listener, const pw_remo + int pw_remote_connect_fd(pw_remote *remote, int fd); + void pw_remote_destroy(pw_remote *remote); + pw_remote * pw_remote_new(pw_core *core, pw_properties *properties, size_t user_data_size); ++enum pw_remote_state pw_remote_get_state(pw_remote *remote, const char **error); + + // stream.h + void pw_stream_add_listener(pw_stream *stream, spa_hook *listener, const pw_stream_events *events, void *data); +@@ -42,3 +43,5 @@ void pw_thread_loop_destroy(pw_thread_loop *loop); + pw_thread_loop * pw_thread_loop_new(pw_loop *loop, const char *name); + int pw_thread_loop_start(pw_thread_loop *loop); + void pw_thread_loop_stop(pw_thread_loop *loop); ++void pw_thread_loop_lock(struct pw_thread_loop *loop); ++void pw_thread_loop_unlock(struct pw_thread_loop *loop); +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire03.sigs b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire03.sigs +new file mode 100644 +index 0000000..78d241f +--- /dev/null ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/pipewire03.sigs +@@ -0,0 +1,46 @@ ++// Copyright 2018 The WebRTC project authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++//------------------------------------------------ ++// Functions from PipeWire used in capturer code. ++//------------------------------------------------ ++ ++// core.h ++int pw_core_disconnect(pw_core *core); ++ ++// loop.h ++void pw_loop_destroy(pw_loop *loop); ++pw_loop * pw_loop_new(const spa_dict *props); ++ ++ ++// pipewire.h ++void pw_init(int *argc, char **argv[]); ++ ++// properties.h ++pw_properties * pw_properties_new_string(const char *args); ++ ++// stream.h ++void pw_stream_add_listener(pw_stream *stream, spa_hook *listener, const pw_stream_events *events, void *data); ++int pw_stream_connect(pw_stream *stream, enum pw_direction direction, uint32_t target_id, enum pw_stream_flags flags, const spa_pod **params, uint32_t n_params); ++pw_buffer *pw_stream_dequeue_buffer(pw_stream *stream); ++void pw_stream_destroy(pw_stream *stream); ++pw_stream * pw_stream_new(pw_core *core, const char *name, pw_properties *props); ++int pw_stream_queue_buffer(pw_stream *stream, pw_buffer *buffer); ++int pw_stream_set_active(pw_stream *stream, bool active); ++int pw_stream_update_params(pw_stream *stream, const spa_pod **params, uint32_t n_params); ++ ++// thread-loop.h ++void pw_thread_loop_destroy(pw_thread_loop *loop); ++pw_thread_loop * pw_thread_loop_new(const char *name, const spa_dict *props); ++int pw_thread_loop_start(pw_thread_loop *loop); ++void pw_thread_loop_stop(pw_thread_loop *loop); ++void pw_thread_loop_lock(pw_thread_loop *loop); ++void pw_thread_loop_unlock(pw_thread_loop *loop); ++pw_loop * pw_thread_loop_get_loop(pw_thread_loop *loop); ++ ++ ++// context.h ++void pw_context_destroy(pw_context *context); ++pw_context *pw_context_new(pw_loop *main_loop, pw_properties *props, size_t user_data_size); ++pw_core * pw_context_connect(pw_context *context, pw_properties *properties, size_t user_data_size); +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc +deleted file mode 100644 +index fe67214..0000000 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc ++++ /dev/null +@@ -1,29 +0,0 @@ +-/* +- * Copyright 2018 The WebRTC project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license +- * that can be found in the LICENSE file in the root of the source +- * tree. An additional intellectual property rights grant can be found +- * in the file PATENTS. All contributing project authors may +- * be found in the AUTHORS file in the root of the source tree. +- */ +- +-#include "modules/desktop_capture/linux/screen_capturer_pipewire.h" +- +-#include +- +- +-namespace webrtc { +- +-ScreenCapturerPipeWire::ScreenCapturerPipeWire() +- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Screen) {} +-ScreenCapturerPipeWire::~ScreenCapturerPipeWire() {} +- +-// static +-std::unique_ptr +-ScreenCapturerPipeWire::CreateRawScreenCapturer( +- const DesktopCaptureOptions& options) { +- return std::make_unique(); +-} +- +-} // namespace webrtc +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h +deleted file mode 100644 +index 66dcd68..0000000 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.h ++++ /dev/null +@@ -1,33 +0,0 @@ +-/* +- * Copyright 2018 The WebRTC project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license +- * that can be found in the LICENSE file in the root of the source +- * tree. An additional intellectual property rights grant can be found +- * in the file PATENTS. All contributing project authors may +- * be found in the AUTHORS file in the root of the source tree. +- */ +- +-#ifndef MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_ +-#define MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_ +- +-#include +- +-#include "modules/desktop_capture/linux/base_capturer_pipewire.h" +- +-namespace webrtc { +- +-class ScreenCapturerPipeWire : public BaseCapturerPipeWire { +- public: +- ScreenCapturerPipeWire(); +- ~ScreenCapturerPipeWire() override; +- +- static std::unique_ptr CreateRawScreenCapturer( +- const DesktopCaptureOptions& options); +- +- RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerPipeWire); +-}; +- +-} // namespace webrtc +- +-#endif // MODULES_DESKTOP_CAPTURE_LINUX_SCREEN_CAPTURER_PIPEWIRE_H_ +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc +deleted file mode 100644 +index b455915..0000000 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc ++++ /dev/null +@@ -1,29 +0,0 @@ +-/* +- * Copyright 2018 The WebRTC project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license +- * that can be found in the LICENSE file in the root of the source +- * tree. An additional intellectual property rights grant can be found +- * in the file PATENTS. All contributing project authors may +- * be found in the AUTHORS file in the root of the source tree. +- */ +- +-#include "modules/desktop_capture/linux/window_capturer_pipewire.h" +- +-#include +- +- +-namespace webrtc { +- +-WindowCapturerPipeWire::WindowCapturerPipeWire() +- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Window) {} +-WindowCapturerPipeWire::~WindowCapturerPipeWire() {} +- +-// static +-std::unique_ptr +-WindowCapturerPipeWire::CreateRawWindowCapturer( +- const DesktopCaptureOptions& options) { +- return std::make_unique(); +-} +- +-} // namespace webrtc +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.h b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.h +deleted file mode 100644 +index 7f184ef..0000000 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.h ++++ /dev/null +@@ -1,33 +0,0 @@ +-/* +- * Copyright 2018 The WebRTC project authors. All Rights Reserved. +- * +- * Use of this source code is governed by a BSD-style license +- * that can be found in the LICENSE file in the root of the source +- * tree. An additional intellectual property rights grant can be found +- * in the file PATENTS. All contributing project authors may +- * be found in the AUTHORS file in the root of the source tree. +- */ +- +-#ifndef MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_ +-#define MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_ +- +-#include +- +-#include "modules/desktop_capture/linux/base_capturer_pipewire.h" +- +-namespace webrtc { +- +-class WindowCapturerPipeWire : public BaseCapturerPipeWire { +- public: +- WindowCapturerPipeWire(); +- ~WindowCapturerPipeWire() override; +- +- static std::unique_ptr CreateRawWindowCapturer( +- const DesktopCaptureOptions& options); +- +- RTC_DISALLOW_COPY_AND_ASSIGN(WindowCapturerPipeWire); +-}; +- +-} // namespace webrtc +- +-#endif // MODULES_DESKTOP_CAPTURE_LINUX_WINDOW_CAPTURER_PIPEWIRE_H_ +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc +index 82dbae4..ed48b7d 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/screen_capturer_linux.cc +@@ -14,7 +14,7 @@ + #include "modules/desktop_capture/desktop_capturer.h" + + #if defined(WEBRTC_USE_PIPEWIRE) +-#include "modules/desktop_capture/linux/screen_capturer_pipewire.h" ++#include "modules/desktop_capture/linux/base_capturer_pipewire.h" + #endif // defined(WEBRTC_USE_PIPEWIRE) + + #if defined(WEBRTC_USE_X11) +@@ -28,7 +28,7 @@ std::unique_ptr DesktopCapturer::CreateRawScreenCapturer( + const DesktopCaptureOptions& options) { + #if defined(WEBRTC_USE_PIPEWIRE) + if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { +- return ScreenCapturerPipeWire::CreateRawScreenCapturer(options); ++ return BaseCapturerPipeWire::CreateRawCapturer(options); + } + #endif // defined(WEBRTC_USE_PIPEWIRE) + +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc +index 41dbf83..2b142ae 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/desktop_capture/window_capturer_linux.cc +@@ -14,7 +14,7 @@ + #include "modules/desktop_capture/desktop_capturer.h" + + #if defined(WEBRTC_USE_PIPEWIRE) +-#include "modules/desktop_capture/linux/window_capturer_pipewire.h" ++#include "modules/desktop_capture/linux/base_capturer_pipewire.h" + #endif // defined(WEBRTC_USE_PIPEWIRE) + + #if defined(WEBRTC_USE_X11) +@@ -28,7 +28,7 @@ std::unique_ptr DesktopCapturer::CreateRawWindowCapturer( + const DesktopCaptureOptions& options) { + #if defined(WEBRTC_USE_PIPEWIRE) + if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { +- return WindowCapturerPipeWire::CreateRawWindowCapturer(options); ++ return BaseCapturerPipeWire::CreateRawCapturer(options); + } + #endif // defined(WEBRTC_USE_PIPEWIRE) + +diff --git a/src/3rdparty/chromium/third_party/webrtc/webrtc.gni b/src/3rdparty/chromium/third_party/webrtc/webrtc.gni +index ca8acdb..505c975 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/webrtc.gni ++++ b/src/3rdparty/chromium/third_party/webrtc/webrtc.gni +@@ -117,6 +117,10 @@ declare_args() { + # Set this to link PipeWire directly instead of using the dlopen. + rtc_link_pipewire = false + ++ # Set this to use certain PipeWire version ++ # Currently we support PipeWire 0.2 (default) and PipeWire 0.3 ++ rtc_pipewire_version = "0.3" ++ + # Enable to use the Mozilla internal settings. + build_with_mozilla = false + +-- +2.37.3 + diff --git a/qtwebengine-python3.patch b/qtwebengine-python3.patch new file mode 100644 index 0000000..c081f60 --- /dev/null +++ b/qtwebengine-python3.patch @@ -0,0 +1,2058 @@ +From c2fc1669f976475e4dd052bbd2f6352e3e6c6afa Mon Sep 17 00:00:00 2001 +From: Christophe Giboudeaux +Date: Fri, 23 Sep 2022 18:31:33 +0200 +Subject: [PATCH] Use python3 to build qtwebengine + +Origin: ArchLinux, https://github.com/archlinux/svntogit-packages/tree/packages/qt5-webengine/trunk +--- + configure.pri | 29 ++----- + mkspecs/features/functions.prf | 6 +- + .../chromium/build/print_python_deps.py | 4 +- + .../protobufs/binary_proto_generator.py | 8 +- + .../tracing/generate_trace_viewer_grd.py | 2 +- + .../mojo/public/tools/bindings/BUILD.gn | 2 + + .../tools/bindings/gen_data_files_list.py | 8 +- + .../generators/mojom_java_generator.py | 4 + + .../tools/mojom/mojom/generate/generator.py | 14 ++-- + .../tools/mojom/mojom/generate/module.py | 3 +- + .../mojom/mojom/generate/template_expander.py | 12 +-- + .../scripts/bind_gen/blink_v8_bridge.py | 6 +- + .../scripts/bind_gen/callback_interface.py | 2 +- + .../bindings/scripts/bind_gen/code_node.py | 10 +-- + .../bindings/scripts/bind_gen/codegen_expr.py | 15 ++-- + .../scripts/bind_gen/codegen_format.py | 2 +- + .../scripts/bind_gen/codegen_utils.py | 2 +- + .../bindings/scripts/bind_gen/dictionary.py | 2 +- + .../bindings/scripts/bind_gen/interface.py | 82 +++++++++++-------- + .../scripts/bind_gen/mako_renderer.py | 2 +- + .../bindings/scripts/bind_gen/style_format.py | 9 +- + .../bindings/scripts/bind_gen/task_queue.py | 5 +- + .../bindings/scripts/code_generator.py | 10 +++ + .../scripts/generate_origin_trial_features.py | 4 +- + .../bindings/scripts/idl_definitions.py | 8 +- + .../renderer/bindings/scripts/idl_reader.py | 4 +- + .../renderer/bindings/scripts/idl_types.py | 2 +- + .../renderer/bindings/scripts/utilities.py | 28 +++---- + .../renderer/bindings/scripts/v8_interface.py | 9 +- + .../renderer/bindings/scripts/v8_methods.py | 4 + + .../renderer/bindings/scripts/v8_utilities.py | 2 +- + .../scripts/web_idl/callback_interface.py | 12 +-- + .../bindings/scripts/web_idl/database.py | 2 +- + .../bindings/scripts/web_idl/exposure.py | 5 +- + .../bindings/scripts/web_idl/function_like.py | 28 +++---- + .../bindings/scripts/web_idl/idl_compiler.py | 21 ++--- + .../bindings/scripts/web_idl/interface.py | 45 +++++----- + .../bindings/scripts/web_idl/ir_builder.py | 29 ++++--- + .../bindings/scripts/web_idl/make_copy.py | 7 ++ + .../bindings/scripts/web_idl/namespace.py | 12 +-- + .../bindings/templates/dictionary_v8.cc.tmpl | 8 +- + .../scripts/core/css/make_style_shorthands.py | 23 +++--- + .../properties/make_css_property_instances.py | 4 +- + .../blink/renderer/build/scripts/gperf.py | 2 +- + .../blink/renderer/build/scripts/in_file.py | 2 +- + .../renderer/build/scripts/in_generator.py | 5 ++ + .../build/scripts/make_runtime_features.py | 2 +- + .../scripts/templates/element_factory.cc.tmpl | 4 +- + .../templates/element_type_helpers.cc.tmpl | 4 +- + .../templates/element_type_helpers.h.tmpl | 2 +- + .../build/scripts/templates/macros.tmpl | 4 +- + .../templates/make_qualified_names.h.tmpl | 4 +- + .../dawn/generator/generator_lib.py | 4 + + .../devtools-frontend/src/BUILD.gn | 2 + + .../scripts/build/build_inspector_overlay.py | 3 +- + .../build/build_release_applications.py | 9 +- + .../scripts/build/generate_devtools_grd.py | 4 +- + .../src/scripts/build/modular_build.py | 6 +- + .../chromium/third_party/jinja2/tests.py | 2 +- + .../json_schema_compiler/feature_compiler.py | 4 +- + .../tools/metrics/ukm/gen_builders.py | 5 +- + .../ui/ozone/generate_constructor_list.py | 13 ++- + .../ui/ozone/generate_ozone_platform_list.py | 26 ++++-- + src/buildtools/config/support.pri | 10 +-- + src/buildtools/configure.json | 18 ++-- + 65 files changed, 360 insertions(+), 271 deletions(-) + +diff --git a/configure.pri b/configure.pri +index e072961..8d639a9 100644 +--- a/configure.pri ++++ b/configure.pri +@@ -7,20 +7,7 @@ QTWEBENGINE_SOURCE_TREE = $$PWD + equals(QMAKE_HOST.os, Windows): EXE_SUFFIX = .exe + + defineTest(isPythonVersionSupported) { +- python = $$system_quote($$system_path($$1)) +- python_version = $$system('$$python -c "import sys; print(sys.version_info[0:3])"') +- python_version ~= s/[()]//g +- python_version = $$split(python_version, ',') +- python_major_version = $$first(python_version) +- greaterThan(python_major_version, 2) { +- qtLog("Python version 3 is not supported by Chromium.") +- return(false) +- } +- python_minor_version = $$member(python_version, 1) +- python_patch_version = $$member(python_version, 2) +- greaterThan(python_major_version, 1): greaterThan(python_minor_version, 6): greaterThan(python_patch_version, 4): return(true) +- qtLog("Unsupported python version: $${python_major_version}.$${python_minor_version}.$${python_patch_version}.") +- return(false) ++ return(true) + } + + defineTest(qtConfTest_detectJumboBuild) { +@@ -52,22 +39,22 @@ defineTest(qtConfReport_jumboBuild) { + qtConfReportPadded($${1}, $$mergeLimit) + } + +-defineTest(qtConfTest_detectPython2) { +- python = $$qtConfFindInPath("python2$$EXE_SUFFIX") ++defineTest(qtConfTest_detectPython) { ++ python = $$qtConfFindInPath("python3$$EXE_SUFFIX") + isEmpty(python) { +- qtLog("'python2$$EXE_SUFFIX' not found in PATH. Checking for 'python$$EXE_SUFFIX'.") +- python = $$qtConfFindInPath("python$$EXE_SUFFIX") ++ qtLog("'python3$$EXE_SUFFIX' not found in PATH. Checking for 'python3$$EXE_SUFFIX'.") ++ python = $$qtConfFindInPath("python3$$EXE_SUFFIX") + } + isEmpty(python) { +- qtLog("'python$$EXE_SUFFIX' not found in PATH. Giving up.") ++ qtLog("'python3$$EXE_SUFFIX' not found in PATH. Giving up.") + return(false) + } + !isPythonVersionSupported($$python) { +- qtLog("A suitable Python 2 executable could not be located.") ++ qtLog("A suitable Python executable could not be located.") + return(false) + } + +- # Make tests.python2.location available in configure.json. ++ # Make tests.python.location available in configure.json. + $${1}.location = $$clean_path($$python) + export($${1}.location) + $${1}.cache += location +diff --git a/mkspecs/features/functions.prf b/mkspecs/features/functions.prf +index 7f63058..2d2eb2d 100644 +--- a/mkspecs/features/functions.prf ++++ b/mkspecs/features/functions.prf +@@ -44,11 +44,11 @@ defineReplace(which) { + + # Returns the unquoted path to the python executable. + defineReplace(pythonPath) { +- isEmpty(QMAKE_PYTHON2) { ++ isEmpty(QMAKE_PYTHON) { + # Fallback for building QtWebEngine with Qt < 5.8 +- QMAKE_PYTHON2 = python ++ QMAKE_PYTHON = python3 + } +- return($$QMAKE_PYTHON2) ++ return($$QMAKE_PYTHON) + } + + # Returns the python executable for use with shell / make targets. +diff --git a/src/3rdparty/chromium/build/print_python_deps.py b/src/3rdparty/chromium/build/print_python_deps.py +index fd29c09..f4e2141 100755 +--- a/src/3rdparty/chromium/build/print_python_deps.py ++++ b/src/3rdparty/chromium/build/print_python_deps.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/python2.7 ++#!/usr/bin/python3 + # Copyright 2016 The Chromium Authors. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be + # found in the LICENSE file. +@@ -152,7 +152,7 @@ def main(): + + # Trybots run with vpython as default Python, but with a different config + # from //.vpython. To make the is_vpython test work, and to match the behavior +- # of dev machines, the shebang line must be run with python2.7. ++ # of dev machines, the shebang line must be run with python. + # + # E.g. $HOME/.vpython-root/dd50d3/bin/python + # E.g. /b/s/w/ir/cache/vpython/ab5c79/bin/python +diff --git a/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py b/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py +index 7422ead..1636551 100755 +--- a/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py ++++ b/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py +@@ -7,7 +7,7 @@ + Converts a given ASCII proto into a binary resource. + + """ +- ++from __future__ import print_function + import abc + import imp + import optparse +@@ -196,12 +196,12 @@ class BinaryProtoGenerator: + self._ImportProtoModules(opts.path) + + if not self.VerifyArgs(opts): +- print "Wrong arguments" ++ print("Wrong arguments") + return 1 + + try: + self._GenerateBinaryProtos(opts) + except Exception as e: +- print "ERROR: Failed to render binary version of %s:\n %s\n%s" % ( +- opts.infile, str(e), traceback.format_exc()) ++ print("ERROR: Failed to render binary version of %s:\n %s\n%s" % ++ (opts.infile, str(e), traceback.format_exc())) + return 1 +diff --git a/src/3rdparty/chromium/content/browser/tracing/generate_trace_viewer_grd.py b/src/3rdparty/chromium/content/browser/tracing/generate_trace_viewer_grd.py +index 037f949..be393d2 100755 +--- a/src/3rdparty/chromium/content/browser/tracing/generate_trace_viewer_grd.py ++++ b/src/3rdparty/chromium/content/browser/tracing/generate_trace_viewer_grd.py +@@ -74,7 +74,7 @@ def main(argv): + for filename in parsed_args.source_files: + add_file_to_grd(doc, os.path.basename(filename)) + +- with open(parsed_args.output_filename, 'w') as output_file: ++ with open(parsed_args.output_filename, 'wb') as output_file: + output_file.write(doc.toxml(encoding='UTF-8')) + + +diff --git a/src/3rdparty/chromium/mojo/public/tools/bindings/BUILD.gn b/src/3rdparty/chromium/mojo/public/tools/bindings/BUILD.gn +index fc04b5d..708958e 100644 +--- a/src/3rdparty/chromium/mojo/public/tools/bindings/BUILD.gn ++++ b/src/3rdparty/chromium/mojo/public/tools/bindings/BUILD.gn +@@ -2,9 +2,11 @@ + # Use of this source code is governed by a BSD-style license that can be + # found in the LICENSE file. + ++import("//build/config/python.gni") + import("//mojo/public/tools/bindings/mojom.gni") + import("//third_party/jinja2/jinja2.gni") + ++# TODO(crbug.com/1194274): Investigate nondeterminism in Py3 builds. + action("precompile_templates") { + sources = mojom_generator_sources + sources += [ +diff --git a/src/3rdparty/chromium/mojo/public/tools/bindings/gen_data_files_list.py b/src/3rdparty/chromium/mojo/public/tools/bindings/gen_data_files_list.py +index 79c9e50..8b78d09 100644 +--- a/src/3rdparty/chromium/mojo/public/tools/bindings/gen_data_files_list.py ++++ b/src/3rdparty/chromium/mojo/public/tools/bindings/gen_data_files_list.py +@@ -18,7 +18,6 @@ import os + import re + import sys + +-from cStringIO import StringIO + from optparse import OptionParser + + sys.path.insert( +@@ -41,12 +40,9 @@ def main(): + pattern = re.compile(options.pattern) + files = [f for f in os.listdir(options.directory) if pattern.match(f)] + +- stream = StringIO() +- for f in files: +- print(f, file=stream) ++ contents = '\n'.join(f for f in files) + '\n' ++ WriteFile(contents, options.output) + +- WriteFile(stream.getvalue(), options.output) +- stream.close() + + if __name__ == '__main__': + sys.exit(main()) +diff --git a/src/3rdparty/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py b/src/3rdparty/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py +index 96b2fdf..00b9dcc 100644 +--- a/src/3rdparty/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py ++++ b/src/3rdparty/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py +@@ -25,6 +25,10 @@ sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, + 'build', 'android', 'gyp')) + from util import build_utils + ++# TODO(crbug.com/1174969): Remove this once Python2 is obsoleted. ++if sys.version_info.major != 2: ++ basestring = str ++ long = int + + GENERATOR_PREFIX = 'java' + +diff --git a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator.py b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator.py +index de62260..4a1c73f 100644 +--- a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator.py ++++ b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator.py +@@ -136,9 +136,14 @@ class Stylizer(object): + + def WriteFile(contents, full_path): + # If |contents| is same with the file content, we skip updating. ++ if not isinstance(contents, bytes): ++ data = contents.encode('utf8') ++ else: ++ data = contents ++ + if os.path.isfile(full_path): + with open(full_path, 'rb') as destination_file: +- if destination_file.read() == contents: ++ if destination_file.read() == data: + return + + # Make sure the containing directory exists. +@@ -146,11 +151,8 @@ def WriteFile(contents, full_path): + fileutil.EnsureDirectoryExists(full_dir) + + # Dump the data to disk. +- with open(full_path, "wb") as f: +- if not isinstance(contents, bytes): +- f.write(contents.encode('utf-8')) +- else: +- f.write(contents) ++ with open(full_path, 'wb') as f: ++ f.write(data) + + + def AddComputedData(module): +diff --git a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/module.py b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/module.py +index ebbc9b3..3d02642 100644 +--- a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/module.py ++++ b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/module.py +@@ -398,7 +398,8 @@ class Field(object): + + + class StructField(Field): +- pass ++ def __hash__(self): ++ return super(Field, self).__hash__() + + + class UnionField(Field): +diff --git a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py +index 7a30056..8d9e26f 100644 +--- a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py ++++ b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py +@@ -75,9 +75,9 @@ def PrecompileTemplates(generator_modules, output_dir): + os.path.dirname(module.__file__), generator.GetTemplatePrefix()) + ])) + jinja_env.filters.update(generator.GetFilters()) +- jinja_env.compile_templates( +- os.path.join(output_dir, "%s.zip" % generator.GetTemplatePrefix()), +- extensions=["tmpl"], +- zip="stored", +- py_compile=True, +- ignore_errors=False) ++ jinja_env.compile_templates(os.path.join( ++ output_dir, "%s.zip" % generator.GetTemplatePrefix()), ++ extensions=["tmpl"], ++ zip="stored", ++ py_compile=sys.version_info.major < 3, ++ ignore_errors=False) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py +index 3225ecc..fc078d3 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py +@@ -344,7 +344,7 @@ def make_default_value_expr(idl_type, default_value): + """ + assert default_value.is_type_compatible_with(idl_type) + +- class DefaultValueExpr: ++ class DefaultValueExpr(object): + _ALLOWED_SYMBOLS_IN_DEPS = ("isolate") + + def __init__(self, initializer_expr, initializer_deps, +@@ -502,7 +502,7 @@ def make_v8_to_blink_value(blink_var_name, + assert isinstance(blink_var_name, str) + assert isinstance(v8_value_expr, str) + assert isinstance(idl_type, web_idl.IdlType) +- assert (argument_index is None or isinstance(argument_index, (int, long))) ++ assert (argument_index is None or isinstance(argument_index, int)) + assert (default_value is None + or isinstance(default_value, web_idl.LiteralConstant)) + +@@ -622,7 +622,7 @@ def make_v8_to_blink_value_variadic(blink_var_name, v8_array, + """ + assert isinstance(blink_var_name, str) + assert isinstance(v8_array, str) +- assert isinstance(v8_array_start_index, (int, long)) ++ assert isinstance(v8_array_start_index, int) + assert isinstance(idl_type, web_idl.IdlType) + + pattern = ("auto&& ${{{_1}}} = " +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py +index 4a6df51..8b51f23 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py +@@ -177,7 +177,7 @@ def generate_callback_interface(callback_interface_identifier): + prop_install_mode=PropInstallMode.UNCONDITIONAL, + trampoline_var_name=None, + attribute_entries=[], +- constant_entries=filter(is_unconditional, constant_entries), ++ constant_entries=list(filter(is_unconditional, constant_entries)), + exposed_construct_entries=[], + operation_entries=[]) + (install_interface_template_decl, install_interface_template_def, +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py +index 52972fe..e5ae9d9 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py +@@ -503,13 +503,13 @@ class CompositeNode(CodeNode): + gensym_kwargs = {} + template_vars = {} + for arg in args: +- assert isinstance(arg, (CodeNode, int, long, str)) ++ assert isinstance(arg, (CodeNode, int, str)) + gensym = CodeNode.gensym() + gensym_args.append("${{{}}}".format(gensym)) + template_vars[gensym] = arg + for key, value in kwargs.items(): +- assert isinstance(key, (int, long, str)) +- assert isinstance(value, (CodeNode, int, long, str)) ++ assert isinstance(key, (int, str)) ++ assert isinstance(value, (CodeNode, int, str)) + gensym = CodeNode.gensym() + gensym_kwargs[key] = "${{{}}}".format(gensym) + template_vars[gensym] = value +@@ -602,7 +602,7 @@ class ListNode(CodeNode): + def insert(self, index, node): + if node is None: + return +- assert isinstance(index, (int, long)) ++ assert isinstance(index, int) + assert isinstance(node, CodeNode) + assert node.outer is None and node.prev is None + +@@ -721,7 +721,7 @@ class SymbolScopeNode(SequenceNode): + if not scope_chains: + return counts + +- self_index = iter(scope_chains).next().index(self) ++ self_index = next(iter(scope_chains)).index(self) + scope_chains = map( + lambda scope_chain: scope_chain[self_index + 1:], scope_chains) + scope_to_likeliness = {} +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py +index a229a6c..5fa288d 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py +@@ -109,7 +109,7 @@ def expr_and(terms): + + if any(term.is_always_false for term in terms): + return _Expr(False) +- terms = filter(lambda x: not x.is_always_true, terms) ++ terms = list(filter(lambda x: not x.is_always_true, terms)) + if not terms: + return _Expr(True) + if len(terms) == 1: +@@ -124,7 +124,7 @@ def expr_or(terms): + + if any(term.is_always_true for term in terms): + return _Expr(True) +- terms = filter(lambda x: not x.is_always_false, terms) ++ terms = list(filter(lambda x: not x.is_always_false, terms)) + if not terms: + return _Expr(False) + if len(terms) == 1: +@@ -222,7 +222,7 @@ def expr_from_exposure(exposure, + elif exposure.only_in_secure_contexts is False: + secure_context_term = _Expr(True) + else: +- terms = map(ref_enabled, exposure.only_in_secure_contexts) ++ terms = list(map(ref_enabled, exposure.only_in_secure_contexts)) + secure_context_term = expr_or( + [_Expr("${is_in_secure_context}"), + expr_not(expr_and(terms))]) +@@ -275,10 +275,11 @@ def expr_from_exposure(exposure, + + # [ContextEnabled] + if exposure.context_enabled_features: +- terms = map( +- lambda feature: _Expr( +- "${{context_feature_settings}}->is{}Enabled()".format( +- feature)), exposure.context_enabled_features) ++ terms = list( ++ map( ++ lambda feature: _Expr( ++ "${{context_feature_settings}}->is{}Enabled()".format( ++ feature)), exposure.context_enabled_features)) + context_enabled_terms.append( + expr_and([_Expr("${context_feature_settings}"), + expr_or(terms)])) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py +index 87d26ee..f3e9d38 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py +@@ -23,7 +23,7 @@ class _TemplateFormatter(string.Formatter): + self._template_formatter_indexing_count_ = 0 + + def get_value(self, key, args, kwargs): +- if isinstance(key, (int, long)): ++ if isinstance(key, int): + return args[key] + assert isinstance(key, str) + if not key: +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py +index 2bcc4fe..e72282a 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py +@@ -116,4 +116,4 @@ def write_code_node_to_file(code_node, filepath): + # stderr=format_result.error_message)) + # + # web_idl.file_io.write_to_file_if_changed(filepath, format_result.contents) +- web_idl.file_io.write_to_file_if_changed(filepath, rendered_text) ++ web_idl.file_io.write_to_file_if_changed(filepath, rendered_text.encode('utf-8')) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py +index b39f010..4d68202 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py +@@ -993,7 +993,7 @@ def make_dict_trace_func(cg_context): + _2 = _blink_member_name(member).value_var + return TextNode(_format(pattern, _1=_1, _2=_2)) + +- body.extend(map(make_trace_member_node, own_members)) ++ body.extend(list(map(make_trace_member_node, own_members))) + body.append(TextNode("BaseClass::Trace(visitor);")) + + return func_decl, func_def +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py +index 10ff306..bfdf712 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py +@@ -582,7 +582,7 @@ def _make_blink_api_call(code_node, + overriding_args=None): + assert isinstance(code_node, SymbolScopeNode) + assert isinstance(cg_context, CodeGenContext) +- assert num_of_args is None or isinstance(num_of_args, (int, long)) ++ assert num_of_args is None or isinstance(num_of_args, int) + assert (overriding_args is None + or (isinstance(overriding_args, (list, tuple)) + and all(isinstance(arg, str) for arg in overriding_args))) +@@ -1196,8 +1196,10 @@ def make_overload_dispatcher(cg_context): + did_use_break = did_use_break or can_fail + + conditional = expr_or( +- map(lambda item: expr_from_exposure(item.function_like.exposure), +- items)) ++ list( ++ map( ++ lambda item: expr_from_exposure(item.function_like.exposure ++ ), items))) + if not conditional.is_always_true: + node = CxxUnlikelyIfNode(cond=conditional, body=node) + +@@ -4642,7 +4644,7 @@ class _PropEntryConstructorGroup(_PropEntryBase): + def __init__(self, is_context_dependent, exposure_conditional, world, + constructor_group, ctor_callback_name, ctor_func_length): + assert isinstance(ctor_callback_name, str) +- assert isinstance(ctor_func_length, (int, long)) ++ assert isinstance(ctor_func_length, int) + + _PropEntryBase.__init__(self, is_context_dependent, + exposure_conditional, world, constructor_group) +@@ -4670,7 +4672,7 @@ class _PropEntryOperationGroup(_PropEntryBase): + op_func_length, + no_alloc_direct_callback_name=None): + assert isinstance(op_callback_name, str) +- assert isinstance(op_func_length, (int, long)) ++ assert isinstance(op_func_length, int) + + _PropEntryBase.__init__(self, is_context_dependent, + exposure_conditional, world, operation_group) +@@ -5175,9 +5177,9 @@ def make_install_interface_template(cg_context, function_name, class_name, api_c + ]) + + if class_like.identifier == "CSSStyleDeclaration": +- css_properties = filter( +- lambda attr: "CSSProperty" in attr.extended_attributes, +- class_like.attributes) ++ css_properties = list( ++ filter(lambda attr: "CSSProperty" in attr.extended_attributes, ++ class_like.attributes)) + if css_properties: + prop_name_list = "".join( + map(lambda attr: "\"{}\", ".format(attr.identifier), +@@ -5567,8 +5569,8 @@ ${instance_object} = ${v8_context}->Global()->GetPrototype().As();\ + "V8DOMConfiguration::InstallConstants(${isolate}, " + "${interface_template}, ${prototype_template}, " + "kConstantCallbackTable, base::size(kConstantCallbackTable));") +- constant_callback_entries = filter(lambda entry: entry.const_callback_name, +- constant_entries) ++ constant_callback_entries = list(filter(lambda entry: entry.const_callback_name, ++ constant_entries)) + install_properties(table_name, constant_callback_entries, + _make_constant_callback_registration_table, + installer_call_text) +@@ -5584,8 +5586,8 @@ ${instance_object} = ${v8_context}->Global()->GetPrototype().As();\ + "V8DOMConfiguration::InstallConstants(${isolate}, " + "${interface_template}, ${prototype_template}, " + "kConstantValueTable, base::size(kConstantValueTable));") +- constant_value_entries = filter( +- lambda entry: not entry.const_callback_name, constant_entries) ++ constant_value_entries = list(filter( ++ lambda entry: not entry.const_callback_name, constant_entries)) + install_properties(table_name, constant_value_entries, + _make_constant_value_registration_table, + installer_call_text) +@@ -6336,8 +6338,8 @@ def make_v8_context_snapshot_api(cg_context, component, attribute_entries, + assert isinstance(component, web_idl.Component) + + derived_interfaces = cg_context.interface.deriveds +- derived_names = map(lambda interface: interface.identifier, +- derived_interfaces) ++ derived_names = list( ++ map(lambda interface: interface.identifier, derived_interfaces)) + derived_names.append(cg_context.interface.identifier) + if not ("Window" in derived_names or "HTMLDocument" in derived_names): + return None, None +@@ -6411,9 +6413,11 @@ def _make_v8_context_snapshot_get_reference_table_function( + collect_callbacks(named_properties_object_callback_defs) + collect_callbacks(cross_origin_property_callback_defs) + +- entry_nodes = map( +- lambda name: TextNode("reinterpret_cast({}),".format(name)), +- filter(None, callback_names)) ++ entry_nodes = list( ++ map( ++ lambda name: TextNode("reinterpret_cast({}),".format(name ++ )), ++ filter(None, callback_names))) + table_node = ListNode([ + TextNode("using namespace ${class_name}Callbacks;"), + TextNode("static const intptr_t kReferenceTable[] = {"), +@@ -6451,10 +6455,11 @@ def _make_v8_context_snapshot_install_props_per_context_function( + class_name=None, + prop_install_mode=PropInstallMode.V8_CONTEXT_SNAPSHOT, + trampoline_var_name=None, +- attribute_entries=filter(selector, attribute_entries), +- constant_entries=filter(selector, constant_entries), +- exposed_construct_entries=filter(selector, exposed_construct_entries), +- operation_entries=filter(selector, operation_entries)) ++ attribute_entries=list(filter(selector, attribute_entries)), ++ constant_entries=list(filter(selector, constant_entries)), ++ exposed_construct_entries=list( ++ filter(selector, exposed_construct_entries)), ++ operation_entries=list(filter(selector, operation_entries))) + + return func_decl, func_def + +@@ -6810,11 +6815,11 @@ def generate_interface(interface_identifier): + class_name=impl_class_name, + prop_install_mode=PropInstallMode.UNCONDITIONAL, + trampoline_var_name=tp_install_unconditional_props, +- attribute_entries=filter(is_unconditional, attribute_entries), +- constant_entries=filter(is_unconditional, constant_entries), +- exposed_construct_entries=filter(is_unconditional, +- exposed_construct_entries), +- operation_entries=filter(is_unconditional, operation_entries)) ++ attribute_entries=list(filter(is_unconditional, attribute_entries)), ++ constant_entries=list(filter(is_unconditional, constant_entries)), ++ exposed_construct_entries=list( ++ filter(is_unconditional, exposed_construct_entries)), ++ operation_entries=list(filter(is_unconditional, operation_entries))) + (install_context_independent_props_decl, + install_context_independent_props_def, + install_context_independent_props_trampoline) = make_install_properties( +@@ -6823,11 +6828,14 @@ def generate_interface(interface_identifier): + class_name=impl_class_name, + prop_install_mode=PropInstallMode.CONTEXT_INDEPENDENT, + trampoline_var_name=tp_install_context_independent_props, +- attribute_entries=filter(is_context_independent, attribute_entries), +- constant_entries=filter(is_context_independent, constant_entries), +- exposed_construct_entries=filter(is_context_independent, +- exposed_construct_entries), +- operation_entries=filter(is_context_independent, operation_entries)) ++ attribute_entries=list( ++ filter(is_context_independent, attribute_entries)), ++ constant_entries=list(filter(is_context_independent, ++ constant_entries)), ++ exposed_construct_entries=list( ++ filter(is_context_independent, exposed_construct_entries)), ++ operation_entries=list( ++ filter(is_context_independent, operation_entries))) + (install_context_dependent_props_decl, install_context_dependent_props_def, + install_context_dependent_props_trampoline) = make_install_properties( + cg_context, +@@ -6835,11 +6843,13 @@ def generate_interface(interface_identifier): + class_name=impl_class_name, + prop_install_mode=PropInstallMode.CONTEXT_DEPENDENT, + trampoline_var_name=tp_install_context_dependent_props, +- attribute_entries=filter(is_context_dependent, attribute_entries), +- constant_entries=filter(is_context_dependent, constant_entries), +- exposed_construct_entries=filter(is_context_dependent, +- exposed_construct_entries), +- operation_entries=filter(is_context_dependent, operation_entries)) ++ attribute_entries=list(filter(is_context_dependent, ++ attribute_entries)), ++ constant_entries=list(filter(is_context_dependent, constant_entries)), ++ exposed_construct_entries=list( ++ filter(is_context_dependent, exposed_construct_entries)), ++ operation_entries=list(filter(is_context_dependent, ++ operation_entries))) + (install_interface_template_decl, install_interface_template_def, + install_interface_template_trampoline) = make_install_interface_template( + cg_context, +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py +index b4c7055..f3a2fcd 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py +@@ -105,7 +105,7 @@ class MakoRenderer(object): + on_error = self._caller_stack_on_error + if (len(current) <= len(on_error) + and all(current[i] == on_error[i] +- for i in xrange(len(current)))): ++ for i in range(len(current)))): + pass # Error happened in a deeper caller. + else: + self._caller_stack_on_error = list(self._caller_stack) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py +index dc3493c..017d3d4 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py +@@ -70,8 +70,13 @@ def gn_format(contents, filename=None): + + + def _invoke_format_command(command_line, filename, contents): +- proc = subprocess.Popen( +- command_line, stdin=subprocess.PIPE, stdout=subprocess.PIPE) ++ kwargs = {} ++ if sys.version_info.major != 2: ++ kwargs['encoding'] = 'utf-8' ++ proc = subprocess.Popen(command_line, ++ stdin=subprocess.PIPE, ++ stdout=subprocess.PIPE, ++ **kwargs) + stdout_output, stderr_output = proc.communicate(input=contents) + exit_code = proc.wait() + +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py +index 0d8f4c0..e666a9b 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py +@@ -2,6 +2,7 @@ + # Use of this source code is governed by a BSD-style license that can be + # found in the LICENSE file. + ++import functools + import multiprocessing + + from .package_initializer import package_initializer +@@ -76,7 +77,7 @@ class TaskQueue(object): + if not report_progress: + return + +- done_count = reduce( ++ done_count = functools.reduce( + lambda count, worker_task: count + bool(worker_task.ready()), + self._worker_tasks, 0) + report_progress(len(self._worker_tasks), done_count) +@@ -85,4 +86,4 @@ class TaskQueue(object): + def _task_queue_run_tasks(tasks): + for task in tasks: + func, args, kwargs = task +- apply(func, args, kwargs) ++ func(*args, **kwargs) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py +index e8280be..e49e6eb 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py +@@ -13,6 +13,7 @@ import re + import sys + + from idl_types import set_ancestors, IdlType ++from itertools import groupby + from v8_globals import includes + from v8_interface import constant_filters + from v8_types import set_component_dirs +@@ -43,6 +44,7 @@ TEMPLATES_DIR = os.path.normpath( + # after path[0] == invoking script dir + sys.path.insert(1, THIRD_PARTY_DIR) + import jinja2 ++from jinja2.filters import make_attrgetter, environmentfilter + + + def generate_indented_conditional(code, conditional): +@@ -88,6 +90,13 @@ def runtime_enabled_if(code, name): + return generate_indented_conditional(code, function) + + ++@environmentfilter ++def do_stringify_key_group_by(environment, value, attribute): ++ expr = make_attrgetter(environment, attribute) ++ key = lambda item: '' if expr(item) is None else str(expr(item)) ++ return groupby(sorted(value, key=key), expr) ++ ++ + def initialize_jinja_env(cache_dir): + jinja_env = jinja2.Environment( + loader=jinja2.FileSystemLoader(TEMPLATES_DIR), +@@ -117,6 +126,7 @@ def initialize_jinja_env(cache_dir): + }) + jinja_env.filters.update(constant_filters()) + jinja_env.filters.update(method_filters()) ++ jinja_env.filters["stringifykeygroupby"] = do_stringify_key_group_by + return jinja_env + + +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py +index 130004e..04c0fab 100755 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py +@@ -80,7 +80,7 @@ def read_idl_file(reader, idl_filename): + assert len(interfaces) == 1, ( + "Expected one interface in file %r, found %d" % + (idl_filename, len(interfaces))) +- return (interfaces.values()[0], includes) ++ return (list(interfaces.values())[0], includes) + + + def interface_is_global(interface): +@@ -281,7 +281,7 @@ def main(): + + info_provider = create_component_info_provider( + os.path.normpath(options.info_dir), options.target_component) +- idl_filenames = map(str.strip, open(options.idl_files_list)) ++ idl_filenames = list(map(str.strip, open(options.idl_files_list))) + + generate_origin_trial_features(info_provider, options, idl_filenames) + return 0 +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py +index 14e6e9d..b027818 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py +@@ -394,7 +394,8 @@ class IdlInterface(object): + else: + raise ValueError('Unrecognized node class: %s' % child_class) + +- if len(filter(None, [self.iterable, self.maplike, self.setlike])) > 1: ++ if len(list(filter(None, ++ [self.iterable, self.maplike, self.setlike]))) > 1: + raise ValueError( + 'Interface can only have one of iterable<>, maplike<> and setlike<>.' + ) +@@ -512,6 +513,9 @@ class IdlAttribute(TypedObject): + def accept(self, visitor): + visitor.visit_attribute(self) + ++ def __lt__(self, other): ++ return self.name < other.name ++ + + ################################################################################ + # Constants +@@ -852,7 +856,7 @@ class IdlIncludes(object): + ################################################################################ + + +-class Exposure: ++class Exposure(object): + """An Exposure holds one Exposed or RuntimeEnabled condition. + Each exposure has two properties: exposed and runtime_enabled. + Exposure(e, r) corresponds to [Exposed(e r)]. Exposure(e) corresponds to +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py +index 8d72865..b80eebd 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py +@@ -55,8 +55,8 @@ def validate_blink_idl_definitions(idl_filename, idl_file_basename, + definitions. There is no filename convention in this case. + - Otherwise, an IDL file is invalid. + """ +- targets = ( +- definitions.interfaces.values() + definitions.dictionaries.values()) ++ targets = (list(definitions.interfaces.values()) + ++ list(definitions.dictionaries.values())) + number_of_targets = len(targets) + if number_of_targets > 1: + raise Exception( +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py +index cd4f0c3..ab95e9c 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py +@@ -349,7 +349,7 @@ class IdlUnionType(IdlTypeBase): + return True + + def single_matching_member_type(self, predicate): +- matching_types = filter(predicate, self.flattened_member_types) ++ matching_types = list(filter(predicate, self.flattened_member_types)) + if len(matching_types) > 1: + raise ValueError('%s is ambiguous.' % self.name) + return matching_types[0] if matching_types else None +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/utilities.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/utilities.py +index e1677ee..3c5006f 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/utilities.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/utilities.py +@@ -196,8 +196,9 @@ class ComponentInfoProviderModules(ComponentInfoProvider): + + @property + def callback_functions(self): +- return dict(self._component_info_core['callback_functions'].items() + +- self._component_info_modules['callback_functions'].items()) ++ return dict( ++ list(self._component_info_core['callback_functions'].items()) + ++ list(self._component_info_modules['callback_functions'].items())) + + @property + def specifier_for_export(self): +@@ -209,8 +210,8 @@ class ComponentInfoProviderModules(ComponentInfoProvider): + + + def load_interfaces_info_overall_pickle(info_dir): +- with open(os.path.join(info_dir, +- 'interfaces_info.pickle')) as interface_info_file: ++ with open(os.path.join(info_dir, 'interfaces_info.pickle'), ++ mode='rb') as interface_info_file: + return pickle.load(interface_info_file) + + +@@ -236,23 +237,20 @@ def merge_dict_recursively(target, diff): + + def create_component_info_provider_core(info_dir): + interfaces_info = load_interfaces_info_overall_pickle(info_dir) +- with open( +- os.path.join(info_dir, 'core', +- 'component_info_core.pickle')) as component_info_file: ++ with open(os.path.join(info_dir, 'core', 'component_info_core.pickle'), ++ mode='rb') as component_info_file: + component_info = pickle.load(component_info_file) + return ComponentInfoProviderCore(interfaces_info, component_info) + + + def create_component_info_provider_modules(info_dir): + interfaces_info = load_interfaces_info_overall_pickle(info_dir) +- with open( +- os.path.join(info_dir, 'core', +- 'component_info_core.pickle')) as component_info_file: ++ with open(os.path.join(info_dir, 'core', 'component_info_core.pickle'), ++ mode='rb') as component_info_file: + component_info_core = pickle.load(component_info_file) +- with open( +- os.path.join( +- info_dir, 'modules', +- 'component_info_modules.pickle')) as component_info_file: ++ with open(os.path.join(info_dir, 'modules', ++ 'component_info_modules.pickle'), ++ mode='rb') as component_info_file: + component_info_modules = pickle.load(component_info_file) + return ComponentInfoProviderModules(interfaces_info, component_info_core, + component_info_modules) +@@ -356,7 +354,7 @@ def write_pickle_file(pickle_filename, data): + pickle_filename = abs(pickle_filename) + # If |data| is same with the file content, we skip updating. + if os.path.isfile(pickle_filename): +- with open(pickle_filename) as pickle_file: ++ with open(pickle_filename, 'rb') as pickle_file: + try: + if pickle.load(pickle_file) == data: + return +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py +index a432604..a85b03a 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py +@@ -189,7 +189,7 @@ def context_enabled_features(attributes): + return sorted([ + member for member in members + if member.get(KEY) and not member.get('exposed_test') +- ]) ++ ], key=lambda item: item['name']) + + def member_filter_by_name(members, name): + return [member for member in members if member[KEY] == name] +@@ -612,7 +612,8 @@ def interface_context(interface, interfaces, component_info): + sorted( + origin_trial_features(interface, context['constants'], + context['attributes'], context['methods']) + +- context_enabled_features(context['attributes'])), ++ context_enabled_features(context['attributes']), ++ key=lambda item: item['name']), + }) + if context['optional_features']: + includes.add('platform/bindings/v8_per_context_data.h') +@@ -1356,9 +1357,9 @@ def resolution_tests_methods(effective_overloads): + + # Extract argument and IDL type to simplify accessing these in each loop. + arguments = [method['arguments'][index] for method in methods] +- arguments_methods = zip(arguments, methods) ++ arguments_methods = list(zip(arguments, methods)) + idl_types = [argument['idl_type_object'] for argument in arguments] +- idl_types_methods = zip(idl_types, methods) ++ idl_types_methods = list(zip(idl_types, methods)) + + # We can’t do a single loop through all methods or simply sort them, because + # a method may be listed in multiple steps of the resolution algorithm, and +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py +index 5f1f89a..6ee8a40 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py +@@ -46,6 +46,10 @@ import v8_types + import v8_utilities + from v8_utilities import (has_extended_attribute_value, is_unforgeable) + ++# TODO: Remove this once Python2 is obsoleted. ++if sys.version_info.major != 2: ++ basestring = str ++ + + def method_is_visible(method, interface_is_partial): + if 'overloads' in method: +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py +index 2ecd692..fcfc483 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py +@@ -271,7 +271,7 @@ EXPOSED_WORKERS = set([ + ]) + + +-class ExposureSet: ++class ExposureSet(object): + """An ExposureSet is a collection of Exposure instructions.""" + + def __init__(self, exposures=None): +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py +index 13fb7c7..b73b771 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py +@@ -91,11 +91,13 @@ class CallbackInterface(UserDefinedType, WithExtendedAttributes, + for operation_ir in ir.operations + ]) + self._operation_groups = tuple([ +- OperationGroup( +- operation_group_ir, +- filter(lambda x: x.identifier == operation_group_ir.identifier, +- self._operations), +- owner=self) for operation_group_ir in ir.operation_groups ++ OperationGroup(operation_group_ir, ++ list( ++ filter( ++ lambda x: x.identifier == operation_group_ir ++ .identifier, self._operations)), ++ owner=self) ++ for operation_group_ir in ir.operation_groups + ]) + + @property +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py +index c92cf48..f5d5912 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py +@@ -156,4 +156,4 @@ class Database(object): + return self._view_by_kind(Database._Kind.UNION) + + def _view_by_kind(self, kind): +- return self._impl.find_by_kind(kind).values() ++ return list(self._impl.find_by_kind(kind).values()) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py +index abaeef3..e36cf74 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py +@@ -8,8 +8,11 @@ from .runtime_enabled_features import RuntimeEnabledFeatures + class _Feature(str): + """Represents a runtime-enabled feature.""" + ++ def __new__(cls, value): ++ return str.__new__(cls, value) ++ + def __init__(self, value): +- str.__init__(self, value) ++ str.__init__(self) + self._is_context_dependent = ( + RuntimeEnabledFeatures.is_context_dependent(self)) + +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py +index 648c70d..1712f19 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py +@@ -71,8 +71,9 @@ class FunctionLike(WithIdentifier): + def num_of_required_arguments(self): + """Returns the number of required arguments.""" + return len( +- filter(lambda arg: not (arg.is_optional or arg.is_variadic), +- self.arguments)) ++ list( ++ filter(lambda arg: not (arg.is_optional or arg.is_variadic), ++ self.arguments))) + + + class OverloadGroup(WithIdentifier): +@@ -171,8 +172,7 @@ class OverloadGroup(WithIdentifier): + Returns the effective overload set. + https://heycam.github.io/webidl/#compute-the-effective-overload-set + """ +- assert argument_count is None or isinstance(argument_count, +- (int, long)) ++ assert argument_count is None or isinstance(argument_count, int) + + N = argument_count + S = [] +@@ -188,21 +188,21 @@ class OverloadGroup(WithIdentifier): + + S.append( + OverloadGroup.EffectiveOverloadItem( +- X, map(lambda arg: arg.idl_type, X.arguments), +- map(lambda arg: arg.optionality, X.arguments))) ++ X, list(map(lambda arg: arg.idl_type, X.arguments)), ++ list(map(lambda arg: arg.optionality, X.arguments)))) + + if X.is_variadic: +- for i in xrange(n, max(maxarg, N)): +- t = map(lambda arg: arg.idl_type, X.arguments) +- o = map(lambda arg: arg.optionality, X.arguments) +- for _ in xrange(n, i + 1): ++ for i in range(n, max(maxarg, N)): ++ t = list(map(lambda arg: arg.idl_type, X.arguments)) ++ o = list(map(lambda arg: arg.optionality, X.arguments)) ++ for _ in range(n, i + 1): + t.append(X.arguments[-1].idl_type) + o.append(X.arguments[-1].optionality) + S.append(OverloadGroup.EffectiveOverloadItem(X, t, o)) + +- t = map(lambda arg: arg.idl_type, X.arguments) +- o = map(lambda arg: arg.optionality, X.arguments) +- for i in xrange(n - 1, -1, -1): ++ t = list(map(lambda arg: arg.idl_type, X.arguments)) ++ o = list(map(lambda arg: arg.optionality, X.arguments)) ++ for i in range(n - 1, -1, -1): + if X.arguments[i].optionality == IdlType.Optionality.REQUIRED: + break + S.append(OverloadGroup.EffectiveOverloadItem(X, t[:i], o[:i])) +@@ -222,7 +222,7 @@ class OverloadGroup(WithIdentifier): + for item in items) + assert len(items) > 1 + +- for index in xrange(len(items[0].type_list)): ++ for index in range(len(items[0].type_list)): + # Assume that the given items are valid, and we only need to test + # the two types. + if OverloadGroup.are_distinguishable_types( +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py +index c5ee2bd..5831507 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py +@@ -149,8 +149,8 @@ class IdlCompiler(object): + for old_ir in old_irs: + new_ir = make_copy(old_ir) + self._ir_map.add(new_ir) +- new_ir.attributes = filter(not_disabled, new_ir.attributes) +- new_ir.operations = filter(not_disabled, new_ir.operations) ++ new_ir.attributes = list(filter(not_disabled, new_ir.attributes)) ++ new_ir.operations = list(filter(not_disabled, new_ir.operations)) + + def _record_defined_in_partial_and_mixin(self): + old_irs = self._ir_map.irs_of_kinds( +@@ -231,7 +231,7 @@ class IdlCompiler(object): + only_to_members_of_partial_or_mixin=False) + propagate_to_exposure(propagate) + +- map(process_member_like, ir.iter_all_members()) ++ list(map(process_member_like, ir.iter_all_members())) + + def process_member_like(ir): + propagate = functools.partial(propagate_extattr, ir=ir) +@@ -257,7 +257,7 @@ class IdlCompiler(object): + + self._ir_map.move_to_new_phase() + +- map(process_interface_like, old_irs) ++ list(map(process_interface_like, old_irs)) + + def _determine_blink_headers(self): + irs = self._ir_map.irs_of_kinds( +@@ -422,9 +422,9 @@ class IdlCompiler(object): + assert not new_interface.deriveds + derived_set = identifier_to_derived_set.get( + new_interface.identifier, set()) +- new_interface.deriveds = map( +- lambda id_: self._ref_to_idl_def_factory.create(id_), +- sorted(derived_set)) ++ new_interface.deriveds = list( ++ map(lambda id_: self._ref_to_idl_def_factory.create(id_), ++ sorted(derived_set))) + + def _supplement_missing_html_constructor_operation(self): + # Temporary mitigation of misuse of [HTMLConstructor] +@@ -553,7 +553,8 @@ class IdlCompiler(object): + self._ir_map.add(new_ir) + + for group in new_ir.iter_all_overload_groups(): +- exposures = map(lambda overload: overload.exposure, group) ++ exposures = list(map(lambda overload: overload.exposure, ++ group)) + + # [Exposed] + if any(not exposure.global_names_and_features +@@ -653,8 +654,8 @@ class IdlCompiler(object): + constructs = set() + for global_name in global_names: + constructs.update(exposed_map.get(global_name, [])) +- new_ir.exposed_constructs = map( +- self._ref_to_idl_def_factory.create, sorted(constructs)) ++ new_ir.exposed_constructs = list( ++ map(self._ref_to_idl_def_factory.create, sorted(constructs))) + + assert not new_ir.legacy_window_aliases + if new_ir.identifier != 'Window': +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py +index 65d24e5..067ef2e 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py +@@ -180,8 +180,9 @@ class Interface(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo, + self._constructor_groups = tuple([ + ConstructorGroup( + group_ir, +- filter(lambda x: x.identifier == group_ir.identifier, +- self._constructors), ++ list( ++ filter(lambda x: x.identifier == group_ir.identifier, ++ self._constructors)), + owner=self) for group_ir in ir.constructor_groups + ]) + assert len(self._constructor_groups) <= 1 +@@ -192,8 +193,9 @@ class Interface(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo, + self._named_constructor_groups = tuple([ + ConstructorGroup( + group_ir, +- filter(lambda x: x.identifier == group_ir.identifier, +- self._named_constructors), ++ list( ++ filter(lambda x: x.identifier == group_ir.identifier, ++ self._named_constructors)), + owner=self) for group_ir in ir.named_constructor_groups + ]) + self._operations = tuple([ +@@ -203,22 +205,23 @@ class Interface(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo, + self._operation_groups = tuple([ + OperationGroup( + group_ir, +- filter(lambda x: x.identifier == group_ir.identifier, +- self._operations), ++ list( ++ filter(lambda x: x.identifier == group_ir.identifier, ++ self._operations)), + owner=self) for group_ir in ir.operation_groups + ]) + self._exposed_constructs = tuple(ir.exposed_constructs) + self._legacy_window_aliases = tuple(ir.legacy_window_aliases) + self._indexed_and_named_properties = None +- indexed_and_named_property_operations = filter( +- lambda x: x.is_indexed_or_named_property_operation, +- self._operations) ++ indexed_and_named_property_operations = list( ++ filter(lambda x: x.is_indexed_or_named_property_operation, ++ self._operations)) + if indexed_and_named_property_operations: + self._indexed_and_named_properties = IndexedAndNamedProperties( + indexed_and_named_property_operations, owner=self) + self._stringifier = None +- stringifier_operation_irs = filter(lambda x: x.is_stringifier, +- ir.operations) ++ stringifier_operation_irs = list( ++ filter(lambda x: x.is_stringifier, ir.operations)) + if stringifier_operation_irs: + assert len(stringifier_operation_irs) == 1 + op_ir = make_copy(stringifier_operation_irs[0]) +@@ -231,8 +234,9 @@ class Interface(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo, + attribute = None + if operation.stringifier_attribute: + attr_id = operation.stringifier_attribute +- attributes = filter(lambda x: x.identifier == attr_id, +- self._attributes) ++ attributes = list( ++ filter(lambda x: x.identifier == attr_id, ++ self._attributes)) + assert len(attributes) == 1 + attribute = attributes[0] + self._stringifier = Stringifier(operation, attribute, owner=self) +@@ -578,8 +582,9 @@ class Iterable(WithDebugInfo): + self._operation_groups = tuple([ + OperationGroup( + group_ir, +- filter(lambda x: x.identifier == group_ir.identifier, +- self._operations), ++ list( ++ filter(lambda x: x.identifier == group_ir.identifier, ++ self._operations)), + owner=owner) for group_ir in ir.operation_groups + ]) + +@@ -666,8 +671,9 @@ class Maplike(WithDebugInfo): + self._operation_groups = tuple([ + OperationGroup( + group_ir, +- filter(lambda x: x.identifier == group_ir.identifier, +- self._operations), ++ list( ++ filter(lambda x: x.identifier == group_ir.identifier, ++ self._operations)), + owner=owner) for group_ir in ir.operation_groups + ]) + +@@ -755,8 +761,9 @@ class Setlike(WithDebugInfo): + self._operation_groups = tuple([ + OperationGroup( + group_ir, +- filter(lambda x: x.identifier == group_ir.identifier, +- self._operations), ++ list( ++ filter(lambda x: x.identifier == group_ir.identifier, ++ self._operations)), + owner=owner) for group_ir in ir.operation_groups + ]) + +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py +index e9aeff4..d80554d 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py +@@ -2,6 +2,8 @@ + # Use of this source code is governed by a BSD-style license that can be + # found in the LICENSE file. + ++import sys ++ + from .argument import Argument + from .ast_group import AstGroup + from .attribute import Attribute +@@ -30,6 +32,11 @@ from .operation import Operation + from .typedef import Typedef + + ++# TODO: Remove this once Python2 is obsoleted. ++if sys.version_info.major != 2: ++ long = int ++ ++ + def load_and_register_idl_definitions(filepaths, register_ir, + create_ref_to_idl_def, idl_type_factory): + """ +@@ -160,7 +167,7 @@ class _IRBuilder(object): + child_nodes = list(node.GetChildren()) + extended_attributes = self._take_extended_attributes(child_nodes) + +- members = map(self._build_interface_member, child_nodes) ++ members = list(map(self._build_interface_member, child_nodes)) + attributes = [] + constants = [] + operations = [] +@@ -302,7 +309,7 @@ class _IRBuilder(object): + child_nodes = list(node.GetChildren()) + inherited = self._take_inheritance(child_nodes) + extended_attributes = self._take_extended_attributes(child_nodes) +- own_members = map(self._build_dictionary_member, child_nodes) ++ own_members = list(map(self._build_dictionary_member, child_nodes)) + + return Dictionary.IR( + identifier=Identifier(node.GetName()), +@@ -336,7 +343,7 @@ class _IRBuilder(object): + + child_nodes = list(node.GetChildren()) + extended_attributes = self._take_extended_attributes(child_nodes) +- members = map(self._build_interface_member, child_nodes) ++ members = list(map(self._build_interface_member, child_nodes)) + constants = [] + operations = [] + for member in members: +@@ -456,8 +463,8 @@ class _IRBuilder(object): + assert len(child_nodes) == 1 + child = child_nodes[0] + if child.GetClass() == 'Arguments': +- arguments = map(build_extattr_argument, +- child.GetChildren()) ++ arguments = list( ++ map(build_extattr_argument, child.GetChildren())) + elif child.GetClass() == 'Call': + assert len(child.GetChildren()) == 1 + grand_child = child.GetChildren()[0] +@@ -486,7 +493,9 @@ class _IRBuilder(object): + + assert node.GetClass() == 'ExtAttributes' + return ExtendedAttributes( +- filter(None, map(build_extended_attribute, node.GetChildren()))) ++ list( ++ filter(None, map(build_extended_attribute, ++ node.GetChildren())))) + + def _build_inheritance(self, node): + assert node.GetClass() == 'Inherit' +@@ -506,7 +515,7 @@ class _IRBuilder(object): + + def _build_iterable(self, node): + assert node.GetClass() == 'Iterable' +- types = map(self._build_type, node.GetChildren()) ++ types = list(map(self._build_type, node.GetChildren())) + assert len(types) == 1 or len(types) == 2 + if len(types) == 1: # value iterator + key_type, value_type = (None, types[0]) +@@ -584,7 +593,7 @@ class _IRBuilder(object): + def _build_maplike(self, node, interface_identifier): + assert node.GetClass() == 'Maplike' + assert isinstance(interface_identifier, Identifier) +- types = map(self._build_type, node.GetChildren()) ++ types = list(map(self._build_type, node.GetChildren())) + assert len(types) == 2 + key_type, value_type = types + is_readonly = bool(node.GetProperty('READONLY')) +@@ -676,7 +685,7 @@ class _IRBuilder(object): + def _build_setlike(self, node, interface_identifier): + assert node.GetClass() == 'Setlike' + assert isinstance(interface_identifier, Identifier) +- types = map(self._build_type, node.GetChildren()) ++ types = list(map(self._build_type, node.GetChildren())) + assert len(types) == 1 + value_type = types[0] + is_readonly = bool(node.GetProperty('READONLY')) +@@ -838,7 +847,7 @@ class _IRBuilder(object): + + def build_union_type(node, extended_attributes): + return self._idl_type_factory.union_type( +- member_types=map(self._build_type, node.GetChildren()), ++ member_types=list(map(self._build_type, node.GetChildren())), + is_optional=is_optional, + extended_attributes=extended_attributes, + debug_info=self._build_debug_info(node)) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py +index a7a2b11..2f6b613 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py +@@ -3,6 +3,13 @@ + # found in the LICENSE file. + + ++import sys ++ ++# TODO: Remove this once Python2 is obsoleted. ++if sys.version_info.major != 2: ++ long = int ++ basestring = str ++ + def make_copy(obj, memo=None): + """ + Creates a copy of the given object, which should be an IR or part of IR. +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py +index eeabef9..bd7e989 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py +@@ -107,11 +107,13 @@ class Namespace(UserDefinedType, WithExtendedAttributes, WithCodeGeneratorInfo, + for operation_ir in ir.operations + ]) + self._operation_groups = tuple([ +- OperationGroup( +- operation_group_ir, +- filter(lambda x: x.identifier == operation_group_ir.identifier, +- self._operations), +- owner=self) for operation_group_ir in ir.operation_groups ++ OperationGroup(operation_group_ir, ++ list( ++ filter( ++ lambda x: x.identifier == operation_group_ir ++ .identifier, self._operations)), ++ owner=self) ++ for operation_group_ir in ir.operation_groups + ]) + + @property +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl b/src/3rdparty/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl +index 0add9c4..dc910f6 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl ++++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl +@@ -59,9 +59,9 @@ void {{v8_class}}::ToImpl(v8::Isolate* isolate, v8::Local v8_value, { + DCHECK(executionContext); + {% endif %}{# has_origin_trial_members #} + {% endif %}{# members #} +- {% for origin_trial_test, origin_trial_member_list in members | groupby('origin_trial_feature_name') %} ++ {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %} + {% filter origin_trial_enabled(origin_trial_test, "executionContext") %} +- {% for feature_name, member_list in origin_trial_member_list | groupby('runtime_enabled_feature_name') %} ++ {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %} + {% filter runtime_enabled(feature_name) %} + {% for member in member_list %} + v8::Local {{member.v8_value}}; +@@ -147,9 +147,9 @@ bool toV8{{cpp_class}}(const {{cpp_class}}* impl, v8::Local dictiona + DCHECK(executionContext); + {% endif %}{# has_origin_trial_members #} + {% endif %}{# members #} +- {% for origin_trial_test, origin_trial_member_list in members | groupby('origin_trial_feature_name') %} ++ {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %} + {% filter origin_trial_enabled(origin_trial_test, "executionContext") %} +- {% for feature_name, member_list in origin_trial_member_list | groupby('runtime_enabled_feature_name') %} ++ {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %} + {% filter runtime_enabled(feature_name) %} + {% for member in member_list %} + v8::Local {{member.v8_value}}; +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py +index 1799cd5..5f43ffa 100755 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py +@@ -71,7 +71,7 @@ class Expansion(object): + def enabled_longhands(self): + include = lambda longhand: not longhand[ + 'runtime_flag'] or self.is_enabled(longhand['runtime_flag']) +- return filter(include, self._longhands) ++ return list(filter(include, self._longhands)) + + @property + def index(self): +@@ -87,8 +87,9 @@ class Expansion(object): + + def create_expansions(longhands): + flags = collect_runtime_flags(longhands) +- expansions = map(lambda mask: Expansion(longhands, flags, mask), +- range(1 << len(flags))) ++ expansions = list( ++ map(lambda mask: Expansion(longhands, flags, mask), ++ range(1 << len(flags)))) + assert len(expansions) > 0 + # We generate 2^N expansions for N flags, so enforce some limit. + assert len(flags) <= 4, 'Too many runtime flags for a single shorthand' +@@ -114,14 +115,14 @@ class StylePropertyShorthandWriter(json5_generator.Writer): + + self._longhand_dictionary = defaultdict(list) + for property_ in json5_properties.shorthands: +- property_['longhand_enum_keys'] = map(enum_key_for_css_property, +- property_['longhands']) +- property_['longhand_property_ids'] = map(id_for_css_property, +- property_['longhands']) +- +- longhands = map( +- lambda name: json5_properties.properties_by_name[name], +- property_['longhands']) ++ property_['longhand_enum_keys'] = list( ++ map(enum_key_for_css_property, property_['longhands'])) ++ property_['longhand_property_ids'] = list( ++ map(id_for_css_property, property_['longhands'])) ++ ++ longhands = list( ++ map(lambda name: json5_properties.properties_by_name[name], ++ property_['longhands'])) + property_['expansions'] = create_expansions(longhands) + for longhand_enum_key in property_['longhand_enum_keys']: + self._longhand_dictionary[longhand_enum_key].append(property_) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py +index 75030ac..f72aade 100755 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py +@@ -42,8 +42,8 @@ class CSSPropertyInstancesWriter(json5_generator.Writer): + aliases = self._css_properties.aliases + + # Lists of PropertyClassData. +- self._property_classes_by_id = map(self.get_class, properties) +- self._alias_classes_by_id = map(self.get_class, aliases) ++ self._property_classes_by_id = list(map(self.get_class, properties)) ++ self._alias_classes_by_id = list(map(self.get_class, aliases)) + + # Sort by enum value. + self._property_classes_by_id.sort(key=lambda t: t.enum_value) +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/gperf.py b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/gperf.py +index 5ee4905..db72660 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/gperf.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/gperf.py +@@ -95,7 +95,7 @@ def main(): + + open(args.output_file, 'wb').write( + generate_gperf(gperf_path, +- open(infile).read(), gperf_args)) ++ open(infile).read(), gperf_args).encode('utf-8')) + + + if __name__ == '__main__': +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_file.py b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_file.py +index 28adc05..5811348 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_file.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_file.py +@@ -66,7 +66,7 @@ class InFile(object): + self._defaults = defaults + self._valid_values = copy.deepcopy( + valid_values if valid_values else {}) +- self._parse(map(str.strip, lines)) ++ self._parse(list(map(str.strip, lines))) + + @classmethod + def load_from_files(self, file_paths, defaults, valid_values, +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_generator.py b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_generator.py +index e46740a..ab1981a 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_generator.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_generator.py +@@ -32,10 +32,15 @@ import os + import os.path + import shlex + import shutil ++import sys + import optparse + + from in_file import InFile + ++# TODO: Remove this once Python2 is obsoleted. ++if sys.version_info.major != 2: ++ basestring = str ++ + + ######################################################### + # This is now deprecated - use json5_generator.py instead +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py +index cafe8d9..6925a4f 100755 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py +@@ -138,7 +138,7 @@ class RuntimeFeatureWriter(BaseRuntimeFeatureWriter): + except Exception: + # If trouble unpickling, overwrite + pass +- with open(os.path.abspath(file_name), 'w') as pickle_file: ++ with open(os.path.abspath(file_name), 'wb') as pickle_file: + pickle.dump(features_map, pickle_file) + + def _template_inputs(self): +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl +index dc3f44c..3eefcf9 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl +@@ -26,7 +26,7 @@ using {{namespace}}FunctionMap = HashMapGetExecutionContext())) { +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl +index 1b5297d..edecc81 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl +@@ -15,7 +15,7 @@ namespace blink { + class Document; + + // Type checking. +-{% for tag in tags|sort if not tag.multipleTagNames and not tag.noTypeHelpers %} ++{% for tag in tags|sort(attribute='name') if not tag.multipleTagNames and not tag.noTypeHelpers %} + class {{tag.interface}}; + template <> + inline bool IsElementOfType(const Node& node) { +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl +index 0244433..dcdbb02 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl +@@ -25,7 +25,7 @@ + + + {% macro trie_leaf(index, object, return_macro, lowercase_data) %} +-{% set name, value = object.items()[0] %} ++{% set name, value = (object.items()|list)[0] %} + {% if name|length %} + if ( + {%- for c in name -%} +@@ -45,7 +45,7 @@ return {{ return_macro(value) }}; + + + {% macro trie_switch(trie, index, return_macro, lowercase_data) %} +-{% if trie|length == 1 and trie.values()[0] is string %} ++{% if trie|length == 1 and (trie.values()|list)[0] is string %} + {{ trie_leaf(index, trie, return_macro, lowercase_data) -}} + {% else %} + {% if lowercase_data %} +diff --git a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl +index cb05c6c..bd5566b 100644 +--- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl ++++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl +@@ -24,12 +24,12 @@ namespace {{cpp_namespace}} { + {{symbol_export}}extern const WTF::AtomicString& {{namespace_prefix}}NamespaceURI; + + // Tags +-{% for tag in tags|sort %} ++{% for tag in tags|sort(attribute='name') %} + {{symbol_export}}extern const blink::{{namespace}}QualifiedName& {{tag|symbol}}Tag; + {% endfor %} + + // Attributes +-{% for attr in attrs|sort %} ++{% for attr in attrs|sort(attribute='name') %} + {{symbol_export}}extern const blink::QualifiedName& {{attr|symbol}}Attr; + {% endfor %} + +diff --git a/src/3rdparty/chromium/third_party/dawn/generator/generator_lib.py b/src/3rdparty/chromium/third_party/dawn/generator/generator_lib.py +index 5e3734d..e3d46bd 100644 +--- a/src/3rdparty/chromium/third_party/dawn/generator/generator_lib.py ++++ b/src/3rdparty/chromium/third_party/dawn/generator/generator_lib.py +@@ -201,6 +201,10 @@ def _compute_python_dependencies(root_dir=None): + + paths = set() + for path in module_paths: ++ # Builtin/namespaced modules may return None for the file path. ++ if not path: ++ continue ++ + path = os.path.abspath(path) + + if not path.startswith(root_dir): +diff --git a/src/3rdparty/chromium/third_party/devtools-frontend/src/BUILD.gn b/src/3rdparty/chromium/third_party/devtools-frontend/src/BUILD.gn +index cd488e8..ea1dc3d 100644 +--- a/src/3rdparty/chromium/third_party/devtools-frontend/src/BUILD.gn ++++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/BUILD.gn +@@ -2,6 +2,8 @@ + # Use of this source code is governed by a BSD-style license that can be + # found in the LICENSE file. + ++import("//build/config/python.gni") ++ + import("//third_party/blink/public/public_features.gni") + import("./all_devtools_files.gni") + import("./all_devtools_modules.gni") +diff --git a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py +index d6666e8..0f7a661 100644 +--- a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py ++++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py +@@ -45,7 +45,8 @@ def rollup(input_path, output_path, filename, max_size, rollup_plugin): + ['--format', 'iife', '-n', 'InspectorOverlay'] + ['--input', target] + + ['--plugin', rollup_plugin], + stdout=subprocess.PIPE, +- stderr=subprocess.PIPE) ++ stderr=subprocess.PIPE, ++ text=True) + out, error = rollup_process.communicate() + if not out: + raise Exception("rollup failed: " + error) +diff --git a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py +index fa8e73d..7d0b84b 100644 +--- a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py ++++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py +@@ -10,7 +10,7 @@ Builds applications in release mode: + and the application loader into a single script. + """ + +-from cStringIO import StringIO ++from io import StringIO + from os import path + from os.path import join + import copy +@@ -145,8 +145,7 @@ class ReleaseBuilder(object): + resource_content = read_file(path.join(self.application_dir, resource_name)) + if not (resource_name.endswith('.html') + or resource_name.endswith('md')): +- resource_content += resource_source_url(resource_name).encode( +- 'utf-8') ++ resource_content += resource_source_url(resource_name) + resource_content = resource_content.replace('\\', '\\\\') + resource_content = resource_content.replace('\n', '\\n') + resource_content = resource_content.replace('"', '\\"') +@@ -173,7 +172,9 @@ class ReleaseBuilder(object): + def _concatenate_application_script(self, output): + output.write('Root.allDescriptors.push(...%s);' % self._release_module_descriptors()) + if self.descriptors.extends: +- output.write('Root.applicationDescriptor.modules.push(...%s);' % json.dumps(self.descriptors.application.values())) ++ output.write( ++ 'Root.applicationDescriptor.modules.push(...%s);' % ++ json.dumps(list(self.descriptors.application.values()))) + else: + output.write('Root.applicationDescriptor = %s;' % self.descriptors.application_json()) + +diff --git a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py +index be510c4..c6a59c9 100644 +--- a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py ++++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py +@@ -123,7 +123,7 @@ def main(argv): + + try: + os.makedirs(path.join(output_directory, 'Images')) +- except OSError, e: ++ except OSError as e: + if e.errno != errno.EEXIST: + raise e + +@@ -147,7 +147,7 @@ def main(argv): + shutil.copy(path.join(dirname, filename), path.join(output_directory, 'Images')) + add_file_to_grd(doc, path.join('Images', filename)) + +- with open(parsed_args.output_filename, 'w') as output_file: ++ with open(parsed_args.output_filename, 'wb') as output_file: + output_file.write(doc.toxml(encoding='UTF-8')) + + +diff --git a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py +index 0ba695d..bb1da2f 100644 +--- a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py ++++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py +@@ -7,6 +7,8 @@ + Utilities for the modular DevTools build. + """ + ++from __future__ import print_function ++ + import collections + from os import path + import os +@@ -40,7 +42,7 @@ def load_and_parse_json(filename): + try: + return json.loads(read_file(filename)) + except: +- print 'ERROR: Failed to parse %s' % filename ++ print('ERROR: Failed to parse %s' % filename) + raise + + class Descriptors: +@@ -57,7 +59,7 @@ class Descriptors: + + def application_json(self): + result = dict() +- result['modules'] = self.application.values() ++ result['modules'] = list(self.application.values()) + return json.dumps(result) + + def all_compiled_files(self): +diff --git a/src/3rdparty/chromium/third_party/jinja2/tests.py b/src/3rdparty/chromium/third_party/jinja2/tests.py +index 0adc3d4..b14f85f 100644 +--- a/src/3rdparty/chromium/third_party/jinja2/tests.py ++++ b/src/3rdparty/chromium/third_party/jinja2/tests.py +@@ -10,7 +10,7 @@ + """ + import operator + import re +-from collections import Mapping ++from collections.abc import Mapping + from jinja2.runtime import Undefined + from jinja2._compat import text_type, string_types, integer_types + import decimal +diff --git a/src/3rdparty/chromium/tools/json_schema_compiler/feature_compiler.py b/src/3rdparty/chromium/tools/json_schema_compiler/feature_compiler.py +index 1480390..c68e007 100644 +--- a/src/3rdparty/chromium/tools/json_schema_compiler/feature_compiler.py ++++ b/src/3rdparty/chromium/tools/json_schema_compiler/feature_compiler.py +@@ -371,8 +371,8 @@ def DoesNotHaveAllowlistForHostedApps(value): + # what the allowlist looks like) to a python list of strings. + def cpp_list_to_list(cpp_list): + assert type(cpp_list) is str +- assert cpp_list[0] is '{' +- assert cpp_list[-1] is '}' ++ assert cpp_list[0] == '{' ++ assert cpp_list[-1] == '}' + new_list = json.loads('[%s]' % cpp_list[1:-1]) + assert type(new_list) is list + return new_list +diff --git a/src/3rdparty/chromium/tools/metrics/ukm/gen_builders.py b/src/3rdparty/chromium/tools/metrics/ukm/gen_builders.py +index f9f61d9..44e46fa 100755 +--- a/src/3rdparty/chromium/tools/metrics/ukm/gen_builders.py ++++ b/src/3rdparty/chromium/tools/metrics/ukm/gen_builders.py +@@ -48,9 +48,10 @@ def ReadFilteredData(path): + data = ukm_model.UKM_XML_TYPE.Parse(ukm_file.read()) + event_tag = ukm_model._EVENT_TYPE.tag + metric_tag = ukm_model._METRIC_TYPE.tag +- data[event_tag] = filter(ukm_model.IsNotObsolete, data[event_tag]) ++ data[event_tag] = list(filter(ukm_model.IsNotObsolete, data[event_tag])) + for event in data[event_tag]: +- event[metric_tag] = filter(ukm_model.IsNotObsolete, event[metric_tag]) ++ event[metric_tag] = list( ++ filter(ukm_model.IsNotObsolete, event[metric_tag])) + return data + + +diff --git a/src/3rdparty/chromium/ui/ozone/generate_constructor_list.py b/src/3rdparty/chromium/ui/ozone/generate_constructor_list.py +index 8d80063..04fa18e 100755 +--- a/src/3rdparty/chromium/ui/ozone/generate_constructor_list.py ++++ b/src/3rdparty/chromium/ui/ozone/generate_constructor_list.py +@@ -45,12 +45,15 @@ Example Output: ./ui/ozone/generate_constructor_list.py \ + } // namespace ui + """ + ++try: ++ from StringIO import StringIO # for Python 2 ++except ImportError: ++ from io import StringIO # for Python 3 + import optparse + import os + import collections + import re + import sys +-import string + + + def GetTypedefName(typename): +@@ -68,7 +71,7 @@ def GetConstructorName(typename, platform): + This is just "Create" + typename + platform. + """ + +- return 'Create' + typename + string.capitalize(platform) ++ return 'Create' + typename + platform.capitalize() + + + def GenerateConstructorList(out, namespace, export, typenames, platforms, +@@ -163,12 +166,14 @@ def main(argv): + sys.exit(1) + + # Write to standard output or file specified by --output_cc. +- out_cc = sys.stdout ++ out_cc = getattr(sys.stdout, 'buffer', sys.stdout) + if options.output_cc: + out_cc = open(options.output_cc, 'wb') + +- GenerateConstructorList(out_cc, options.namespace, options.export, ++ out_cc_str = StringIO() ++ GenerateConstructorList(out_cc_str, options.namespace, options.export, + typenames, platforms, includes, usings) ++ out_cc.write(out_cc_str.getvalue().encode('utf-8')) + + if options.output_cc: + out_cc.close() +diff --git a/src/3rdparty/chromium/ui/ozone/generate_ozone_platform_list.py b/src/3rdparty/chromium/ui/ozone/generate_ozone_platform_list.py +index d47c398..2702b68 100755 +--- a/src/3rdparty/chromium/ui/ozone/generate_ozone_platform_list.py ++++ b/src/3rdparty/chromium/ui/ozone/generate_ozone_platform_list.py +@@ -49,12 +49,15 @@ Example Output: ./generate_ozone_platform_list.py --default wayland dri wayland + + """ + ++try: ++ from StringIO import StringIO # for Python 2 ++except ImportError: ++ from io import StringIO # for Python 3 + import optparse + import os + import collections + import re + import sys +-import string + + + def GetConstantName(name): +@@ -63,7 +66,7 @@ def GetConstantName(name): + We just capitalize the platform name and prepend "CreateOzonePlatform". + """ + +- return 'kPlatform' + string.capitalize(name) ++ return 'kPlatform' + name.capitalize() + + + def GeneratePlatformListText(out, platforms): +@@ -149,9 +152,9 @@ def main(argv): + platforms.insert(0, options.default) + + # Write to standard output or file specified by --output_{cc,h}. +- out_cc = sys.stdout +- out_h = sys.stdout +- out_txt = sys.stdout ++ out_cc = getattr(sys.stdout, 'buffer', sys.stdout) ++ out_h = getattr(sys.stdout, 'buffer', sys.stdout) ++ out_txt = getattr(sys.stdout, 'buffer', sys.stdout) + if options.output_cc: + out_cc = open(options.output_cc, 'wb') + if options.output_h: +@@ -159,9 +162,16 @@ def main(argv): + if options.output_txt: + out_txt = open(options.output_txt, 'wb') + +- GeneratePlatformListText(out_txt, platforms) +- GeneratePlatformListHeader(out_h, platforms) +- GeneratePlatformListSource(out_cc, platforms) ++ out_txt_str = StringIO() ++ out_h_str = StringIO() ++ out_cc_str = StringIO() ++ ++ GeneratePlatformListText(out_txt_str, platforms) ++ out_txt.write(out_txt_str.getvalue().encode('utf-8')) ++ GeneratePlatformListHeader(out_h_str, platforms) ++ out_h.write(out_h_str.getvalue().encode('utf-8')) ++ GeneratePlatformListSource(out_cc_str, platforms) ++ out_cc.write(out_cc_str.getvalue().encode('utf-8')) + + if options.output_cc: + out_cc.close() +diff --git a/src/buildtools/config/support.pri b/src/buildtools/config/support.pri +index e7f869a..1bf2c5d 100644 +--- a/src/buildtools/config/support.pri ++++ b/src/buildtools/config/support.pri +@@ -21,7 +21,7 @@ defineReplace(qtwebengine_checkWebEngineCoreError) { + !qtwebengine_checkForGperf(QtWebEngine):return(false) + !qtwebengine_checkForBison(QtWebEngine):return(false) + !qtwebengine_checkForFlex(QtWebEngine):return(false) +- !qtwebengine_checkForPython2(QtWebEngine):return(false) ++ !qtwebengine_checkForPython(QtWebEngine):return(false) + !qtwebengine_checkForNodejs(QtWebEngine):return(false) + !qtwebengine_checkForSanitizer(QtWebEngine):return(false) + linux:!qtwebengine_checkForPkgCfg(QtWebEngine):return(false) +@@ -51,7 +51,7 @@ defineReplace(qtwebengine_checkPdfError) { + !qtwebengine_checkForGperf(QtPdf):return(false) + !qtwebengine_checkForBison(QtPdf):return(false) + !qtwebengine_checkForFlex(QtPdf):return(false) +- !qtwebengine_checkForPython2(QtPdf):return(false) ++ !qtwebengine_checkForPython(QtPdf):return(false) + !qtwebengine_checkForSanitizer(QtPdf):return(false) + linux:!qtwebengine_checkForPkgCfg(QtPdf):return(false) + linux:!qtwebengine_checkForHostPkgCfg(QtPdf):return(false) +@@ -143,10 +143,10 @@ defineTest(qtwebengine_checkForFlex) { + return(true) + } + +-defineTest(qtwebengine_checkForPython2) { ++defineTest(qtwebengine_checkForPython) { + module = $$1 +- !qtConfig(webengine-python2) { +- qtwebengine_skipBuild("Python version 2 (2.7.5 or later) is required to build $${module}.") ++ !qtConfig(webengine-python) { ++ qtwebengine_skipBuild("Python is required to build $${module}.") + return(false) + } + return(true) +diff --git a/src/buildtools/configure.json b/src/buildtools/configure.json +index 88d1790..032aa66 100644 +--- a/src/buildtools/configure.json ++++ b/src/buildtools/configure.json +@@ -295,9 +295,9 @@ + "label": "system ninja", + "type": "detectNinja" + }, +- "webengine-python2": { +- "label": "python2", +- "type": "detectPython2", ++ "webengine-python": { ++ "label": "python", ++ "type": "detectPython", + "log": "location" + }, + "webengine-winversion": { +@@ -374,7 +374,7 @@ + && features.webengine-gperf + && features.webengine-bison + && features.webengine-flex +- && features.webengine-python2 ++ && features.webengine-python + && features.webengine-nodejs + && (!config.sanitizer || features.webengine-sanitizer) + && (!config.linux || features.pkg-config) +@@ -400,7 +400,7 @@ + && features.webengine-gperf + && features.webengine-bison + && features.webengine-flex +- && features.webengine-python2 ++ && features.webengine-python + && (!config.sanitizer || features.webengine-sanitizer) + && (!config.linux || features.pkg-config) + && (!config.linux || features.webengine-host-pkg-config) +@@ -423,12 +423,12 @@ + "autoDetect": "features.private_tests", + "output": [ "privateFeature" ] + }, +- "webengine-python2": { +- "label": "python2", +- "condition": "tests.webengine-python2", ++ "webengine-python": { ++ "label": "python", ++ "condition": "tests.webengine-python", + "output": [ + "privateFeature", +- { "type": "varAssign", "name": "QMAKE_PYTHON2", "value": "tests.webengine-python2.location" } ++ { "type": "varAssign", "name": "QMAKE_PYTHON", "value": "tests.webengine-python.location" } + ] + }, + "webengine-gperf": { +-- +2.37.3 + diff --git a/rtc-dont-use-h264.patch b/rtc-dont-use-h264.patch new file mode 100644 index 0000000..ddb2463 --- /dev/null +++ b/rtc-dont-use-h264.patch @@ -0,0 +1,32 @@ +From: Fabian Vogt +Subject: Don't require open264 when proprietary_codecs are supported + +diff --git a/src/3rdparty/chromium/third_party/webrtc/webrtc.gni b/chromium/third_party/webrtc/webrtc.gni +index ca8acdbf259..36897a72aa8 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/webrtc.gni ++++ b/src/3rdparty/chromium/third_party/webrtc/webrtc.gni +@@ -151,8 +151,7 @@ declare_args() { + # + # Enabling H264 when building with MSVC is currently not supported, see + # bugs.webrtc.org/9213#c13 for more info. +- rtc_use_h264 = +- proprietary_codecs && !is_android && !is_ios && !(is_win && !is_clang) ++ rtc_use_h264 = false + + # Enable this flag to make webrtc::Mutex be implemented by absl::Mutex. + rtc_use_absl_mutex = false + +diff --git a/src/core/config/common.pri b/src/core/config/common.pri +index d9d64e76..cd0fd120 100644 +--- a/src/core/config/common.pri ++++ b/src/core/config/common.pri +@@ -26,9 +26,6 @@ qtConfig(webengine-webrtc) { + + qtConfig(webengine-proprietary-codecs) { + gn_args += proprietary_codecs=true ffmpeg_branding=\"Chrome\" +- qtConfig(webengine-webrtc) { +- gn_args += rtc_use_h264=true +- } + } else { + gn_args += proprietary_codecs=false + } diff --git a/sandbox_futex_time64.patch b/sandbox_futex_time64.patch new file mode 100644 index 0000000..5858f1c --- /dev/null +++ b/sandbox_futex_time64.patch @@ -0,0 +1,53 @@ +From 6abdfb1d7638c787081d16bb90022cde7a86309f Mon Sep 17 00:00:00 2001 +From: Matthew Denton +Date: Tue, 16 Mar 2021 06:38:05 +0000 +Subject: [PATCH] Linux sandbox: support futex_time64 on 32-bit platforms + +This updates futex-related syscall sets to include futex_time64, which +is a version of the futex syscall which uses 64 bit time on 32-bit +systems, to prepare for the Y2038 problem. + +Change-Id: Ie933d9fec221233bf837f00c08eb7daee204081d +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2753571 +Commit-Queue: Matthew Denton +Reviewed-by: Robert Sesek +Cr-Commit-Position: refs/heads/master@{#863166} +--- + sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc | 7 ++++++- + sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc | 3 +++ + 2 files changed, 9 insertions(+), 1 deletion(-) + + +diff --git a/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc b/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc +index 5e650d93c4b..b37f082dd69 100644 +--- a/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc ++++ b/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc +@@ -198,8 +198,13 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno, + } + #endif + +- if (sysno == __NR_futex) ++ if (sysno == __NR_futex ++#if defined(__NR_futex_time64) ++ || sysno == __NR_futex_time64 ++#endif ++ ) { + return RestrictFutex(); ++ } + + if (sysno == __NR_set_robust_list) + return Error(EPERM); +diff --git a/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc +index d1ea8e99a1c..3a8a924cc0a 100644 +--- a/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc ++++ b/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc +@@ -427,6 +427,9 @@ bool SyscallSets::IsAllowedFutex(int sysno) { + case __NR_get_robust_list: + case __NR_set_robust_list: + case __NR_futex: ++#if defined(__NR_futex_time64) ++ case __NR_futex_time64: ++#endif + default: + return false; + }