From 74fa1b7504d6a693a0f4d8bcbee2e9a683407435 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 3 Mar 2020 09:14:48 +0530 Subject: [PATCH] PDF Output: Add a hangcheck for loading HTML if there is no progress for sixty seconds abort See #1865380 (Private bug) --- src/calibre/ebooks/pdf/html_writer.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/pdf/html_writer.py b/src/calibre/ebooks/pdf/html_writer.py index 17db4bc616..79bb32750b 100644 --- a/src/calibre/ebooks/pdf/html_writer.py +++ b/src/calibre/ebooks/pdf/html_writer.py @@ -18,7 +18,7 @@ from operator import attrgetter, itemgetter from html5_parser import parse from PyQt5.Qt import ( - QApplication, QMarginsF, QObject, QPageLayout, QTimer, QUrl, pyqtSignal + QApplication, QMarginsF, QObject, QPageLayout, Qt, QTimer, QUrl, pyqtSignal ) from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInterceptor from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineProfile @@ -39,6 +39,7 @@ from calibre.srv.render_book import check_for_maths from calibre.utils.fonts.sfnt.container import Sfnt, UnsupportedFont from calibre.utils.fonts.sfnt.merge import merge_truetype_fonts_for_pdf from calibre.utils.logging import default_log +from calibre.utils.monotonic import monotonic from calibre.utils.podofo import ( dedup_type3_fonts, get_podofo, remove_unused_fonts, set_metadata_implementation ) @@ -172,10 +173,26 @@ class Renderer(QWebEnginePage): self.titleChanged.connect(self.title_changed) self.loadStarted.connect(self.load_started) + self.loadProgress.connect(self.load_progress) self.loadFinished.connect(self.load_finished) + self.load_hang_check_timer = t = QTimer(self) + self.load_started_at = 0 + t.setTimerType(Qt.VeryCoarseTimer) + t.setInterval(60 * 1000) + t.setSingleShot(True) + t.timeout.connect(self.on_load_hang) def load_started(self): + self.load_started_at = monotonic() self.load_complete = False + self.load_hang_check_timer.start() + + def load_progress(self, amt): + self.load_hang_check_timer.start() + + def on_load_hang(self): + self.log(self.log_prefix, 'Loading not complete after {} seconds, aborting.'.format(int(monotonic() - self.load_started_at))) + self.load_finished(False) def title_changed(self, title): if self.wait_for_title and title == self.wait_for_title and self.load_complete: @@ -187,6 +204,7 @@ class Renderer(QWebEnginePage): def load_finished(self, ok): self.load_complete = True + self.load_hang_check_timer.stop() if not ok: self.working = False self.work_done.emit(self, 'Load of {} failed'.format(self.url().toString()))