src/eric7/WebBrowser/WebBrowserPage.py

branch
eric7
changeset 11102
ceabb30155b8
parent 11090
f5f5f5803935
child 11105
ec86fc991d28
--- a/src/eric7/WebBrowser/WebBrowserPage.py	Wed Dec 18 16:51:10 2024 +0100
+++ b/src/eric7/WebBrowser/WebBrowserPage.py	Wed Dec 18 16:52:16 2024 +0100
@@ -8,7 +8,10 @@
 Module implementing the helpbrowser using QWebView.
 """
 
+import contextlib
+
 from PyQt6.QtCore import (
+    QCoreApplication,
     QEventLoop,
     QPoint,
     QTimer,
@@ -24,6 +27,7 @@
 from eric7 import EricUtilities, Preferences
 from eric7.EricWidgets import EricMessageBox
 from eric7.WebBrowser.WebBrowserWindow import WebBrowserWindow
+from eric7.SystemUtilities import QtUtilities
 
 from .JavaScript.ExternalJsObject import ExternalJsObject
 from .Tools import Scripts
@@ -38,6 +42,9 @@
 except ImportError:
     SSL_AVAILABLE = False
 
+with contextlib.suppress(ImportError):
+    from PyQt6.QtWebEngineCore import QWebEnginePermission
+
 
 class WebBrowserPage(QWebEnginePage):
     """
@@ -66,6 +73,52 @@
 
     sslConfigurationChanged = pyqtSignal()
 
+    if QtUtilities.qVersionTuple() >= (6, 8, 0):
+        PermissionTypeQuestions = {
+            QWebEnginePermission.PermissionType.Geolocation: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to access your location information?</p>",
+            ),
+            QWebEnginePermission.PermissionType.MediaAudioCapture: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to access your microphone?</p>",
+            ),
+            QWebEnginePermission.PermissionType.MediaVideoCapture: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to access your webcam?</p>",
+            ),
+            QWebEnginePermission.PermissionType.MediaAudioVideoCapture: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to access your microphone and webcam?</p>",
+            ),
+            QWebEnginePermission.PermissionType.MouseLock: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to lock your mouse cursor?</p>",
+            ),
+            QWebEnginePermission.PermissionType.DesktopVideoCapture: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to capture video of your desktop?</p>",
+            ),
+            QWebEnginePermission.PermissionType.DesktopAudioVideoCapture: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to capture audio and video of your desktop?</p>",
+            ),
+            QWebEnginePermission.PermissionType.Notifications: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to show notifications on your desktop?</p>",
+            ),
+            QWebEnginePermission.PermissionType.ClipboardReadWrite: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to read from and write to the clipboard?</p>",
+            ),
+            QWebEnginePermission.PermissionType.LocalFontsAccess: QCoreApplication.translate(
+                "WebBrowserPage",
+                "<p>Allow <b>{0}</b> to access fonts stored on this machine?</p>",
+            ),
+        }
+    else:
+        PermissionTypeQuestions = {}
+
     def __init__(self, view, parent=None):
         """
         Constructor
@@ -82,7 +135,12 @@
 
         self.__view = view
 
-        self.featurePermissionRequested.connect(self.__featurePermissionRequested)
+        try:
+            # Qt 6.8+
+            self.permissionRequested.connect(self.__permissionRequested)
+        except AttributeError:
+            # Qt <6.8
+            self.featurePermissionRequested.connect(self.__featurePermissionRequested)
         self.authenticationRequired.connect(
             lambda url, auth: WebBrowserWindow.networkManager().authentication(
                 url, auth, self
@@ -303,14 +361,35 @@
         @param feature requested feature
         @type QWebEnginePage.Feature
         """
+        # Qt <6.8
         manager = WebBrowserWindow.featurePermissionManager()
         manager.requestFeaturePermission(self, url, feature)
 
+    def __permissionRequested(self, permission):
+        """
+        Private slot handling a permission request.
+
+        @param permission reference to the permission request object
+        @type QWebEnginePermission
+        """
+        # Qt 6.8+
+        question = self.PermissionTypeQuestions.get(permission.permissionType())
+        if question and EricMessageBox.yesNo(
+            self.view(),
+            self.tr("Permission Request"),
+            question.format(permission.origin().host()),
+            yesDefault=True,
+        ):
+            permission.grant()
+        else:
+            permission.deny()
+        
+
     def execJavaScript(
         self, script, worldId=QWebEngineScript.ScriptWorldId.MainWorld, timeout=500
     ):
         """
-        Public method to execute a JavaScript function synchroneously.
+        Public method to execute a JavaScript function synchronously.
 
         @param script JavaScript script source to be executed
         @type str

eric ide

mercurial