diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 969b31938..5d31e60da 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -130,6 +130,7 @@ Fixed - (QtWebEngine) HTML fullscreen is now tracked for each tab separately, which means it's not possible anymore to accidentally get stuck in fullscreen state by closing a tab with a fullscreen video. +- For some people, running some userscripts crashed - this should now be fixed. - Various other rare crashes should now be fixed. - The settings documentation was truncated with v0.10.1 which should now be fixed. diff --git a/qutebrowser/commands/userscripts.py b/qutebrowser/commands/userscripts.py index f3802d04c..40e7aedc3 100644 --- a/qutebrowser/commands/userscripts.py +++ b/qutebrowser/commands/userscripts.py @@ -40,6 +40,7 @@ class _QtFIFOReader(QObject): _filepath: The path to the opened FIFO. _fifo: The Python file object for the FIFO. _notifier: The QSocketNotifier used. + _finished: Set after cleanup() has been called. Signals: got_line: Emitted when a whole line arrived. @@ -59,11 +60,18 @@ class _QtFIFOReader(QObject): self._fifo = os.fdopen(fd, 'r') self._notifier = QSocketNotifier(fd, QSocketNotifier.Read, self) self._notifier.activated.connect(self.read_line) + self._finished = False @pyqtSlot() def read_line(self): """(Try to) read a line from the FIFO.""" log.procs.debug("QSocketNotifier triggered!") + if self._finished: + # For unknown reasons, read_line can still get called after + # cleanup() was, and the QSocketNotifier was already deleted... + log.procs.debug("QtFIFOReader finished already...") + return + self._notifier.setEnabled(False) try: for line in self._fifo: @@ -75,6 +83,7 @@ class _QtFIFOReader(QObject): def cleanup(self): """Clean up so the FIFO can be closed.""" + self._finished = True self._notifier.setEnabled(False) for line in self._fifo: self.got_line.emit(line.rstrip('\r\n'))