Add renderer_process_terminated signal to tab API

This commit is contained in:
Florian Bruhin 2017-02-08 10:55:05 +01:00
parent 2227c037f0
commit 2469d01ce7
3 changed files with 41 additions and 12 deletions

View File

@ -74,6 +74,14 @@ class UnsupportedOperationError(WebTabError):
"""Raised when an operation is not supported with the given backend.""" """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: class TabData:
"""A simple namespace with a fixed set of attributes. """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. fullscreen_requested: Fullscreen display was requested by the page.
arg: True if fullscreen should be turned on, arg: True if fullscreen should be turned on,
False if it should be turned off. 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() window_close_requested = pyqtSignal()
@ -548,6 +560,7 @@ class AbstractTab(QWidget):
contents_size_changed = pyqtSignal(QSizeF) contents_size_changed = pyqtSignal(QSizeF)
add_history_item = pyqtSignal(QUrl, QUrl, str) # url, requested url, title add_history_item = pyqtSignal(QUrl, QUrl, str) # url, requested url, title
fullscreen_requested = pyqtSignal(bool) fullscreen_requested = pyqtSignal(bool)
renderer_process_terminated = pyqtSignal(TerminationStatus, int)
def __init__(self, win_id, mode_manager, parent=None): def __init__(self, win_id, mode_manager, parent=None):
self.win_id = win_id self.win_id = win_id

View File

@ -40,7 +40,7 @@ from qutebrowser.browser.webengine import (webview, webengineelem, tabhistory,
webenginedownloads) webenginedownloads)
from qutebrowser.misc import miscwidgets from qutebrowser.misc import miscwidgets
from qutebrowser.utils import (usertypes, qtutils, log, javascript, utils, from qutebrowser.utils import (usertypes, qtutils, log, javascript, utils,
objreg, jinja, message) objreg, jinja)
_qute_scheme_handler = None _qute_scheme_handler = None
@ -683,17 +683,17 @@ class WebEngineTab(browsertab.AbstractTab):
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-58697 # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-58697
status = QWebEnginePage.CrashedTerminationStatus status = QWebEnginePage.CrashedTerminationStatus
if status == QWebEnginePage.NormalTerminationStatus: status_map = {
pass QWebEnginePage.NormalTerminationStatus:
elif status == QWebEnginePage.AbnormalTerminationStatus: browsertab.TerminationStatus.normal,
message.error("Renderer process exited with status {}".format( QWebEnginePage.AbnormalTerminationStatus:
exitcode)) browsertab.TerminationStatus.abnormal,
elif status == QWebEnginePage.CrashedTerminationStatus: QWebEnginePage.CrashedTerminationStatus:
message.error("Renderer process crashed") browsertab.TerminationStatus.crashed,
elif status == QWebEnginePage.KilledTerminationStatus: QWebEnginePage.KilledTerminationStatus:
message.error("Renderer process was killed") browsertab.TerminationStatus.killed,
else: }
raise ValueError("Invalid status {}".format(status)) self.renderer_process_terminated.emit(status_map[status], exitcode)
def _connect_signals(self): def _connect_signals(self):
view = self._widget view = self._widget

View File

@ -198,6 +198,8 @@ class TabbedBrowser(tabwidget.TabWidget):
functools.partial(self.on_load_started, tab)) functools.partial(self.on_load_started, tab))
tab.window_close_requested.connect( tab.window_close_requested.connect(
functools.partial(self.on_window_close_requested, tab)) 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.new_tab_requested.connect(self.tabopen)
tab.add_history_item.connect(objreg.get('web-history').add_from_tab) tab.add_history_item.connect(objreg.get('web-history').add_from_tab)
tab.fullscreen_requested.connect(self.page_fullscreen_requested) tab.fullscreen_requested.connect(self.page_fullscreen_requested)
@ -655,6 +657,20 @@ class TabbedBrowser(tabwidget.TabWidget):
self.update_window_title() self.update_window_title()
self.update_tab_title(idx) 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): def resizeEvent(self, e):
"""Extend resizeEvent of QWidget to emit a resized signal afterwards. """Extend resizeEvent of QWidget to emit a resized signal afterwards.