--- a/WebBrowser/Network/QtHelpSchemeHandler.py Tue Sep 18 19:23:07 2018 +0200 +++ b/WebBrowser/Network/QtHelpSchemeHandler.py Wed Sep 19 19:50:10 2018 +0200 @@ -12,7 +12,8 @@ import mimetypes import os -from PyQt5.QtCore import pyqtSignal, QByteArray, QIODevice, QBuffer +from PyQt5.QtCore import pyqtSignal, QByteArray, QIODevice, QBuffer, QTimer, \ + QMutex, QMutexLocker from PyQt5.QtWebEngineCore import QWebEngineUrlSchemeHandler, \ QWebEngineUrlRequestJob @@ -118,19 +119,24 @@ """ super(QtHelpSchemeReply, self).__init__(parent) - url = job.requestUrl() - strUrl = url.toString() + self.__job = job + self.__engine = engine + self.__mutex = QMutex() self.__buffer = QBuffer() + # determine mimetype + url = self.__job.requestUrl() + strUrl = url.toString() + # For some reason the url to load maybe wrong (passed from web engine) # though the css file and the references inside should work that way. # One possible problem might be that the css is loaded at the same # level as the html, thus a path inside the css like # (../images/foo.png) might cd out of the virtual folder - if not engine.findFile(url).isValid(): + if not self.__engine.findFile(url).isValid(): if strUrl.startswith(QtDocPath): - newUrl = job.requestUrl() + newUrl = self.__job.requestUrl() if not newUrl.path().startswith("/qdoc/"): newUrl.setPath("/qdoc" + newUrl.path()) url = newUrl @@ -141,8 +147,18 @@ # do our own (limited) guessing self.__mimeType = self.__mimeFromUrl(url) - if engine.findFile(url).isValid(): - data = engine.fileData(url) + QTimer.singleShot(0, lambda: self.__loadQtHelpPage(url)) + + def __loadQtHelpPage(self, url): + """ + Private method to load the requested QtHelp page. + + @param url URL of the requested page + @type QUrl + """ + + if self.__engine.findFile(url).isValid(): + data = self.__engine.fileData(url) else: data = QByteArray(self.tr( """<html>""" @@ -150,12 +166,16 @@ """<body><div align="center"><br><br>""" """<h1>The page could not be found</h1><br>""" """<h3>'{0}'</h3></div></body>""" - """</html>""").format(strUrl) + """</html>""").format(url.toString()) .encode("utf-8")) + lock = QMutexLocker(self.__mutex) self.__buffer.setData(data) self.__buffer.open(QIODevice.ReadOnly) + lock.unlock() + self.open(QIODevice.ReadOnly) + self.readyRead.emit() def bytesAvailable(self): """ @@ -164,6 +184,7 @@ @return number of available bytes @rtype int """ + lock = QMutexLocker(self.__mutex) # __IGNORE_WARNING__ return self.__buffer.bytesAvailable() def readData(self, maxlen): @@ -173,6 +194,7 @@ @param maxlen maximum number of bytes to read (integer) @return string containing the data (bytes) """ + lock = QMutexLocker(self.__mutex) # __IGNORE_WARNING__ return self.__buffer.read(maxlen) def close(self):