--- 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):