WebBrowser/Network/QtHelpSchemeHandler.py

changeset 6507
54054456ca58
parent 6120
4c60a21ce6dd
child 6530
25b9dcfd6fcc
child 6542
dac410f3aff4
diff -r ff6172ce89a9 -r 54054456ca58 WebBrowser/Network/QtHelpSchemeHandler.py
--- 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):

eric ide

mercurial