From 2469d01ce70af6d168f5d99c67e7fc5b4a5d2503 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 8 Feb 2017 10:55:05 +0100 Subject: [PATCH] Add renderer_process_terminated signal to tab API --- qutebrowser/browser/browsertab.py | 13 ++++++++++ qutebrowser/browser/webengine/webenginetab.py | 24 +++++++++---------- qutebrowser/mainwindow/tabbedbrowser.py | 16 +++++++++++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 8addb293c..34d4424a3 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -74,6 +74,14 @@ class UnsupportedOperationError(WebTabError): """Raised when an operation is not supported with the given backend.""" +TerminationStatus = usertypes.enum('TerminationStatus', [ + 'normal', + 'abnormal', # non-zero exit status + 'crashed', # e.g. segfault + 'killed' +]) + + class TabData: """A simple namespace with a fixed set of attributes. @@ -532,6 +540,10 @@ class AbstractTab(QWidget): fullscreen_requested: Fullscreen display was requested by the page. arg: True if fullscreen should be turned on, False if it should be turned off. + renderer_process_terminated: Emitted when the underlying renderer process + terminated. + arg 0: A TerminationStatus member. + arg 1: The exit code. """ window_close_requested = pyqtSignal() @@ -548,6 +560,7 @@ class AbstractTab(QWidget): contents_size_changed = pyqtSignal(QSizeF) add_history_item = pyqtSignal(QUrl, QUrl, str) # url, requested url, title fullscreen_requested = pyqtSignal(bool) + renderer_process_terminated = pyqtSignal(TerminationStatus, int) def __init__(self, win_id, mode_manager, parent=None): self.win_id = win_id diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index dc3aec277..4c1bb9e9d 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -40,7 +40,7 @@ from qutebrowser.browser.webengine import (webview, webengineelem, tabhistory, webenginedownloads) from qutebrowser.misc import miscwidgets from qutebrowser.utils import (usertypes, qtutils, log, javascript, utils, - objreg, jinja, message) + objreg, jinja) _qute_scheme_handler = None @@ -683,17 +683,17 @@ class WebEngineTab(browsertab.AbstractTab): # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-58697 status = QWebEnginePage.CrashedTerminationStatus - if status == QWebEnginePage.NormalTerminationStatus: - pass - elif status == QWebEnginePage.AbnormalTerminationStatus: - message.error("Renderer process exited with status {}".format( - exitcode)) - elif status == QWebEnginePage.CrashedTerminationStatus: - message.error("Renderer process crashed") - elif status == QWebEnginePage.KilledTerminationStatus: - message.error("Renderer process was killed") - else: - raise ValueError("Invalid status {}".format(status)) + status_map = { + QWebEnginePage.NormalTerminationStatus: + browsertab.TerminationStatus.normal, + QWebEnginePage.AbnormalTerminationStatus: + browsertab.TerminationStatus.abnormal, + QWebEnginePage.CrashedTerminationStatus: + browsertab.TerminationStatus.crashed, + QWebEnginePage.KilledTerminationStatus: + browsertab.TerminationStatus.killed, + } + self.renderer_process_terminated.emit(status_map[status], exitcode) def _connect_signals(self): view = self._widget diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 27a882dc7..204dcdf7a 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -198,6 +198,8 @@ class TabbedBrowser(tabwidget.TabWidget): functools.partial(self.on_load_started, tab)) tab.window_close_requested.connect( functools.partial(self.on_window_close_requested, tab)) + tab.renderer_process_terminated.connect( + functools.partial(self._on_renderer_process_terminated, tab)) tab.new_tab_requested.connect(self.tabopen) tab.add_history_item.connect(objreg.get('web-history').add_from_tab) tab.fullscreen_requested.connect(self.page_fullscreen_requested) @@ -655,6 +657,20 @@ class TabbedBrowser(tabwidget.TabWidget): self.update_window_title() self.update_tab_title(idx) + def _on_renderer_process_terminated(self, tab, status, code): + """Show an error when a renderer process terminated.""" + if status == browsertab.TerminationStatus.normal: + pass + elif status == browsertab.TerminationStatus.abnormal: + message.error("Renderer process exited with status {}".format( + code)) + elif status == browsertab.TerminationStatus.crashed: + message.error("Renderer process crashed") + elif status == browsertab.TerminationStatus.killed: + message.error("Renderer process was killed") + else: + raise ValueError("Invalid status {}".format(status)) + def resizeEvent(self, e): """Extend resizeEvent of QWidget to emit a resized signal afterwards.