Description
Summary if you've been linked to this issue due to crashes
Due to a yet-unknown issue (possibly unclean shutdowns of qutebrowser?), the "Service Worker" storage used by the underlying QtWebEngine/Chromium gets corrupted. When qutebrowser is used with such a corrupt Service Worker storage, crashes will occur on pages which use the corrupted data, such as GMail. We've unfortunately never been able to figure out what causes the corruption (happening in the qutebrowser run before the crashes start!), help tracking this down would be much appreciated.
As a one-time fix, remove the webengine/Service Workers
directory in qutebrowser's data directory (e.g. ~/.local/share/qutebrowser/webengine/Service Worker
on Linux, see `:version for the exact location of the data directory). It's unclear whether websites are storing any data supposed to be persistent in there, but no such case is known so far, so it should be safe to delete.
As a permanent workaround, run :set qt.workarounds.remove_service_workers true
. This make qutebrowser automatically remove the data (corrupted or not) on every start. Be aware that this will negatively impact the startup time (especially on a HDD) and could in theory delete data supposed to be persistent (see above). Please also consider first only removing the directory manually, in order to help track down what exactly causes the problem to appear again.
Original issue
Apparently QtWebEngine 5.15 still has some kind of issue with service workers. This is mostly a continuation of #4853 and #5279, i.e. a bug (or several) which has been following us in one way or another for over a year now 😢
The reproducer from #5279 with the Epic Games Store doesn't seem to reproduce the issue this time around, and the --disable-shared-workers
workaround which is active for Qt 5.14 doesn't seem to help, according to a Reddit post.
Analyzing the crash with DebugDiag yields an unusable stacktrace (full log):
DetailID = 3
Count: 2
Exception #: 0XC0000005
Stack:
Qt5WebEngineCore!GetHandleVerifier+0x1cf7e36
Qt5WebEngineCore!GetHandleVerifier+0x1c6cd66
Qt5WebEngineCore!QWebEngineUrlScheme::QWebEngineUrlScheme+0x311f13
Qt5WebEngineCore!GetHandleVerifier+0x1d0f95a
Qt5WebEngineCore!QtWebEngineCore::JavaScriptDialogController::qt_static_metacall+0x29ab3
Qt5WebEngineCore!QWebEngineUrlSchemeHandler::qt_metacast+0x17d65
Qt5WebEngineCore!GetHandleVerifier+0x92bf
Qt5WebEngineCore!GetHandleVerifier+0x8dd2
Qt5WebEngineCore!QWebEngineUrlSchemeHandler::qt_metacast+0xc964
Qt5WebEngineCore!QWebEngineUrlSchemeHandler::qt_metacast+0xd1d2
Qt5WebEngineCore!GetHandleVerifier+0x9762
Qt5WebEngineCore!QWebEngineUrlSchemeHandler::qt_metacast+0x40059
Qt5WebEngineCore!GetHandleVerifier+0x192aadd
Qt5WebEngineCore!QWebEngineUrlSchemeHandler::qt_metacast+0x434d5
Qt5WebEngineCore!QWebEngineUrlSchemeHandler::qt_metacast+0xe1d8
KERNEL32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21
However, kiburtse of the Qt Company did some crazy work at hand-decoding it:
base\threading\platform_thread_win.cc @ 108 base::`anonymous namespace'::ThreadFunc
base\threading\thread.cc @ 379 base::Thread::ThreadMain
content\browser\browser_process_sub_thread.cc @ 135 content::BrowserProcessSubThread::IOThreadRun
base\run_loop.cc @ 158 base::RunLoop::Run
base\task\sequence_manager\thread_controller_with_message_pump_impl.cc @ 471 base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run
base\message_loop\message_pump_win.cc @ 76 base::MessagePumpWin::Run
base\message_loop\message_pump_win.cc @ 623 base::MessagePumpForIO::DoRunLoop
base\task\sequence_manager\thread_controller_with_message_pump_impl.cc @ 221 base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoSomeWork
base\task\sequence_manager\thread_controller_with_message_pump_impl.cc @ 366 base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl
base\task\common\task_annotator.cc @ 142 base::TaskAnnotator::RunTask
base\bind_internal.h @ 644 base::internal::Invoker<...>::RunOnce
content\browser\cache_storage\cache_storage_operation.cc @ 50 content::CacheStorageOperation::Run
base\bind_internal.h @ 621 base::internal::InvokeHelper<1,void>::MakeItSo<...> >
content\browser\cache_storage\legacy\legacy_cache_storage.cc @ 1424 content::LegacyCacheStorage::SizeImpl
content\browser\cache_storage\legacy\legacy_cache_storage_cache.cc @ 856 content::LegacyCacheStorageCache::Size
At this point I'm not 100% sure it's Windows specific (I think I've heard of people on Linux who have crashes which are solved by moving the Service Worker directory away), but it definitely seems to mostly happen on Windows.
To clarify: This isn't a bug in qutebrowser, I'm just opening this to have a place to track anything new we find out. Right now it'd still really help to have a reliable reproducer.