diff options
author | Florian Bruhin <me@the-compiler.org> | 2020-02-13 11:55:23 +0100 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2020-02-13 12:06:36 +0100 |
commit | b99abb744a92209ca9c56d6f12bce62547d32087 (patch) | |
tree | afa828ada5dac462097087e1738357a282bf9477 | |
parent | 0e3f6e6b87736bea34c6424021f01cbc07501efe (diff) | |
download | qutebrowser-b99abb744a92209ca9c56d6f12bce62547d32087.tar.gz qutebrowser-b99abb744a92209ca9c56d6f12bce62547d32087.zip |
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)
-rw-r--r-- | qutebrowser/misc/backendproblem.py | 36 |
1 files changed, 36 insertions, 0 deletions
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) |