summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2022-05-14 16:14:33 +0200
committerFlorian Bruhin <me@the-compiler.org>2022-06-22 17:41:11 +0200
commitd81d400ed1cbd6279a6d5e39e03b5ff88c9176bb (patch)
treef562fb90206d391f0325a8e4f2e55a89db0ba9ca
parent1b85c2980af48fd2a9973fe1a33b455a31b89c0f (diff)
downloadqutebrowser-d81d400ed1cbd6279a6d5e39e03b5ff88c9176bb.tar.gz
qutebrowser-d81d400ed1cbd6279a6d5e39e03b5ff88c9176bb.zip
qt6: Use new API to get Chromium/QtWebEngine versions
-rw-r--r--qutebrowser/utils/version.py27
-rw-r--r--tests/unit/utils/test_version.py24
2 files changed, 44 insertions, 7 deletions
diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py
index b3becea8a..2aff43759 100644
--- a/qutebrowser/utils/version.py
+++ b/qutebrowser/utils/version.py
@@ -660,6 +660,20 @@ class WebEngineVersions:
return cls._CHROMIUM_VERSIONS.get(minor_version)
@classmethod
+ def from_api(cls, qtwe_version: str, chromium_version: str) -> 'WebEngineVersions':
+ """Get the versions based on the exact versions.
+
+ This is called if we have proper APIs to get the versions easily
+ (Qt 6.2 with PyQt 6.3.1+).
+ """
+ parsed = utils.VersionNumber.parse(qtwe_version)
+ return cls(
+ webengine=parsed,
+ chromium=chromium_version,
+ source='api',
+ )
+
+ @classmethod
def from_importlib(cls, pyqt_webengine_qt_version: str) -> 'WebEngineVersions':
"""Get the versions based on the PyQtWebEngine version.
@@ -741,6 +755,19 @@ def qtwebengine_versions(*, avoid_init: bool = False) -> WebEngineVersions:
"""
from qutebrowser.browser.webengine import webenginesettings
+ try:
+ from qutebrowser.qt.webenginecore import (
+ qWebEngineVersion,
+ qWebEngineChromiumVersion,
+ )
+ except ImportError:
+ pass # Needs QtWebEngine 6.2+ with PyQtWebEngine 6.3.1+
+ else:
+ return WebEngineVersions.from_api(
+ qtwe_version=qWebEngineVersion(),
+ chromium_version=qWebEngineChromiumVersion(),
+ )
+
if webenginesettings.parsed_user_agent is None and not avoid_init:
webenginesettings.init_user_agent()
diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py
index 551439258..5fe1ea2dc 100644
--- a/tests/unit/utils/test_version.py
+++ b/tests/unit/utils/test_version.py
@@ -1066,13 +1066,13 @@ class TestChromiumVersion:
# Not available with QtWebKit
monkeypatch.setattr(webenginesettings, 'parsed_user_agent', None)
- def test_fake_ua(self, monkeypatch, caplog):
+ def test_fake_ua(self, monkeypatch, caplog, patch_no_api):
ver = '77.0.3865.98'
webenginesettings._init_user_agent_str(_QTWE_USER_AGENT.format(ver))
assert version.qtwebengine_versions().chromium == ver
- def test_prefers_saved_user_agent(self, monkeypatch):
+ def test_prefers_saved_user_agent(self, monkeypatch, patch_no_api):
webenginesettings._init_user_agent_str(_QTWE_USER_AGENT.format('87'))
class FakeProfile:
@@ -1088,7 +1088,16 @@ class TestChromiumVersion:
def test_avoided(self, monkeypatch):
versions = version.qtwebengine_versions(avoid_init=True)
- assert versions.source in ['ELF', 'importlib', 'PyQt', 'Qt']
+ assert versions.source in ['api', 'ELF', 'importlib', 'PyQt', 'Qt']
+
+ @pytest.fixture
+ def patch_no_api(self, monkeypatch):
+ """Simulate no PyQt API for getting its version."""
+ monkeypatch.delattr(
+ qutebrowser.qt.webenginecore,
+ "qWebEngineVersion",
+ raising=False,
+ )
@pytest.fixture
def patch_elf_fail(self, monkeypatch):
@@ -1135,9 +1144,10 @@ class TestChromiumVersion:
importlib_patcher(qt=None, qt5=None)
@pytest.mark.parametrize('patches, sources', [
- (['elf_fail'], ['importlib', 'PyQt', 'Qt']),
- (['elf_fail', 'no_importlib'], ['PyQt', 'Qt']),
- (['elf_fail', 'importlib_no_package'], ['PyQt', 'Qt']),
+ (['no_api'], ['ELF', 'importlib', 'PyQt', 'Qt']),
+ (['no_api', 'elf_fail'], ['importlib', 'PyQt', 'Qt']),
+ (['no_api', 'elf_fail', 'no_importlib'], ['PyQt', 'Qt']),
+ (['no_api', 'elf_fail', 'importlib_no_package'], ['PyQt', 'Qt']),
], ids=','.join)
def test_simulated(self, request, patches, sources):
"""Test various simulated error conditions.
@@ -1158,7 +1168,7 @@ class TestChromiumVersion:
('5.15.3', None, utils.VersionNumber(5, 15, 3)),
('5.15.3', '5.15.4', utils.VersionNumber(5, 15, 4)), # -Qt5 takes precedence
])
- def test_importlib(self, qt, qt5, expected, patch_elf_fail, importlib_patcher):
+ def test_importlib(self, qt, qt5, expected, patch_elf_fail, patch_no_api, importlib_patcher):
"""Test the importlib version logic with different Qt packages.
With PyQtWebEngine 5.15.4, PyQtWebEngine-Qt was renamed to PyQtWebEngine-Qt5.