From 5bfab5482839a25f4b2761134617c75caf32bb5c Mon Sep 17 00:00:00 2001 From: Ryan Farley Date: Wed, 20 Dec 2017 18:05:11 -0600 Subject: [PATCH] supplement broken webengine load signals This uses the much more reliable `loadProgress(100)` in place of `loadFinished(true)` for WebEngine, with `loadProgressFake` and `loadFinishedFake` used instead of the 'official' variants. --- qutebrowser/browser/webengine/webenginetab.py | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 813f1eb9c..10c826bd9 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -24,7 +24,7 @@ import functools import html as html_utils import sip -from PyQt5.QtCore import pyqtSlot, Qt, QEvent, QPoint, QPointF, QUrl, QTimer +from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent, QPoint, QPointF, QUrl, QTimer from PyQt5.QtGui import QKeyEvent from PyQt5.QtNetwork import QAuthenticator from PyQt5.QtWidgets import QApplication @@ -539,7 +539,18 @@ class WebEngineElements(browsertab.AbstractElements): class WebEngineTab(browsertab.AbstractTab): - """A QtWebEngine tab in the browser.""" + """A QtWebEngine tab in the browser. + + Signals: + loadFinishedFake: + Used in place of unreliable loadFinished + loadProgressFake: + Used in place of loadProgress + """ + + #WORKAROUND for https://bugreports.qt.io/browse/QTBUG-65223 + loadFinishedFake = pyqtSignal(bool) + loadProgressFake = pyqtSignal(int) def __init__(self, *, win_id, mode_manager, private, parent=None): super().__init__(win_id=win_id, mode_manager=mode_manager, @@ -793,17 +804,31 @@ class WebEngineTab(browsertab.AbstractTab): } self.renderer_process_terminated.emit(status_map[status], exitcode) + @pyqtSlot(int) + def _on_load_progress_fake(self, perc): + """Use loadProgress(100) to emit loadFinished(True). + + See https://bugreports.qt.io/browse/QTBUG-65223 + """ + self.loadProgressFake.emit(perc) + if perc == 100 and self.load_status() != usertypes.LoadStatus.error: + self.loadFinishedFake.emit(True) + + @pyqtSlot(bool) + def _on_load_finished_fake(self, ok): + """Use only loadFinished(False). + + See https://bugreports.qt.io/browse/QTBUG-65223 + """ + if not ok: + self.loadFinishedFake.emit(False) + def _connect_signals(self): view = self._widget page = view.page() page.windowCloseRequested.connect(self.window_close_requested) page.linkHovered.connect(self.link_hovered) - page.loadProgress.connect(self._on_load_progress) - page.loadStarted.connect(self._on_load_started) - page.loadFinished.connect(self._on_history_trigger) - page.loadFinished.connect(self._restore_zoom) - page.loadFinished.connect(self._on_load_finished) page.certificate_error.connect(self._on_ssl_errors) page.authenticationRequired.connect(self._on_authentication_required) page.proxyAuthenticationRequired.connect( @@ -816,6 +841,14 @@ class WebEngineTab(browsertab.AbstractTab): view.renderProcessTerminated.connect( self._on_render_process_terminated) view.iconChanged.connect(self.icon_changed) + #WORKAROUND for https://bugreports.qt.io/browse/QTBUG-65223 + page.loadProgress.connect(self._on_load_progress_fake) + self.loadProgressFake.connect(self._on_load_progress) + page.loadStarted.connect(self._on_load_started) + self.loadFinishedFake.connect(self._on_history_trigger) + self.loadFinishedFake.connect(self._restore_zoom) + self.loadFinishedFake.connect(self._on_load_finished) + page.loadFinished.connect(self._on_load_finished_fake) def event_target(self): return self._widget.focusProxy()