Sat, 18 Jun 2016 17:17:05 +0200
Prepared the QWebEingine based web browser for the new runJavaScript() method as of Qt 5.7.0.
--- a/APIs/Python3/eric6.api Fri Jun 17 19:38:14 2016 +0200 +++ b/APIs/Python3/eric6.api Sat Jun 18 17:17:05 2016 +0200 @@ -10809,14 +10809,16 @@ eric6.WebBrowser.WebBrowserLanguagesDialog.WebBrowserLanguagesDialog.on_removeButton_clicked?4() eric6.WebBrowser.WebBrowserLanguagesDialog.WebBrowserLanguagesDialog.on_upButton_clicked?4() eric6.WebBrowser.WebBrowserLanguagesDialog.WebBrowserLanguagesDialog?1(parent=None) +eric6.WebBrowser.WebBrowserPage.WebBrowserPage.SafeJsWorld?7 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.acceptNavigationRequest?4(url, type_, isMainFrame) eric6.WebBrowser.WebBrowserPage.WebBrowserPage.certificateError?4(error) -eric6.WebBrowser.WebBrowserPage.WebBrowserPage.execJavaScript?4(script) +eric6.WebBrowser.WebBrowserPage.WebBrowserPage.execJavaScript?4(script, worldId=QWebEngineScript.MainWorld, timeout=500) eric6.WebBrowser.WebBrowserPage.WebBrowserPage.hitTestContent?4(pos) eric6.WebBrowser.WebBrowserPage.WebBrowserPage.isJavaScriptEnabled?4() eric6.WebBrowser.WebBrowserPage.WebBrowserPage.javaScriptConsoleMessage?4(level, message, lineNumber, sourceId) eric6.WebBrowser.WebBrowserPage.WebBrowserPage.mapToViewport?4(pos) eric6.WebBrowser.WebBrowserPage.WebBrowserPage.resultCallback?4(resDict=resultDict) +eric6.WebBrowser.WebBrowserPage.WebBrowserPage.runJavaScript?4(script, worldId=-1, callback=None) eric6.WebBrowser.WebBrowserPage.WebBrowserPage.scroll?4(x, y) eric6.WebBrowser.WebBrowserPage.WebBrowserPage.setJavaScriptEnabled?4(enable) eric6.WebBrowser.WebBrowserPage.WebBrowserPage.setUserAgent?4(agent)
--- a/Documentation/Help/source.qhp Fri Jun 17 19:38:14 2016 +0200 +++ b/Documentation/Help/source.qhp Sat Jun 18 17:17:05 2016 +0200 @@ -15349,6 +15349,7 @@ <keyword name="WebBrowserPage.on_setCurrentPageButton_clicked" id="WebBrowserPage.on_setCurrentPageButton_clicked" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_setCurrentPageButton_clicked" /> <keyword name="WebBrowserPage.on_startupCombo_currentIndexChanged" id="WebBrowserPage.on_startupCombo_currentIndexChanged" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.on_startupCombo_currentIndexChanged" /> <keyword name="WebBrowserPage.resultCallback" id="WebBrowserPage.resultCallback" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.resultCallback" /> + <keyword name="WebBrowserPage.runJavaScript" id="WebBrowserPage.runJavaScript" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.runJavaScript" /> <keyword name="WebBrowserPage.save" id="WebBrowserPage.save" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.save" /> <keyword name="WebBrowserPage.scroll" id="WebBrowserPage.scroll" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.scroll" /> <keyword name="WebBrowserPage.setJavaScriptEnabled" id="WebBrowserPage.setJavaScriptEnabled" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.setJavaScriptEnabled" />
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserPage.html Fri Jun 17 19:38:14 2016 +0200 +++ b/Documentation/Source/eric6.WebBrowser.WebBrowserPage.html Sat Jun 18 17:17:05 2016 +0200 @@ -48,7 +48,7 @@ QWebEnginePage <h3>Class Attributes</h3> <table> -<tr><td>None</td></tr> +<tr><td>SafeJsWorld</td></tr> </table> <h3>Class Methods</h3> <table> @@ -105,6 +105,9 @@ <td><a href="#WebBrowserPage.resultCallback">resultCallback</a></td> <td></td> </tr><tr> +<td><a href="#WebBrowserPage.runJavaScript">runJavaScript</a></td> +<td>Public method to run a script in the context of the page.</td> +</tr><tr> <td><a href="#WebBrowserPage.scroll">scroll</a></td> <td>Public method to scroll by the given amount of pixels.</td> </tr><tr> @@ -254,13 +257,19 @@ </dd> </dl><a NAME="WebBrowserPage.execJavaScript" ID="WebBrowserPage.execJavaScript"></a> <h4>WebBrowserPage.execJavaScript</h4> -<b>execJavaScript</b>(<i>script</i>) +<b>execJavaScript</b>(<i>script, worldId=QWebEngineScript.MainWorld, timeout=500</i>) <p> Public method to execute a JavaScript function synchroneously. </p><dl> <dt><i>script</i> (str)</dt> <dd> JavaScript script source to be executed +</dd><dt><i>worldId</i> (int)</dt> +<dd> +ID to run the script under +</dd><dt><i>timeout</i> (int)</dt> +<dd> +max. time the script is given to execute </dd> </dl><dl> <dt>Returns:</dt> @@ -349,7 +358,24 @@ </dl><a NAME="WebBrowserPage.resultCallback" ID="WebBrowserPage.resultCallback"></a> <h4>WebBrowserPage.resultCallback</h4> <b>resultCallback</b>(<i>resDict=resultDict</i>) -<a NAME="WebBrowserPage.scroll" ID="WebBrowserPage.scroll"></a> +<a NAME="WebBrowserPage.runJavaScript" ID="WebBrowserPage.runJavaScript"></a> +<h4>WebBrowserPage.runJavaScript</h4> +<b>runJavaScript</b>(<i>script, worldId=-1, callback=None</i>) +<p> + Public method to run a script in the context of the page. +</p><dl> +<dt><i>script</i> (str)</dt> +<dd> +JavaScript script source to be executed +</dd><dt><i>worldId</i> (int)</dt> +<dd> +ID to run the script under +</dd><dt><i>callback</i> (function)</dt> +<dd> +callback function to be executed when the script has + ended +</dd> +</dl><a NAME="WebBrowserPage.scroll" ID="WebBrowserPage.scroll"></a> <h4>WebBrowserPage.scroll</h4> <b>scroll</b>(<i>x, y</i>) <p>
--- a/WebBrowser/AdBlock/AdBlockPage.py Fri Jun 17 19:38:14 2016 +0200 +++ b/WebBrowser/AdBlock/AdBlockPage.py Sat Jun 18 17:17:05 2016 +0200 @@ -12,6 +12,7 @@ from PyQt5.QtCore import QObject from ..Tools import Scripts +from ..WebBrowserPage import WebBrowserPage class AdBlockPage(QObject): @@ -36,10 +37,10 @@ elementHiding = manager.elementHidingRules(page.url()) if elementHiding: script = Scripts.setCss(elementHiding) - page.runJavaScript(script) + page.runJavaScript(script, WebBrowserPage.SafeJsWorld) # apply domain specific element hiding rules elementHiding = manager.elementHidingRulesForDomain(page.url()) if elementHiding: script = Scripts.setCss(elementHiding) - page.runJavaScript(script) + page.runJavaScript(script, WebBrowserPage.SafeJsWorld)
--- a/WebBrowser/GreaseMonkey/GreaseMonkeyScript.py Fri Jun 17 19:38:14 2016 +0200 +++ b/WebBrowser/GreaseMonkey/GreaseMonkeyScript.py Sat Jun 18 17:17:05 2016 +0200 @@ -16,6 +16,7 @@ from .GreaseMonkeyJavaScript import bootstrap_js, values_js from ..Tools.DelayedFileWatcher import DelayedFileWatcher +from ..WebBrowserPage import WebBrowserPage class GreaseMonkeyScript(QObject): @@ -361,7 +362,7 @@ script = QWebEngineScript() script.setName(self.fullName()) script.setInjectionPoint(injectionPoint) - script.setWorldId(QWebEngineScript.MainWorld) + script.setWorldId(WebBrowserPage.SafeJsWorld) script.setRunsOnSubFrames(not self.__noFrames) script.setSourceCode("{0}\n{1}".format( bootstrap_js, self.__script
--- a/WebBrowser/Passwords/PasswordManager.py Fri Jun 17 19:38:14 2016 +0200 +++ b/WebBrowser/Passwords/PasswordManager.py Sat Jun 18 17:17:05 2016 +0200 @@ -26,6 +26,7 @@ import WebBrowser.WebBrowserWindow from ..Tools import Scripts +from ..WebBrowserPage import WebBrowserPage class PasswordManager(QObject): @@ -50,7 +51,7 @@ script = QWebEngineScript() script.setName("_eric_passwordmonitor") script.setInjectionPoint(QWebEngineScript.DocumentReady) - script.setWorldId(QWebEngineScript.MainWorld) + script.setWorldId(WebBrowserPage.SafeJsWorld) script.setRunsOnSubFrames(True) script.setSourceCode(Scripts.setupFormObserver()) profile = WebBrowser.WebBrowserWindow.WebBrowserWindow.webProfile() @@ -370,7 +371,7 @@ postData = QByteArray(Utilities.crypto.pwConvert( form.postData, encode=False).encode("utf-8")) script = Scripts.completeFormData(postData) - page.runJavaScript(script) + page.runJavaScript(script, WebBrowserPage.SafeJsWorld) def masterPasswordChanged(self, oldPassword, newPassword): """
--- a/WebBrowser/PersonalInformationManager/PersonalInformationManager.py Fri Jun 17 19:38:14 2016 +0200 +++ b/WebBrowser/PersonalInformationManager/PersonalInformationManager.py Sat Jun 18 17:17:05 2016 +0200 @@ -16,6 +16,8 @@ import Preferences import UI.PixmapCache +from ..WebBrowserPage import WebBrowserPage + class PersonalInformationManager(QObject): """ @@ -183,7 +185,7 @@ v += "{2}" + e.value.substring(e.selectionEnd); e.value = v; }}""".format(self.__clickedPos.x(), self.__clickedPos.y(), info) - self.__view.page().runJavaScript(source) + self.__view.page().runJavaScript(source, WebBrowserPage.SafeJsWorld) def viewKeyPressEvent(self, view, evt): """ @@ -220,7 +222,7 @@ }} }} }}""".format(self.__matchingJsTable()) - view.page().runJavaScript(source) + view.page().runJavaScript(source, WebBrowserPage.SafeJsWorld) return True @@ -264,7 +266,7 @@ }} }} }}""".format(self.__matchingJsTable()) - page.runJavaScript(source) + page.runJavaScript(source, WebBrowserPage.SafeJsWorld) def __matchingJsTable(self): """
--- a/WebBrowser/SiteInfo/SiteInfoDialog.py Fri Jun 17 19:38:14 2016 +0200 +++ b/WebBrowser/SiteInfo/SiteInfoDialog.py Sat Jun 18 17:17:05 2016 +0200 @@ -20,6 +20,7 @@ from .Ui_SiteInfoDialog import Ui_SiteInfoDialog from ..Tools import Scripts, WebBrowserTools +from ..WebBrowserPage import WebBrowserPage import UI.PixmapCache @@ -75,15 +76,17 @@ self.securityLabel.setStyleSheet(SiteInfoDialog.nokStyle) self.securityLabel.setText('<b>Connection is not encrypted.</b>') browser.page().runJavaScript( - "document.charset", + "document.charset", WebBrowserPage.SafeJsWorld, lambda res: self.encodingLabel.setText(res)) # populate Meta tags browser.page().runJavaScript(Scripts.getAllMetaAttributes(), + WebBrowserPage.SafeJsWorld, self.__processMetaAttributes) # populate Media tab browser.page().runJavaScript(Scripts.getAllImages(), + WebBrowserPage.SafeJsWorld, self.__processImageTags) def __processImageTags(self, res):
--- 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):
--- a/WebBrowser/WebBrowserView.py Fri Jun 17 19:38:14 2016 +0200 +++ b/WebBrowser/WebBrowserView.py Sat Jun 18 17:17:05 2016 +0200 @@ -853,7 +853,9 @@ from .Tools import Scripts script = Scripts.getFormData(self.__clickedPos) self.page().runJavaScript( - script, lambda res: self.__checkForFormCallback(res, act)) + script, + WebBrowserPage.SafeJsWorld, + lambda res: self.__checkForFormCallback(res, act)) def __checkForFormCallback(self, res, act): """ @@ -1064,6 +1066,7 @@ script = Scripts.getFormData(self.__clickedPos) self.page().runJavaScript( script, + WebBrowserPage.SafeJsWorld, lambda res: self.__mw.openSearchManager().addEngineFromForm( res, self)) @@ -1097,7 +1100,7 @@ from .Tools import Scripts script = Scripts.getAllMetaAttributes() self.page().runJavaScript( - script, self.__addBookmarkCallback) + script, WebBrowserPage.SafeJsWorld, self.__addBookmarkCallback) def __addBookmarkCallback(self, res): """ @@ -1657,19 +1660,21 @@ """ Private slot to add a new speed dial. """ - self.__page.runJavaScript("addSpeedDial();") + self.__page.runJavaScript("addSpeedDial();", + WebBrowserPage.SafeJsWorld) def __configureSpeedDial(self): """ Private slot to configure the speed dial. """ - self.page().runJavaScript("configureSpeedDial();") + self.page().runJavaScript("configureSpeedDial();", + WebBrowserPage.SafeJsWorld) def __reloadAllSpeedDials(self): """ Private slot to reload all speed dials. """ - self.page().runJavaScript("reloadAll();") + self.page().runJavaScript("reloadAll();", WebBrowserPage.SafeJsWorld) def __resetSpeedDials(self): """
--- a/WebBrowser/WebBrowserWebSearchWidget.py Fri Jun 17 19:38:14 2016 +0200 +++ b/WebBrowser/WebBrowserWebSearchWidget.py Sat Jun 18 17:17:05 2016 +0200 @@ -253,7 +253,8 @@ cb = self.__mw.currentBrowser() from .Tools import Scripts script = Scripts.getOpenSearchLinks() - cb.page().runJavaScript(script, self.__showEnginesMenuCallback) + cb.page().runJavaScript( + script, WebBrowserPage.SafeJsWorld, self.__showEnginesMenuCallback) def __showEnginesMenuCallback(self, res): """
--- a/WebBrowser/WebBrowserWindow.py Fri Jun 17 19:38:14 2016 +0200 +++ b/WebBrowser/WebBrowserWindow.py Sat Jun 18 17:17:05 2016 +0200 @@ -19,8 +19,7 @@ from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QByteArray, QSize, QTimer, \ QUrl, QTextCodec, QProcess, QEvent -from PyQt5.QtGui import QDesktopServices, QKeySequence, QFont, QFontMetrics, \ - QPalette +from PyQt5.QtGui import QDesktopServices, QKeySequence, QFont, QFontMetrics from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QDockWidget, \ QComboBox, QLabel, QSplitter, QMenu, QToolButton, QLineEdit, \ QApplication, QWhatsThis, QDialog, QHBoxLayout, QProgressBar, QAction, \ @@ -2289,6 +2288,8 @@ """ Private slot called to add the displayed file to the bookmarks. """ + from .WebBrowserPage import WebBrowserPage + view = self.currentBrowser() view.addBookmark() urlStr = bytes(view.url().toEncoded()).decode() @@ -2297,6 +2298,7 @@ script = Scripts.getAllMetaAttributes() view.page().runJavaScript( script, + WebBrowserPage.SafeJsWorld, lambda res: self.__addBookmarkCallback(urlStr, title, res)) def __addBookmarkCallback(self, url, title, res): @@ -2351,7 +2353,9 @@ """ Public slot to bookmark all open tabs. """ + from .WebBrowserPage import WebBrowserPage from .Bookmarks.AddBookmarkDialog import AddBookmarkDialog + dlg = AddBookmarkDialog() dlg.setFolder(True) dlg.setTitle(self.tr("Saved Tabs")) @@ -2368,6 +2372,7 @@ script = Scripts.getAllMetaAttributes() view.page().runJavaScript( script, + WebBrowserPage.SafeJsWorld, lambda res: self.__bookmarkAllCallback(folder, urlStr, title, res)) @@ -3998,10 +4003,12 @@ self.webProfile().scripts().remove(oldScript) if userStyle: + from .WebBrowserPage import WebBrowserPage + script = QWebEngineScript() script.setName(name) script.setInjectionPoint(QWebEngineScript.DocumentCreation) - script.setWorldId(QWebEngineScript.ApplicationWorld) + script.setWorldId(WebBrowserPage.SafeJsWorld) script.setRunsOnSubFrames(True) script.setSourceCode(Scripts.setStyleSheet(userStyle)) self.webProfile().scripts().insert(script) @@ -4108,10 +4115,12 @@ QWebEngineProfile.AllowPersistentCookies) # Setup QWebChannel user script + from .WebBrowserPage import WebBrowserPage + script = QWebEngineScript() script.setName("_eric_webchannel") script.setInjectionPoint(QWebEngineScript.DocumentCreation) - script.setWorldId(QWebEngineScript.MainWorld) + script.setWorldId(WebBrowserPage.SafeJsWorld) script.setRunsOnSubFrames(True) script.setSourceCode(Scripts.setupWebChannel()) cls._webProfile.scripts().insert(script)