summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2020-02-13 11:55:23 +0100
committerFlorian Bruhin <me@the-compiler.org>2020-02-13 12:06:36 +0100
commitb99abb744a92209ca9c56d6f12bce62547d32087 (patch)
treeafa828ada5dac462097087e1738357a282bf9477
parent0e3f6e6b87736bea34c6424021f01cbc07501efe (diff)
downloadqutebrowser-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.py36
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)