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.
This commit is contained in:
Ryan Farley 2017-12-20 18:05:11 -06:00
parent 5c00eea122
commit 5bfab54828

View File

@ -24,7 +24,7 @@ import functools
import html as html_utils import html as html_utils
import sip 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.QtGui import QKeyEvent
from PyQt5.QtNetwork import QAuthenticator from PyQt5.QtNetwork import QAuthenticator
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
@ -539,7 +539,18 @@ class WebEngineElements(browsertab.AbstractElements):
class WebEngineTab(browsertab.AbstractTab): 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): def __init__(self, *, win_id, mode_manager, private, parent=None):
super().__init__(win_id=win_id, mode_manager=mode_manager, 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) 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): def _connect_signals(self):
view = self._widget view = self._widget
page = view.page() page = view.page()
page.windowCloseRequested.connect(self.window_close_requested) page.windowCloseRequested.connect(self.window_close_requested)
page.linkHovered.connect(self.link_hovered) 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.certificate_error.connect(self._on_ssl_errors)
page.authenticationRequired.connect(self._on_authentication_required) page.authenticationRequired.connect(self._on_authentication_required)
page.proxyAuthenticationRequired.connect( page.proxyAuthenticationRequired.connect(
@ -816,6 +841,14 @@ class WebEngineTab(browsertab.AbstractTab):
view.renderProcessTerminated.connect( view.renderProcessTerminated.connect(
self._on_render_process_terminated) self._on_render_process_terminated)
view.iconChanged.connect(self.icon_changed) 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): def event_target(self):
return self._widget.focusProxy() return self._widget.focusProxy()