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