WebBrowser/WebBrowserPage.py

changeset 5001
08eaee907686
parent 4978
27fba2b81749
child 5009
8b1ca3c1da22
diff -r 1a86b869d8a9 -r 08eaee907686 WebBrowser/WebBrowserPage.py
--- a/WebBrowser/WebBrowserPage.py	Fri Jun 17 19:38:14 2016 +0200
+++ b/WebBrowser/WebBrowserPage.py	Sat Jun 18 17:17:05 2016 +0200
@@ -14,9 +14,10 @@
 except NameError:
     pass
 
-from PyQt5.QtCore import pyqtSlot, QUrl, QTimer, QEventLoop, QPoint
+from PyQt5.QtCore import pyqtSlot, qVersion, QUrl, QTimer, QEventLoop, QPoint
 from PyQt5.QtGui import QDesktopServices
-from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineSettings
+from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineSettings, \
+    QWebEngineScript
 from PyQt5.QtWebChannel import QWebChannel
 
 from WebBrowser.WebBrowserWindow import WebBrowserWindow
@@ -32,6 +33,11 @@
     """
     Class implementing an enhanced web page.
     """
+    if qVersion() >= "5.7.0":
+        SafeJsWorld = QWebEngineScript.ApplicationWorld
+    else:
+        SafeJsWorld = QWebEngineScript.MainWorld
+    
     def __init__(self, parent=None):
         """
         Constructor
@@ -148,29 +154,57 @@
         manager = WebBrowserWindow.featurePermissionManager()
         manager.requestFeaturePermission(self, url, feature)
     
-    def execJavaScript(self, script):
+    def execJavaScript(self, script, worldId=QWebEngineScript.MainWorld,
+                       timeout=500):
         """
         Public method to execute a JavaScript function synchroneously.
         
         @param script JavaScript script source to be executed
         @type str
+        @param worldId ID to run the script under
+        @type int
+        @param timeout max. time the script is given to execute
+        @type int
         @return result of the script
         @rtype depending upon script result
         """
         loop = QEventLoop()
         resultDict = {"res": None}
-        QTimer.singleShot(500, loop.quit)
+        QTimer.singleShot(timeout, loop.quit)
         
         def resultCallback(res, resDict=resultDict):
             if loop and loop.isRunning():
                 resDict["res"] = res
                 loop.quit()
         
-        self.runJavaScript(script, resultCallback)
+        self.runJavaScript(script, worldId, resultCallback)
         
         loop.exec_()
         return resultDict["res"]
     
+    def runJavaScript(self, script, worldId=-1, callback=None):
+        """
+        Public method to run a script in the context of the page.
+        
+        @param script JavaScript script source to be executed
+        @type str
+        @param worldId ID to run the script under
+        @type int
+        @param callback callback function to be executed when the script has
+            ended
+        @type function
+        """
+        if qVersion() >= "5.7.0" and worldId > -1:
+            if callback is None:
+                QWebEnginePage.runJavaScript(self, script, worldId)
+            else:
+                QWebEnginePage.runJavaScript(self, script, worldId, callback)
+        else:
+            if callback is None:
+                QWebEnginePage.runJavaScript(self, script)
+            else:
+                QWebEnginePage.runJavaScript(self, script, callback)
+    
     def setJavaScriptEnabled(self, enable):
         """
         Public method to enable JavaScript.
@@ -205,7 +239,8 @@
         """
         self.runJavaScript(
             "window.scrollTo(window.scrollX + {0}, window.scrollY + {1})"
-            .format(x, y)
+            .format(x, y),
+            WebBrowserPage.SafeJsWorld
         )
     
     def mapToViewport(self, pos):

eric ide

mercurial