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."""
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

View File

@ -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

View File

@ -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.