commit:     40ecb1d4fbc755fbe7cf4a91412f4acec06fc13b
Author:     Ionen Wolkens <ionen <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 21 22:04:03 2025 +0000
Commit:     Ionen Wolkens <ionen <AT> gentoo <DOT> org>
CommitDate: Fri Nov 21 22:19:15 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=40ecb1d4

www-client/qutebrowser: backport Qt 6.10.1 :version crash workaround

Does not affect normal usage, but getting an instant crash when just
checking qutebrowser's version could make someone lose work and such
so may as well backport, albeit qutebrowser-3.6.2 may not be far away.

The actual bug is in qtwebengine, but due to jira migration it cannot
be reported upstream at the moment. Either way likely will not bother
backporting a fix + make everyone rebuild qtwebengine over this unless
it affects more packages (they need to be messing with webextensions
which is very rare, maybe falkon at most).

Signed-off-by: Ionen Wolkens <ionen <AT> gentoo.org>

 .../files/qutebrowser-3.6.1-qt6.10.1.patch         | 121 +++++++++++++++++++++
 ...er-3.6.1.ebuild => qutebrowser-3.6.1-r1.ebuild} |   4 +
 2 files changed, 125 insertions(+)

diff --git a/www-client/qutebrowser/files/qutebrowser-3.6.1-qt6.10.1.patch 
b/www-client/qutebrowser/files/qutebrowser-3.6.1-qt6.10.1.patch
new file mode 100644
index 000000000000..5a72167fd72f
--- /dev/null
+++ b/www-client/qutebrowser/files/qutebrowser-3.6.1-qt6.10.1.patch
@@ -0,0 +1,121 @@
+https://github.com/qutebrowser/qutebrowser/issues/8785
+https://github.com/qutebrowser/qutebrowser/commit/0c34bf2f791b1
+--- a/qutebrowser/browser/webengine/webenginesettings.py
++++ b/qutebrowser/browser/webengine/webenginesettings.py
+@@ -459,12 +459,16 @@
+ 
+ 
++def default_qt_profile() -> QWebEngineProfile:
++    """Get the default profile from Qt."""
++    if machinery.IS_QT6:
++        return QWebEngineProfile("Default")
++    else:
++        return QWebEngineProfile.defaultProfile()
++
++
+ def _init_default_profile():
+     """Init the default QWebEngineProfile."""
+     global default_profile
+-
+-    if machinery.IS_QT6:
+-        default_profile = QWebEngineProfile("Default")
+-    else:
+-        default_profile = QWebEngineProfile.defaultProfile()
++    default_profile = default_qt_profile()
+     assert not default_profile.isOffTheRecord()
+ 
+--- a/qutebrowser/utils/version.py
++++ b/qutebrowser/utils/version.py
+@@ -931,10 +931,16 @@
+     if (
+         objects.backend == usertypes.Backend.QtWebEngine
+-        and "avoid-chromium-init" not in objects.debug_flags
+         and machinery.IS_QT6  # mypy; TODO early return once Qt 5 is dropped
+     ):
+-        from qutebrowser.qt.webenginecore import QWebEngineProfile
+-        profile = QWebEngineProfile.defaultProfile()
+-        assert profile is not None  # mypy
++        from qutebrowser.browser.webengine import webenginesettings
++        lines.append("WebExtensions:")
++
++        if webenginesettings.default_profile:
++            profile = webenginesettings.default_profile
++        elif "avoid-chromium-init" in objects.debug_flags:
++            lines[0] += " unknown (avoiding init)"
++            return lines
++        else:
++            profile = webenginesettings.default_qt_profile()
+ 
+         try:
+@@ -945,5 +951,4 @@
+         assert ext_manager is not None  # mypy
+ 
+-        lines.append("WebExtensions:")
+         if not ext_manager.extensions():
+             lines[0] += " none"
+--- a/tests/unit/utils/test_version.py
++++ b/tests/unit/utils/test_version.py
+@@ -1450,9 +1450,7 @@
+         if machinery.IS_QT6:
+             monkeypatch.setattr(
+-                QWebEngineProfile,
+-                "defaultProfile",
+-                lambda: FakeExtensionProfile(
+-                    FakeExtensionManager([FakeExtensionInfo("ext1")])
+-                ),
++                webenginesettings,
++                "default_profile",
++                
FakeExtensionProfile(FakeExtensionManager([FakeExtensionInfo("ext1")])),
+             )
+             substitutions['webextensions'] = (
+@@ -1593,18 +1591,33 @@
+ 
+     def test_qtwebkit(self, monkeypatch: pytest.MonkeyPatch) -> None:
++        assert webenginesettings.default_profile is None  # -> 
default_qt_profile() used
+         monkeypatch.setattr(version.objects, "backend", 
usertypes.Backend.QtWebKit)
+-        monkeypatch.setattr(QWebEngineProfile, "defaultProfile", lambda: 1/0)
++        monkeypatch.setattr(webenginesettings, "default_qt_profile", lambda: 
1 / 0)
+         assert not version._webengine_extensions()
+ 
+     def test_avoid_chromium_init(self, monkeypatch: pytest.MonkeyPatch) -> 
None:
++        assert webenginesettings.default_profile is None  # -> 
default_qt_profile() used
+         monkeypatch.setattr(version.objects, "backend", 
usertypes.Backend.QtWebEngine)
+         monkeypatch.setattr(objects, "debug_flags", {"avoid-chromium-init"})
+-        monkeypatch.setattr(QWebEngineProfile, "defaultProfile", lambda: 1/0)
+-        assert not version._webengine_extensions()
++        monkeypatch.setattr(webenginesettings, "default_qt_profile", lambda: 
1 / 0)
++        assert version._webengine_extensions() == [
++            "WebExtensions: unknown (avoiding init)"
++        ]
+ 
+     def test_no_extension_manager(self, monkeypatch: pytest.MonkeyPatch) -> 
None:
+-        monkeypatch.setattr(QWebEngineProfile, "defaultProfile", object)
++        assert webenginesettings.default_profile is None  # -> 
default_qt_profile() used
++        monkeypatch.setattr(webenginesettings, "default_qt_profile", object)
+         assert not version._webengine_extensions()
+ 
++    @pytest.mark.parametrize("avoid_init", [True, False])
++    def test_preexisting_profile(self, monkeypatch: pytest.MonkeyPatch, 
avoid_init: bool) -> None:
++        """Test that we use the pre-existing profile if available."""
++        monkeypatch.setattr(webenginesettings, "default_profile", 
FakeExtensionProfile(FakeExtensionManager([])))
++        if avoid_init:
++            monkeypatch.setattr(objects, "debug_flags", 
{"avoid-chromium-init"})
++
++        result = version._webengine_extensions()
++        assert result == ["WebExtensions: none"]
++
+     @pytest.mark.parametrize(
+         "extensions, expected",
+@@ -1667,9 +1680,7 @@
+     ) -> None:
+         monkeypatch.setattr(
+-            QWebEngineProfile,
+-            "defaultProfile",
+-            lambda: FakeExtensionProfile(
+-                FakeExtensionManager(extensions)
+-            ),
++            webenginesettings,
++            "default_profile",
++            FakeExtensionProfile(FakeExtensionManager(extensions)),
+         )
+         assert version._webengine_extensions() == expected

diff --git a/www-client/qutebrowser/qutebrowser-3.6.1.ebuild 
b/www-client/qutebrowser/qutebrowser-3.6.1-r1.ebuild
similarity index 99%
rename from www-client/qutebrowser/qutebrowser-3.6.1.ebuild
rename to www-client/qutebrowser/qutebrowser-3.6.1-r1.ebuild
index 170101720577..3e70ebcadf80 100644
--- a/www-client/qutebrowser/qutebrowser-3.6.1.ebuild
+++ b/www-client/qutebrowser/qutebrowser-3.6.1-r1.ebuild
@@ -66,6 +66,10 @@ fi
 EPYTEST_PLUGINS=( hypothesis pytest-{bdd,mock,qt,rerunfailures,xvfb} )
 distutils_enable_tests pytest
 
+PATCHES=(
+       "${FILESDIR}"/${P}-qt6.10.1.patch
+)
+
 src_prepare() {
        distutils-r1_src_prepare
 

Reply via email to