src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py

branch
eric7
changeset 11102
ceabb30155b8
parent 11090
f5f5f5803935
child 11105
ec86fc991d28
diff -r 33079db9e5ba -r ceabb30155b8 src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py
--- a/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py	Wed Dec 18 16:51:10 2024 +0100
+++ b/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py	Wed Dec 18 16:52:16 2024 +0100
@@ -7,11 +7,19 @@
 Module implementing the feature permission dialog.
 """
 
+import contextlib
+
 from PyQt6.QtCore import Qt, pyqtSlot
-from PyQt6.QtWebEngineCore import QWebEnginePage
 from PyQt6.QtWidgets import QAbstractItemView, QDialog, QTreeWidget, QTreeWidgetItem
+try:
+    # Qt 6.8+
+    from PyQt6.QtWebEngineCore import QWebEnginePermission
+except ImportError:
+    # Qt <6.8
+    from PyQt6.QtWebEngineCore import QWebEnginePage
 
 from eric7.EricGui import EricPixmapCache
+from eric7.SystemUtilities import QtUtilities
 
 from .Ui_FeaturePermissionsDialog import Ui_FeaturePermissionsDialog
 
@@ -26,8 +34,8 @@
         Constructor
 
         @param featurePermissions dictionary with remembered feature
-            permissions
-        @type dict of dict of list
+            permissions (Qt <6.8) or a list of permission objects (Qt 6.8+)
+        @type dict of dict of list or list of QWebEnginePermission
         @param parent reference to the parent widget
         @type QWidget
         """
@@ -166,6 +174,36 @@
             self.tr("Desktop Audio && Video"),
         )
 
+        if QtUtilities.qVersionTuple() >= (6, 8, 0):
+            # Qt 6.8+
+            self.clipboardList = QTreeWidget()
+            self.clipboardList.setAlternatingRowColors(True)
+            self.clipboardList.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
+            self.clipboardList.setRootIsDecorated(False)
+            self.clipboardList.setItemsExpandable(False)
+            self.clipboardList.setAllColumnsShowFocus(True)
+            self.clipboardList.setObjectName("camList")
+            self.clipboardList.setSortingEnabled(True)
+            self.clipboardList.headerItem().setText(0, self.tr("Host"))
+            self.clipboardList.headerItem().setText(1, self.tr("Permission"))
+            self.tabWidget.addTab(
+                self.clipboardList, EricPixmapCache.getIcon("clipboard"), self.tr("Clipboard")
+            )
+
+            self.localFontsList = QTreeWidget()
+            self.localFontsList.setAlternatingRowColors(True)
+            self.localFontsList.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
+            self.localFontsList.setRootIsDecorated(False)
+            self.localFontsList.setItemsExpandable(False)
+            self.localFontsList.setAllColumnsShowFocus(True)
+            self.localFontsList.setObjectName("camList")
+            self.localFontsList.setSortingEnabled(True)
+            self.localFontsList.headerItem().setText(0, self.tr("Host"))
+            self.localFontsList.headerItem().setText(1, self.tr("Permission"))
+            self.tabWidget.addTab(
+                self.localFontsList, EricPixmapCache.getIcon("font"), self.tr("Local Fonts")
+            )
+
         self.setTabOrder(self.tabWidget, self.notifList)
         self.setTabOrder(self.notifList, self.geoList)
         self.setTabOrder(self.geoList, self.micList)
@@ -174,33 +212,74 @@
         self.setTabOrder(self.micCamList, self.mouseLockList)
         self.setTabOrder(self.mouseLockList, self.deskVidList)
         self.setTabOrder(self.deskVidList, self.deskAudVidList)
-        self.setTabOrder(self.deskAudVidList, self.removeButton)
+        if QtUtilities.qVersionTuple() >= (6, 8, 0):
+            # Qt 6.8+
+            self.setTabOrder(self.deskAudVidList, self.clipboardList)
+            self.setTabOrder(self.clipboardList, self.localFontsList)
+            self.setTabOrder(self.localFontsList, self.removeButton)
+        else:
+            self.setTabOrder(self.deskAudVidList, self.removeButton)
         self.setTabOrder(self.removeButton, self.removeAllButton)
 
-        self.__permissionStrings = {
-            QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: self.tr("Allow"),
-            QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: self.tr("Deny"),
-        }
+        if QtUtilities.qVersionTuple() >= (6, 8, 0):
+            # Qt 6.8+
+            self.__permissionStrings = {
+                QWebEnginePermission.State.Granted: self.tr("Allow"),
+                QWebEnginePermission.State.Denied: self.tr("Deny"),
+                QWebEnginePermission.State.Ask: self.tr("Always Ask"),
+                QWebEnginePermission.State.Invalid: self.tr("Invalid"),
+            }
 
-        self.__permissionsLists = {
-            QWebEnginePage.Feature.Geolocation: self.geoList,
-            QWebEnginePage.Feature.MediaAudioCapture: self.micList,
-            QWebEnginePage.Feature.MediaVideoCapture: self.camList,
-            QWebEnginePage.Feature.MediaAudioVideoCapture: self.micCamList,
-            QWebEnginePage.Feature.MouseLock: self.mouseLockList,
-            QWebEnginePage.Feature.DesktopVideoCapture: self.deskVidList,
-            QWebEnginePage.Feature.DesktopAudioVideoCapture: self.deskAudVidList,
-            QWebEnginePage.Feature.Notifications: self.notifList,
-        }
+            self.__permissionsLists = {
+                QWebEnginePermission.PermissionType.Geolocation: self.geoList,
+                QWebEnginePermission.PermissionType.MediaAudioCapture: self.micList,
+                QWebEnginePermission.PermissionType.MediaVideoCapture: self.camList,
+                QWebEnginePermission.PermissionType.MediaAudioVideoCapture: self.micCamList,
+                QWebEnginePermission.PermissionType.MouseLock: self.mouseLockList,
+                QWebEnginePermission.PermissionType.DesktopVideoCapture: self.deskVidList,
+                QWebEnginePermission.PermissionType.DesktopAudioVideoCapture: self.deskAudVidList,
+                QWebEnginePermission.PermissionType.Notifications: self.notifList,
+                QWebEnginePermission.PermissionType.ClipboardReadWrite: self.clipboardList,
+                QWebEnginePermission.PermissionType.LocalFontsAccess: self.localFontsList,
+            }
 
-        for feature, permissionsList in self.__permissionsLists.items():
-            for permission in featurePermissions[feature]:
-                for host in featurePermissions[feature][permission]:
+            for permission in featurePermissions:
+                with contextlib.suppress(KeyError):
+                    permissionsList = self.__permissionsLists[permission.permissionType()]
                     itm = QTreeWidgetItem(
-                        permissionsList, [host, self.__permissionStrings[permission]]
+                        permissionsList, [
+                            permission.origin().toString(),
+                            self.__permissionStrings[permission.state()],
+                        ]
                     )
                     itm.setData(0, Qt.ItemDataRole.UserRole, permission)
+        else:
+            # Qt <6.8
+            self.__permissionStrings = {
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: self.tr("Allow"),
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: self.tr("Deny"),
+            }
 
+            self.__permissionsLists = {
+                QWebEnginePage.Feature.Geolocation: self.geoList,
+                QWebEnginePage.Feature.MediaAudioCapture: self.micList,
+                QWebEnginePage.Feature.MediaVideoCapture: self.camList,
+                QWebEnginePage.Feature.MediaAudioVideoCapture: self.micCamList,
+                QWebEnginePage.Feature.MouseLock: self.mouseLockList,
+                QWebEnginePage.Feature.DesktopVideoCapture: self.deskVidList,
+                QWebEnginePage.Feature.DesktopAudioVideoCapture: self.deskAudVidList,
+                QWebEnginePage.Feature.Notifications: self.notifList,
+            }
+
+            for feature, permissionsList in self.__permissionsLists.items():
+                for permission in featurePermissions[feature]:
+                    for host in featurePermissions[feature][permission]:
+                        itm = QTreeWidgetItem(
+                            permissionsList, [host, self.__permissionStrings[permission]]
+                        )
+                        itm.setData(0, Qt.ItemDataRole.UserRole, permission)
+
+        self.__removedPermissions = []
         self.__previousCurrent = -1
         self.tabWidget.currentChanged.connect(self.__currentTabChanged)
         self.tabWidget.setCurrentIndex(0)
@@ -247,6 +326,7 @@
         for itm in currentList.selectedItems():
             row = currentList.indexOfTopLevelItem(itm)
             itm = currentList.takeTopLevelItem(row)
+            self.__removedPermissions.append(itm.data(0, Qt.ItemDataRole.UserRole))
             del itm
         self.__updateButtons()
 
@@ -258,6 +338,7 @@
         currentList = self.tabWidget.currentWidget()
         while currentList.topLevelItemCount() > 0:
             itm = currentList.takeTopLevelItem(0)  # __IGNORE_WARNING__
+            self.__removedPermissions.append(itm.data(0, Qt.ItemDataRole.UserRole))
             del itm
         self.__updateButtons()
 
@@ -268,6 +349,7 @@
         @return new feature permission settings
         @rtype dict of dict of list
         """
+        # Qt <6.8
         featurePermissions = {}
         for feature, permissionsList in self.__permissionsLists.items():
             featurePermissions[feature] = {
@@ -281,3 +363,11 @@
                 featurePermissions[feature][permission].append(host)
 
         return featurePermissions
+
+    def persistChanges(self):
+        """
+        Public method to persist the removed permissions.
+        """
+        # Qt 6.8+
+        for permission in self.__removedPermissions:
+            permission.reset()

eric ide

mercurial