From d79f6296ee88f8adcc548bf6ab0d0d8ebf0260d9 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 13 May 2021 13:02:26 +0200 Subject: Remove service workers based on QtWebEngine version See https://bugreports.qt.io/browse/QTBUG-93744 (cherry picked from commit b03b03bdf6e02e13b348689bf7b18196432f232b) Additional fixups: Store initial QtWebEngine version (cherry picked from commit 948fd5040d81228452fd72a0170a0d8fe35839a9) Fix state config unit tests (cherry picked from commit 335ed484c1f8b6e5417d9000ae226b4f9a85b28f) Fix running without QtWebEngine (cherry picked from commit 57ed85ffad3278d159d1ebd03081a5e719b952cb) Remove unused imports (cherry picked from commit 9e52ad621ac44d0391c2c6d9dbdda967f7ce95f0) Fix tests without QtWebEngine (cherry picked from commit ac12fcd714c699f927170b3d0508336940366bac) --- qutebrowser/config/configfiles.py | 18 ++++++++++- qutebrowser/misc/backendproblem.py | 3 ++ tests/unit/config/test_configfiles.py | 61 +++++++++++++++++++++++++++++++++-- 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index f8566e2d0..a3320c5c1 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -39,7 +39,7 @@ import qutebrowser from qutebrowser.config import (configexc, config, configdata, configutils, configtypes) from qutebrowser.keyinput import keyutils -from qutebrowser.utils import standarddir, utils, qtutils, log, urlmatch +from qutebrowser.utils import standarddir, utils, qtutils, log, urlmatch, version if TYPE_CHECKING: from qutebrowser.misc import savemanager @@ -89,6 +89,7 @@ class StateConfig(configparser.ConfigParser): self.read(self._filename, encoding='utf-8') self.qt_version_changed = False + self.qtwe_version_changed = False self.qutebrowser_version_changed = VersionChange.unknown self._set_changed_attributes() @@ -108,8 +109,20 @@ class StateConfig(configparser.ConfigParser): self[sect].pop(key, None) self['general']['qt_version'] = qVersion() + self['general']['qtwe_version'] = self._qtwe_version_str() self['general']['version'] = qutebrowser.__version__ + def _qtwe_version_str(self) -> str: + """Get the QtWebEngine version string. + + Note that it's too early to use objects.backend here... + """ + try: + import PyQt5.QtWebEngineWidgets # pylint: disable=unused-import + except ImportError: + return 'no' + return str(version.qtwebengine_versions(avoid_init=True).webengine) + def _set_changed_attributes(self) -> None: """Set qt_version_changed/qutebrowser_version_changed attributes. @@ -123,6 +136,9 @@ class StateConfig(configparser.ConfigParser): old_qt_version = self['general'].get('qt_version', None) self.qt_version_changed = old_qt_version != qVersion() + old_qtwe_version = self['general'].get('qtwe_version', None) + self.qtwe_version_changed = old_qtwe_version != self._qtwe_version_str() + old_qutebrowser_version = self['general'].get('version', None) if old_qutebrowser_version is None: # https://github.com/python/typeshed/issues/2093 diff --git a/qutebrowser/misc/backendproblem.py b/qutebrowser/misc/backendproblem.py index 001aa3047..3e14719e0 100644 --- a/qutebrowser/misc/backendproblem.py +++ b/qutebrowser/misc/backendproblem.py @@ -389,6 +389,7 @@ class _BackendProblemChecker: WORKAROUND for: https://bugreports.qt.io/browse/QTBUG-72532 https://bugreports.qt.io/browse/QTBUG-82105 + https://bugreports.qt.io/browse/QTBUG-93744 """ if ('serviceworker_workaround' not in configfiles.state['general'] and qtutils.version_check('5.14', compiled=False)): @@ -398,6 +399,8 @@ class _BackendProblemChecker: reason = 'Qt 5.14' elif configfiles.state.qt_version_changed: reason = 'Qt version changed' + elif configfiles.state.qtwe_version_changed: + reason = 'QtWebEngine version changed' elif config.val.qt.workarounds.remove_service_workers: reason = 'Explicitly enabled' else: diff --git a/tests/unit/config/test_configfiles.py b/tests/unit/config/test_configfiles.py index e0d64bffc..65952ddb4 100644 --- a/tests/unit/config/test_configfiles.py +++ b/tests/unit/config/test_configfiles.py @@ -29,7 +29,7 @@ from PyQt5.QtCore import QSettings from qutebrowser.config import (config, configfiles, configexc, configdata, configtypes) -from qutebrowser.utils import utils, usertypes, urlmatch, standarddir +from qutebrowser.utils import utils, usertypes, urlmatch, standarddir, version from qutebrowser.keyinput import keyutils @@ -81,6 +81,7 @@ def autoconfig(config_tmpdir): False, '[general]\n' 'qt_version = 5.6.7\n' + 'qtwe_version = 7.8.9\n' 'version = 1.2.3\n' '\n' '[geometry]\n' @@ -92,6 +93,7 @@ def autoconfig(config_tmpdir): False, '[general]\n' 'qt_version = 5.6.7\n' + 'qtwe_version = 7.8.9\n' 'version = 1.2.3\n' '\n' '[geometry]\n' @@ -104,6 +106,7 @@ def autoconfig(config_tmpdir): '[general]\n' 'foobar = 42\n' 'qt_version = 5.6.7\n' + 'qtwe_version = 7.8.9\n' 'version = 1.2.3\n' '\n' '[geometry]\n' @@ -114,6 +117,7 @@ def autoconfig(config_tmpdir): True, '[general]\n' 'qt_version = 5.6.7\n' + 'qtwe_version = 7.8.9\n' 'version = 1.2.3\n' 'newval = 23\n' '\n' @@ -122,10 +126,13 @@ def autoconfig(config_tmpdir): '[inspector]\n' '\n'), ]) -def test_state_config(fake_save_manager, data_tmpdir, monkeypatch, - old_data, insert, new_data): +def test_state_config( + fake_save_manager, data_tmpdir, monkeypatch, qtwe_version_patcher, + old_data, insert, new_data +): monkeypatch.setattr(configfiles.qutebrowser, '__version__', '1.2.3') monkeypatch.setattr(configfiles, 'qVersion', lambda: '5.6.7') + qtwe_version_patcher('7.8.9') statefile = data_tmpdir / 'state' if old_data is not None: @@ -157,6 +164,28 @@ def state_writer(data_tmpdir): return _write +@pytest.fixture +def qtwe_version_patcher(monkeypatch): + try: + from PyQt5 import QtWebEngineWidgets # pylint: disable=unused-import + except ImportError: + pytest.skip("QtWebEngine not available") + + def patch(ver): + monkeypatch.setattr( + configfiles.version, + 'qtwebengine_versions', + lambda avoid_init=False: + version.WebEngineVersions( + webengine=utils.VersionNumber.parse(ver), + chromium=None, + source='test', + ) + ) + + return patch + + @pytest.mark.parametrize('old_version, new_version, changed', [ (None, '5.12.1', False), ('5.12.1', '5.12.1', False), @@ -176,6 +205,32 @@ def test_qt_version_changed(state_writer, monkeypatch, assert state.qt_version_changed == changed +@pytest.mark.parametrize('old_version, new_version, changed', [ + (None, '5.15.1', False), + ('5.15.1', '5.15.1', False), + ('5.15.1', '5.15.2', True), + ('5.14.0', '5.15.2', True), +]) +def test_qtwe_version_changed(state_writer, qtwe_version_patcher, + old_version, new_version, changed): + qtwe_version_patcher(new_version) + + if old_version is not None: + state_writer('qtwe_version', old_version) + + state = configfiles.StateConfig() + assert state.qtwe_version_changed == changed + + +def test_qtwe_version_changed_webkit(stubs, monkeypatch, state_writer): + fake = stubs.ImportFake({'PyQt5.QtWebEngineWidgets': False}, monkeypatch) + fake.patch() + + state_writer('qtwe_version', 'no') + state = configfiles.StateConfig() + assert not state.qtwe_version_changed + + @pytest.mark.parametrize('old_version, new_version, expected', [ (None, '2.0.0', configfiles.VersionChange.unknown), ('1.14.1', '1.14.1', configfiles.VersionChange.equal), -- cgit v1.2.3-54-g00ecf