Prepared the QWebEingine based web browser for the new runJavaScript() method as of Qt 5.7.0.

Sat, 18 Jun 2016 17:17:05 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 18 Jun 2016 17:17:05 +0200
changeset 5001
08eaee907686
parent 5000
1a86b869d8a9
child 5002
ee96cf64a855

Prepared the QWebEingine based web browser for the new runJavaScript() method as of Qt 5.7.0.

APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric6.WebBrowser.WebBrowserPage.html file | annotate | diff | comparison | revisions
WebBrowser/AdBlock/AdBlockPage.py file | annotate | diff | comparison | revisions
WebBrowser/GreaseMonkey/GreaseMonkeyScript.py file | annotate | diff | comparison | revisions
WebBrowser/Passwords/PasswordManager.py file | annotate | diff | comparison | revisions
WebBrowser/PersonalInformationManager/PersonalInformationManager.py file | annotate | diff | comparison | revisions
WebBrowser/SiteInfo/SiteInfoDialog.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserPage.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserWebSearchWidget.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserWindow.py file | annotate | diff | comparison | revisions
--- 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)
Binary file Documentation/Help/source.qch has changed
--- 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)

eric ide

mercurial