From b99abb744a92209ca9c56d6f12bce62547d32087 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 13 Feb 2020 11:55:23 +0100 Subject: Delete Service Worker directory on Qt upgrades QtWebEngine upgrades seem to have issues with old service workers around. As a workaround, let's delete the Service Worker directory (keeping one backup around) when the Qt version changes (and also once on Qt 5.14 to get rid of existing bad data). Related Qt issues: - https://bugreports.qt.io/browse/QTBUG-72532 - https://bugreports.qt.io/browse/QTBUG-82105 It seems to be okay to delete those, as the website can re-register them, and they don't seem to have any persistent data storage. Relevant reading: - https://github.com/chromium/chromium/blob/master/content/browser/service_worker/README.md - https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API - https://w3c.github.io/ServiceWorker/ - https://developer.mozilla.org/en-US/docs/Web/API/CacheStorage Fixes #4853 (cherry picked from commit 84541de04b06f3d40d11fb38669367b0905f04a0) --- qutebrowser/misc/backendproblem.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/qutebrowser/misc/backendproblem.py b/qutebrowser/misc/backendproblem.py index dd99de378..6aab87ea6 100644 --- a/qutebrowser/misc/backendproblem.py +++ b/qutebrowser/misc/backendproblem.py @@ -440,6 +440,41 @@ class _BackendProblemChecker: if os.path.exists(cache_dir): shutil.rmtree(cache_dir) + def _handle_serviceworker_nuking(self) -> None: + """Nuke the service workers directory if the Qt version changed. + + WORKAROUND for: + https://bugreports.qt.io/browse/QTBUG-72532 + https://bugreports.qt.io/browse/QTBUG-82105 + """ + if ('serviceworker_workaround' not in configfiles.state['general'] and + qtutils.version_check('5.14', compiled=False)): + # Nuke the service worker directory once for every install with Qt + # 5.14, given that it seems to cause a variety of segfaults. + configfiles.state['general']['serviceworker_workaround'] = '514' + affected = True + else: + # Otherwise, just nuke it when the Qt version changed. + affected = configfiles.state.qt_version_changed + + if not affected: + return + + service_worker_dir = os.path.join(standarddir.data(), 'webengine', + 'Service Worker') + bak_dir = service_worker_dir + '-bak' + if not os.path.exists(service_worker_dir): + return + + log.init.info("Qt version changed, removing service workers") + + # Keep one backup around - we're not 100% sure what persistent data + # could be in there, but this folder can grow to ~300 MB. + if os.path.exists(bak_dir): + shutil.rmtree(bak_dir) + + shutil.move(service_worker_dir, bak_dir) + def _assert_backend(self, backend: usertypes.Backend) -> None: assert objects.backend == backend, objects.backend @@ -452,6 +487,7 @@ class _BackendProblemChecker: self._nvidia_shader_workaround() self._handle_nouveau_graphics() self._handle_cache_nuking() + self._handle_serviceworker_nuking() else: self._assert_backend(usertypes.Backend.QtWebKit) self._handle_ssl_support(fatal=True) -- cgit v1.2.3-54-g00ecf